uxnan-bridge 0.0.1-alpha.20260621

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/README.md +150 -0
  2. package/dist/src/account-status.d.ts +13 -0
  3. package/dist/src/account-status.js +78 -0
  4. package/dist/src/account-status.js.map +1 -0
  5. package/dist/src/adapters/base-adapter.d.ts +18 -0
  6. package/dist/src/adapters/base-adapter.js +15 -0
  7. package/dist/src/adapters/base-adapter.js.map +1 -0
  8. package/dist/src/adapters/claude-adapter.d.ts +102 -0
  9. package/dist/src/adapters/claude-adapter.js +486 -0
  10. package/dist/src/adapters/claude-adapter.js.map +1 -0
  11. package/dist/src/adapters/claude-tools.d.ts +25 -0
  12. package/dist/src/adapters/claude-tools.js +146 -0
  13. package/dist/src/adapters/claude-tools.js.map +1 -0
  14. package/dist/src/adapters/codex-adapter.d.ts +116 -0
  15. package/dist/src/adapters/codex-adapter.js +912 -0
  16. package/dist/src/adapters/codex-adapter.js.map +1 -0
  17. package/dist/src/adapters/codex-app-server.d.ts +74 -0
  18. package/dist/src/adapters/codex-app-server.js +225 -0
  19. package/dist/src/adapters/codex-app-server.js.map +1 -0
  20. package/dist/src/adapters/codex-approval.d.ts +88 -0
  21. package/dist/src/adapters/codex-approval.js +160 -0
  22. package/dist/src/adapters/codex-approval.js.map +1 -0
  23. package/dist/src/adapters/codex-tools.d.ts +18 -0
  24. package/dist/src/adapters/codex-tools.js +106 -0
  25. package/dist/src/adapters/codex-tools.js.map +1 -0
  26. package/dist/src/adapters/content-blocks.d.ts +68 -0
  27. package/dist/src/adapters/content-blocks.js +205 -0
  28. package/dist/src/adapters/content-blocks.js.map +1 -0
  29. package/dist/src/adapters/echo-agent-adapter.d.ts +23 -0
  30. package/dist/src/adapters/echo-agent-adapter.js +72 -0
  31. package/dist/src/adapters/echo-agent-adapter.js.map +1 -0
  32. package/dist/src/adapters/gemini-adapter.d.ts +87 -0
  33. package/dist/src/adapters/gemini-adapter.js +594 -0
  34. package/dist/src/adapters/gemini-adapter.js.map +1 -0
  35. package/dist/src/adapters/gemini-tools.d.ts +4 -0
  36. package/dist/src/adapters/gemini-tools.js +48 -0
  37. package/dist/src/adapters/gemini-tools.js.map +1 -0
  38. package/dist/src/adapters/opencode-adapter.d.ts +74 -0
  39. package/dist/src/adapters/opencode-adapter.js +418 -0
  40. package/dist/src/adapters/opencode-adapter.js.map +1 -0
  41. package/dist/src/adapters/opencode-tools.d.ts +2 -0
  42. package/dist/src/adapters/opencode-tools.js +41 -0
  43. package/dist/src/adapters/opencode-tools.js.map +1 -0
  44. package/dist/src/adapters/pi-adapter.d.ts +92 -0
  45. package/dist/src/adapters/pi-adapter.js +467 -0
  46. package/dist/src/adapters/pi-adapter.js.map +1 -0
  47. package/dist/src/adapters/pi-tools.d.ts +10 -0
  48. package/dist/src/adapters/pi-tools.js +72 -0
  49. package/dist/src/adapters/pi-tools.js.map +1 -0
  50. package/dist/src/adapters/process-agent-adapter.d.ts +24 -0
  51. package/dist/src/adapters/process-agent-adapter.js +111 -0
  52. package/dist/src/adapters/process-agent-adapter.js.map +1 -0
  53. package/dist/src/adapters/resolve-claude.d.ts +13 -0
  54. package/dist/src/adapters/resolve-claude.js +57 -0
  55. package/dist/src/adapters/resolve-claude.js.map +1 -0
  56. package/dist/src/adapters/resolve-codex.d.ts +13 -0
  57. package/dist/src/adapters/resolve-codex.js +48 -0
  58. package/dist/src/adapters/resolve-codex.js.map +1 -0
  59. package/dist/src/adapters/resolve-gemini.d.ts +13 -0
  60. package/dist/src/adapters/resolve-gemini.js +47 -0
  61. package/dist/src/adapters/resolve-gemini.js.map +1 -0
  62. package/dist/src/adapters/resolve-opencode.d.ts +11 -0
  63. package/dist/src/adapters/resolve-opencode.js +49 -0
  64. package/dist/src/adapters/resolve-opencode.js.map +1 -0
  65. package/dist/src/adapters/resolve-pi.d.ts +13 -0
  66. package/dist/src/adapters/resolve-pi.js +46 -0
  67. package/dist/src/adapters/resolve-pi.js.map +1 -0
  68. package/dist/src/adapters/run-options.d.ts +22 -0
  69. package/dist/src/adapters/run-options.js +48 -0
  70. package/dist/src/adapters/run-options.js.map +1 -0
  71. package/dist/src/adapters/spawn.d.ts +20 -0
  72. package/dist/src/adapters/spawn.js +16 -0
  73. package/dist/src/adapters/spawn.js.map +1 -0
  74. package/dist/src/agents/agent-manager.d.ts +98 -0
  75. package/dist/src/agents/agent-manager.js +433 -0
  76. package/dist/src/agents/agent-manager.js.map +1 -0
  77. package/dist/src/agents/attachments.d.ts +28 -0
  78. package/dist/src/agents/attachments.js +121 -0
  79. package/dist/src/agents/attachments.js.map +1 -0
  80. package/dist/src/bridge-context.d.ts +45 -0
  81. package/dist/src/bridge-context.js +2 -0
  82. package/dist/src/bridge-context.js.map +1 -0
  83. package/dist/src/bridge-status.d.ts +12 -0
  84. package/dist/src/bridge-status.js +17 -0
  85. package/dist/src/bridge-status.js.map +1 -0
  86. package/dist/src/bridge.d.ts +37 -0
  87. package/dist/src/bridge.js +446 -0
  88. package/dist/src/bridge.js.map +1 -0
  89. package/dist/src/cli.d.ts +2 -0
  90. package/dist/src/cli.js +194 -0
  91. package/dist/src/cli.js.map +1 -0
  92. package/dist/src/conversation/session-history.d.ts +27 -0
  93. package/dist/src/conversation/session-history.js +1082 -0
  94. package/dist/src/conversation/session-history.js.map +1 -0
  95. package/dist/src/conversation/thread-store.d.ts +74 -0
  96. package/dist/src/conversation/thread-store.js +366 -0
  97. package/dist/src/conversation/thread-store.js.map +1 -0
  98. package/dist/src/daemon-config.d.ts +123 -0
  99. package/dist/src/daemon-config.js +64 -0
  100. package/dist/src/daemon-config.js.map +1 -0
  101. package/dist/src/daemon-state.d.ts +27 -0
  102. package/dist/src/daemon-state.js +76 -0
  103. package/dist/src/daemon-state.js.map +1 -0
  104. package/dist/src/git/git-runner.d.ts +24 -0
  105. package/dist/src/git/git-runner.js +63 -0
  106. package/dist/src/git/git-runner.js.map +1 -0
  107. package/dist/src/git/git-service.d.ts +76 -0
  108. package/dist/src/git/git-service.js +435 -0
  109. package/dist/src/git/git-service.js.map +1 -0
  110. package/dist/src/handler-router.d.ts +34 -0
  111. package/dist/src/handler-router.js +67 -0
  112. package/dist/src/handler-router.js.map +1 -0
  113. package/dist/src/handlers/account-handler.d.ts +4 -0
  114. package/dist/src/handlers/account-handler.js +27 -0
  115. package/dist/src/handlers/account-handler.js.map +1 -0
  116. package/dist/src/handlers/agent-handler.d.ts +2 -0
  117. package/dist/src/handlers/agent-handler.js +8 -0
  118. package/dist/src/handlers/agent-handler.js.map +1 -0
  119. package/dist/src/handlers/bridge-control-handler.d.ts +2 -0
  120. package/dist/src/handlers/bridge-control-handler.js +64 -0
  121. package/dist/src/handlers/bridge-control-handler.js.map +1 -0
  122. package/dist/src/handlers/desktop-handler.d.ts +12 -0
  123. package/dist/src/handlers/desktop-handler.js +5 -0
  124. package/dist/src/handlers/desktop-handler.js.map +1 -0
  125. package/dist/src/handlers/git-handler.d.ts +2 -0
  126. package/dist/src/handlers/git-handler.js +82 -0
  127. package/dist/src/handlers/git-handler.js.map +1 -0
  128. package/dist/src/handlers/index.d.ts +8 -0
  129. package/dist/src/handlers/index.js +22 -0
  130. package/dist/src/handlers/index.js.map +1 -0
  131. package/dist/src/handlers/not-implemented.d.ts +10 -0
  132. package/dist/src/handlers/not-implemented.js +21 -0
  133. package/dist/src/handlers/not-implemented.js.map +1 -0
  134. package/dist/src/handlers/notifications-handler.d.ts +2 -0
  135. package/dist/src/handlers/notifications-handler.js +62 -0
  136. package/dist/src/handlers/notifications-handler.js.map +1 -0
  137. package/dist/src/handlers/params.d.ts +11 -0
  138. package/dist/src/handlers/params.js +72 -0
  139. package/dist/src/handlers/params.js.map +1 -0
  140. package/dist/src/handlers/project-handler.d.ts +2 -0
  141. package/dist/src/handlers/project-handler.js +6 -0
  142. package/dist/src/handlers/project-handler.js.map +1 -0
  143. package/dist/src/handlers/thread-context-handler.d.ts +2 -0
  144. package/dist/src/handlers/thread-context-handler.js +211 -0
  145. package/dist/src/handlers/thread-context-handler.js.map +1 -0
  146. package/dist/src/handlers/workspace-handler.d.ts +2 -0
  147. package/dist/src/handlers/workspace-handler.js +101 -0
  148. package/dist/src/handlers/workspace-handler.js.map +1 -0
  149. package/dist/src/hooks/claude-approval-hook.d.ts +7 -0
  150. package/dist/src/hooks/claude-approval-hook.js +95 -0
  151. package/dist/src/hooks/claude-approval-hook.js.map +1 -0
  152. package/dist/src/hooks/gemini-approval-hook.d.ts +7 -0
  153. package/dist/src/hooks/gemini-approval-hook.js +113 -0
  154. package/dist/src/hooks/gemini-approval-hook.js.map +1 -0
  155. package/dist/src/index.d.ts +62 -0
  156. package/dist/src/index.js +65 -0
  157. package/dist/src/index.js.map +1 -0
  158. package/dist/src/keyring-secret-store.d.ts +36 -0
  159. package/dist/src/keyring-secret-store.js +70 -0
  160. package/dist/src/keyring-secret-store.js.map +1 -0
  161. package/dist/src/lock-file.d.ts +18 -0
  162. package/dist/src/lock-file.js +60 -0
  163. package/dist/src/lock-file.js.map +1 -0
  164. package/dist/src/logger.d.ts +28 -0
  165. package/dist/src/logger.js +99 -0
  166. package/dist/src/logger.js.map +1 -0
  167. package/dist/src/pairing/pairing-code-service.d.ts +45 -0
  168. package/dist/src/pairing/pairing-code-service.js +183 -0
  169. package/dist/src/pairing/pairing-code-service.js.map +1 -0
  170. package/dist/src/projects/project-registry.d.ts +14 -0
  171. package/dist/src/projects/project-registry.js +60 -0
  172. package/dist/src/projects/project-registry.js.map +1 -0
  173. package/dist/src/push/push-sender.d.ts +21 -0
  174. package/dist/src/push/push-sender.js +96 -0
  175. package/dist/src/push/push-sender.js.map +1 -0
  176. package/dist/src/push/push-service.d.ts +122 -0
  177. package/dist/src/push/push-service.js +260 -0
  178. package/dist/src/push/push-service.js.map +1 -0
  179. package/dist/src/qr.d.ts +17 -0
  180. package/dist/src/qr.js +31 -0
  181. package/dist/src/qr.js.map +1 -0
  182. package/dist/src/secret-store.d.ts +23 -0
  183. package/dist/src/secret-store.js +27 -0
  184. package/dist/src/secret-store.js.map +1 -0
  185. package/dist/src/secure-device-state.d.ts +16 -0
  186. package/dist/src/secure-device-state.js +63 -0
  187. package/dist/src/secure-device-state.js.map +1 -0
  188. package/dist/src/service-installer.d.ts +57 -0
  189. package/dist/src/service-installer.js +254 -0
  190. package/dist/src/service-installer.js.map +1 -0
  191. package/dist/src/session-state.d.ts +14 -0
  192. package/dist/src/session-state.js +19 -0
  193. package/dist/src/session-state.js.map +1 -0
  194. package/dist/src/transport/crypto.d.ts +43 -0
  195. package/dist/src/transport/crypto.js +78 -0
  196. package/dist/src/transport/crypto.js.map +1 -0
  197. package/dist/src/transport/lan-server.d.ts +33 -0
  198. package/dist/src/transport/lan-server.js +105 -0
  199. package/dist/src/transport/lan-server.js.map +1 -0
  200. package/dist/src/transport/local-hosts.d.ts +17 -0
  201. package/dist/src/transport/local-hosts.js +30 -0
  202. package/dist/src/transport/local-hosts.js.map +1 -0
  203. package/dist/src/transport/mdns-advertiser.d.ts +83 -0
  204. package/dist/src/transport/mdns-advertiser.js +282 -0
  205. package/dist/src/transport/mdns-advertiser.js.map +1 -0
  206. package/dist/src/transport/message-io.d.ts +33 -0
  207. package/dist/src/transport/message-io.js +87 -0
  208. package/dist/src/transport/message-io.js.map +1 -0
  209. package/dist/src/transport/outbound-log.d.ts +24 -0
  210. package/dist/src/transport/outbound-log.js +78 -0
  211. package/dist/src/transport/outbound-log.js.map +1 -0
  212. package/dist/src/transport/relay-client.d.ts +19 -0
  213. package/dist/src/transport/relay-client.js +27 -0
  214. package/dist/src/transport/relay-client.js.map +1 -0
  215. package/dist/src/transport/secure-channel.d.ts +33 -0
  216. package/dist/src/transport/secure-channel.js +81 -0
  217. package/dist/src/transport/secure-channel.js.map +1 -0
  218. package/dist/src/transport/server-handshake.d.ts +49 -0
  219. package/dist/src/transport/server-handshake.js +137 -0
  220. package/dist/src/transport/server-handshake.js.map +1 -0
  221. package/dist/src/transport/session-handler.d.ts +19 -0
  222. package/dist/src/transport/session-handler.js +134 -0
  223. package/dist/src/transport/session-handler.js.map +1 -0
  224. package/dist/src/transport/session-registry.d.ts +58 -0
  225. package/dist/src/transport/session-registry.js +91 -0
  226. package/dist/src/transport/session-registry.js.map +1 -0
  227. package/dist/src/transport/trust-store.d.ts +23 -0
  228. package/dist/src/transport/trust-store.js +33 -0
  229. package/dist/src/transport/trust-store.js.map +1 -0
  230. package/dist/src/transport/ws-adapter.d.ts +7 -0
  231. package/dist/src/transport/ws-adapter.js +16 -0
  232. package/dist/src/transport/ws-adapter.js.map +1 -0
  233. package/dist/src/version.d.ts +1 -0
  234. package/dist/src/version.js +13 -0
  235. package/dist/src/version.js.map +1 -0
  236. package/dist/src/workspace/browse-service.d.ts +10 -0
  237. package/dist/src/workspace/browse-service.js +97 -0
  238. package/dist/src/workspace/browse-service.js.map +1 -0
  239. package/dist/src/workspace/checkpoint-service.d.ts +21 -0
  240. package/dist/src/workspace/checkpoint-service.js +219 -0
  241. package/dist/src/workspace/checkpoint-service.js.map +1 -0
  242. package/dist/src/workspace/path-guard.d.ts +7 -0
  243. package/dist/src/workspace/path-guard.js +51 -0
  244. package/dist/src/workspace/path-guard.js.map +1 -0
  245. package/dist/src/workspace/workspace-service.d.ts +8 -0
  246. package/dist/src/workspace/workspace-service.js +111 -0
  247. package/dist/src/workspace/workspace-service.js.map +1 -0
  248. package/package.json +46 -0
  249. package/scripts/extract-gemini-hook.mjs +16 -0
  250. package/scripts/fake-approval-bridge.mjs +23 -0
  251. package/scripts/install-service-linux.sh +38 -0
  252. package/scripts/install-service-macos.sh +38 -0
  253. package/scripts/install-service-windows.ps1 +26 -0
  254. package/scripts/test-gemini-hook-e2e.mjs +168 -0
  255. package/scripts/write-gemini-settings.mjs +31 -0
@@ -0,0 +1,486 @@
1
+ /**
2
+ * Claude Code adapter (real agent).
3
+ *
4
+ * Claude Code does NOT speak the generic bridge agent IPC. Each turn spawns
5
+ * `claude -p <prompt> --output-format stream-json --verbose --include-partial-messages`
6
+ * as a one-shot process and maps its JSONL event stream onto the bridge's agent
7
+ * events (same one-shot pattern as the OpenCode adapter). Session continuity is
8
+ * preserved by capturing `session_id` from the stream and passing `--resume` on
9
+ * the next turn.
10
+ *
11
+ * Critical detail: the prompt is passed as an argv element and spawned with
12
+ * `shell:false` (no shell interpolation), and stdin is IGNORED.
13
+ *
14
+ * Captured stream-json event shapes (one JSON object per line), verified against
15
+ * `claude` 2.x:
16
+ * { "type":"system", "subtype":"init", "session_id":"…", "model":"…" }
17
+ * { "type":"stream_event", "event":{ "type":"content_block_delta", "delta":{ "type":"text_delta", "text":"…" } }, "session_id":"…" }
18
+ * { "type":"assistant", "message":{ "content":[ { "type":"text", "text":"…" } ] }, "session_id":"…" }
19
+ * { "type":"result", "subtype":"success", "is_error":false, "result":"<final text>", "session_id":"…" }
20
+ *
21
+ * See bridge/FOR-DEV.md (agent adapters) and bridge/docs/testing.md (validating adapters).
22
+ */
23
+ import { createInterface } from 'node:readline';
24
+ import { BaseAgentAdapter } from './base-adapter.js';
25
+ import { extractToolResults, extractToolUses, toolUseToBlock, } from './claude-tools.js';
26
+ import { effortValues, reasoningOption, reasoningValue, withOptions } from './run-options.js';
27
+ import { defaultSpawn } from './spawn.js';
28
+ const CLAUDE_CAPABILITIES = {
29
+ planMode: true,
30
+ streaming: true,
31
+ approvals: true,
32
+ forking: true,
33
+ images: true,
34
+ reportsContextUsage: true,
35
+ };
36
+ /**
37
+ * Stable `--model` aliases Claude Code accepts. Claude Code has no enumerate
38
+ * command (verified against `claude` 2.x `--help`): `--model` takes an alias or
39
+ * a full id, and the alias is the plug-and-play routing key — it always resolves
40
+ * to the latest model of that tier the account can use. The concrete version a
41
+ * run resolved to is reported in the `system/init` event and surfaced via the
42
+ * `model_resolved` stream event (so the user can see e.g. `opus → claude-opus-4-8`).
43
+ */
44
+ const CLAUDE_MODEL_ALIASES = ['opus', 'sonnet', 'haiku'];
45
+ /** Human-facing labels for the stable aliases. */
46
+ const CLAUDE_ALIAS_LABELS = {
47
+ opus: 'Opus',
48
+ sonnet: 'Sonnet',
49
+ haiku: 'Haiku',
50
+ };
51
+ /**
52
+ * Reasoning-effort levels Claude Code's `--effort` flag accepts (verified against
53
+ * `claude --help`: low, medium, high, xhigh, max). Claude Code has no enumerate
54
+ * API, so this is a maintained table — kept in lock-step with the CLI, the same
55
+ * way the model aliases are. (`ultrathink` and friends are prompt-level thinking
56
+ * triggers, NOT `--effort` levels, so they don't belong here.)
57
+ */
58
+ const CLAUDE_EFFORT_LEVELS = ['low', 'medium', 'high', 'xhigh', 'max'];
59
+ /** Reasoning-effort knob advertised on every Claude model. */
60
+ const CLAUDE_REASONING_OPTION = reasoningOption(effortValues(CLAUDE_EFFORT_LEVELS));
61
+ /**
62
+ * Context-window size (tokens) for a Claude model id or alias, so the phone can
63
+ * show context usage as a percentage. Fable/Opus/Sonnet are 1M, Haiku is 200K
64
+ * (matches the current model catalog); unknown ids return undefined.
65
+ */
66
+ export function claudeContextWindow(model) {
67
+ if (!model)
68
+ return undefined;
69
+ const m = model.toLowerCase();
70
+ if (m.includes('haiku'))
71
+ return 200_000;
72
+ if (m.includes('fable') || m.includes('opus') || m.includes('sonnet'))
73
+ return 1_000_000;
74
+ return undefined;
75
+ }
76
+ /** Sum the context-occupying token counts from a Claude `result.usage` object. */
77
+ export function claudeUsageTokens(usage) {
78
+ if (!isRecord(usage))
79
+ return undefined;
80
+ const count = (key) => typeof usage[key] === 'number' ? usage[key] : 0;
81
+ const total = count('input_tokens') +
82
+ count('cache_read_input_tokens') +
83
+ count('cache_creation_input_tokens') +
84
+ count('output_tokens');
85
+ return total > 0 ? total : undefined;
86
+ }
87
+ /** Parse one `claude … --output-format stream-json` line, or null if it isn't JSON. */
88
+ export function parseClaudeLine(line) {
89
+ const trimmed = line.trim();
90
+ if (!trimmed)
91
+ return null;
92
+ let parsed;
93
+ try {
94
+ parsed = JSON.parse(trimmed);
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ const sessionId = typeof parsed['session_id'] === 'string' ? parsed['session_id'] : undefined;
100
+ const base = { sessionId };
101
+ switch (parsed['type']) {
102
+ case 'system': {
103
+ const model = typeof parsed['model'] === 'string' ? parsed['model'] : undefined;
104
+ return { kind: 'init', ...base, ...(model !== undefined ? { model } : {}) };
105
+ }
106
+ case 'stream_event': {
107
+ const event = isRecord(parsed['event']) ? parsed['event'] : undefined;
108
+ if (event && event['type'] === 'content_block_delta') {
109
+ const delta = isRecord(event['delta']) ? event['delta'] : undefined;
110
+ if (delta && delta['type'] === 'text_delta' && typeof delta['text'] === 'string') {
111
+ return { kind: 'delta', ...base, text: delta['text'] };
112
+ }
113
+ // Extended-thinking output streams as `thinking_delta` blocks (the
114
+ // signature_delta blocks that follow carry no readable text → ignored).
115
+ if (delta && delta['type'] === 'thinking_delta' && typeof delta['thinking'] === 'string') {
116
+ return { kind: 'thinking', ...base, text: delta['thinking'] };
117
+ }
118
+ }
119
+ return { kind: 'other', ...base };
120
+ }
121
+ case 'assistant': {
122
+ const message = isRecord(parsed['message']) ? parsed['message'] : undefined;
123
+ const content = message ? message['content'] : undefined;
124
+ const text = extractAssistantText(content);
125
+ const toolUses = extractToolUses(content);
126
+ // Each assistant message carries its own `usage` (token counts including
127
+ // the full input context at that point) — a fallback for turns whose final
128
+ // `result` event omits usage, so the context meter still fills in.
129
+ const usage = message && isRecord(message['usage']) ? message['usage'] : undefined;
130
+ return {
131
+ kind: 'assistant_text',
132
+ ...base,
133
+ text,
134
+ ...(toolUses.length > 0 ? { toolUses } : {}),
135
+ ...(usage !== undefined ? { usage } : {}),
136
+ };
137
+ }
138
+ case 'user': {
139
+ const message = isRecord(parsed['message']) ? parsed['message'] : undefined;
140
+ const toolResults = extractToolResults(message ? message['content'] : undefined);
141
+ return { kind: 'tool_result', ...base, ...(toolResults.length > 0 ? { toolResults } : {}) };
142
+ }
143
+ case 'result': {
144
+ const isError = parsed['is_error'] === true || parsed['subtype'] !== 'success';
145
+ const text = typeof parsed['result'] === 'string' ? parsed['result'] : undefined;
146
+ return {
147
+ kind: 'result',
148
+ ...base,
149
+ text,
150
+ isError,
151
+ ...(parsed['usage'] !== undefined ? { usage: parsed['usage'] } : {}),
152
+ };
153
+ }
154
+ default:
155
+ return { kind: 'other', ...base };
156
+ }
157
+ }
158
+ export class ClaudeCodeAdapter extends BaseAgentAdapter {
159
+ agentId = 'claude-code';
160
+ capabilities = CLAUDE_CAPABILITIES;
161
+ #binaryPath;
162
+ #prependArgs;
163
+ #defaultModel;
164
+ #pinnedModels;
165
+ #permissionMode;
166
+ #interactiveApprovals;
167
+ #approvalHook;
168
+ #spawn;
169
+ /** threadId → Claude session id, for `--resume` continuity. */
170
+ #sessionByThread = new Map();
171
+ /** turnId → in-flight run, for cancellation. */
172
+ #active = new Map();
173
+ #defaultCwd = process.cwd();
174
+ /** Native Claude session id for a thread (on-disk history-fallback locator). */
175
+ nativeSessionId(threadId) {
176
+ return this.#sessionByThread.get(threadId);
177
+ }
178
+ constructor(options = {}) {
179
+ super();
180
+ this.#binaryPath = options.binaryPath ?? 'claude';
181
+ this.#prependArgs = options.prependArgs ?? [];
182
+ this.#defaultModel = options.defaultModel;
183
+ this.#pinnedModels = options.pinnedModels ?? [];
184
+ this.#permissionMode = options.permissionMode ?? 'acceptEdits';
185
+ this.#interactiveApprovals = options.interactiveApprovals ?? false;
186
+ this.#approvalHook = options.approvalHook;
187
+ this.#spawn = options.spawnFn ?? defaultSpawn;
188
+ }
189
+ get defaultModel() {
190
+ return this.#defaultModel;
191
+ }
192
+ start(config) {
193
+ if (config.cwd)
194
+ this.#defaultCwd = config.cwd;
195
+ return Promise.resolve();
196
+ }
197
+ stop() {
198
+ for (const run of this.#active.values()) {
199
+ run.child.kill();
200
+ }
201
+ this.#active.clear();
202
+ return Promise.resolve();
203
+ }
204
+ sendTurn(options) {
205
+ const { threadId, turnId, text } = options;
206
+ const cwd = options.cwd ?? this.#defaultCwd;
207
+ const model = options.service ?? this.#defaultModel;
208
+ const sessionId = this.#sessionByThread.get(threadId);
209
+ // The thread's persisted access mode (chosen on the phone) overrides the
210
+ // adapter's configured posture for THIS turn. Absent → unchanged behaviour.
211
+ const accessMode = options.accessMode;
212
+ // Interactive approvals: inject a PreToolUse hook (validated against claude
213
+ // 2.1.177) that round-trips each tool to the bridge for the user's decision.
214
+ // The hook stays in play for `requestApproval` (and when no mode is set);
215
+ // `approveForMe`/`fullAccess` explicitly bypass it so the agent isn't asked.
216
+ const hookConfigured = this.#interactiveApprovals && this.#approvalHook !== undefined;
217
+ const allowHook = (accessMode === undefined || accessMode === 'requestApproval') && hookConfigured;
218
+ const hookUrl = allowHook ? this.#approvalHook.url() : undefined;
219
+ const interactive = hookUrl !== undefined;
220
+ // The non-interactive permission posture: the access mode wins when set,
221
+ // else the configured default. `requestApproval` without a usable hook falls
222
+ // back to the configured posture (so the turn isn't denied wholesale).
223
+ const effectiveMode = accessMode === 'approveForMe'
224
+ ? 'acceptEdits'
225
+ : accessMode === 'fullAccess'
226
+ ? 'bypassPermissions'
227
+ : this.#permissionMode;
228
+ const args = [
229
+ '-p',
230
+ '--output-format',
231
+ 'stream-json',
232
+ '--verbose',
233
+ '--include-partial-messages',
234
+ ];
235
+ if (interactive) {
236
+ const settings = JSON.stringify({
237
+ hooks: {
238
+ PreToolUse: [
239
+ {
240
+ matcher: '*',
241
+ hooks: [{ type: 'command', command: `node "${this.#approvalHook.scriptPath}"` }],
242
+ },
243
+ ],
244
+ },
245
+ });
246
+ // `--permission-mode default` is REQUIRED for the PreToolUse hook to run
247
+ // (validated against claude 2.1.177: without it, headless `-p` doesn't
248
+ // consult the hook and denies). The hook is then the gate.
249
+ args.push('--settings', settings, '--permission-mode', 'default');
250
+ }
251
+ else if (effectiveMode === 'acceptEdits') {
252
+ args.push('--permission-mode', 'acceptEdits');
253
+ }
254
+ else if (effectiveMode === 'bypassPermissions') {
255
+ args.push('--dangerously-skip-permissions');
256
+ }
257
+ if (model)
258
+ args.push('--model', model);
259
+ // Reasoning effort (low|medium|high|xhigh|max). Pass-through — the CLI
260
+ // validates the level; `claude --effort` is a session flag (verified
261
+ // against `claude --help`). Reads the `reasoning` knob, then legacy effort.
262
+ const effort = reasoningValue(options);
263
+ if (effort)
264
+ args.push('--effort', effort);
265
+ if (sessionId)
266
+ args.push('--resume', sessionId);
267
+ args.push(text);
268
+ const spawnExtra = interactive
269
+ ? {
270
+ env: {
271
+ UXNAN_HOOK_URL: hookUrl,
272
+ UXNAN_HOOK_TOKEN: this.#approvalHook.token,
273
+ UXNAN_HOOK_THREAD_ID: threadId,
274
+ },
275
+ }
276
+ : undefined;
277
+ let child;
278
+ try {
279
+ child = this.#spawn(this.#binaryPath, [...this.#prependArgs, ...args], cwd, spawnExtra);
280
+ }
281
+ catch (err) {
282
+ this.emit({
283
+ type: 'turn_error',
284
+ threadId,
285
+ turnId,
286
+ data: { text: `failed to launch claude: ${errorMessage(err)}` },
287
+ });
288
+ return Promise.resolve();
289
+ }
290
+ this.#active.set(turnId, { child, threadId });
291
+ this.emit({ type: 'turn_started', threadId, turnId });
292
+ let full = '';
293
+ let sawPartial = false;
294
+ let sawModel = false;
295
+ let resolvedModel;
296
+ let errored = false;
297
+ let completed = false;
298
+ // The most recent assistant-message usage, used if the `result` event omits
299
+ // its own usage (so the context meter still reports tokens).
300
+ let lastUsage;
301
+ // tool_use id → its (complete) invocation, until the matching tool_result
302
+ // arrives and the two are paired into a structured content block.
303
+ const pendingTools = new Map();
304
+ const reader = createInterface({ input: child.stdout });
305
+ reader.on('line', (line) => {
306
+ const event = parseClaudeLine(line);
307
+ if (!event)
308
+ return;
309
+ if (event.sessionId)
310
+ this.#sessionByThread.set(threadId, event.sessionId);
311
+ // Register tool invocations (with their inputs) so the result can pair.
312
+ if (event.toolUses) {
313
+ for (const tool of event.toolUses)
314
+ pendingTools.set(tool.id, tool);
315
+ }
316
+ // Track the latest assistant-message usage as a completion fallback.
317
+ if (event.kind === 'assistant_text' && event.usage !== undefined) {
318
+ lastUsage = event.usage;
319
+ }
320
+ // A tool_result completes a tool → emit a structured block (command/diff/
321
+ // tool) for the Work log / Changed files sections.
322
+ if (event.kind === 'tool_result' && event.toolResults) {
323
+ for (const result of event.toolResults) {
324
+ const tool = pendingTools.get(result.toolUseId);
325
+ if (!tool)
326
+ continue;
327
+ pendingTools.delete(result.toolUseId);
328
+ this.emit({
329
+ type: 'block',
330
+ threadId,
331
+ turnId,
332
+ data: { content: toolUseToBlock(tool, result) },
333
+ });
334
+ }
335
+ }
336
+ if (event.kind === 'init' && event.model && !sawModel) {
337
+ // Surface the concrete model the alias resolved to (e.g. `opus` →
338
+ // `claude-opus-4-8`) so the phone can show the exact version in use.
339
+ sawModel = true;
340
+ resolvedModel = event.model;
341
+ this.emit({ type: 'model_resolved', threadId, turnId, data: { text: event.model } });
342
+ }
343
+ else if (event.kind === 'delta' && event.text) {
344
+ sawPartial = true;
345
+ full += event.text;
346
+ this.emit({ type: 'delta', threadId, turnId, data: { text: event.text } });
347
+ }
348
+ else if (event.kind === 'thinking' && event.text) {
349
+ // Reasoning chunk — streamed to the phone (and persisted) separately from
350
+ // the answer so it can be shown in a collapsible "thinking" section.
351
+ this.emit({ type: 'thinking', threadId, turnId, data: { text: event.text } });
352
+ }
353
+ else if (event.kind === 'assistant_text' && event.text && !sawPartial) {
354
+ // Fallback when token streaming produced no deltas: emit the complete
355
+ // assistant message text as one chunk.
356
+ full += event.text;
357
+ this.emit({ type: 'delta', threadId, turnId, data: { text: event.text } });
358
+ }
359
+ else if (event.kind === 'result') {
360
+ if (event.isError) {
361
+ errored = true;
362
+ this.emit({
363
+ type: 'turn_error',
364
+ threadId,
365
+ turnId,
366
+ data: { text: event.text && event.text.length > 0 ? event.text : 'claude error' },
367
+ });
368
+ }
369
+ else {
370
+ completed = true;
371
+ // Prefer the streamed text (`full`) — it's the complete narration the
372
+ // user saw. `result.result` is often only the final segment of a
373
+ // tool-using turn, so using it would shrink the message on re-sync and
374
+ // drop earlier paragraphs. Fall back to `result.result` only when no
375
+ // partials streamed.
376
+ const finalText = sawPartial && full.length > 0
377
+ ? full
378
+ : event.text && event.text.length > 0
379
+ ? event.text
380
+ : full;
381
+ const tokens = claudeUsageTokens(event.usage ?? lastUsage);
382
+ const window = claudeContextWindow(resolvedModel ?? model);
383
+ const usage = tokens !== undefined
384
+ ? { tokens, ...(window !== undefined ? { contextWindow: window } : {}) }
385
+ : undefined;
386
+ this.emit({
387
+ type: 'turn_completed',
388
+ threadId,
389
+ turnId,
390
+ data: { text: finalText, ...(usage !== undefined ? { usage } : {}) },
391
+ });
392
+ }
393
+ }
394
+ });
395
+ child.on('error', (err) => {
396
+ reader.close();
397
+ this.#active.delete(turnId);
398
+ if (!errored && !completed) {
399
+ errored = true;
400
+ this.emit({
401
+ type: 'turn_error',
402
+ threadId,
403
+ turnId,
404
+ data: { text: `claude process error: ${err.message}` },
405
+ });
406
+ }
407
+ });
408
+ child.on('close', () => {
409
+ reader.close();
410
+ this.#active.delete(turnId);
411
+ if (!completed && !errored) {
412
+ // No terminal `result` line arrived (e.g. killed): complete with what we have.
413
+ this.emit({ type: 'turn_completed', threadId, turnId, data: { text: full } });
414
+ }
415
+ });
416
+ return Promise.resolve();
417
+ }
418
+ cancelTurn(threadId, turnId) {
419
+ const run = this.#active.get(turnId);
420
+ if (run) {
421
+ run.child.kill();
422
+ this.#active.delete(turnId);
423
+ this.emit({ type: 'turn_aborted', threadId, turnId });
424
+ }
425
+ return Promise.resolve();
426
+ }
427
+ /**
428
+ * Claude Code has no model-list command. Expose the stable `--model` aliases
429
+ * (each tracks the latest model of its tier the account can use — the concrete
430
+ * version is reported per-run via the `model_resolved` event), followed by any
431
+ * concrete versions pinned in config. Pinned ids that collide with an alias
432
+ * are dropped so the alias (the "latest" entry) wins.
433
+ */
434
+ listModels() {
435
+ const def = this.#defaultModel;
436
+ const aliasModels = CLAUDE_MODEL_ALIASES.map((alias) => {
437
+ const label = CLAUDE_ALIAS_LABELS[alias] ?? alias;
438
+ return {
439
+ id: alias,
440
+ // The "(latest)" suffix flags that the alias auto-tracks the newest
441
+ // model; the picker also shows the bare alias id beneath it.
442
+ displayName: `${label} (latest)`,
443
+ description: `Always the newest ${label} your account can use`,
444
+ isDefault: def === alias,
445
+ };
446
+ });
447
+ const aliasIds = new Set(CLAUDE_MODEL_ALIASES);
448
+ const seen = new Set(aliasIds);
449
+ const pinnedModels = [];
450
+ for (const spec of this.#pinnedModels) {
451
+ const id = spec.id.trim();
452
+ if (!id || seen.has(id))
453
+ continue;
454
+ seen.add(id);
455
+ pinnedModels.push({
456
+ id,
457
+ displayName: spec.displayName && spec.displayName.length > 0 ? spec.displayName : id,
458
+ ...(spec.description && spec.description.length > 0
459
+ ? { description: spec.description }
460
+ : {}),
461
+ isDefault: def === id,
462
+ });
463
+ }
464
+ // Every Claude model accepts the same `--effort` levels, so advertise the
465
+ // reasoning knob on each.
466
+ return Promise.resolve(withOptions([...aliasModels, ...pinnedModels], [CLAUDE_REASONING_OPTION]));
467
+ }
468
+ }
469
+ function extractAssistantText(content) {
470
+ if (!Array.isArray(content))
471
+ return '';
472
+ let text = '';
473
+ for (const block of content) {
474
+ if (isRecord(block) && block['type'] === 'text' && typeof block['text'] === 'string') {
475
+ text += block['text'];
476
+ }
477
+ }
478
+ return text;
479
+ }
480
+ function isRecord(value) {
481
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
482
+ }
483
+ function errorMessage(err) {
484
+ return err instanceof Error ? err.message : String(err);
485
+ }
486
+ //# sourceMappingURL=claude-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../../../src/adapters/claude-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /** A complete tool invocation parsed from an `assistant` message. */
2
+ export interface ClaudeToolUse {
3
+ id: string;
4
+ name: string;
5
+ input: Record<string, unknown>;
6
+ }
7
+ /** A tool result parsed from a `user` message. */
8
+ export interface ClaudeToolResult {
9
+ toolUseId: string;
10
+ text: string;
11
+ isError: boolean;
12
+ }
13
+ /** Extracts the `tool_use` blocks from an `assistant` message's content. */
14
+ export declare function extractToolUses(content: unknown): ClaudeToolUse[];
15
+ /** Extracts the `tool_result` blocks from a `user` message's content. */
16
+ export declare function extractToolResults(content: unknown): ClaudeToolResult[];
17
+ /** A tool_result's content is a string or an array of `{type:'text', text}`. */
18
+ export declare function extractResultText(content: unknown): string;
19
+ /**
20
+ * Maps a paired tool_use + tool_result onto a MessageContent block:
21
+ * Bash → `command_execution`, edit/write tools → `diff`, everything else →
22
+ * a generic `tool` block. Returns the JSON the phone decodes via
23
+ * `MessageContent.fromJson`.
24
+ */
25
+ export declare function toolUseToBlock(tool: ClaudeToolUse, result: ClaudeToolResult): Record<string, unknown>;