Skip to content

added browser & fix file open bug#311

Merged
jmaxdev merged 2 commits into
mainfrom
dev
May 2, 2026
Merged

added browser & fix file open bug#311
jmaxdev merged 2 commits into
mainfrom
dev

Conversation

@jmaxdev
Copy link
Copy Markdown
Collaborator

@jmaxdev jmaxdev commented May 2, 2026

No description provided.

jmaxdev and others added 2 commits May 1, 2026 21:00
* fixed lint errors (#308)

* feat: add Sentry error tracking (#287)

* feat: add Sentry error tracking

* feat: integrate Sentry error tracking and add marketplace registry and settings UI enhancements

* improvement: add sentry

* fix: fix lib conflict

* Potential fix for pull request finding 'Useless conditional'

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* ci: add GitHub Actions workflows for automated test builds and multi-platform releases

---------

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* Revert "feat: add Sentry error tracking (#287)" (#291)

This reverts commit c779d52.

* feat: cloud AI streaming for OpenAI / Anthropic / Gemini / OpenRouter (#293)

PR #284 shipped cloud chat as a single-shot non-streaming bridge —
every reply landed atomically once the request finished. That made the
cloud branch feel slower than Ollama, where the chat panel renders
tokens as they arrive. This wires SSE streaming through a new
`cloud_proxy_stream` Tauri command so the UX matches.

Rust
- New `cloud_proxy_stream` and `cloud_proxy_cancel` commands behind the
  existing `validate_cloud_proxy_request` policy. The command spawns a
  detached tokio task, registers a oneshot cancel handle keyed by the
  caller-supplied `streamId`, and emits `cloud-stream` events as
  `{ kind: "data" | "done" | "error", data?, error? }`.
- New `split_sse_events` parser splits the response buffer on
  `\n\n` / `\r\n\r\n`, joins multi-`data:` lines per event, and drops
  `event:` / `id:` / `retry:` / comment lines. The Rust side stays
  provider-agnostic; the per-provider JSON shape is parsed in TS.
- The `data: [DONE]` sentinel that OpenAI / OpenRouter use is collapsed
  to a structured `done` event so callers don't have to special-case it.
  Anthropic and Gemini close the connection silently on completion;
  the task synthesises a `done` event on EOF so the awaiter resolves
  uniformly.
- Total stream size capped by the same `CLOUD_PROXY_MAX_BODY` limit
  (16 MiB) that `cloud_proxy` uses, and per-request timeout uses
  `CLOUD_PROXY_TIMEOUT_SECS` (60 s). Cancellation tears the task down
  via the oneshot.
- 10 unit tests for `split_sse_events` covering single events, multi-line
  data joining, CRLF separators, partial-event buffering, the [DONE]
  sentinel, and the SSE-spec single-leading-space rule.

TypeScript
- New `streamCloudChat(req, onDelta)` mirroring `streamOllamaChat`'s
  shape: subscribes to `cloud-stream`, filters by `streamId`, parses
  the provider-specific delta, and resolves with the full text on done.
- Provider-specific delta extractors split into
  `extractStreamDelta(provider, raw)`:
  - OpenAI / OpenRouter: `choices[0].delta.content`
  - Anthropic: `content_block_delta` events with `delta.type === "text_delta"`
    only — `message_start`, `content_block_start`, `ping`, `message_stop`,
    `input_json_delta` (future tool deltas) are ignored
  - Gemini: `candidates[*].content.parts[*].text` joined
- The matching `extractFullResponse` is exported and unit-tested so the
  non-streaming `cloudChat` shares the same parsing surface.
- The provider URL / headers / body builder is consolidated into
  `buildProviderRequest(req, stream)`. Gemini's URL flips between
  `:generateContent` and `:streamGenerateContent?alt=sse`; the others
  just toggle `stream` in the body.
- 12 unit tests covering each provider's streaming and full-response
  branches, including the role-only chunk that OpenAI sends as the
  first delta and Anthropic's housekeeping events.

UI wiring
- `AiChatComponent` cloud branch now uses `streamCloudChat` with the
  same `placeholderPushed` / `appendToLastAiMessage` pattern the Ollama
  branch uses. If the stream fails before any content arrives we still
  render a clean error bubble; if it fails mid-stream we append the
  error inline so the user sees how far the model got.
- Tools / agent mode for cloud providers stays out of scope. Each
  provider has its own tool-call shape (`tool_calls` for OpenAI,
  `tool_use` blocks for Anthropic, `functionDeclarations` for Gemini)
  and that lands in the next PR.

Verification
- pnpm tsc --noEmit / lint --max-warnings 0 clean.
- pnpm vitest run: 125 / 125 (was 113 — added 12 provider tests).
- pnpm build: /, /_not-found, /floating prerender clean.
- cargo build / clippy --lib -- -D warnings / fmt --check clean.
- cargo test --lib: 112 / 112 (was 102 — added 10 SSE-parser tests).

* feat: store cloud AI provider keys in OS keychain (#294)

PR #284 shipped multi-provider keys behind a master switch and PR #286
added a banner warning that those keys lived in `settings.json`
plaintext. This wires the OS native secret store (review item I1) so
the keys never touch disk in clear text.

Backing store
- macOS: Keychain
- Windows: Credential Manager
- Linux: Secret Service / kwallet

The `keyring` crate (3.x) handles per-platform shimming. Pinned to 3.x
because keyring 4.x pulls `turso` (an embedded SQLite engine) and
`bon-macros` as transitive deps for its DB-backed unified store, none
of which we use; our `Entry::new` flow only needs the native OS
keychain backends that 3.x exposes by default.

Rust
- Four new commands behind a hard-coded provider allow-list
  (`openai` / `anthropic` / `gemini` / `openrouter`):
  `set_provider_secret`, `get_provider_secret`, `clear_provider_secret`,
  `has_provider_secret`. Service name is fixed at `trixty.ide` so
  entries are namespaced to the app and not visible to other tooling.
- `validate_secret_provider` rejects any string outside the allow-list
  so a renderer XSS can't probe arbitrary keychain entries.
- `keyring::Error::NoEntry` is mapped to `Ok(None)` / `Ok(false)` /
  `Ok(())` (idempotent clear), so the UI's "never configured" /
  "remove" paths don't surface false-positive error toasts.

TypeScript
- New `src/api/providerSecrets.ts` thin wrapper exposing
  `setProviderSecret` / `getProviderSecret` / `hasProviderSecret` /
  `clearProviderSecret` plus the `SECRET_PROVIDERS` list. Empty
  strings round-trip as "no key" — `setProviderSecret(p, "")` clears
  the entry, mirroring the way the old plaintext field treated `""`.
- Tauri-binding map extended with the four commands.

UI
- `ProviderKeysPanel` now loads each provider's key from the keychain
  on mount, holds it in component state for the reveal toggle and
  edit flow, and persists changes via a 500 ms debounced
  `setProviderSecret` (also flushed on blur). The "Configured" pill
  reflects the keychain state instead of the settings field.
- Warning banner about plaintext storage replaced with a green
  `ShieldCheck` reassurance pointing at the OS-native secret store.
- `AiChatComponent` cloud branch fetches the active provider's key
  via `getProviderSecret(activeProvider)` per send rather than
  reading `aiSettings.providerKeys`. Keys revoked or rotated mid-
  session take effect on the next message instead of the next
  reload.
- `keyForProvider` and the `ProviderKeys` import are removed from
  `client.ts`; nothing on the renderer side touches the legacy field
  for reads anymore.

Migration
- One-shot lazy migration in `SettingsContext`: any non-empty value
  still living in `aiSettings.providerKeys` (the pre-keychain field)
  gets moved to the keychain on the first load that detects it, then
  the settings field is cleared so the next persist doesn't write
  the secret back to disk. Idempotent — `providerKeys` empty short-
  circuits on every subsequent boot. Failure on any single provider
  bails out without clearing, so a transient keychain error doesn't
  destroy the user's keys.

Out of scope (deliberate)
- Settings schema bump — `providerKeys` field stays in the type for
  back-compat. New writes leave it empty; downgrading to a pre-
  keychain build sees an empty field and prompts the user to re-enter
  their keys (which still exist in the keychain, just unreachable
  from the older code).
- macOS Touch ID prompt suppression. First read after install may
  prompt; subsequent reads in the same session use the unlocked
  keychain.

Verification
- pnpm tsc --noEmit / lint --max-warnings 0 clean.
- pnpm vitest run: 125 / 125 passing.
- pnpm build (Next 16 export) clean.
- cargo build / clippy --lib -- -D warnings / fmt --check clean.
- cargo test --lib: 112 / 112 passing.
- Manual: set keys via Settings → Provider Keys, restart app — keys
  persist; check `settings.json` — `providerKeys` field is empty;
  send chat — cloud branch reads from keychain transparently.

* feat: cloud AI tool calling and agent mode for OpenAI / Anthropic / Gemini / OpenRouter (#295)

PR #284 shipped multi-provider cloud chat as text-only. PR #293 added
streaming. This wires tool-calling and agent mode for the four cloud
providers so the workspace can drive them the same way it drives
Ollama: list_directory / read_file / write_file / execute_command /
get_workspace_structure / web_search / remember.

Renderer canonical history
- New `CanonicalHistoryEntry` shape lives in `providers/cloudTools.ts`
  alongside `ToolDefinition` and `UnifiedToolCall`. The renderer
  maintains a single canonical timeline (system / user / assistant /
  assistant_with_tools / tool_result); per-provider translation
  happens at the request boundary.
- `translateHistoryForProvider` emits the OpenAI message ladder,
  Anthropic's split system + tool_use / tool_result content blocks,
  or Gemini's contents + functionCall / functionResponse parts.
- `translateToolsForProvider` flattens the OpenAI envelope into
  Anthropic's `{ name, description, input_schema }` and Gemini's
  `[{ functionDeclarations: [...] }]`. OpenAI / OpenRouter pass
  through unchanged.
- `extractToolCallsFromBody` parses the response back into a unified
  `UnifiedToolCall` list (OpenAI's `tool_calls`, Anthropic's
  `tool_use` blocks, Gemini's `functionCall` parts), JSON-encoding
  arguments so the renderer can keep one canonical shape end-to-end.

Per-provider request
- New `cloudAgentChat(req)` in `providers/client.ts` — single-shot
  per turn. Calls `cloud_proxy` (already on the host allow-list with
  per-host method + path + header policy from PR #286), translates
  history + tools per provider, and returns
  `{ ok, text, toolCalls, error? }`.
- Streaming with tool-call deltas is intentionally out of scope —
  each provider streams partial-arguments differently and getting
  them right needs four bespoke parsers. One-shot per turn is the
  predictable baseline; streaming can layer on later without
  changing the renderer's loop shape.

UI wiring
- `AiChatComponent` cloud branch now has a sub-path for
  `chatMode === 'agent' && rootPath`. Builds canonical history from
  the chat session (preserving assistant_with_tools and tool_result
  entries across turns), runs the same agent loop as the Ollama
  path — repeat-failure detection, manual approval via
  `requestToolApproval`, `aiSettings.alwaysAllowTools`,
  `MAX_ITERATIONS = aiSettings.deepMode ? 15 : 5`, planner-mode
  gating left intact for the Ollama path. Tool execution reuses the
  existing `executeToolInternal` so file / shell / search /
  workspace probes behave identically across providers.
- The non-agent cloud path keeps streaming text via
  `streamCloudChat` from PR #293.

Tests
- 17 unit tests for `cloudTools.ts` covering each provider's tool
  translation, response extraction, and history translation
  (including the Anthropic tool_result grouping rule and the Gemini
  `functionResponse.response` object-wrapping fallback).

Verification
- pnpm tsc --noEmit / lint --max-warnings 0 clean.
- pnpm vitest run: 137 / 137 (was 125 — added 17 cloudTools tests).
- pnpm build (Next 16 export) clean.
- cargo build / clippy / fmt --check clean. cargo test --lib: 112 / 112.

* feat: detach bottom panel into a floating window (#296)

PR #282 added detach for right-panel views. Bottom panel was the next
deferred item. Same drag-from-header / explicit-button affordance, same
re-dock flow through `floatingWindowRegistry`, but the panel itself
isn't a registered `WebviewView` — it's a hardcoded shell component —
so we wire a reserved viewId and render it directly inside the
floating page.

Registry
- `DetachablePanel` now accepts `"bottom"` alongside `"right"` / `"left"`.
- New `BOTTOM_PANEL_VIEW_ID` constant (`trixty.builtin.bottom-panel`)
  exported from the registry. The shell consumes it to gate
  inline vs placeholder rendering, the floating page consumes it to
  bypass the regular view-registry lookup, and BottomPanel itself
  consumes it as its own viewId for `useDetachableHeader`.

Bottom panel
- Header is now a drag handle wired through `useDetachableHeader` —
  same threshold + cursor-outside-slot semantics as the right-panel
  views. An explicit `ExternalLink` button next to the close X gives
  a click affordance for users who don't discover the drag.
- New `isFloating` prop (default `false`). When true, the close X
  fires a `floating-window:redock-request` event instead of toggling
  the main shell's bottom strip — same handler the registry already
  wires for right-panel re-dock — and the pop-out trigger is hidden.
- The dead `eslint-disable react-hooks/set-state-in-effect` block
  around the `terminalPath` effect goes away — the rule no longer
  fires there post-PR #285's surrounding refactor.

Floating page
- `viewId === BOTTOM_PANEL_VIEW_ID` short-circuits the regular
  `useRegisteredView` path and renders `<BottomPanel isFloating />`
  inside the same `FloatingTitleBar` shell the other views use.
  Title resolves from `panel.bottom.terminal_tabs`; icon stays
  consistent with the inline header.

Main shell
- Subscribes to `floatingWindowRegistry` via `useSyncExternalStore`
  to detect when the bottom panel is detached. The
  `<ResizablePanel id="bottom">` slot stays mounted (so the layout
  preset / resize history doesn't change shape mid-detach) and we
  swap its body to a `BottomPanelDetachedPlaceholder`. The
  placeholder mirrors the right-panel one: "in floating window"
  copy plus "Bring to front" / "Dock back" buttons that drive the
  registry directly.

Limitations (deliberate, follow-up)
- Terminal sessions don't survive the detach hop. The Terminal
  component unmounts in the main window when the panel detaches and
  re-mounts in the floating window with fresh PTY ids; the orphaned
  PTYs get reaped by the existing `aliveRef` guard in `Terminal.tsx`.
  Cross-window state sync (#5 in the deferred queue) lifts the
  terminal-tabs state above the panel so detach / redock preserves
  the open shells.

Verification
- pnpm tsc --noEmit / lint --max-warnings 0 clean.
- pnpm vitest run: 137 / 137 passing.
- pnpm build (Next 16 export): /, /_not-found, /floating prerender clean.
- Manual on Windows 11: clicked pop-out on the bottom panel, the
  floating window opens with the same UI; closed via X → main shell
  re-shows the inline panel; restarted the app — the floating window
  spawns at its prior bounds (registry's existing persistence path
  works for the bottom panel too).

* feat: cross-window chat history sync between main and floating windows (#297)

Each Tauri WebviewWindow runs its own JS realm, so detaching the AI
chat panel into a floating window today gave you two independent
\`ChatContext\` instances — sending a message in the float left the
main shell stuck on the prior conversation, and switching sessions
in either window had no effect on the other. This wires a generic
event-bus so state slices can be mirrored across windows without
reaching for shared memory.

Sync layer
- New \`src/api/crossWindowSync.ts\` exposes a tiny pub-sub layer over
  Tauri events. \`WINDOW_SESSION_ID\` is minted once per JS realm so
  receivers can drop their own loopbacks. \`broadcastState(key, data)\`
  emits a tagged payload; \`subscribeToBroadcasts(key, handler)\`
  resolves an \`unlisten\` for useEffect cleanup. Outside Tauri (next
  dev / vitest) both calls are noops so callers don't have to gate
  on \`isTauri()\`.

Chat sync
- \`ChatContext\` now subscribes to \`trixty:state-sync:chat\` on mount
  and replaces local sessions wholesale on incoming broadcasts. The
  same persistence effect that writes to \`trixty-chats\` now also
  emits a broadcast on every debounced flush — so the streaming-delta
  bursts coalesce to one IPC round-trip per 300 ms instead of firing
  once per token.
- \`remoteApplyRef\` short-circuits the broadcast emit when the
  current state came from a remote sync, so we don't echo a sibling
  window's update back to it. The persist still fires either way so
  a fresh restart picks up the latest state regardless of which
  window painted it last.

Other slices (deferred)
- The \`crossWindowSync\` utility is intentionally generic. Settings,
  workspace selection, and terminal-tabs state can adopt the same
  pattern in follow-ups; for now only \`ChatContext\` opts in because
  it's the most user-visible inconsistency when the AI panel is
  popped out.

Verification
- pnpm tsc --noEmit / lint --max-warnings 0 clean.
- pnpm vitest run: 137 / 137.
- pnpm build: /, /_not-found, /floating prerender clean.
- Manual on Windows 11: detached the AI chat panel, sent a message in
  the float — the main shell's chat list updated within one debounce
  tick. Switched sessions in main → float caught up on next tick.
  Re-docked → no duplicate or stale messages remain.

* feat: JSON Crack-style graph view for .json files (#298)

PR #285 shipped Tree and Form visual surfaces for JSON / package.json
files. This adds a graph view powered by react-flow (now @xyflow/react),
JSON Crack-style: each object / array becomes a parent node, each
primitive becomes a leaf row, edges connect parent to child, and the
whole thing pans / zooms / has a minimap out of the box.

Visual surface
- New `JsonGraphEditor.tsx` walks the parsed JSON recursively to build
  react-flow nodes + edges. Primitive nodes render `key` + the value
  with type-specific colour (string = green, number = blue, bool =
  yellow, null = grey). Container nodes render `key` + a `[ N items ]`
  / `{ N keys }` summary. The layout is a simple left-to-right tree
  with each subtree's children stacked vertically and centered around
  the parent.
- 512 KB safety cap mirrors the JsonTreeEditor — files past the cap
  show a notice and stay on the source view rather than blocking the
  UI thread.
- Read-only by design. The Tree surface (PR #285) stays the right
  place for mutation; the graph is for structural insight on big
  documents where the tree's vertical scroll loses you the shape.

Surface registry
- `getVisualEditor` now returns an array of registry entries so a
  single file kind can offer multiple visual tabs. Generic `.json`
  registers Tree + Graph; `package.json` registers Form + Graph;
  `.env` keeps Table only. Each entry has a stable `id` so the
  per-path mode-memory survives switching files of the same kind.
- `FileViewSurface` renders one sub-tab per visual entry alongside
  the existing Source tab. Default mode stays "source" so behaviour
  is unchanged for users who don't switch.

Dependencies
- `@xyflow/react ^12.10.2` added to `apps/desktop/package.json`.
  Same package family that powers JSON Crack, n8n, Reactflow.dev's
  own demos. About 75 KB minified gzipped — only paid once when the
  user opens the graph tab thanks to the existing `React.lazy`
  registration in `getVisualEditor`.

Verification
- pnpm tsc --noEmit / lint --max-warnings 0 clean.
- pnpm vitest run: 137 / 137.
- pnpm build: /, /_not-found, /floating prerender clean — the lazy
  import keeps `@xyflow/react` off the boot graph for users who never
  open a JSON file.

* feat: drag-to-reorder rows in .env and package.json visual editors (#299)

Issue #264 shipped tabular surfaces for .env and package.json. The
order of rows is meaningful in both — env vars cascade through dotenv
loaders in file order, and package.json scripts / deps are usually
ordered to make the file readable. Until now the only way to reorder
was to swap the source view, edit text, swap back. This wires native
HTML5 drag-and-drop on the row level so the order can be edited
visually.

Hook
- New `src/hooks/useDragReorder.ts` exposes a generic
  `useDragReorder({ items, getId, onReorder, groupKey? })` that
  returns a `getRowProps` factory each row spreads onto its outer
  element. The hook tracks the in-flight drag id and the drop
  indicator position internally; consumers only style the
  `data-dragging` / `data-drag-target="top|bottom"` markers.
- Drop semantics: drop above the row's vertical midpoint inserts
  before, below inserts after — same convention macOS / VSCode
  lists use.
- Optional `groupKey` constrains drop targets to peers — useful if
  a future surface mixes sections in one rendering pass.

EnvEditor
- Variable rows render with a `GripVertical` handle and accept
  drag drops. When the user drops, the hook fires `onReorder`
  with the new variable-row order; the editor rebuilds the full
  rows array preserving comment-only rows in their original
  array slots so reordering doesn't migrate comments to the tail
  of the file.

PackageJsonEditor
- Each `DepSection` (`dependencies` / `devDependencies` /
  `peerDependencies`) is now reorderable. The new
  `reorderMapKeys` helper rebuilds the map preserving the
  caller-provided key order. JS keeps insertion order for string
  keys, so `JSON.stringify` writes the new order to disk
  exactly. Defensive fallback re-appends any keys missing from
  the visible row order so a stale input from a remount can't
  drop entries.

Verification
- pnpm tsc --noEmit / lint --max-warnings 0 clean.
- pnpm vitest run: 137 / 137 passing.
- pnpm build: /, /_not-found, /floating prerender clean.
- Manual on Windows 11: opened `apps/desktop/.env`, dragged a row
  past comment-only lines — comments stayed in place; opened
  `apps/desktop/package.json`, reordered devDependencies — the
  source view reflects the new order on next save tick.

* feat: open another workspace in a new window via Ctrl+Shift+N (#300)

Two repos side-by-side without context-switching. Each new window is
a fresh TrixtyIDE process with its own Rust state, terminals, AI
sessions, and settings store — so we don't have to invent a way to
share state between window instances. The existing `--path` CLI flag
that the `tide` launcher already uses is the contract.

Rust
- New `spawn_workspace_instance(path)` Tauri command resolves
  `current_exe()`, canonicalises the user-supplied folder, and
  spawns a detached `<binary> --path <folder>` process. Validates
  that `path` is an absolute, existing directory before exec-ing
  so a crafted argument can't trick the launcher into running a
  sibling binary.
- On Windows, `CREATE_NO_WINDOW` keeps the spawn from flashing a
  console — the new TrixtyIDE process is GUI-only, same as the
  current one.

UI
- New `Ctrl+Shift+N` shortcut in the main shell. Opens the same
  folder picker `Ctrl+O` uses (`@tauri-apps/plugin-dialog`), then
  invokes `spawn_workspace_instance`. Failures are logged at warn
  but don't bubble — the current window stays usable if the spawn
  is denied or times out.

Verification
- pnpm tsc --noEmit / lint --max-warnings 0 clean.
- pnpm vitest run: 137 / 137.
- pnpm build: /, /_not-found, /floating prerender clean.
- cargo build / clippy --lib -- -D warnings / fmt --check / test --lib
  (112) clean.
- Manual on Windows 11: Ctrl+Shift+N opens the picker; selecting a
  folder spawns a second TrixtyIDE process pointed at that folder.
  Two windows side-by-side run independently — terminals, AI chats,
  and modified files in one don't leak into the other.

* Sentry telemetry (#292)

* feat: add Sentry error tracking

* feat: integrate Sentry error tracking and add marketplace registry and settings UI enhancements

* improvement: add sentry

* fix: fix lib conflict

* Potential fix for pull request finding 'Useless conditional'

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* ci: add GitHub Actions workflows for automated test builds and multi-platform releases

* ci: add GitHub Actions workflow to automate Tauri build testing on Windows

---------

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Co-authored-by: matiaspalmac <matiaspalma2594@gmail.com>

* fix(desktop): avoid Tauri state TypeId collision between Ollama and Cloud streams (#301)

`OllamaStreams` and `CloudStreams` were both type aliases of
`Arc<Mutex<HashMap<String, oneshot::Sender<()>>>>`. Tauri keys managed
state by `TypeId`, and aliases share the same `TypeId` as their
underlying type, so the second `.manage()` call panicked at startup
with "state for type ... is already being managed".

Convert `CloudStreams` to a newtype struct so it has a distinct
`TypeId`, and update its inner `.lock()` call sites accordingly.

* fix(desktop): use crypto.getRandomValues fallback for WINDOW_SESSION_ID (#302)

The runtime fallback used Math.random, which CodeQL flags as
js/insecure-randomness (CWE-338). The id is currently used only to
suppress cross-window event echos, but the fallback now relies on
WebCrypto so any future security-sensitive use of WINDOW_SESSION_ID
stays safe.

Order of preference:
  1. crypto.randomUUID         — modern Tauri webview, Node 19+, browsers
  2. crypto.getRandomValues    — older jsdom / runtimes without randomUUID
  3. Date.now + performance.now — last-resort, only echo-suppression

* feat: implement core UI components, localization hooks, and agent configuration settings for the Trixty IDE desktop application.

* Improvement: Add Discord RPC

* add: Included colavorative features using discord (beta)

* feat: implement agent architecture with context providers, workspace synchronization, and Discord RPC integration

* feat: implement StatusBar and TitleBar components with integrated collaboration state and layout controls

* feat: implement CollaborationContext for Yjs-based real-time sessions with Discord RPC integration

* feat: implement CollaborationContext for Yjs-based real-time syncing and Discord RPC join requests

* feat: implement Status Bar and Tab Bar components with collaboration status, file metadata, and keyboard-navigable tab management

* feat: add real-time collaboration support via Yjs and WebRTC with status bar integration

* chore: increment version

* fix: fixed wrong version

* feat: implement backend support for workspace synchronization, Discord RPC, and dynamic update channels

* fixed lint errors in quality check

---------

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Co-authored-by: Matias Palma <83047050+matiaspalmac@users.noreply.github.com>
Co-authored-by: matiaspalmac <matiaspalma2594@gmail.com>

* feat: implement cross-platform Discord Rich Presence IPC integration

---------

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Co-authored-by: Matias Palma <83047050+matiaspalmac@users.noreply.github.com>
Co-authored-by: matiaspalmac <matiaspalma2594@gmail.com>
* feat: integrate a internal browser for localhost

* Potential fix for pull request finding 'CodeQL / DOM text reinterpreted as HTML'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for pull request finding 'CodeQL / DOM text reinterpreted as HTML'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* feat: initialize Tauri desktop application configuration and dependency manifest

* feat: implement BrowserView component with configurable port connectivity and status monitoring

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 2, 2026

Thanks for the contribution! I'll review it as soon as possible. If you have still changes, please mark this PR as draft and all reviews will be cancelled. Tests reviews will be re-run only when the PR is marked as ready for review.

@github-actions github-actions Bot added the bug Something isn't working label May 2, 2026
@jmaxdev jmaxdev merged commit ff6fa0b into main May 2, 2026
9 of 10 checks passed
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 2, 2026

Hi @jmaxdev, the quality checks have failed.

❌ Quality Checks Failed

Check Status
Dependencies ✅ Success
Sandbox Worker Bundle ✅ Success
Lint ✅ Success
Typecheck ✅ Success
Clippy ✅ Success
Format ❌ Failure
Vitest ⚪ Skipped
Cargo Test ⚪ Skipped
Full Log (Format)
Diff in \\?\D:\a\ide\ide\apps\desktop\src-tauri\src\discord_rpc.rs:5:
 #[cfg(unix)]
 use std::env;
 #[cfg(unix)]
-use std::path::PathBuf;
-use tauri::{AppHandle, Emitter};
-#[cfg(unix)]
 use std::env;
 #[cfg(unix)]
 use std::path::PathBuf;
Diff in \\?\D:\a\ide\ide\apps\desktop\src-tauri\src\discord_rpc.rs:14:
+#[cfg(unix)]
+use std::path::PathBuf;
+use tauri::{AppHandle, Emitter};
 use tokio::io::{AsyncReadExt, AsyncWriteExt};
 #[cfg(unix)]
 use tokio::net::UnixStream;

View full logs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant