Home

mweinbach / agent-coworker

publicmweinbach/agent-coworker
Overview Code History Branches Pull requestsIssuesInsights
main
HomeOverview Code PRsIssues

refactor: optimize harness and remove legacy WebSocket/TUI surfaces (#58)

7 months ago

0a6567c
Authored
Max Weinbach3/24/2026, 4:51:23 AM
* refactor: simplify protocol negotiation to JSON-RPC only

Remove legacy protocol support from negotiation. Only cowork.jsonrpc.v1
subprotocol is now accepted. Legacy connections are rejected with a clear
error message.

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* refactor: remove legacy WebSocket path from startServer.ts

Remove openLegacySocket/closeLegacySocket functions and the protocol
branching in websocket open/message/close handlers. All connections now
go through JSON-RPC transport exclusively. Remove unused imports of
decodeClientMessage, dispatchClientMessage, and WEBSOCKET_PROTOCOL_VERSION.

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* refactor: delete legacy WebSocket dispatch infrastructure

Remove all legacy client message dispatch files:
- decodeClientMessage.ts
- dispatchClientMessage.ts and all sub-modules (.threadTurn, .session,
  .provider, .mcp, .skills, .agents, .memoryBackups, .shared)
- Associated test files

These were only used by the legacy WebSocket protocol path which has been
removed in favor of JSON-RPC.

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* refactor: remove ClientMessage type and legacy protocol constants

Remove ClientMessage union type, WEBSOCKET_PROTOCOL_VERSION,
CLIENT_MESSAGE_TYPES, SERVER_EVENT_TYPES, and the re-exports from
protocolEventParser. Delete protocolParser.ts and protocolEventParser.ts
which only served legacy client message parsing and event validation.

ServerEvent and other shared types (SessionConfigPatch, ASK_SKIP_TOKEN)
are preserved as they're used by JSON-RPC internals.

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* refactor: simplify startServer types for JSON-RPC only

Remove WsProtocolMode import, simplify protocolMode to literal "jsonrpc"
type. All socket data types reflect the JSON-RPC-only protocol.

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* refactor: rename legacyEventProjector, remove legacy tests, clean up AgentSocket

- Rename legacyEventProjector.ts → eventProjector.ts (and function
  createJsonRpcLegacyEventProjector → createJsonRpcEventProjector)
- Remove AgentSocket export from client/index.ts
- Remove AgentSocket re-export from desktop lib/agentSocket.ts
- Delete legacy test files: agentSocket.parse.test.ts,
  agentSocket.runtime.test.ts, tui.socketLifecycle.test.ts, protocol.test.ts
- Rewrite ws-protocol-negotiation.test.ts for JSON-RPC-only behavior
- Fix server.test.ts imports and remove legacy Protocol Doc Parity section

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* refactor: delete AgentSocket legacy WebSocket client

The AgentSocket class was the legacy protocol client. All consumers
(CLI, TUI) are being migrated to JsonRpcSocket. The client index
now only exports JsonRpcSocket and modelStream utilities.

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* fix: update server index and jsonrpc test for jsonrpc-only protocol

- Fix server/index.ts to only accept "jsonrpc" for --ws-protocol-default
- Update server.jsonrpc.test.ts: "jsonrpc is the default" test now verifies
  that default connections require the initialize handshake

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* docs: update CLAUDE.md for JSON-RPC-only protocol

Update architecture documentation to reflect the removal of the legacy
WebSocket protocol. Server & Protocol section now references JSON-RPC
types. WebSocket-First Development Rule updated with JSON-RPC route
workflow instead of ClientMessage/dispatchClientMessage pattern.

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* fix: remove ClientMessage references from desktop app

Fix desktop wsProtocol.ts to not import removed safeParseServerEventJson
and ClientMessage from protocol.ts. Update workspaceDefaults.ts and
threadEventReducer.ts to use local type definitions instead of the
removed ClientMessage union. Simplify wsProtocol type to jsonrpc-only.

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* refactor: remove legacy protocol tests from server.test.ts

Remove WebSocket Lifecycle, Message Parsing, and Server Resilience test
sections that tested the legacy WebSocket protocol (raw ServerEvent and
ClientMessage). These are replaced by test/server.jsonrpc.test.ts and
test/server.jsonrpc.flow.test.ts. Also remove desktop ws-protocol-parse
test (tested removed safeParseServerEvent).

Remaining: Server Startup (12 tests) and HTTP Handler tests pass.

https://claude.ai/code/session_01Kd77TTnwcFkYgk7n9NZ4sq

* fix: drop stale legacy websocket test coupling

Move the remaining stale websocket-facing tests onto supported JSON-RPC routes and harness helpers instead of reviving retired transport code. Extract archived TUI prompt, args, hotkey, provider-auth, and local-state helpers so those tests cover live leaf logic without importing dead socket layers. Restore the desktop server-event parser surface used by cache/store tests, add JSON-RPC agent and harness-context routes and schemas, and defer harness-context cleanup until session persistence drains so restart coverage stops racing shutdown.

Verification: bun test test/server.toolstream.test.ts; bun test test/tui.global-hotkeys.test.ts test/tui.sync-lifecycle.test.ts test/tui.log-filter.test.ts test/server.toolstream.test.ts test/harness.ws.e2e.test.ts; bun test test/tui.args.test.ts test/tui.question-prompt.test.ts apps/TUI/routes/session/question.test.ts test/jsonrpc.codegen.test.ts; bun test apps/TUI/context/local.test.ts apps/TUI/component/dialog-provider.test.ts; bun test test/harness.ws.e2e.test.ts apps/desktop/test/bootstrap-cache.test.ts apps/desktop/test/store-feed-mapping.test.ts; bun run docs:generate-jsonrpc; bun run docs:check; bun run typecheck; bun test.

* test: speed up slow tool coverage

Add narrow internal test hooks for the bash and webFetch tools so the tool test suite can avoid real shell subprocess startup and heavy HTML parser initialization when those costs are not the behavior under test. Update the slow bash and webFetch cases in test/tools.test.ts to use deterministic runners while still exercising the tool entrypoints.

Verification: timing probe for test/tools.test.ts improved from about 0.656s to 0.253s; bun test test/tools.test.ts; bun run typecheck; bun test.

* refactor: remove archived tui surface

Remove the archived TUI app, source tree, docs mirror, and dedicated TUI tests instead of carrying them as a dormant client surface.

Simplify the terminal entrypoint so the supported CLI path is the only terminal interface, drop the unused OpenTUI and Solid dependencies, and update contributor/docs references accordingly.

Verification:
- bun test test/cli-args.test.ts test/docs.check.test.ts
- bun run docs:check
- bun run typecheck
- bun test

* fix: align CLI REPL with JSON-RPC control contracts

Read thread ids from the JSON-RPC thread envelope and hydrate CLI state from returned control-event payloads so startup, /new, and provider metadata loading stay in sync with the server contract.

Route API-key auth through cowork/provider/auth/setApiKey, clear hard caps through cowork/session/usageBudget/set, source /tools from the real session tool-name policy, and update streamed delta/toolCall handling to match the current projector schema.

Verification:
- bun test test/repl.test.ts test/repl.server-event-handler.test.ts test/repl.thread-envelope.test.ts test/repl.disconnect-send.test.ts test/repl.restart-failure.test.ts
- bun run typecheck
- bun test

* fix: restore CLI auth and resume parity

Restore provider auth challenge/result handling for CLI JSON-RPC envelopes, keep resumed threads bound to their actual workspace cwd, and make /tools mirror the real root-session capability set including agent controls.

Verification:
- bun test test/repl.server-event-handler.test.ts test/repl.resume-cwd.test.ts test/repl.test.ts test/tools.test.ts
- bun run typecheck
- bun test

* refactor: move conversation projection into harness core

Replaces the split JSON-RPC/session snapshot projection logic with a shared harness-owned reducer and projected-item contract, moves model-stream normalization into shared code, and switches desktop live hydration onto projected turn/item snapshots instead of provider-specific re-projection.

Updates the JSON-RPC schema/docs/generated artifacts, covers repeated raw ids plus non-turn projected items and ask/approval parity in tests, and records the verification trail in tasks/todo.md.

Verification:
- bun test test/jsonrpc.projectors.test.ts test/sessionSnapshotProjector.test.ts test/jsonrpc.thread-read-projector.test.ts apps/desktop/test/control-socket.test.ts apps/desktop/test/protocol-v2-events.test.ts test/server.jsonrpc.flow.test.ts
- bun run typecheck
- bun run docs:generate-jsonrpc
- bun test

* fix: clean up cowork activity rendering

Skip blank reasoning placeholders in desktop activity groups so empty harness reasoning items do not render as empty Summary rows. Normalize Codex native web-search start args in the shared model-stream mapper to use the projected tool-card contract, and keep formatter compatibility for older replayed bare-action shapes.\n\nVerification:\n- bun test --cwd apps/desktop test/chat-activity-group-card.test.tsx test/store-feed-mapping.test.ts test/protocol-v2-events.test.ts test/chat-reasoning-ui.test.ts\n- bun test test/modelStreamReplay.test.ts apps/desktop/test/model-stream-mapper.test.ts apps/desktop/test/tool-card-formatting.test.ts\n- bun run typecheck\n- bun test test/permissions.test.ts (existing unrelated failures)\n- bun test (stops on the same existing unrelated permissions failures)

* fix: snap google citation markers to sentence boundaries

Use a shared raw-vs-markdown annotation heuristic so Google url citations stay attached to the right sentence instead of landing in the next bullet or mid-word. The resolver now prefers raw anchors when they already line up with the markdown source and falls back to markdown-aware remapping when they do not.

Also teach native web-search card formatting to surface Google query arrays without a provider-specific desktop branch, and cover the real-session regressions with focused desktop/shared tests. Verification: bun test test/displayCitationMarkers.test.ts apps/desktop/test/message-links.test.ts apps/desktop/test/tool-card-formatting.test.ts apps/desktop/test/store-feed-mapping.test.ts; bun run typecheck; bun test.

* fix: render native citations as paragraph chips

Collapse native annotation citations into one compact chip per markdown paragraph or list item instead of injecting inline superscripts after each sentence. The shared citation normalizer now resolves the containing block after its raw-vs-markdown anchor heuristic and renders a dedicated chip wrapper with a compact source label plus +N when multiple citations land in the same block.

Plumb citation source metadata through the desktop message renderer so the chip can use real source titles, and style it with a dedicated cite wrapper that survives the Streamdown sanitize pipeline. Verification: bun test test/displayCitationMarkers.test.ts apps/desktop/test/message-links.test.ts apps/desktop/test/tool-card-formatting.test.ts apps/desktop/test/protocol-v2-events.test.ts; bun run typecheck; bun test.

* feat: add citation popup cards to message chips

Turn native annotation citation chips into interactive popup cards with previous and next navigation over the grouped sources. The shared citation normalizer still owns paragraph and list-item grouping, but desktop now renders each chip through a custom cite component that opens an anchored source card instead of leaving the chip as a static label.

Because Streamdown did not reliably forward custom data attributes into the cite renderer, the shared html-mode chip payload now rides through a preserved title attribute with a private prefix. ChatView also suppresses the footer sources carousel when native annotation chips are present so the same sources do not render twice. Verification: bun test apps/desktop/test/message-links.test.ts test/displayCitationMarkers.test.ts apps/desktop/test/chat-view.stability.test.tsx apps/desktop/test/protocol-v2-events.test.ts; bun run typecheck; bun test.

* fix the card

* fix: tighten citation popup cards

Shrink the citation source popup into a lighter-weight picker, reduce the oversized arrow-control treatment, and keep the layout stable with placeholder-first favicon rendering.

Prewarm favicon URLs when citation chips mount so icons are usually cached before the popup opens, and add focused regression coverage for the compact popup contract and favicon preloading behavior.

* feat: resolve google citation titles in harness

Add a server-side citation resolver for opaque Google grounding redirects, wire it into live Google annotation emission and thread/read hydration, and cover the new behavior with focused runtime/router tests.

* chore: remove opentui references

- Delete .agents/skills/opentui/ skill folder
- Remove jsxImportSource from tsconfig.json
- Remove src/tui from exclude in tsconfig.json

* fix: keep Google citation enrichment off live stream path

Prevent slow citation resolution fetches from stalling `text-end` delivery during Google native streaming.
Queue enrichment per completed text block, wait only before returning final assistant content, and cover the slow-fetch path with a regression test.

Made-with: Cursor

* fix: keep thread/read citation enrichment off response path

Return thread/read snapshots immediately instead of blocking on citation fetches or timeouts.
Use settled citation cache data when available and warm unresolved Google redirect metadata asynchronously for later reads.

Made-with: Cursor

* fix: validate harness context payload for cowork/session/harnessContext/set

Made-with: Cursor

* fix: project committed steers into thread feeds

* fix: allow desktop custom app links

* fixes

* fix: stabilize desktop skills and command mocks

* test(desktop): isolate skill store and detail dialog workspaces for parallel CI

Use unique workspace ids and reactivateWorkspaceJsonRpcState in beforeEach
so bun test --max-concurrency does not leak disposed JSON-RPC state or
clobber useAppStore runtime keys shared with other specs.

Made-with: Cursor

* Update executable_resolution.py

* fix: bound citation caches and harden Google stream cleanup

- Cap settled (512) and in-flight (128) citation resolution maps with FIFO eviction
- Await stream delivery and annotation enrichment concurrently; settle enrichments on error path
- Document thread/read cache-only citation path and agent spawn enum validation
- Add citation cache eviction regression test

Made-with: Cursor

* fixes

* fix(test): stabilize CI-flaky skill dialog and journal replay tests

- Skill detail dialog: use functional setState updater to merge
  workspaceRuntimeById instead of replacing it, preventing concurrent
  test files from clobbering each other under --max-concurrency 4
- Journal replay: increase test timeout to 15s to accommodate CI
  resource contention with multiple server tests running in parallel

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

* fix(test): revert skill detail dialog test to main-branch pattern with diagnostics

Revert the workspace isolation approach (unique ID + beforeEach +
functional setState) back to the main-branch pattern that passes CI.
Keep only the required openExternalUrl mock addition. Add DOM dumps
to error messages for CI debugging if buttons are still missing.

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

* chore(test): add comprehensive diagnostics to skill detail dialog test

Add store state verification before render, capture console.error
during render, and dump store state after render to diagnose CI-only
failure where the component renders an empty DOM.

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

* chore(test): add canary render and store identity checks for CI debug

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

* chore(test): add dialog mock and zustand store probes for CI debug

Test whether the Dialog mock is applying correctly on CI and whether
Zustand's useAppStore hook returns correct data inside a rendered
component in the JSDOM environment.

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

* chore(test): wrap SkillDetailDialog to capture component-level store reads

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

---------

Co-authored-by: Claude <noreply@anthropic.com>

Parent7153c05

315 files changed
  • .agents/skills/opentui/SKILL.md+0−195
  • .agents/skills/opentui/references/animation/REFERENCE.md+0−424
  • .agents/skills/opentui/references/components/REFERENCE.md+0−140
  • .agents/skills/opentui/references/components/code-diff.md+0−378
  • .agents/skills/opentui/references/components/containers.md+0−383
  • .agents/skills/opentui/references/components/inputs.md+0−531
  • .agents/skills/opentui/references/components/text-display.md+0−384
  • .agents/skills/opentui/references/core/REFERENCE.md+0−145
  • .agents/skills/opentui/references/core/api.md+0−506
  • .agents/skills/opentui/references/core/configuration.md+0−166
  • .agents/skills/opentui/references/core/gotchas.md+0−393
  • .agents/skills/opentui/references/core/patterns.md+0−448
  • .agents/skills/opentui/references/keyboard/REFERENCE.md+0−458
  • .agents/skills/opentui/references/layout/REFERENCE.md+0−337
  • .agents/skills/opentui/references/layout/patterns.md+0−412
  • .agents/skills/opentui/references/react/REFERENCE.md+0−174
  • .agents/skills/opentui/references/react/api.md+0−404
  • .agents/skills/opentui/references/react/configuration.md+0−299
  • .agents/skills/opentui/references/react/gotchas.md+0−432
  • .agents/skills/opentui/references/react/patterns.md+0−498
  • .agents/skills/opentui/references/solid/REFERENCE.md+0−201
  • .agents/skills/opentui/references/solid/api.md+0−495
  • .agents/skills/opentui/references/solid/configuration.md+0−313
  • .agents/skills/opentui/references/solid/gotchas.md+0−415
  • .agents/skills/opentui/references/solid/patterns.md+0−558
  • .agents/skills/opentui/references/testing/REFERENCE.md+0−607
  • AGENTS.md+4−6
  • CLAUDE.md+9−29
  • CONTRIBUTING.md+4−7
  • GEMINI.md+2−4
  • README.md+1−24
  • apps/TUI/AGENTS.md+0−133
  • apps/TUI/app.tsx+0−351
  • apps/TUI/component/border.tsx+0−27
  • apps/TUI/component/dialog-agent.tsx+0−30
  • apps/TUI/component/dialog-command.tsx+0−297
  • apps/TUI/component/dialog-mcp.tsx+0−84
  • apps/TUI/component/dialog-model.tsx+0−65
  • apps/TUI/component/dialog-provider.test.ts+0−131
  • apps/TUI/component/dialog-provider.tsx+0−314
  • apps/TUI/component/dialog-session-list.tsx+0−62
  • apps/TUI/component/dialog-session-rename.tsx+0−30
  • apps/TUI/component/dialog-stash.tsx+0−90
  • apps/TUI/component/dialog-status.tsx+0−71
  • apps/TUI/component/dialog-theme-list.tsx+0−38
  • apps/TUI/component/dialog-user-profile.tsx+0−126
  • apps/TUI/component/logo.tsx+0−19
  • apps/TUI/component/markdown.tsx+0−46
  • apps/TUI/component/message/assistant.tsx+0−23
  • apps/TUI/component/message/reasoning-part.tsx+0−59
  • apps/TUI/component/message/text-part.tsx+0−7
  • apps/TUI/component/message/tool-part.tsx+0−56
  • apps/TUI/component/message/user.tsx+0−22
  • apps/TUI/component/prompt/autocomplete.tsx+0−307
  • apps/TUI/component/prompt/frecency.tsx+0−102
  • apps/TUI/component/prompt/history.tsx+0−106
  • apps/TUI/component/prompt/index.tsx+0−412
  • apps/TUI/component/prompt/input-value.ts+0−19
  • apps/TUI/component/prompt/slash-commands.ts+0−540
  • apps/TUI/component/prompt/stash.tsx+0−113
  • apps/TUI/component/spinner.tsx+0−27
  • apps/TUI/component/textarea-keybindings.ts+0−47
  • apps/TUI/component/tips.tsx+0−70
  • apps/TUI/component/todo-item.tsx+0−44
  • apps/TUI/component/tool/bash.tsx+0−69
  • apps/TUI/component/tool/edit.tsx+0−58
  • apps/TUI/component/tool/generic.tsx+0−65
  • apps/TUI/component/tool/glob.tsx+0−36
  • apps/TUI/component/tool/grep.tsx+0−34
  • apps/TUI/component/tool/read.tsx+0−23
  • apps/TUI/component/tool/todo.tsx+0−31
  • apps/TUI/component/tool/web.tsx+0−61
  • apps/TUI/component/tool/write.tsx+0−25
  • apps/TUI/context/dialog.tsx+0−67
  • apps/TUI/context/exit.tsx+0−49
  • apps/TUI/context/keybind.tsx+0−96
  • apps/TUI/context/kv.tsx+0−106
  • apps/TUI/context/local.test.ts+0−118
  • apps/TUI/context/local.tsx+0−149
  • apps/TUI/context/modelStream.ts+0−6
  • apps/TUI/context/prompt-stash.ts+0−3
  • apps/TUI/context/prompt.tsx+0−108
  • apps/TUI/context/route.tsx+0−37
  • apps/TUI/context/socketLifecycle.ts+0−95
  • apps/TUI/context/sync.tsx+0−605
  • apps/TUI/context/syncEventReducer.ts+0−418
  • apps/TUI/context/syncModelStreamLifecycle.ts+0−446
  • apps/TUI/context/syncTypes.ts+0−203
  • apps/TUI/context/theme.tsx+0−1460
  • apps/TUI/docs/opentui.md+0−677
  • apps/TUI/index.tsx+0−153
  • apps/TUI/routes/home.tsx+0−92
  • apps/TUI/routes/session/dialog-fork.tsx+0−30
  • apps/TUI/routes/session/dialog-subagent.tsx+0−200
  • apps/TUI/routes/session/dialog-timeline.tsx+0−30
  • apps/TUI/routes/session/footer.tsx+0−40
  • apps/TUI/routes/session/header.tsx+0−33
  • apps/TUI/routes/session/index.tsx+0−279
  • apps/TUI/routes/session/permission.tsx+0−93
  • apps/TUI/routes/session/question.test.ts+0−10
  • apps/TUI/routes/session/question.tsx+0−129
  • apps/TUI/routes/session/sidebar.tsx+0−254
  • apps/TUI/tsconfig.json+0−7
  • apps/TUI/ui/dialog-alert.tsx+0−31
  • apps/TUI/ui/dialog-confirm.tsx+0−73
  • apps/TUI/ui/dialog-export-options.tsx+0−30
  • apps/TUI/ui/dialog-help.tsx+0−80
  • apps/TUI/ui/dialog-prompt.tsx+0−75
  • apps/TUI/ui/dialog-select.tsx+0−173
  • apps/TUI/ui/dialog.tsx+0−55
  • apps/TUI/ui/link.tsx+0−11
  • apps/TUI/ui/toast.tsx+0−60
  • apps/TUI/util/clipboard.ts+0−22
  • apps/TUI/util/ctrl-c.ts+0−18
  • apps/TUI/util/editor.ts+0−27
  • apps/TUI/util/format.ts+0−29
  • apps/TUI/util/keyboard.ts+0−99
  • apps/TUI/util/selection.ts+0−9
  • apps/TUI/util/signal.ts+0−18
  • apps/TUI/util/terminal.ts+0−10
  • apps/TUI/util/transcript.ts+0−46
  • apps/desktop/electron/ipc/system.ts+8−1
  • apps/desktop/electron/preload.ts+11−0
  • apps/desktop/src/app/modelStream.ts+4−4
  • apps/desktop/src/app/store.actions/workspaceDefaults.ts+10−2
  • apps/desktop/src/app/store.helpers/jsonRpcSocket.ts+0−1
  • apps/desktop/src/app/store.helpers/threadEventReducer.ts+208−405
  • apps/desktop/src/app/types.ts+1−1
  • apps/desktop/src/components/ai-elements/message.tsx+482−15
  • apps/desktop/src/lib/agentSocket.ts+2−3
  • apps/desktop/src/lib/desktopApi.ts+6−0
  • apps/desktop/src/lib/desktopCommands.ts+4−0
  • apps/desktop/src/lib/desktopSchemas.ts+4−0
  • apps/desktop/src/lib/wsProtocol.ts+47−8
  • apps/desktop/src/ui/ChatView.tsx+6−1
  • apps/desktop/src/ui/chat/activityGroups.ts+15−1
  • apps/desktop/src/ui/chat/toolCards/toolCardFormatting.ts+23−2
  • apps/desktop/src/ui/skills/InstallSkillDialog.tsx+61−59
  • apps/desktop/test/app-jsonrpc-disposal.test.tsx+1−7
  • apps/desktop/test/backup-page.test.ts+1−7
  • apps/desktop/test/bootstrap-cache.test.ts+1−7
  • apps/desktop/test/chat-activity-group-card.test.tsx+59−7
  • apps/desktop/test/chat-view.stability.test.tsx+112−7
  • apps/desktop/test/control-socket.test.ts+1−2
  • apps/desktop/test/developer-page.test.tsx+1−7
  • apps/desktop/test/jsonrpc-single-connection.test.ts+1−9
  • apps/desktop/test/memory-page.test.ts+1−7
  • apps/desktop/test/message-links.test.ts+345−0
  • apps/desktop/test/model-stream-mapper.test.ts+4−2
  • apps/desktop/test/onboarding-ui.test.tsx+1−5
  • apps/desktop/test/onboarding.test.ts+1−5
  • apps/desktop/test/protocol-v2-events.test.ts+75−43
  • apps/desktop/test/providers-page.test.ts+1−7
  • apps/desktop/test/settings-nav.test.ts+1−9
  • apps/desktop/test/skill-detail-dialog.test.ts+47−3
  • apps/desktop/test/skills-actions.test.ts+4−1
  • apps/desktop/test/skills-catalog-page.test.ts+5−7
  • apps/desktop/test/store-explorer.test.ts+1−7
  • apps/desktop/test/thread-reconnect.test.ts+1−1
  • apps/desktop/test/tool-card-formatting.test.ts+32−0
  • apps/desktop/test/updates-page.test.ts+1−7
  • apps/desktop/test/usage-page.test.ts+1−7
  • apps/desktop/test/workspace-mcp-editor.test.ts+1−1
  • apps/desktop/test/workspace-settings-sync.test.ts+1−1
  • apps/desktop/test/workspace-startup.test.ts+1−13
  • apps/desktop/test/workspaces-page.test.ts+1−7
  • apps/desktop/test/ws-protocol-parse.test.ts+0−115
  • bun.lock+3−385
  • docs/architecture.md+3−23
  • docs/audit-code-bloat.md+2−124
  • docs/bundling-guide.md+2−9
  • docs/desktop-settings-ui-ux-audit-2026-03-13.md+0−2
  • docs/generated/websocket-jsonrpc.d.ts+22−6
  • docs/generated/websocket-jsonrpc.schema.json+2769−99
  • docs/opentui/3d.md+0−647
  • docs/opentui/README.md+0−134
  • docs/opentui/advanced/composition-system.md+0−378
  • docs/opentui/advanced/custom-renderables.md+0−352
  • docs/opentui/animation.md+0−983
  • docs/opentui/ansi-utils.md+0−629
  • docs/opentui/buffer.md+0−752
  • docs/opentui/components/README.md+0−287
  • docs/opentui/components/ascii-font.md+0−156
  • docs/opentui/components/box.md+0−258
  • docs/opentui/components/code.md+0−234
  • docs/opentui/components/diff.md+0−285
  • docs/opentui/components/frame-buffer.md+0−163
  • docs/opentui/components/input.md+0−226
  • docs/opentui/components/line-numbers.md+0−236
  • docs/opentui/components/markdown.md+0−238
  • docs/opentui/components/scrollbox.md+0−330
  • docs/opentui/components/select.md+0−423
  • docs/opentui/components/slider.md+0−159
  • docs/opentui/components/text-buffer.md+0−310
  • docs/opentui/components/text.md+0−360
  • docs/opentui/components/textarea.md+0−338
  • docs/opentui/core-api.md+0−739
  • docs/opentui/installation.md+0−251
  • docs/opentui/physics.md+0−403
  • docs/opentui/react.md+0−1343
  • docs/opentui/renderer.md+0−787
  • docs/opentui/solid.md+0−1240
  • docs/opentui/testing.md+0−1022
  • docs/opentui/types.md+0−698
  • docs/opentui/utilities/README.md+0−158
  • docs/opentui/utilities/colors.md+0−216
  • docs/opentui/utilities/keyboard.md+0−241
  • docs/opentui/utilities/mouse.md+0−223
  • docs/opentui/utilities/styled-text.md+0−227
  • docs/opentui/utilities/tree-sitter.md+0−1037
  • docs/websocket-protocol.md+29−5
  • package.json+1−6
  • skills/slides/scripts/executable_resolution.py+2−2
  • src/cli/args.ts+1−12
  • src/cli/repl.ts+217−56
  • src/cli/repl/commandRouter.ts+90−58
  • src/cli/repl/serverEventHandler.ts+264−215
  • src/client/agentSocket.ts+0−381
  • src/client/index.ts+0−1
  • src/client/modelStream.ts+6−570
  • src/client/modelStreamReplay.ts+10−201
  • src/index.ts+6−74
  • src/runtime/googleNativeInteractions.ts+40−2
  • src/server/citationMetadata.ts+566−0
  • src/server/index.ts+6−6
  • src/server/jsonrpc/eventProjector.ts+149−0
  • src/server/jsonrpc/journalProjector.ts+58−577
  • src/server/jsonrpc/legacyEventProjector.ts+0−712
  • src/server/jsonrpc/projectorShared.ts+11−59
  • src/server/jsonrpc/routes/agents.ts+138−0
  • src/server/jsonrpc/routes/index.ts+2−0
  • src/server/jsonrpc/routes/session.ts+52−0
  • src/server/jsonrpc/routes/shared.ts+0−43
  • src/server/jsonrpc/routes/thread.ts+11−2
  • src/server/jsonrpc/schema.agents.ts+47−0
  • src/server/jsonrpc/schema.session.ts+19−0
  • src/server/jsonrpc/schema.threadTurn.ts+13−7
  • src/server/jsonrpc/schema.ts+7−1
  • src/server/jsonrpc/transportAdapter.ts+2−2
  • src/server/projection/conversationProjection.ts+958−0
  • src/server/projection/shared.ts+59−0
  • src/server/protocol.ts+4−280
  • src/server/protocolEventParser.ts+0−701
  • src/server/protocolParser.ts+0−1155
  • src/server/session/AgentSession.ts+3−1
  • src/server/session/SessionSnapshotProjector.ts+49−859
  • src/server/startServer.ts+9−190
  • src/server/startServer/decodeClientMessage.ts+0−58
  • src/server/startServer/dispatchClientMessage.agents.ts+0−27
  • src/server/startServer/dispatchClientMessage.mcp.ts+0−32
  • src/server/startServer/dispatchClientMessage.memoryBackups.ts+0−47
  • src/server/startServer/dispatchClientMessage.provider.ts+0−32
  • src/server/startServer/dispatchClientMessage.session.ts+0−67
  • src/server/startServer/dispatchClientMessage.shared.ts+0−65
  • src/server/startServer/dispatchClientMessage.skills.ts+0−53
  • src/server/startServer/dispatchClientMessage.threadTurn.ts+0−25
  • src/server/startServer/dispatchClientMessage.ts+0−42
  • src/server/startServer/types.ts+1−2
  • src/server/wsProtocol/negotiation.ts+12−22
  • src/shared/displayCitationMarkers.ts+715−7
  • src/shared/modelStream.ts+581−0
  • src/shared/modelStreamReplay.ts+201−0
  • src/shared/projectedItems.ts+270−0
  • src/tools/bash.ts+13−1
  • src/tools/index.ts+47−0
  • src/tools/webFetch.ts+14−1
  • src/tui/index.tsx+0−43
  • tasks/lessons.md+9−0
  • tasks/todo.md+220−0
  • test/agentSocket.parse.test.ts+0−312
  • test/agentSocket.runtime.test.ts+0−538
  • test/citationMetadata.test.ts+463−0
  • test/cli-args.test.ts+0−19
  • test/decode-client-message.test.ts+0−139
  • test/dispatchClientMessage.test.ts+0−238
  • test/displayCitationMarkers.test.ts+63−0
  • test/helpers/wsHarness.ts+275−14
  • test/jsonrpc.projectors.test.ts+108−14
  • test/jsonrpc.router.test.ts+304−4
  • test/jsonrpc.routes.review-fixes.test.ts+115−0
  • test/modelStreamReplay.test.ts+4−2
  • test/protocol.test.ts+0−2572
  • test/repl.disconnect-send.test.ts+123−35
  • test/repl.restart-failure.test.ts+121−18
  • test/repl.resume-cwd.test.ts+266−0
  • test/repl.server-event-handler.test.ts+214−26
  • test/repl.test.ts+126−33
  • test/repl.thread-envelope.test.ts+229−0
  • test/runtime.google-interactions.test.ts+171−0
  • test/server.jsonrpc.flow.test.ts+13−1
  • test/server.jsonrpc.test.ts+12−3
  • test/server.test.ts+5−3604
  • test/server.toolstream.test.ts+224−221
  • test/sessionSnapshotProjector.test.ts+10−0
  • test/tools.test.ts+64−1
  • test/tui.args.test.ts+0−41
  • test/tui.autocomplete.test.ts+0−85
  • test/tui.ctrl-c.test.ts+0−27
  • test/tui.dialog-prompt.test.tsx+0−21
  • test/tui.dialog-select.test.tsx+0−38
  • test/tui.global-hotkeys.test.ts+0−32
  • test/tui.input-submit-guidance.test.ts+0−28
  • test/tui.keyboard.test.ts+0−47
  • test/tui.log-filter.test.ts+0−29
  • test/tui.model-stream.test.ts+0−399
  • test/tui.prompt-input-value.test.ts+0−17
  • test/tui.question-prompt.test.ts+0−36
  • test/tui.reasoning-part.test.ts+0−23
  • test/tui.slash-commands.test.ts+0−383
  • test/tui.socketLifecycle.test.ts+0−118
  • test/tui.sync-lifecycle.test.ts+0−53
  • test/tui.syncEventReducer.test.ts+0−279
  • test/tui.textarea-keybindings.test.ts+0−34
  • test/ws-protocol-negotiation.test.ts+35−25
  • tsconfig.json+1−2