Commit Graph

357 Commits

Author SHA1 Message Date
Jan Carbonell
a16f35bc12 patch so anthropic oauth doesn't show up (#1378) 2026-04-07 01:07:43 -06:00
Source Open
95f53dfa32 feat(app): add composer tools popover (#1369)
* feat(app): add composer tools popover

* fix(app): highlight connected MCP badges

---------

Co-authored-by: src-opn <src-opn@users.noreply.github.com>
2026-04-06 13:52:50 -07:00
Source Open
0589897b2f feat(den): add org-managed llm provider library (#1343)
* feat(den): add org-managed llm provider library

Let Den admins curate shared providers and models with encrypted credentials, then let the app connect through the existing add-provider flow. This keeps org-wide model access consistent without requiring per-user OAuth setup.

* docs(den): prefer longer db encryption keys

* fix(den): pass db encryption key through local dev

---------

Co-authored-by: src-opn <src-opn@users.noreply.github.com>
2026-04-06 10:17:21 -07:00
ben
b3afb8a176 fix(app): keep React session transcript stable across switches (#1365)
* feat(app): add React markdown and transcript parity

Render React session messages with a proper markdown stack, Solid-style user and assistant layouts, and structured tool-call cards so the React path matches the existing transcript experience more closely.

* feat(app): drive React sessions through useChat streaming

Move the React session path to a custom useChat transport backed by the existing OpenCode event stream so transcript state, sending, and streaming are owned by React instead of snapshot polling.

* fix(app): remount React session island per chat

Reset the React session surface when the workspace or session changes so an in-flight useChat stream from one chat cannot continue writing into another chat after a switch.

* fix(app): scope React stream deltas to one session

Reject message.part.delta updates that do not belong to the active session so concurrent OpenCode event streams cannot interleave transcript text across chats in the React session surface.

* fix(app): cache React transcript state per session

Persist streamed UI messages in TanStack query cache per workspace/session so revisiting a running chat shows the last known partial transcript instead of starting empty on remount.

* feat(app): keep React session state in shared sync cache

Move React session transcript ownership out of the mounted chat view by sharing one query client across islands and applying workspace event updates into per-session query cache, mirroring the global sync pattern used by OpenCode.

* fix(app): keep React session sync alive across chat switches

Mount the workspace-scoped React session sync above the per-chat session island so switching chats no longer tears down the event subscription that keeps transcript state updating in the background.

* Revert "fix(app): keep React session sync alive across chat switches"

This reverts commit 15f37a09c1.

* Revert "feat(app): keep React session state in shared sync cache"

This reverts commit 49df59d6ef.

* fix(app): keep React session streams alive across switches

Move React session streaming state into a shared app-level runtime backed by one query client and a workspace-scoped event sync reducer so leaving and returning to a running session restores the current transcript instead of showing an empty pane or leaking between chats.

* fix(app): preserve beginning of streamed text across session switches

Create text parts on first delta arrival instead of silently dropping deltas that arrive before the part shell exists, and ensure the message shell is present before appending any delta. This fixes the bug where switching away from a streaming session and coming back would show only later lines, missing the beginning of the response.

* fix(app): preserve streamed text when re-selecting a busy session

When switching back to a session that is still streaming, the server snapshot returns empty text for in-progress parts. The reconcile call in selectSession was overwriting the locally accumulated text with that empty snapshot. Now both the Solid and React paths preserve the longer local text when the session status is busy.
2026-04-06 08:13:05 -07:00
ben
dfb7f1b2dc fix(startup): move boot orchestration to TS and cut desktop sync stalls (#1366)
Shift startup/loading control to TS with explicit boot phases, cached->live sidebar transitions, and startup trace markers while reducing Rust-side blocking in workspace and orchestrator status paths to improve macOS responsiveness during boot and workspace switching.

Made-with: Cursor
2026-04-06 07:44:34 -07:00
ben
9365e7d397 feat(app): add incremental React session path (#1362)
* feat(server): add workspace session read APIs

Expose workspace-scoped session list, detail, message, and snapshot reads so the client can fetch session data without depending on activation choreography.

* feat(app): route mounted session reads through OpenWork APIs

Use the new workspace-scoped session read endpoints for mounted OpenWork clients so the current frontend stops depending on direct session proxy reads for list, detail, message, and todo loading.

* feat(app): add React read-only session transcript

Introduce a feature-gated React island for the session transcript so we can replace the session surface incrementally while keeping the Solid shell intact.

* feat(app): add React session composer surface

Extend the feature-gated React session island to own its draft, prompt send, stop flow, and snapshot polling so the session body can evolve independently from the Solid composer.

* feat(app): add React session transition model

Keep the React session surface stable during session switches by tracking rendered vs intended session state and exposing a developer debug panel for render-source and transition inspection.

* docs(prd): add React migration plan to repo

Copy the incremental React adoption PRD into the OpenWork repo so the migration plan lives next to the implementation and PR branch.

* docs(prd): sync full React migration plan

Replace the shortened repo copy with the full incremental React adoption PRD so the implementation branch and product plan stay in sync.

* feat(desktop): add React session launch modes

Add dedicated Tauri dev and debug-build entrypoints for the React session path and honor a build-time React session flag before local storage so the alternate shell is easy to launch and reproduce.

* fix(app): fall back to legacy mounted session reads

Keep the new app working against older OpenWork servers by falling back to the original mounted OpenCode session reads when the workspace-scoped session read APIs are unavailable.
2026-04-05 16:46:06 -07:00
ben
2b740531a4 fix(app): remove more dead settings shell code (#1350)
* fix(app): remove more dead settings shell code

* fix(app): prune more dead helpers and props
2026-04-04 17:56:43 -07:00
ben
6827c5670e fix(app): remove dead shell and session rail code (#1347) 2026-04-04 14:25:19 -07:00
Jan Carbonell
cdfc4eca8b removing unused functions (#1346)
* removing unused functions

* also not needed (from landing page)

* added readme on script
2026-04-04 14:48:53 -06:00
src-opn
ff981742bb chore: bump version to 0.11.202 2026-04-04 13:13:29 -07:00
Source Open
52f282b94d fix(i18n): restore missing page translations (#1345)
* fix(i18n): restore missing page translations

* fix(i18n): correct settings locale labels

* fix(dev): avoid reusing another checkout's Vite server

---------

Co-authored-by: src-opn <src-opn@users.noreply.github.com>
2026-04-04 13:12:09 -07:00
Omar McAdam
e40b050c3b Revert "Revert translation breaking behavior (#1342)" (#1348)
This reverts commit 1dd639b033.
2026-04-04 13:11:37 -07:00
ben
1dd639b033 Revert translation breaking behavior (#1342)
* Revert "fix(i18n/zh): cleanups to Chinese translations (#1341)"

This reverts commit 03ee1f2f0e.

* Revert "feat(i18n): add Thai language + missing translations for all other locales (#1339)"

This reverts commit db0f94e36a.

* Revert "feat(i18n): extract en translations — session area (#1249)"

This reverts commit 3271af47b4.

* Revert "feat(i18n): extract en translations — pages (#1250)"

This reverts commit e006acade6.

* Revert "feat(i18n): extract en translations — context/lib/misc (#1251)"

This reverts commit c349413f09.
2026-04-04 12:47:55 -07:00
Johnny Shields
03ee1f2f0e fix(i18n/zh): cleanups to Chinese translations (#1341)
- Skills: titles use "Skills(技能)", inline uses "skills" following Anthropic official Chinese translations
- MCP: keep as protocol name, never translate to 应用
- Apps (where EN says "Apps"): 应用
- Commands: 命令, Plugins: 插件, Sessions: 会话
- Remove 571 incorrect CJK-Latin spaces
- Standardize 沙盒→沙箱, 您→你, 仪表盘→主页
- Fix 2 MCP keys incorrectly changed to 应用
- Update header comment with terminology glossary
2026-04-04 12:44:19 -06:00
Johnny Shields
db0f94e36a feat(i18n): add Thai language + missing translations for all other locales (#1339)
* feat(i18n): complete translations for all 6 locales

- JA: add 704 missing keys (1542 total)
- ZH: add 771 missing keys (1549 total)
- TH: create full Thai locale (1542 keys, adapted from PR #795)
- pt-BR: add 704 missing keys (1543 total)
- VI: add 727 missing keys (1543 total)
- Register Thai locale in i18n/index.ts

All locales now have complete coverage of en.ts keys.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(i18n): review and polish all locale translations

JA: fix 42 workspace/worker terms, 8 spacing issues, 19 ellipsis fixes
ZH: rebrand 50+ MCP→Apps strings, standardize 你/您, remove 6 stale keys
TH: translate 200+ untranslated strings, fix term consistency, port PR #795 hero text
pt-BR: fix gender agreement, align plural placeholders
VI: fix 70+ workspace/worker terminology, verify diacritics

All locales now have 1542 keys matching en.ts exactly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(i18n): final holistic review pass — 8 precision fixes

JA: fix token label/hint to preserve collaborator/owner distinction
ZH: standardize sandbox terminology (沙盒→沙箱, 3 keys)
TH: fix den.signing_in to convey "finishing" not just "signing in"
pt-BR: fix matching context, curated qualifier, missing verb (3 keys)
VI: fix reload vs restart consistency in mcp.auth section

All locales verified: key parity, placeholders, term consistency,
tone, punctuation, and meaning preservation confirmed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(i18n/ja): use 済み for status labels, しました for toasts

Short status labels/badges use noun+済み (completed state):
- common.copied: コピー済み
- message_list.tool_updated_file: {file}を更新済み
- message_list.tool_updated_file_fallback: ファイル更新済み
- skills.install_complete: インストール済み

Toast/notification messages keep しました (past action).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 11:29:50 -06:00
Jan Carbonell
dd24fbaa3b fix: restore migrated share skill links (#1335)
* fix(docs): restore migrated share skill links

Republish the example skill bundles on share.openworklabs.com so the docs point at live imports again, and align share bundle examples with the current publisher host.

* fix(server): use canonical shared bundle data urls

Rebuild trusted share fetch URLs to the share service's canonical /b/:id/data endpoint and cover the path with the live provider-config-helper bundle URL.
2026-04-04 02:37:32 -06:00
Jan Carbonell
3866938483 improved harness via more explicit socket drop to make sure ai doesn't get stuck awaiting for this test to pass (#1334) 2026-04-04 01:03:40 -06:00
Benjamin Shafii
15725dfb31 chore: bump version to 0.11.201 2026-04-03 18:28:44 -07:00
Benjamin Shafii
02799ecaa9 fix(app): fully collapse workspace session list when chevron closed
Remove the two-row preview so collapsed workspaces show no task rows,
loading shell, or empty state until expanded again.

Made-with: Cursor
2026-04-03 18:21:23 -07:00
Benjamin Shafii
548a03b616 fix(app): devtools, session load churn, and stream batch flicker
- Add solid-devtools Vite plugin with locator (jsx/component locations) and
  @solid-devtools/overlay, loaded before render in dev only.
- Treat baseline message fetch as complete for empty transcripts so
  ensureSessionLoaded does not refetch on every prefetch/subagent ensure.
- When streaming delivers the first rows while non-idle, sync the batched
  message list immediately so the blueprint empty state does not flash.

Made-with: Cursor
2026-04-03 18:13:49 -07:00
Jan Carbonell
3f0fd61dcf show only two sessions per workspace when collapsed (#1312) 2026-04-03 17:02:58 -06:00
Johnny Shields
3271af47b4 feat(i18n): extract en translations — session area (#1249)
* feat(i18n): extract en translations for session area

Extract hardcoded English strings to i18n keys for:
- composer, context-panel, inbox-panel, message-list
- sidebar, workspace-session-list, status-bar, session page
- share-workspace (session share modal logic)
- i18n/index.ts: add params interpolation support to t()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(i18n): second pass — extract remaining hardcoded strings

Thorough scan of all 8 session-area files for any missed strings:

- composer.tsx: attachments notices, file size errors, upload success/fail,
  paste warning, placeholder text, behavior label, remote worker hint
- context-panel.tsx: open file tooltip with path param
- inbox-panel.tsx: copy path toast, download failed fallback
- message-list.tsx: all tool headline labels (run/read/write/search/delegate),
  subagent status labels, open session button, step row label
- sidebar.tsx: remove workspace button, no sessions empty state
- workspace-session-list.tsx: workspace fallback, connecting label
- session.tsx: provider auth/connected toasts, quick actions titles,
  search conversation titles, menu label, undo/redo labels, rename modal
- share-workspace.ts: collaborator token label, desktop required placeholder,
  starting server hint, worker URL hints, owner permission hint

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(i18n): add missing translation keys for sidebar and workspace list

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(i18n): resolve rebase fallout on session branch

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
2026-04-03 11:44:37 -07:00
Johnny Shields
e006acade6 feat(i18n): extract en translations — pages (#1250)
* feat(i18n): extract en translations for pages

Extract hardcoded English strings to i18n keys for:
- config, extensions, identities, plugins
- automations (was scheduled), settings, skills pages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(i18n): second-pass extraction of remaining hardcoded strings

Scanned all 7 PR3 page files for hardcoded English strings missed by
the reference diff. Converted to t() calls and added keys to en.ts:

- identities.tsx: 25 keys (time ago, dispatched messages, health status,
  Telegram bot setup strings, routing override, agent scope/status,
  peer ID placeholders)
- automations.tsx: 5 keys (scheduler install, prepare/remove job toasts,
  delete confirm description)
- settings.tsx: 12 keys (actor labels, cap labels, workspace fallback,
  deeplink hint, worker ID label, inbox/outbox cap labels)
- skills.tsx: 1 key (loading spinner text)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(i18n): add missing translation keys for identities page

* fix(i18n): resolve rebase fallout on pages branch

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
2026-04-03 11:22:45 -07:00
Johnny Shields
c349413f09 feat(i18n): extract en translations — context/lib/misc (#1251)
* feat(i18n): extract en translations for context/lib/misc

Extract hardcoded English strings to i18n keys for:
- automations context, providers store, shared-bundles
- mcp-auth-modal, onboarding-workspace-selector, question-modal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(i18n): second pass — extract remaining hardcoded strings

Fix missed strings not covered by reference diff:
- automations: schedule_required, prompt_required, prompt_empty,
  server_unavailable in deleteScheduledJob, failed_to_load in local block,
  provider_id_required (2 missed instances in store.ts)
- mcp-auth-modal: request_timed_out
- question-modal: Submit/Next button labels (common.submit, common.next)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(i18n): drop stale rebase artifacts

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
2026-04-03 10:25:19 -07:00
Benjamin Shafii
5cc7bbdd87 chore: bump version to 0.11.200 2026-04-03 07:51:45 -07:00
ben
174ea7c879 feat(app): OpenWork Cloud team skills catalog on Skills page (#1301)
* feat(app): OpenWork Cloud team skills on Skills page

- Den client: listOrgSkills, listOrgSkillHubs, fetchDenOrgSkillsCatalog (hub name enrichment)
- Extensions: cloud catalog refresh/install via upsertSkill; stale on workspace + Den session
- Skills UI: Team filter, org section, sign-in and org gates, refresh and install flow
- i18n: English strings for cloud catalog
- Storybook: Skills tab notes full app needs ExtensionsProvider

Made-with: Cursor

* feat(app): share skill to org with minimal Cloud + public chooser modal

- Den client: listOrgSkillHubSummaries, createOrgSkill, addOrgSkillToHub
- Orchestrate org resolve + POST skill + optional hub attach (skill-org-publish)
- Skills share modal: WorkspaceOptionCard chooser, public link drill-in, team path with hub picker and sign-in CTA
- i18n: EN, ja, zh, vi, pt-BR

Made-with: Cursor

* fix(app): softer share-skill notices and reusable SelectMenu

- Add select-menu custom dropdown (listbox, outside click, Escape)
- modalNotice* classes: light dls-border + body text (no heavy emerald/red outlines)
- Replace native hub select in share-to-team flow

Made-with: Cursor
2026-04-02 21:17:54 -07:00
Benjamin Shafii
4a3e43e597 chore: bump version to 0.11.199 2026-04-01 18:48:35 -07:00
Source Open
c1e12a41fb feat(ui): add shared seeded paper gradients (#1288)
* feat(ui): add shared seeded paper gradients

Centralize the Paper mesh and grain wrappers so React and Solid apps can reuse the same deterministic seed-based visuals without repeating shader config. Add a standalone demo surface and update existing consumers so the shared package is easier to validate and evolve.

* fix(ui): resolve shared package from source

Point the shared UI package exports at source files so Next builds do not depend on a prebuilt dist directory. Add Next transpilation for @openwork/ui in Landing and Den Web so monorepo and Vercel builds resolve the package consistently.

---------

Co-authored-by: src-opn <src-opn@users.noreply.github.com>
2026-04-01 18:14:14 -07:00
Source Open
ecb773e6e6 fix(app): restore bundle i18n import resolution (#1284)
Co-authored-by: src-opn <src-opn@users.noreply.github.com>
2026-04-01 14:21:00 -07:00
Johnny Shields
e4d6e5dc80 Cleanup padding/reduce scrolling on landing page (#1281) 2026-04-01 14:02:50 -07:00
Johnny Shields
fd2e287153 feat(i18n): extract en translations — dashboard area (#1248)
* feat(i18n): extract dashboard/workspace/share strings to en.ts (PR1)

- i18n/index.ts: add params interpolation support to t()
- en.ts: add 200+ translation keys for dashboard, workspace, share, den, session areas
- app.tsx: extract import bundle, skill, worker badge strings
- bundles/store.ts: extract shared_setup, skill_added, worker/badge labels
- bundles/skill-destination-modal.tsx: extract "Shared skill" badge
- components/den-settings-panel.tsx: extract all Cloud settings panel strings
- components/workspace-chip.tsx: extract sandbox/remote badge
- components/workspace-right-sidebar.tsx: extract sidebar labels
- workspace/create-workspace-modal.tsx: extract all create workspace modal strings
- workspace/share-workspace-modal.tsx: extract share modal strings
- session/share-workspace.ts: extract share fields/errors/labels
- shell/settings-shell.tsx: extract tab titles, update pill labels, nav labels

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(i18n): second pass — extract remaining hardcoded strings from app.tsx and create-workspace-modal.tsx

- app.tsx: extract ~35 hardcoded error/UI strings to app.* keys
  (auth failed, rate limit, compact errors, deep link messages,
   model behavior copy, skills/plugins access hints, reload labels, etc.)
- create-workspace-modal.tsx: extract 6 remaining strings
  (error_connect_worker, error_create_template, desktop_badge,
   import_config, importing); also support params in translate()
- en.ts: add all new keys under app.* and dashboard.*

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(i18n): apply t() calls to refactored store files

Replace 31 hardcoded English strings across 10 store/context files with
t() calls using the orphaned app.* i18n keys. Covers:
- actions-store.ts: auth, rate-limit, compact, session, command errors
- deep-links.ts: deep link messages and auth/signin errors
- openwork-server-store.ts: audit and remote access errors
- context/session.ts: connection lost, auth errors, session name
- context/providers/store.ts: not-connected, auth, rate-limit errors
- context/global-sync.tsx: unknown error fallback
- context/model-config.ts: model behavior title/desc, opencode.json,
  auto-compact scope errors
- context/workspace.ts: connection failed messages
- lib/model-behavior.ts: model behavior title
- pages/session.tsx: compact empty error

4 keys have no matching strings in the codebase after the rebase
(app.error.sidecar_unsupported_windows, app.error.command_name_template_required,
app.error.workspace_commands_desktop, app.error.command_scope_unknown)
and are left in en.ts per task instructions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 14:00:59 -07:00
ben
bac168928b feat(debug): capture and export developer logs (#1280)
Developer mode already emitted useful workspace/session/perf logs, but they
mostly lived in the console and only a subset made it into exportable debug
artifacts. That made it hard to collect a clean report from users when chasing
racy workspace bugs.

Add a shared dev-log buffer, feed it from the existing app/workspace/session
and perf debug emitters, surface the log stream in Settings > Debug, and make
it copyable/exportable alongside the existing runtime debug report.
2026-04-01 13:44:36 -07:00
ben
c688fbefb5 fix(session): recover after immediate send failures (#1283) 2026-04-01 13:39:37 -07:00
Benjamin Shafii
fc0262bc1f fix(session): stop staging transcript mounts 2026-03-31 19:53:06 -07:00
Benjamin Shafii
0d93d5d7a7 Revert "feat(session): render streamed file mentions as cards"
This reverts commit ed20f1c4b3.
2026-03-31 18:14:32 -07:00
Benjamin Shafii
73fabb1650 fix(workspace): reveal shared access tokens reliably 2026-03-31 18:14:32 -07:00
Benjamin Shafii
b292e0f942 chore(evidence): add session flow validation screenshot 2026-03-31 18:14:32 -07:00
Benjamin Shafii
5182106fb8 fix(session): stage transcript mounts around the latest view 2026-03-31 18:14:32 -07:00
Benjamin Shafii
423b05b873 fix(session): warm nearby transcripts before opening 2026-03-31 18:14:32 -07:00
Benjamin Shafii
419769b5bd fix(session): anchor follow scroll to real user gestures 2026-03-31 18:14:32 -07:00
Benjamin Shafii
52eaa3d92d fix(session): clear the previous transcript before switch mount 2026-03-31 18:14:31 -07:00
Benjamin Shafii
0e448856bd fix(session): preserve timeline position when loading history 2026-03-31 18:14:31 -07:00
Benjamin Shafii
eb02530c47 fix(session): stop smooth-animating timeline follow scrolls 2026-03-31 18:14:31 -07:00
Benjamin Shafii
25a508d7bd feat(session): render streamed file mentions as cards
Break assistant text into stable blocks so streaming stays responsive and tool-created files surface as openable transcript cards instead of getting buried in prose.
2026-03-31 18:14:31 -07:00
ben
ca971b1dd3 chore: remove opkg CLI integration and dead code (#1268)
- Delete src/opkg.rs (opkg_install + fallback chain) and commands/opkg.rs
- Relocate import_skill from commands/opkg.rs to commands/skills.rs (actively used)
- Remove opkg_install from Tauri handler registration in lib.rs
- Delete dead opkgInstall() from tauri.ts (zero callers)
- Remove apply_augmented_path/augmented_path_env from paths.rs (only consumer was opkg)
- Strip opkg mentions from i18n locale strings (en, zh, ja, vi, pt-BR)
- Remove OpenPackage Notes sections from README.md, README_ZH.md, README_ZH_hk.md
- Update ARCHITECTURE.md: rename OpenPackage Registry to Skill Registry
- Clean up PRD references in openwork-server-ownership-minimal-tauri.md
2026-03-31 18:07:38 -07:00
ben
eb28ed49ca refactor(workspace): separate selection from activation (#1263)
* refactor(workspace): keep selection separate from activation

* refactor(session): create tasks in an explicit workspace

* refactor(session): address runtime actions by workspace
2026-03-31 16:02:23 -07:00
Benjamin Shafii
a295aca9e9 fix(session): persist drafts per conversation 2026-03-31 14:43:35 -07:00
ben
b9c9ffc218 fix(settings): rename workers scope to workspaces (#1260) 2026-03-31 11:30:33 -07:00
ben
75532f9f77 refactor(app): branded TransportDirectory type prevents Windows path mismatch (#1257)
The server compares session.directory with strict equality, but call sites
could silently pick the wrong path formatter (normalizeDirectoryQueryPath
vs toSessionTransportDirectory) — producing forward-slash paths on Windows
where the server stores native backslashes.

Changes:
- Add TransportDirectory branded type so the compiler rejects raw strings
  where a transport-formatted directory is expected.
- Fix connections/store.ts: switch path discovery from normalizeDirectoryQueryPath
  to toSessionTransportDirectory — this value feeds mcp.status/disconnect calls
  that use the same exact-match semantics (latent Windows bug).
- Fix workspace.ts: remote directory discovery now goes through
  toSessionTransportDirectory (caught by the branded type at compile time).
- Mark normalizeDirectoryQueryPath with JSDoc deprecation for server-query use.
- Add round-trip invariant and idempotency tests that assert create-path
  equals list-path for both Unix and Windows directory formats.
2026-03-31 11:14:00 -07:00
Benjamin Shafii
d6245974c6 fix stuff 2026-03-31 07:01:55 -07:00