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,48 @@
1
+ /**
2
+ * Maps Gemini CLI tool events (`tool_use` + `tool_result` from the `stream-json`
3
+ * output) onto the shared structured content blocks the phone renders in the Work
4
+ * log and Changed files. Mirrors `codex-tools.ts` / `pi-tools.ts`.
5
+ *
6
+ * Gemini emits a `tool_use` (name + id + parameters) and, later, a matching
7
+ * `tool_result` (status + optional output) keyed by `tool_id`; the adapter pairs
8
+ * them and calls {@link geminiToolBlock} once the result arrives.
9
+ *
10
+ * Tool schemas (verified live against gemini-cli 0.45.2 / inferred from the public
11
+ * Gemini CLI tool set):
12
+ * - `write_file` → `{ file_path, content }` → write diff block
13
+ * - `replace` → `{ file_path, old_string, new_string }` → edit diff block
14
+ * - `run_shell_command` → `{ command }` → command block
15
+ * - everything else (`read_file`, `list_directory`, `glob`, `search_file_content`,
16
+ * `google_web_search`, …) → generic tool block
17
+ */
18
+ import { commandBlock, editDiffBlock, toolBlock, writeDiffBlock } from './content-blocks.js';
19
+ /** Internal Gemini bookkeeping tools that are noise in the Work log — skipped. */
20
+ const INTERNAL_TOOLS = new Set(['update_topic']);
21
+ /** Whether this tool is Gemini-internal bookkeeping that should not surface. */
22
+ export function isInternalGeminiTool(toolName) {
23
+ return INTERNAL_TOOLS.has(toolName);
24
+ }
25
+ /** Build the structured block for one completed Gemini tool call. */
26
+ export function geminiToolBlock(toolName, toolId, params, output, isError) {
27
+ if (toolName === 'write_file') {
28
+ const file = str(params['file_path']);
29
+ if (file)
30
+ return writeDiffBlock(file, str(params['content']) ?? '');
31
+ }
32
+ if (toolName === 'replace') {
33
+ const file = str(params['file_path']);
34
+ if (file) {
35
+ return editDiffBlock(file, str(params['old_string']) ?? '', str(params['new_string']) ?? '');
36
+ }
37
+ }
38
+ if (toolName === 'run_shell_command') {
39
+ const command = str(params['command']);
40
+ if (command)
41
+ return commandBlock(command, output, isError);
42
+ }
43
+ return toolBlock(toolName, toolId, params, output, isError);
44
+ }
45
+ function str(value) {
46
+ return typeof value === 'string' ? value : undefined;
47
+ }
48
+ //# sourceMappingURL=gemini-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-tools.js","sourceRoot":"","sources":["../../../src/adapters/gemini-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE7F,kFAAkF;AAClF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAEjD,gFAAgF;AAChF,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,MAAc,EACd,MAA+B,EAC/B,MAAc,EACd,OAAgB;IAEhB,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QACtC,IAAI,IAAI;YAAE,OAAO,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QACtC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACvC,IAAI,OAAO;YAAE,OAAO,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { AgentCapabilities, AgentConfig, AgentId, AgentModel, SendTurnOptions } from '@uxnan/shared';
2
+ import { BaseAgentAdapter } from './base-adapter.js';
3
+ import { type SpawnFn } from './spawn.js';
4
+ export type { SpawnFn, SpawnedProcess } from './spawn.js';
5
+ /**
6
+ * Context-occupying token count from an OpenCode `step_finish.part.tokens`
7
+ * object. The real shape (verified against opencode 0.x) is
8
+ * `{ total, input, output, reasoning, cache: { read, write } }` where
9
+ * `total === input + output + reasoning`. Prefer the reported `total`; fall
10
+ * back to summing the distinct buckets (cache read/write are subsets of
11
+ * `input`, so not added), then to any top-level numeric field. Returns
12
+ * undefined when there is nothing to report.
13
+ */
14
+ export declare function openCodeUsageTokens(tokens: unknown): number | undefined;
15
+ export interface OpenCodeAdapterOptions {
16
+ /** Executable to spawn (resolved exe path; see resolve-opencode.ts). */
17
+ binaryPath?: string;
18
+ /** Default model (`provider/model`) when the thread/turn doesn't pick one. */
19
+ defaultModel?: string;
20
+ /** Injected spawn function (tests). */
21
+ spawnFn?: SpawnFn;
22
+ }
23
+ /** A normalized OpenCode event extracted from one `--format json` line. */
24
+ export interface OpenCodeEvent {
25
+ kind: 'text' | 'reasoning' | 'tool' | 'error' | 'finish' | 'other';
26
+ sessionId?: string;
27
+ partId?: string;
28
+ text?: string;
29
+ /** `tool`: the tool name (`bash`/`edit`/`write`/…). */
30
+ toolName?: string;
31
+ /** `tool`: lifecycle status (`pending`/`running`/`completed`/`error`). */
32
+ toolStatus?: string;
33
+ /** `tool`: the tool's arguments. */
34
+ toolInput?: Record<string, unknown>;
35
+ /** `tool`: the tool's output, when finished. */
36
+ toolOutput?: string;
37
+ /** `finish`: context-occupying token count from `step_finish.part.tokens`. */
38
+ tokens?: number;
39
+ }
40
+ /** Parse one `opencode run --format json` line, or null if it isn't JSON. */
41
+ export declare function parseOpenCodeLine(line: string): OpenCodeEvent | null;
42
+ export declare class OpenCodeAdapter extends BaseAgentAdapter {
43
+ #private;
44
+ readonly agentId: AgentId;
45
+ readonly capabilities: AgentCapabilities;
46
+ /** Native OpenCode session id for a thread (on-disk history-fallback locator). */
47
+ nativeSessionId(threadId: string): string | undefined;
48
+ constructor(options?: OpenCodeAdapterOptions);
49
+ get defaultModel(): string | undefined;
50
+ start(config: AgentConfig): Promise<void>;
51
+ /**
52
+ * Populate the per-model context-window cache from `opencode models --verbose`
53
+ * (once). Best-effort: a spawn/parse failure leaves the cache empty and usage
54
+ * stays count-only.
55
+ */
56
+ loadContextWindows(): Promise<void>;
57
+ stop(): Promise<void>;
58
+ sendTurn(options: SendTurnOptions): Promise<void>;
59
+ cancelTurn(threadId: string, turnId: string): Promise<void>;
60
+ /** Run `opencode models` and return the `provider/model` ids it reports. */
61
+ listModels(): Promise<AgentModel[]>;
62
+ }
63
+ /** Parse `opencode models` output into a unique list of `provider/model` ids. */
64
+ export declare function parseModelList(stdout: string): string[];
65
+ /**
66
+ * Parse `opencode models --verbose` into a `provider/model` → context-window map.
67
+ *
68
+ * The verbose output is a sequence of `provider/model` header lines, each
69
+ * followed by that model's pretty-printed JSON (`{ … "limit": { "context": N … } }`).
70
+ * We track the current header and capture the first `"context": <number>` that
71
+ * follows it (only `limit.context` is a numeric `context`; capabilities use a
72
+ * `"type": "context"` string). Models without a window are simply absent.
73
+ */
74
+ export declare function parseOpenCodeModelWindows(verboseStdout: string): Map<string, number>;
@@ -0,0 +1,418 @@
1
+ /**
2
+ * OpenCode adapter (MVP-priority real agent).
3
+ *
4
+ * OpenCode does NOT speak the generic bridge agent IPC. Instead, each turn spawns
5
+ * `opencode run --format json` as a one-shot process and maps its newline-JSON
6
+ * event stream onto the bridge's agent events. Session continuity is preserved by
7
+ * capturing the `sessionID` from the first turn and passing `--session` on the next.
8
+ *
9
+ * Critical detail: OpenCode blocks reading stdin when stdin is an open pipe, so we
10
+ * spawn with stdin IGNORED (closed). The prompt is passed as an argv element and
11
+ * spawned with `shell:false`, so it is never interpolated into a shell.
12
+ *
13
+ * Captured `--format json` event shape (one JSON object per line):
14
+ * { "type":"step_start", "sessionID":"ses_…", "part":{…} }
15
+ * { "type":"text", "sessionID":"ses_…", "part":{ "id":"prt_…","type":"text","text":"…" } }
16
+ * { "type":"step_finish", "sessionID":"ses_…", "part":{ "tokens":{…}, "cost":… } }
17
+ * { "type":"error", "sessionID":"ses_…", "error":{ "data":{ "message":"…" } } }
18
+ *
19
+ * See bridge/FOR-DEV.md (agent adapters) and bridge/docs/testing.md (validating adapters).
20
+ */
21
+ import { spawn } from 'node:child_process';
22
+ import { createInterface } from 'node:readline';
23
+ import { BaseAgentAdapter } from './base-adapter.js';
24
+ import { opencodeToolBlock } from './opencode-tools.js';
25
+ import { reasoningValue } from './run-options.js';
26
+ import { defaultSpawn } from './spawn.js';
27
+ const OPENCODE_CAPABILITIES = {
28
+ planMode: false,
29
+ streaming: true,
30
+ approvals: false,
31
+ forking: true,
32
+ images: true,
33
+ // OpenCode reports per-step token counts (`step_finish.part.tokens`), surfaced
34
+ // as `usage.tokens` so the phone shows the context indicator.
35
+ reportsContextUsage: true,
36
+ };
37
+ /**
38
+ * Context-occupying token count from an OpenCode `step_finish.part.tokens`
39
+ * object. The real shape (verified against opencode 0.x) is
40
+ * `{ total, input, output, reasoning, cache: { read, write } }` where
41
+ * `total === input + output + reasoning`. Prefer the reported `total`; fall
42
+ * back to summing the distinct buckets (cache read/write are subsets of
43
+ * `input`, so not added), then to any top-level numeric field. Returns
44
+ * undefined when there is nothing to report.
45
+ */
46
+ export function openCodeUsageTokens(tokens) {
47
+ if (!isRecord(tokens))
48
+ return undefined;
49
+ const num = (key) => typeof tokens[key] === 'number' ? tokens[key] : 0;
50
+ if (num('total') > 0)
51
+ return num('total');
52
+ const known = num('input') + num('output') + num('reasoning');
53
+ if (known > 0)
54
+ return known;
55
+ let sum = 0;
56
+ for (const value of Object.values(tokens)) {
57
+ if (typeof value === 'number')
58
+ sum += value;
59
+ }
60
+ return sum > 0 ? sum : undefined;
61
+ }
62
+ /** Parse one `opencode run --format json` line, or null if it isn't JSON. */
63
+ export function parseOpenCodeLine(line) {
64
+ const trimmed = line.trim();
65
+ if (!trimmed)
66
+ return null;
67
+ let parsed;
68
+ try {
69
+ parsed = JSON.parse(trimmed);
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ const sessionId = typeof parsed['sessionID'] === 'string' ? parsed['sessionID'] : undefined;
75
+ const part = isRecord(parsed['part']) ? parsed['part'] : undefined;
76
+ const partId = part && typeof part['id'] === 'string' ? part['id'] : undefined;
77
+ const base = { sessionId, partId };
78
+ switch (parsed['type']) {
79
+ case 'text':
80
+ return { kind: 'text', ...base, text: stringOr(part?.['text'], '') };
81
+ case 'reasoning':
82
+ return { kind: 'reasoning', ...base, text: stringOr(part?.['text'], '') };
83
+ case 'tool_use': {
84
+ const state = part && isRecord(part['state']) ? part['state'] : undefined;
85
+ return {
86
+ kind: 'tool',
87
+ ...base,
88
+ toolName: stringOr(part?.['tool'], ''),
89
+ toolStatus: stringOr(state?.['status'], ''),
90
+ toolInput: state && isRecord(state['input']) ? state['input'] : {},
91
+ toolOutput: stringOr(state?.['output'], ''),
92
+ };
93
+ }
94
+ case 'step_finish':
95
+ return { kind: 'finish', ...base, tokens: openCodeUsageTokens(part?.['tokens']) };
96
+ case 'error':
97
+ return { kind: 'error', ...base, text: readErrorMessage(parsed['error']) };
98
+ default:
99
+ return { kind: 'other', ...base };
100
+ }
101
+ }
102
+ export class OpenCodeAdapter extends BaseAgentAdapter {
103
+ agentId = 'opencode';
104
+ capabilities = OPENCODE_CAPABILITIES;
105
+ #binaryPath;
106
+ #defaultModel;
107
+ #spawn;
108
+ /** threadId → OpenCode session id, for `--session` continuity. */
109
+ #sessionByThread = new Map();
110
+ /** turnId → in-flight run, for cancellation. */
111
+ #active = new Map();
112
+ /** model id → context-window tokens, from `opencode models --verbose`. */
113
+ #contextWindowByModel = new Map();
114
+ #windowsLoaded = false;
115
+ #defaultCwd = process.cwd();
116
+ /** Native OpenCode session id for a thread (on-disk history-fallback locator). */
117
+ nativeSessionId(threadId) {
118
+ return this.#sessionByThread.get(threadId);
119
+ }
120
+ constructor(options = {}) {
121
+ super();
122
+ this.#binaryPath = options.binaryPath ?? 'opencode';
123
+ this.#defaultModel = options.defaultModel;
124
+ this.#spawn = options.spawnFn ?? defaultSpawn;
125
+ }
126
+ get defaultModel() {
127
+ return this.#defaultModel;
128
+ }
129
+ start(config) {
130
+ if (config.cwd)
131
+ this.#defaultCwd = config.cwd;
132
+ // Warm the per-model context-window cache so the first turn can already
133
+ // emit usage.contextWindow (→ a percentage on the phone).
134
+ void this.loadContextWindows();
135
+ return Promise.resolve();
136
+ }
137
+ /**
138
+ * Populate the per-model context-window cache from `opencode models --verbose`
139
+ * (once). Best-effort: a spawn/parse failure leaves the cache empty and usage
140
+ * stays count-only.
141
+ */
142
+ loadContextWindows() {
143
+ if (this.#windowsLoaded)
144
+ return Promise.resolve();
145
+ this.#windowsLoaded = true;
146
+ return new Promise((resolve) => {
147
+ let child;
148
+ try {
149
+ child = this.#spawn(this.#binaryPath, ['models', '--verbose'], this.#defaultCwd);
150
+ }
151
+ catch {
152
+ resolve();
153
+ return;
154
+ }
155
+ let out = '';
156
+ const collect = (chunk) => {
157
+ out += String(chunk);
158
+ };
159
+ child.stdout.on('data', collect);
160
+ child.stderr?.on('data', collect);
161
+ child.on('error', () => resolve());
162
+ child.on('close', () => {
163
+ for (const [id, win] of parseOpenCodeModelWindows(out)) {
164
+ this.#contextWindowByModel.set(id, win);
165
+ }
166
+ resolve();
167
+ });
168
+ });
169
+ }
170
+ stop() {
171
+ for (const run of this.#active.values()) {
172
+ run.child.kill();
173
+ }
174
+ this.#active.clear();
175
+ return Promise.resolve();
176
+ }
177
+ sendTurn(options) {
178
+ const { threadId, turnId, text } = options;
179
+ const cwd = options.cwd ?? this.#defaultCwd;
180
+ const model = options.service ?? this.#defaultModel;
181
+ const sessionId = this.#sessionByThread.get(threadId);
182
+ // Warm the context-window cache (once) so this/next turn can emit a window.
183
+ void this.loadContextWindows();
184
+ const args = ['run', '--format', 'json'];
185
+ if (model)
186
+ args.push('--model', model);
187
+ // OpenCode's reasoning knob is the provider/model `--variant`; it reads the
188
+ // generic `reasoning` value, then legacy effort. (Variants are
189
+ // provider-specific and enumerated at runtime, so they aren't advertised.)
190
+ const variant = reasoningValue(options);
191
+ if (variant)
192
+ args.push('--variant', variant);
193
+ if (sessionId)
194
+ args.push('--session', sessionId);
195
+ if (cwd)
196
+ args.push('--dir', cwd);
197
+ args.push(text);
198
+ let child;
199
+ try {
200
+ child = this.#spawn(this.#binaryPath, args, cwd);
201
+ }
202
+ catch (err) {
203
+ this.emit({
204
+ type: 'turn_error',
205
+ threadId,
206
+ turnId,
207
+ data: { text: `failed to launch opencode: ${errorMessage(err)}` },
208
+ });
209
+ return Promise.resolve();
210
+ }
211
+ this.#active.set(turnId, { child, threadId });
212
+ this.emit({ type: 'turn_started', threadId, turnId });
213
+ const partTexts = new Map();
214
+ const reasoningTexts = new Map();
215
+ const emittedTools = new Set();
216
+ let full = '';
217
+ let errored = false;
218
+ // Latest per-step token count (`step_finish.part.tokens`); emitted as
219
+ // `usage.tokens` on completion so the phone's context indicator fills in.
220
+ let tokens;
221
+ const reader = createInterface({ input: child.stdout });
222
+ reader.on('line', (line) => {
223
+ const event = parseOpenCodeLine(line);
224
+ if (!event)
225
+ return;
226
+ if (event.sessionId)
227
+ this.#sessionByThread.set(threadId, event.sessionId);
228
+ if (event.kind === 'text' && event.text) {
229
+ const delta = this.#deltaFor(partTexts, event.partId, event.text);
230
+ if (delta) {
231
+ full += delta;
232
+ this.emit({ type: 'delta', threadId, turnId, data: { text: delta } });
233
+ }
234
+ }
235
+ else if (event.kind === 'reasoning' && event.text) {
236
+ // Reasoning streams as a (re-sent) part text; emit only the new suffix
237
+ // as a thinking delta.
238
+ const delta = this.#deltaFor(reasoningTexts, event.partId, event.text);
239
+ if (delta) {
240
+ this.emit({ type: 'thinking', threadId, turnId, data: { text: delta } });
241
+ }
242
+ }
243
+ else if (event.kind === 'tool') {
244
+ // Emit the structured block once, when the tool reaches a terminal state.
245
+ const id = event.partId ?? '';
246
+ const status = event.toolStatus;
247
+ if ((status === 'completed' || status === 'error') && !emittedTools.has(id)) {
248
+ emittedTools.add(id);
249
+ this.emit({
250
+ type: 'block',
251
+ threadId,
252
+ turnId,
253
+ data: {
254
+ content: opencodeToolBlock(event.toolName ?? '', id, event.toolInput ?? {}, event.toolOutput ?? '', status === 'error'),
255
+ },
256
+ });
257
+ }
258
+ }
259
+ else if (event.kind === 'finish') {
260
+ // Keep the latest step's token count as the turn's context usage.
261
+ if (event.tokens !== undefined)
262
+ tokens = event.tokens;
263
+ }
264
+ else if (event.kind === 'error') {
265
+ errored = true;
266
+ this.emit({
267
+ type: 'turn_error',
268
+ threadId,
269
+ turnId,
270
+ data: { text: event.text ?? 'opencode error' },
271
+ });
272
+ }
273
+ });
274
+ child.on('error', (err) => {
275
+ reader.close();
276
+ this.#active.delete(turnId);
277
+ if (!errored) {
278
+ errored = true;
279
+ this.emit({
280
+ type: 'turn_error',
281
+ threadId,
282
+ turnId,
283
+ data: { text: `opencode process error: ${err.message}` },
284
+ });
285
+ }
286
+ });
287
+ child.on('close', () => {
288
+ reader.close();
289
+ this.#active.delete(turnId);
290
+ if (!errored) {
291
+ const contextWindow = model !== undefined ? this.#contextWindowByModel.get(model) : undefined;
292
+ const usage = tokens !== undefined
293
+ ? { tokens, ...(contextWindow !== undefined ? { contextWindow } : {}) }
294
+ : undefined;
295
+ this.emit({
296
+ type: 'turn_completed',
297
+ threadId,
298
+ turnId,
299
+ data: { text: full, ...(usage !== undefined ? { usage } : {}) },
300
+ });
301
+ }
302
+ });
303
+ return Promise.resolve();
304
+ }
305
+ cancelTurn(threadId, turnId) {
306
+ const run = this.#active.get(turnId);
307
+ if (run) {
308
+ run.child.kill();
309
+ this.#active.delete(turnId);
310
+ this.emit({ type: 'turn_aborted', threadId, turnId });
311
+ }
312
+ return Promise.resolve();
313
+ }
314
+ /** Run `opencode models` and return the `provider/model` ids it reports. */
315
+ listModels() {
316
+ const def = this.#defaultModel;
317
+ return new Promise((resolve) => {
318
+ let stdout = '';
319
+ let child;
320
+ try {
321
+ child = spawn(this.#binaryPath, ['models'], {
322
+ stdio: ['ignore', 'pipe', 'pipe'],
323
+ windowsHide: true,
324
+ shell: false,
325
+ });
326
+ }
327
+ catch {
328
+ resolve([]);
329
+ return;
330
+ }
331
+ child.stdout.on('data', (chunk) => {
332
+ stdout += chunk.toString('utf-8');
333
+ });
334
+ child.on('error', () => resolve([]));
335
+ child.on('close', () => resolve(parseModelList(stdout).map((id) => ({ id, displayName: id, isDefault: def === id }))));
336
+ });
337
+ }
338
+ /**
339
+ * Emit only the newly-appended suffix for a part. Handles both one-shot text
340
+ * parts and incrementally-updated parts (same id streamed multiple times).
341
+ */
342
+ #deltaFor(partTexts, partId, text) {
343
+ const key = partId ?? '';
344
+ const previous = partTexts.get(key) ?? '';
345
+ let delta;
346
+ if (text.startsWith(previous)) {
347
+ delta = text.slice(previous.length);
348
+ }
349
+ else {
350
+ delta = text;
351
+ }
352
+ partTexts.set(key, text);
353
+ return delta;
354
+ }
355
+ }
356
+ // eslint-disable-next-line no-control-regex
357
+ const ANSI_PATTERN = /\[[0-9;]*m/g;
358
+ /** Parse `opencode models` output into a unique list of `provider/model` ids. */
359
+ export function parseModelList(stdout) {
360
+ const seen = new Set();
361
+ for (const raw of stdout.split(/\r?\n/)) {
362
+ const line = raw.replace(ANSI_PATTERN, '').trim();
363
+ // Model ids look like `provider/model`; skip headers/blank lines.
364
+ if (line.includes('/') && !line.includes(' '))
365
+ seen.add(line);
366
+ }
367
+ return [...seen];
368
+ }
369
+ /**
370
+ * Parse `opencode models --verbose` into a `provider/model` → context-window map.
371
+ *
372
+ * The verbose output is a sequence of `provider/model` header lines, each
373
+ * followed by that model's pretty-printed JSON (`{ … "limit": { "context": N … } }`).
374
+ * We track the current header and capture the first `"context": <number>` that
375
+ * follows it (only `limit.context` is a numeric `context`; capabilities use a
376
+ * `"type": "context"` string). Models without a window are simply absent.
377
+ */
378
+ export function parseOpenCodeModelWindows(verboseStdout) {
379
+ const windows = new Map();
380
+ let currentId;
381
+ for (const raw of verboseStdout.split(/\r?\n/)) {
382
+ const line = raw.replace(ANSI_PATTERN, '').trim();
383
+ // Header line before each model's JSON block: bare `provider/model`.
384
+ if (line.includes('/') && !/[\s{}":]/.test(line)) {
385
+ currentId = line;
386
+ continue;
387
+ }
388
+ const match = line.match(/^"context":\s*(\d+)/);
389
+ if (match && currentId && !windows.has(currentId)) {
390
+ const value = Number(match[1]);
391
+ if (value > 0)
392
+ windows.set(currentId, value);
393
+ }
394
+ }
395
+ return windows;
396
+ }
397
+ function isRecord(value) {
398
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
399
+ }
400
+ function stringOr(value, fallback) {
401
+ return typeof value === 'string' ? value : fallback;
402
+ }
403
+ function readErrorMessage(error) {
404
+ if (isRecord(error)) {
405
+ const data = error['data'];
406
+ if (isRecord(data) && typeof data['message'] === 'string')
407
+ return data['message'];
408
+ if (typeof error['message'] === 'string')
409
+ return error['message'];
410
+ if (typeof error['name'] === 'string')
411
+ return error['name'];
412
+ }
413
+ return 'opencode error';
414
+ }
415
+ function errorMessage(err) {
416
+ return err instanceof Error ? err.message : String(err);
417
+ }
418
+ //# sourceMappingURL=opencode-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-adapter.js","sourceRoot":"","sources":["../../../src/adapters/opencode-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Builds the MessageContent JSON for an OpenCode tool part. */
2
+ export declare function opencodeToolBlock(toolName: string, partId: string, input: Record<string, unknown>, output: string, isError: boolean): Record<string, unknown>;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Maps an OpenCode `tool` part onto a structured MessageContent block.
3
+ *
4
+ * OpenCode's `run --format json` streams `{ type:'tool', part:{ tool, state:{
5
+ * status, input, output } } }` parts. `tool` is the tool name (`bash`, `edit`,
6
+ * `write`, `read`, `grep`, …); `state.input` holds the arguments and
7
+ * `state.output` the result. Field names (`filePath`/`oldString`/`newString`)
8
+ * are OpenCode's tool-arg conventions.
9
+ *
10
+ * ASSUMED SHAPE — needs on-device verification against a real OpenCode turn
11
+ * (the adapter's documented event list didn't include tool parts).
12
+ */
13
+ import { commandBlock, editDiffBlock, extractPlanSteps, planBlock, toolBlock, writeDiffBlock, } from './content-blocks.js';
14
+ function str(value) {
15
+ return typeof value === 'string' ? value : '';
16
+ }
17
+ /** Builds the MessageContent JSON for an OpenCode tool part. */
18
+ export function opencodeToolBlock(toolName, partId, input, output, isError) {
19
+ switch (toolName) {
20
+ case 'bash':
21
+ return commandBlock(str(input['command']), output, isError);
22
+ case 'edit':
23
+ return editDiffBlock(str(input['filePath']), str(input['oldString']), str(input['newString']));
24
+ case 'write':
25
+ return writeDiffBlock(str(input['filePath']), str(input['content']));
26
+ // OpenCode's to-do tool surfaces the plan/task list. FOR-DEV: tool name +
27
+ // input shape ASSUMED (`todowrite`/`todoread`, `{ todos:[…] }`) — verify
28
+ // against a real OpenCode plan turn; a mismatch yields no steps → no block.
29
+ case 'todowrite':
30
+ case 'todoread':
31
+ case 'todo': {
32
+ const steps = extractPlanSteps(input);
33
+ if (steps.length > 0)
34
+ return planBlock(steps);
35
+ return toolBlock(toolName, partId, input, output, isError);
36
+ }
37
+ default:
38
+ return toolBlock(toolName, partId, input, output, isError);
39
+ }
40
+ }
41
+ //# sourceMappingURL=opencode-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-tools.js","sourceRoot":"","sources":["../../../src/adapters/opencode-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,cAAc,GACf,MAAM,qBAAqB,CAAC;AAE7B,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,MAAc,EACd,KAA8B,EAC9B,MAAc,EACd,OAAgB;IAEhB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9D,KAAK,MAAM;YACT,OAAO,aAAa,CAClB,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EACtB,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EACvB,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CACxB,CAAC;QACJ,KAAK,OAAO;YACV,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvE,0EAA0E;QAC1E,yEAAyE;QACzE,4EAA4E;QAC5E,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;QACD;YACE,OAAO,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}