@xyagent/cli 0.0.1

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 (385) hide show
  1. package/README.md +860 -0
  2. package/bin/agentlink +8585 -0
  3. package/bin/agentlink-agent +7 -0
  4. package/bin/agentlink-mcp-stdio +173 -0
  5. package/docs/LOGGING.md +159 -0
  6. package/package.json +38 -0
  7. package/src/core.mjs +320 -0
  8. package/src/tunnel.mjs +291 -0
  9. package/src/tunnel_proxy.mjs +913 -0
  10. package/src/tunnel_service.mjs +699 -0
  11. package/src/tunnel_state.mjs +301 -0
  12. package/src/unified_producer.mjs +259 -0
  13. package/src-ext/README.md +75 -0
  14. package/src-ext/bin.mjs +128 -0
  15. package/src-ext/commands/agent.mjs +66 -0
  16. package/src-ext/commands/help.mjs +31 -0
  17. package/src-ext/commands/pair.mjs +455 -0
  18. package/src-ext/commands/reload.mjs +78 -0
  19. package/src-ext/commands/service.mjs +64 -0
  20. package/src-ext/core/accountResolver.mjs +137 -0
  21. package/src-ext/core/activeRuns.mjs +76 -0
  22. package/src-ext/core/agentlinkToolsBootstrap.mjs +75 -0
  23. package/src-ext/core/agentlinkToolsRegistry.mjs +323 -0
  24. package/src-ext/core/agentlinkToolsServer.mjs +109 -0
  25. package/src-ext/core/approvalGateway.mjs +132 -0
  26. package/src-ext/core/attachAuditLog.mjs +79 -0
  27. package/src-ext/core/attachDenylist.mjs +128 -0
  28. package/src-ext/core/autoTunnelDetector.mjs +98 -0
  29. package/src-ext/core/autoTunnelGateway.mjs +393 -0
  30. package/src-ext/core/autoTunnelWiring.mjs +184 -0
  31. package/src-ext/core/boundedMap.mjs +98 -0
  32. package/src-ext/core/bridgeAttachAutoScanner.mjs +237 -0
  33. package/src-ext/core/bridgeHooks.mjs +168 -0
  34. package/src-ext/core/bridgeSelfUninstall.mjs +133 -0
  35. package/src-ext/core/claudeTrust.mjs +74 -0
  36. package/src-ext/core/codexTrust.mjs +77 -0
  37. package/src-ext/core/cosUploadClient.mjs +326 -0
  38. package/src-ext/core/createWorkspace.mjs +170 -0
  39. package/src-ext/core/daemonRestart.mjs +49 -0
  40. package/src-ext/core/defaultWorkspace.mjs +65 -0
  41. package/src-ext/core/ensureGitRepo.mjs +57 -0
  42. package/src-ext/core/hermesProfile.mjs +75 -0
  43. package/src-ext/core/interruptGateway.mjs +119 -0
  44. package/src-ext/core/interruptRunListener.mjs +106 -0
  45. package/src-ext/core/mcpRuntimeFanout.mjs +236 -0
  46. package/src-ext/core/mcpStdioClient.mjs +316 -0
  47. package/src-ext/core/openclawGatewayClient.mjs +230 -0
  48. package/src-ext/core/pairCodeClient.mjs +331 -0
  49. package/src-ext/core/pairInventory.mjs +59 -0
  50. package/src-ext/core/pathExpand.mjs +34 -0
  51. package/src-ext/core/preprocessAttachments.mjs +113 -0
  52. package/src-ext/core/relayWorker.mjs +284 -0
  53. package/src-ext/core/relayWorkerHttp.mjs +58 -0
  54. package/src-ext/core/scanWorkspaces.mjs +842 -0
  55. package/src-ext/core/sessionSlot.mjs +70 -0
  56. package/src-ext/core/stateMachine.mjs +85 -0
  57. package/src-ext/core/toolsServerLifecycle.mjs +169 -0
  58. package/src-ext/core/unifiedDispatchHandler.mjs +439 -0
  59. package/src-ext/core/usageReporter.mjs +207 -0
  60. package/src-ext/openclaw-plugin/envelope-builder.cjs +619 -0
  61. package/src-ext/openclaw-plugin/index.cjs +1919 -0
  62. package/src-ext/openclaw-plugin/openclaw.plugin.json +20 -0
  63. package/src-ext/openclaw-plugin/package.json +12 -0
  64. package/src-ext/openclaw-plugin/relay-defaults.json +3 -0
  65. package/src-ext/openclaw-plugin/todoTranslatorUtils.cjs +101 -0
  66. package/src-ext/runtime/_shared/cliExec.mjs +138 -0
  67. package/src-ext/runtime/_shared/cosTextRefs.mjs +120 -0
  68. package/src-ext/runtime/_shared/fetchAndBase64Encode.mjs +52 -0
  69. package/src-ext/runtime/_shared/relayObjectToBlock.mjs +307 -0
  70. package/src-ext/runtime/_shared/sessionPicker.mjs +418 -0
  71. package/src-ext/runtime/_shared/slashCommandRouter.mjs +1346 -0
  72. package/src-ext/runtime/_shared/todoTranslatorUtils.mjs +94 -0
  73. package/src-ext/runtime/claude/askUserQuestionTranslator.mjs +241 -0
  74. package/src-ext/runtime/claude/customCommandsCollector.mjs +132 -0
  75. package/src-ext/runtime/claude/handleRequest.mjs +1418 -0
  76. package/src-ext/runtime/claude/index.mjs +160 -0
  77. package/src-ext/runtime/claude/internalCommandNames.mjs +58 -0
  78. package/src-ext/runtime/claude/launcher.mjs +313 -0
  79. package/src-ext/runtime/claude/mcpConfigAdapter.mjs +174 -0
  80. package/src-ext/runtime/claude/mcpConfigWriter.mjs +57 -0
  81. package/src-ext/runtime/claude/modelContextWindow.mjs +30 -0
  82. package/src-ext/runtime/claude/modelScanner.mjs +257 -0
  83. package/src-ext/runtime/claude/permissionInterruptBlock.mjs +86 -0
  84. package/src-ext/runtime/claude/permissionPromptServer.mjs +170 -0
  85. package/src-ext/runtime/claude/permissionPromptServerWorker.mjs +214 -0
  86. package/src-ext/runtime/claude/preflight.mjs +62 -0
  87. package/src-ext/runtime/claude/stdoutParser.mjs +365 -0
  88. package/src-ext/runtime/claude/todoTranslator.mjs +66 -0
  89. package/src-ext/runtime/claude/usageProbe.mjs +576 -0
  90. package/src-ext/runtime/claude/usageProbeStrip.mjs +14 -0
  91. package/src-ext/runtime/codex/codexCustomCommandsCollector.mjs +87 -0
  92. package/src-ext/runtime/codex/elicitationHandler.mjs +91 -0
  93. package/src-ext/runtime/codex/eventMapper.mjs +154 -0
  94. package/src-ext/runtime/codex/handleRequest.mjs +1152 -0
  95. package/src-ext/runtime/codex/index.mjs +142 -0
  96. package/src-ext/runtime/codex/mcpConfigAdapter.mjs +155 -0
  97. package/src-ext/runtime/codex/modelScanner.mjs +305 -0
  98. package/src-ext/runtime/codex/planNotificationHandler.mjs +61 -0
  99. package/src-ext/runtime/codex/preflight.mjs +67 -0
  100. package/src-ext/runtime/hermes/commandBackend.mjs +117 -0
  101. package/src-ext/runtime/hermes/envSetup.mjs +229 -0
  102. package/src-ext/runtime/hermes/gatewayManager.mjs +625 -0
  103. package/src-ext/runtime/hermes/handleRequest.mjs +1257 -0
  104. package/src-ext/runtime/hermes/httpBackend.mjs +219 -0
  105. package/src-ext/runtime/hermes/index.mjs +196 -0
  106. package/src-ext/runtime/hermes/mcpConfigAdapter.mjs +189 -0
  107. package/src-ext/runtime/hermes/preflight.mjs +359 -0
  108. package/src-ext/runtime/hermes/responsesBackend.mjs +276 -0
  109. package/src-ext/runtime/hermes/sessionStore.mjs +78 -0
  110. package/src-ext/runtime/hermes/todoTranslator.mjs +90 -0
  111. package/src-ext/runtime/hermes/workspaceRpc.mjs +124 -0
  112. package/src-ext/runtime/openclaw/buildOpenclawDaemonInput.mjs +143 -0
  113. package/src-ext/runtime/openclaw/mcpConfigAdapter.mjs +91 -0
  114. package/src-ext/runtime/openclaw/openclawConfig.mjs +145 -0
  115. package/src-ext/runtime/picoclaw/constants.mjs +39 -0
  116. package/src-ext/runtime/picoclaw/handleRequest.mjs +289 -0
  117. package/src-ext/runtime/picoclaw/index.mjs +314 -0
  118. package/src-ext/runtime/picoclaw/pairFlow.mjs +224 -0
  119. package/src-ext/runtime/picoclaw/state.mjs +78 -0
  120. package/src-ext/runtime/picoclaw/todoTranslator.mjs +67 -0
  121. package/src-ext/runtime/picoclaw/translator.mjs +272 -0
  122. package/src-ext/runtime/picoclaw/wsClient.mjs +129 -0
  123. package/src-ext/service/serviceManager.mjs +521 -0
  124. package/src-shared/README.md +44 -0
  125. package/src-shared/chat_push_normalizer.mjs +113 -0
  126. package/src-shared/correlation.mjs +25 -0
  127. package/src-shared/envelope_builder.mjs +612 -0
  128. package/src-shared/logger.mjs +167 -0
  129. package/src-shared/relay-defaults.json +3 -0
  130. package/src-shared/relay_revoke.mjs +46 -0
  131. package/src-shared/vendor/README.md +60 -0
  132. package/src-shared/vendor/smol-toml/LICENSE +24 -0
  133. package/src-shared/vendor/smol-toml/README.md +236 -0
  134. package/src-shared/vendor/smol-toml/VENDORED.md +37 -0
  135. package/src-shared/vendor/smol-toml/dist/date.d.ts +41 -0
  136. package/src-shared/vendor/smol-toml/dist/date.js +127 -0
  137. package/src-shared/vendor/smol-toml/dist/error.d.ts +38 -0
  138. package/src-shared/vendor/smol-toml/dist/error.js +63 -0
  139. package/src-shared/vendor/smol-toml/dist/extract.d.ts +30 -0
  140. package/src-shared/vendor/smol-toml/dist/extract.js +109 -0
  141. package/src-shared/vendor/smol-toml/dist/index.cjs +900 -0
  142. package/src-shared/vendor/smol-toml/dist/index.d.ts +43 -0
  143. package/src-shared/vendor/smol-toml/dist/index.js +33 -0
  144. package/src-shared/vendor/smol-toml/dist/parse.d.ts +37 -0
  145. package/src-shared/vendor/smol-toml/dist/parse.js +148 -0
  146. package/src-shared/vendor/smol-toml/dist/primitive.d.ts +31 -0
  147. package/src-shared/vendor/smol-toml/dist/primitive.js +178 -0
  148. package/src-shared/vendor/smol-toml/dist/stringify.d.ts +31 -0
  149. package/src-shared/vendor/smol-toml/dist/stringify.js +163 -0
  150. package/src-shared/vendor/smol-toml/dist/struct.d.ts +32 -0
  151. package/src-shared/vendor/smol-toml/dist/struct.js +194 -0
  152. package/src-shared/vendor/smol-toml/dist/util.d.ts +42 -0
  153. package/src-shared/vendor/smol-toml/dist/util.js +100 -0
  154. package/src-shared/vendor/smol-toml/package.json +54 -0
  155. package/src-shared/vendor/yaml/LICENSE +13 -0
  156. package/src-shared/vendor/yaml/README.md +155 -0
  157. package/src-shared/vendor/yaml/VENDORED.md +29 -0
  158. package/src-shared/vendor/yaml/bin.mjs +11 -0
  159. package/src-shared/vendor/yaml/browser/dist/compose/compose-collection.js +88 -0
  160. package/src-shared/vendor/yaml/browser/dist/compose/compose-doc.js +42 -0
  161. package/src-shared/vendor/yaml/browser/dist/compose/compose-node.js +92 -0
  162. package/src-shared/vendor/yaml/browser/dist/compose/compose-scalar.js +80 -0
  163. package/src-shared/vendor/yaml/browser/dist/compose/composer.js +217 -0
  164. package/src-shared/vendor/yaml/browser/dist/compose/resolve-block-map.js +113 -0
  165. package/src-shared/vendor/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  166. package/src-shared/vendor/yaml/browser/dist/compose/resolve-block-seq.js +47 -0
  167. package/src-shared/vendor/yaml/browser/dist/compose/resolve-end.js +37 -0
  168. package/src-shared/vendor/yaml/browser/dist/compose/resolve-flow-collection.js +203 -0
  169. package/src-shared/vendor/yaml/browser/dist/compose/resolve-flow-scalar.js +223 -0
  170. package/src-shared/vendor/yaml/browser/dist/compose/resolve-props.js +148 -0
  171. package/src-shared/vendor/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  172. package/src-shared/vendor/yaml/browser/dist/compose/util-empty-scalar-position.js +27 -0
  173. package/src-shared/vendor/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  174. package/src-shared/vendor/yaml/browser/dist/compose/util-map-includes.js +17 -0
  175. package/src-shared/vendor/yaml/browser/dist/doc/Document.js +334 -0
  176. package/src-shared/vendor/yaml/browser/dist/doc/anchors.js +72 -0
  177. package/src-shared/vendor/yaml/browser/dist/doc/applyReviver.js +55 -0
  178. package/src-shared/vendor/yaml/browser/dist/doc/createNode.js +89 -0
  179. package/src-shared/vendor/yaml/browser/dist/doc/directives.js +176 -0
  180. package/src-shared/vendor/yaml/browser/dist/errors.js +57 -0
  181. package/src-shared/vendor/yaml/browser/dist/index.js +17 -0
  182. package/src-shared/vendor/yaml/browser/dist/log.js +14 -0
  183. package/src-shared/vendor/yaml/browser/dist/nodes/Alias.js +101 -0
  184. package/src-shared/vendor/yaml/browser/dist/nodes/Collection.js +147 -0
  185. package/src-shared/vendor/yaml/browser/dist/nodes/Node.js +38 -0
  186. package/src-shared/vendor/yaml/browser/dist/nodes/Pair.js +36 -0
  187. package/src-shared/vendor/yaml/browser/dist/nodes/Scalar.js +24 -0
  188. package/src-shared/vendor/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  189. package/src-shared/vendor/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  190. package/src-shared/vendor/yaml/browser/dist/nodes/addPairToJSMap.js +104 -0
  191. package/src-shared/vendor/yaml/browser/dist/nodes/identity.js +36 -0
  192. package/src-shared/vendor/yaml/browser/dist/nodes/toJS.js +37 -0
  193. package/src-shared/vendor/yaml/browser/dist/parse/cst-scalar.js +214 -0
  194. package/src-shared/vendor/yaml/browser/dist/parse/cst-stringify.js +61 -0
  195. package/src-shared/vendor/yaml/browser/dist/parse/cst-visit.js +97 -0
  196. package/src-shared/vendor/yaml/browser/dist/parse/cst.js +98 -0
  197. package/src-shared/vendor/yaml/browser/dist/parse/lexer.js +717 -0
  198. package/src-shared/vendor/yaml/browser/dist/parse/line-counter.js +39 -0
  199. package/src-shared/vendor/yaml/browser/dist/parse/parser.js +954 -0
  200. package/src-shared/vendor/yaml/browser/dist/public-api.js +99 -0
  201. package/src-shared/vendor/yaml/browser/dist/schema/Schema.js +38 -0
  202. package/src-shared/vendor/yaml/browser/dist/schema/common/map.js +17 -0
  203. package/src-shared/vendor/yaml/browser/dist/schema/common/null.js +15 -0
  204. package/src-shared/vendor/yaml/browser/dist/schema/common/seq.js +17 -0
  205. package/src-shared/vendor/yaml/browser/dist/schema/common/string.js +14 -0
  206. package/src-shared/vendor/yaml/browser/dist/schema/core/bool.js +19 -0
  207. package/src-shared/vendor/yaml/browser/dist/schema/core/float.js +43 -0
  208. package/src-shared/vendor/yaml/browser/dist/schema/core/int.js +38 -0
  209. package/src-shared/vendor/yaml/browser/dist/schema/core/schema.js +23 -0
  210. package/src-shared/vendor/yaml/browser/dist/schema/json/schema.js +62 -0
  211. package/src-shared/vendor/yaml/browser/dist/schema/tags.js +83 -0
  212. package/src-shared/vendor/yaml/browser/dist/schema/yaml-1.1/binary.js +66 -0
  213. package/src-shared/vendor/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  214. package/src-shared/vendor/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  215. package/src-shared/vendor/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  216. package/src-shared/vendor/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  217. package/src-shared/vendor/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  218. package/src-shared/vendor/yaml/browser/dist/schema/yaml-1.1/schema.js +37 -0
  219. package/src-shared/vendor/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  220. package/src-shared/vendor/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  221. package/src-shared/vendor/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  222. package/src-shared/vendor/yaml/browser/dist/stringify/stringify.js +124 -0
  223. package/src-shared/vendor/yaml/browser/dist/stringify/stringifyCollection.js +143 -0
  224. package/src-shared/vendor/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  225. package/src-shared/vendor/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  226. package/src-shared/vendor/yaml/browser/dist/stringify/stringifyNumber.js +24 -0
  227. package/src-shared/vendor/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  228. package/src-shared/vendor/yaml/browser/dist/stringify/stringifyString.js +328 -0
  229. package/src-shared/vendor/yaml/browser/dist/util.js +11 -0
  230. package/src-shared/vendor/yaml/browser/dist/visit.js +233 -0
  231. package/src-shared/vendor/yaml/browser/index.js +5 -0
  232. package/src-shared/vendor/yaml/browser/package.json +3 -0
  233. package/src-shared/vendor/yaml/dist/cli.d.ts +8 -0
  234. package/src-shared/vendor/yaml/dist/cli.mjs +199 -0
  235. package/src-shared/vendor/yaml/dist/compose/compose-collection.d.ts +11 -0
  236. package/src-shared/vendor/yaml/dist/compose/compose-collection.js +90 -0
  237. package/src-shared/vendor/yaml/dist/compose/compose-doc.d.ts +7 -0
  238. package/src-shared/vendor/yaml/dist/compose/compose-doc.js +44 -0
  239. package/src-shared/vendor/yaml/dist/compose/compose-node.d.ts +28 -0
  240. package/src-shared/vendor/yaml/dist/compose/compose-node.js +95 -0
  241. package/src-shared/vendor/yaml/dist/compose/compose-scalar.d.ts +5 -0
  242. package/src-shared/vendor/yaml/dist/compose/compose-scalar.js +82 -0
  243. package/src-shared/vendor/yaml/dist/compose/composer.d.ts +62 -0
  244. package/src-shared/vendor/yaml/dist/compose/composer.js +221 -0
  245. package/src-shared/vendor/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  246. package/src-shared/vendor/yaml/dist/compose/resolve-block-map.js +115 -0
  247. package/src-shared/vendor/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  248. package/src-shared/vendor/yaml/dist/compose/resolve-block-scalar.js +200 -0
  249. package/src-shared/vendor/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  250. package/src-shared/vendor/yaml/dist/compose/resolve-block-seq.js +49 -0
  251. package/src-shared/vendor/yaml/dist/compose/resolve-end.d.ts +6 -0
  252. package/src-shared/vendor/yaml/dist/compose/resolve-end.js +39 -0
  253. package/src-shared/vendor/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  254. package/src-shared/vendor/yaml/dist/compose/resolve-flow-collection.js +205 -0
  255. package/src-shared/vendor/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  256. package/src-shared/vendor/yaml/dist/compose/resolve-flow-scalar.js +225 -0
  257. package/src-shared/vendor/yaml/dist/compose/resolve-props.d.ts +23 -0
  258. package/src-shared/vendor/yaml/dist/compose/resolve-props.js +150 -0
  259. package/src-shared/vendor/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  260. package/src-shared/vendor/yaml/dist/compose/util-contains-newline.js +36 -0
  261. package/src-shared/vendor/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  262. package/src-shared/vendor/yaml/dist/compose/util-empty-scalar-position.js +29 -0
  263. package/src-shared/vendor/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  264. package/src-shared/vendor/yaml/dist/compose/util-flow-indent-check.js +17 -0
  265. package/src-shared/vendor/yaml/dist/compose/util-map-includes.d.ts +4 -0
  266. package/src-shared/vendor/yaml/dist/compose/util-map-includes.js +19 -0
  267. package/src-shared/vendor/yaml/dist/doc/Document.d.ts +141 -0
  268. package/src-shared/vendor/yaml/dist/doc/Document.js +336 -0
  269. package/src-shared/vendor/yaml/dist/doc/anchors.d.ts +24 -0
  270. package/src-shared/vendor/yaml/dist/doc/anchors.js +77 -0
  271. package/src-shared/vendor/yaml/dist/doc/applyReviver.d.ts +9 -0
  272. package/src-shared/vendor/yaml/dist/doc/applyReviver.js +57 -0
  273. package/src-shared/vendor/yaml/dist/doc/createNode.d.ts +17 -0
  274. package/src-shared/vendor/yaml/dist/doc/createNode.js +91 -0
  275. package/src-shared/vendor/yaml/dist/doc/directives.d.ts +49 -0
  276. package/src-shared/vendor/yaml/dist/doc/directives.js +178 -0
  277. package/src-shared/vendor/yaml/dist/errors.d.ts +21 -0
  278. package/src-shared/vendor/yaml/dist/errors.js +62 -0
  279. package/src-shared/vendor/yaml/dist/index.d.ts +22 -0
  280. package/src-shared/vendor/yaml/dist/index.js +50 -0
  281. package/src-shared/vendor/yaml/dist/log.d.ts +3 -0
  282. package/src-shared/vendor/yaml/dist/log.js +17 -0
  283. package/src-shared/vendor/yaml/dist/nodes/Alias.d.ts +28 -0
  284. package/src-shared/vendor/yaml/dist/nodes/Alias.js +103 -0
  285. package/src-shared/vendor/yaml/dist/nodes/Collection.d.ts +73 -0
  286. package/src-shared/vendor/yaml/dist/nodes/Collection.js +151 -0
  287. package/src-shared/vendor/yaml/dist/nodes/Node.d.ts +47 -0
  288. package/src-shared/vendor/yaml/dist/nodes/Node.js +40 -0
  289. package/src-shared/vendor/yaml/dist/nodes/Pair.d.ts +21 -0
  290. package/src-shared/vendor/yaml/dist/nodes/Pair.js +39 -0
  291. package/src-shared/vendor/yaml/dist/nodes/Scalar.d.ts +42 -0
  292. package/src-shared/vendor/yaml/dist/nodes/Scalar.js +27 -0
  293. package/src-shared/vendor/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  294. package/src-shared/vendor/yaml/dist/nodes/YAMLMap.js +147 -0
  295. package/src-shared/vendor/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  296. package/src-shared/vendor/yaml/dist/nodes/YAMLSeq.js +115 -0
  297. package/src-shared/vendor/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  298. package/src-shared/vendor/yaml/dist/nodes/addPairToJSMap.js +106 -0
  299. package/src-shared/vendor/yaml/dist/nodes/identity.d.ts +23 -0
  300. package/src-shared/vendor/yaml/dist/nodes/identity.js +53 -0
  301. package/src-shared/vendor/yaml/dist/nodes/toJS.d.ts +27 -0
  302. package/src-shared/vendor/yaml/dist/nodes/toJS.js +39 -0
  303. package/src-shared/vendor/yaml/dist/options.d.ts +338 -0
  304. package/src-shared/vendor/yaml/dist/parse/cst-scalar.d.ts +64 -0
  305. package/src-shared/vendor/yaml/dist/parse/cst-scalar.js +218 -0
  306. package/src-shared/vendor/yaml/dist/parse/cst-stringify.d.ts +8 -0
  307. package/src-shared/vendor/yaml/dist/parse/cst-stringify.js +63 -0
  308. package/src-shared/vendor/yaml/dist/parse/cst-visit.d.ts +39 -0
  309. package/src-shared/vendor/yaml/dist/parse/cst-visit.js +99 -0
  310. package/src-shared/vendor/yaml/dist/parse/cst.d.ts +108 -0
  311. package/src-shared/vendor/yaml/dist/parse/cst.js +112 -0
  312. package/src-shared/vendor/yaml/dist/parse/lexer.d.ts +87 -0
  313. package/src-shared/vendor/yaml/dist/parse/lexer.js +719 -0
  314. package/src-shared/vendor/yaml/dist/parse/line-counter.d.ts +22 -0
  315. package/src-shared/vendor/yaml/dist/parse/line-counter.js +41 -0
  316. package/src-shared/vendor/yaml/dist/parse/parser.d.ts +84 -0
  317. package/src-shared/vendor/yaml/dist/parse/parser.js +958 -0
  318. package/src-shared/vendor/yaml/dist/public-api.d.ts +43 -0
  319. package/src-shared/vendor/yaml/dist/public-api.js +104 -0
  320. package/src-shared/vendor/yaml/dist/schema/Schema.d.ts +18 -0
  321. package/src-shared/vendor/yaml/dist/schema/Schema.js +40 -0
  322. package/src-shared/vendor/yaml/dist/schema/common/map.d.ts +2 -0
  323. package/src-shared/vendor/yaml/dist/schema/common/map.js +19 -0
  324. package/src-shared/vendor/yaml/dist/schema/common/null.d.ts +4 -0
  325. package/src-shared/vendor/yaml/dist/schema/common/null.js +17 -0
  326. package/src-shared/vendor/yaml/dist/schema/common/seq.d.ts +2 -0
  327. package/src-shared/vendor/yaml/dist/schema/common/seq.js +19 -0
  328. package/src-shared/vendor/yaml/dist/schema/common/string.d.ts +2 -0
  329. package/src-shared/vendor/yaml/dist/schema/common/string.js +16 -0
  330. package/src-shared/vendor/yaml/dist/schema/core/bool.d.ts +4 -0
  331. package/src-shared/vendor/yaml/dist/schema/core/bool.js +21 -0
  332. package/src-shared/vendor/yaml/dist/schema/core/float.d.ts +4 -0
  333. package/src-shared/vendor/yaml/dist/schema/core/float.js +47 -0
  334. package/src-shared/vendor/yaml/dist/schema/core/int.d.ts +4 -0
  335. package/src-shared/vendor/yaml/dist/schema/core/int.js +42 -0
  336. package/src-shared/vendor/yaml/dist/schema/core/schema.d.ts +1 -0
  337. package/src-shared/vendor/yaml/dist/schema/core/schema.js +25 -0
  338. package/src-shared/vendor/yaml/dist/schema/json/schema.d.ts +2 -0
  339. package/src-shared/vendor/yaml/dist/schema/json/schema.js +64 -0
  340. package/src-shared/vendor/yaml/dist/schema/json-schema.d.ts +69 -0
  341. package/src-shared/vendor/yaml/dist/schema/tags.d.ts +40 -0
  342. package/src-shared/vendor/yaml/dist/schema/tags.js +86 -0
  343. package/src-shared/vendor/yaml/dist/schema/types.d.ts +90 -0
  344. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  345. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/binary.js +68 -0
  346. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  347. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  348. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  349. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/float.js +50 -0
  350. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  351. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/int.js +76 -0
  352. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/omap.d.ts +28 -0
  353. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  354. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  355. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  356. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  357. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/schema.js +39 -0
  358. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  359. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/set.js +96 -0
  360. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  361. package/src-shared/vendor/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  362. package/src-shared/vendor/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  363. package/src-shared/vendor/yaml/dist/stringify/foldFlowLines.js +151 -0
  364. package/src-shared/vendor/yaml/dist/stringify/stringify.d.ts +21 -0
  365. package/src-shared/vendor/yaml/dist/stringify/stringify.js +127 -0
  366. package/src-shared/vendor/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  367. package/src-shared/vendor/yaml/dist/stringify/stringifyCollection.js +145 -0
  368. package/src-shared/vendor/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  369. package/src-shared/vendor/yaml/dist/stringify/stringifyComment.js +24 -0
  370. package/src-shared/vendor/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  371. package/src-shared/vendor/yaml/dist/stringify/stringifyDocument.js +87 -0
  372. package/src-shared/vendor/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  373. package/src-shared/vendor/yaml/dist/stringify/stringifyNumber.js +26 -0
  374. package/src-shared/vendor/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  375. package/src-shared/vendor/yaml/dist/stringify/stringifyPair.js +152 -0
  376. package/src-shared/vendor/yaml/dist/stringify/stringifyString.d.ts +9 -0
  377. package/src-shared/vendor/yaml/dist/stringify/stringifyString.js +330 -0
  378. package/src-shared/vendor/yaml/dist/test-events.d.ts +4 -0
  379. package/src-shared/vendor/yaml/dist/test-events.js +134 -0
  380. package/src-shared/vendor/yaml/dist/util.d.ts +12 -0
  381. package/src-shared/vendor/yaml/dist/util.js +28 -0
  382. package/src-shared/vendor/yaml/dist/visit.d.ts +102 -0
  383. package/src-shared/vendor/yaml/dist/visit.js +236 -0
  384. package/src-shared/vendor/yaml/package.json +96 -0
  385. package/src-shared/vendor/yaml/util.js +2 -0
@@ -0,0 +1,612 @@
1
+ /**
2
+ * envelope_builder.mjs — C1.1.2 + C1.1.3
3
+ *
4
+ * Builders for unified Agent Protocol envelope objects.
5
+ * Each builder returns a plain object without `id` (server assigns).
6
+ *
7
+ * Protocol reference: docs/protocol/unified-agent-sse.md §5.1
8
+ */
9
+
10
+ // ---------------------------------------------------------------------------
11
+ // GAP-16: ID generator — "blk_" prefix + 26 Crockford Base32 chars (ULID format)
12
+ // Crockford alphabet: 0-9 A-H J K M N P-T V-Z (32 chars, no I L O U)
13
+ // ---------------------------------------------------------------------------
14
+
15
+ const CROCKFORD_CHARS = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
16
+
17
+ /**
18
+ * tool_result.output 里嵌套的每个 Block 都必须独立通过 block.schema 校验
19
+ * (block.schema.json 要求 id/type/status;text 块要 type/format/text;image
20
+ * 要 source 等等)。runtime translator 出于人类可读优先,常常只传 {type,
21
+ * format, text},需要在这里补齐 schema 必填项。
22
+ *
23
+ * 规则:
24
+ * - 任意 item 必带 id (auto blk_<ULID>) + status (默认 completed) + type
25
+ * - type === "text" → 默认 format="plain", text=""
26
+ * - type === "thinking" → 默认 text=""
27
+ * - type === "tool_use" → 默认 tool_call_id=id, tool_name="unknown",
28
+ * input={}, input_complete=true
29
+ * - 其他 type 透传,由调用方保证 schema 完整
30
+ *
31
+ * 非 object item(字符串/null)兜底包成 text 块,避免 server 拒。
32
+ */
33
+ function normalizeToolResultOutputItem(raw) {
34
+ if (raw == null) {
35
+ return { id: newBlockId(), type: "text", status: "completed", format: "plain", text: "" };
36
+ }
37
+ if (typeof raw === "string") {
38
+ return { id: newBlockId(), type: "text", status: "completed", format: "plain", text: raw };
39
+ }
40
+ if (typeof raw !== "object") {
41
+ return { id: newBlockId(), type: "text", status: "completed", format: "plain", text: String(raw) };
42
+ }
43
+ const out = { ...raw };
44
+ if (!out.id) out.id = newBlockId();
45
+ if (!out.status) out.status = "completed";
46
+ if (!out.type) out.type = "text";
47
+ if (out.type === "text") {
48
+ if (out.format === undefined) out.format = "plain";
49
+ if (out.text === undefined) out.text = "";
50
+ } else if (out.type === "thinking") {
51
+ if (out.text === undefined) out.text = "";
52
+ } else if (out.type === "tool_use") {
53
+ if (out.tool_call_id === undefined) out.tool_call_id = out.id;
54
+ if (out.tool_name === undefined) out.tool_name = "unknown";
55
+ if (out.input === undefined) out.input = {};
56
+ if (out.input_complete === undefined) out.input_complete = true;
57
+ }
58
+ return out;
59
+ }
60
+
61
+ function newCrockfordSuffix() {
62
+ const bytes = new Uint8Array(16);
63
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
64
+ crypto.getRandomValues(bytes);
65
+ } else {
66
+ // fallback: Math.random (Node < 22 shouldn't happen, but safe)
67
+ for (let i = 0; i < bytes.length; i++) bytes[i] = Math.floor(Math.random() * 256);
68
+ }
69
+ // Encode 128 bits as 26 Crockford Base32 chars (128 / 5 = 25.6 → 26 chars, top 2 bits zero)
70
+ // Pack bytes into a BigInt then extract 5-bit groups from MSB.
71
+ let n = BigInt(0);
72
+ for (const b of bytes) n = (n << BigInt(8)) | BigInt(b);
73
+ const chars = [];
74
+ for (let i = 0; i < 26; i++) {
75
+ chars.unshift(CROCKFORD_CHARS[Number(n & BigInt(31))]);
76
+ n >>= BigInt(5);
77
+ }
78
+ return chars.join("");
79
+ }
80
+
81
+ export function newBlockId() {
82
+ return "blk_" + newCrockfordSuffix();
83
+ }
84
+
85
+ // Mint a fresh `run_<26 Crockford>` id — matches envelope.schema run_id pattern
86
+ // `^run_[0-9A-HJKMNP-TV-Z]{26}$`. Used by hermes bridge when synthesizing a
87
+ // child run for delegate_task (no upstream child session id available).
88
+ export function newRunId() {
89
+ return "run_" + newCrockfordSuffix();
90
+ }
91
+
92
+ // ---------------------------------------------------------------------------
93
+ // C1.1.2 — 5 envelope builders
94
+ // ---------------------------------------------------------------------------
95
+
96
+ /**
97
+ * run.started
98
+ * @param {string} runId
99
+ * @param {{
100
+ * model?: string|null,
101
+ * options?: object,
102
+ * parentRunId?: string,
103
+ * spawnToolUseId?: string,
104
+ * extensions?: object,
105
+ * }} [meta]
106
+ *
107
+ * parentRunId — top-level envelope field; set when this run is a child run
108
+ * spawned by a subagent dispatch. Server's subagent_synth correlates child
109
+ * lifecycle back to the parent's `subagent_ref` block via this field plus
110
+ * `extensions.openclaw.child_session_key`.
111
+ *
112
+ * spawnToolUseId — when provided (non-empty string), written to
113
+ * `payload.spawn_tool_use_id`. Lets relay subagent_synth SDK mode detect that
114
+ * the CLI will supply the child run id, so relay skips minting its own ULID.
115
+ *
116
+ * Note: `usage` was removed — run_started.schema.json uses additionalProperties:false
117
+ * and does not list `usage`; it is reported via a separate usage.report envelope.
118
+ */
119
+ export function buildRunStarted(runId, meta) {
120
+ const env = {
121
+ type: "run.started",
122
+ run_id: runId,
123
+ payload: {
124
+ model: meta?.model ?? "",
125
+ options: meta?.options ?? {},
126
+ },
127
+ };
128
+ if (meta?.parentRunId) env.parent_run_id = meta.parentRunId;
129
+ if (meta?.spawnToolUseId) env.payload.spawn_tool_use_id = meta.spawnToolUseId;
130
+ if (meta?.extensions && typeof meta.extensions === "object") {
131
+ env.extensions = meta.extensions;
132
+ }
133
+ return env;
134
+ }
135
+
136
+ /**
137
+ * run.completed
138
+ * @param {string} runId
139
+ * @param {string} stopReason e.g. "end_turn" | "max_tokens" | "user_canceled"
140
+ * @param {{ parentRunId?: string, extensions?: object }} [opts]
141
+ *
142
+ * parentRunId + extensions same semantics as buildRunStarted; required for
143
+ * child run termination so subagent_synth.synthChildRunTerminal can fire
144
+ * subagent_ref.completed on the parent timeline.
145
+ */
146
+ export function buildRunCompleted(runId, stopReason, opts) {
147
+ const env = {
148
+ type: "run.completed",
149
+ run_id: runId,
150
+ payload: { stop_reason: stopReason || "end_turn" },
151
+ };
152
+ if (opts?.parentRunId) env.parent_run_id = opts.parentRunId;
153
+ if (opts?.extensions && typeof opts.extensions === "object") {
154
+ env.extensions = opts.extensions;
155
+ }
156
+ return env;
157
+ }
158
+
159
+ /**
160
+ * content_block.started
161
+ * @param {string} runId
162
+ * @param {{ id?: string, type: string, [k: string]: any }} block
163
+ * @param {number} [index=0] block index within the message (schema required, defaults to 0)
164
+ *
165
+ * Automatically fills schema-required fields for known block types:
166
+ * - All blocks: `status` defaults to "in_progress"
167
+ * - text blocks: `format` defaults to "plain", `text` defaults to "" (filled via deltas, finalized on completed)
168
+ * - thinking blocks: `text` defaults to "" (filled via deltas, finalized on completed)
169
+ */
170
+ export function buildBlockStarted(runId, block, index = 0) {
171
+ const id = block.id || newBlockId();
172
+ const enrichedBlock = { ...block, id };
173
+ if (enrichedBlock.status === undefined) {
174
+ enrichedBlock.status = "in_progress";
175
+ }
176
+ if (enrichedBlock.type === "text") {
177
+ if (enrichedBlock.format === undefined) enrichedBlock.format = "plain";
178
+ if (enrichedBlock.text === undefined) enrichedBlock.text = "";
179
+ }
180
+ if (enrichedBlock.type === "thinking") {
181
+ if (enrichedBlock.text === undefined) enrichedBlock.text = "";
182
+ }
183
+ // tool_use block — schema requires tool_call_id + tool_name; input defaults
184
+ // to {} and input_complete defaults to false (app accumulates via deltas).
185
+ if (enrichedBlock.type === "tool_use") {
186
+ if (enrichedBlock.tool_call_id === undefined) enrichedBlock.tool_call_id = id;
187
+ if (enrichedBlock.tool_name === undefined) enrichedBlock.tool_name = "unknown";
188
+ if (enrichedBlock.input === undefined) enrichedBlock.input = {};
189
+ if (enrichedBlock.input_complete === undefined) enrichedBlock.input_complete = false;
190
+ }
191
+ // tool_result block — schema requires tool_call_id + output (List<Block>).
192
+ if (enrichedBlock.type === "tool_result") {
193
+ if (enrichedBlock.tool_call_id === undefined) enrichedBlock.tool_call_id = id;
194
+ if (enrichedBlock.output === undefined) enrichedBlock.output = [];
195
+ if (enrichedBlock.is_error === undefined) enrichedBlock.is_error = false;
196
+ }
197
+ // subagent_ref — schema requires child_run_id (^run_[0-9A-HJKMNP-TV-Z]{26}$).
198
+ // fail-fast: blk_ prefix fallback violates schema; caller must supply valid run id.
199
+ if (enrichedBlock.type === "subagent_ref") {
200
+ if (enrichedBlock.child_run_id === undefined) throw new Error("subagent_ref block requires child_run_id");
201
+ }
202
+ // interrupt block — protocol initial status is "awaiting" (not "in_progress").
203
+ // Transparently pass through subtype / prompt / options / title / selection_mode.
204
+ if (enrichedBlock.type === "interrupt") {
205
+ if (enrichedBlock.status === "in_progress") {
206
+ // "in_progress" was set by the generic default above — override with "awaiting"
207
+ // only if the caller did NOT explicitly pass a status.
208
+ // We detect this by checking if the original block.status was undefined.
209
+ if (block.status === undefined) {
210
+ enrichedBlock.status = "awaiting";
211
+ }
212
+ }
213
+ }
214
+ return {
215
+ type: "content_block.started",
216
+ run_id: runId,
217
+ payload: { index, block: enrichedBlock },
218
+ };
219
+ }
220
+
221
+ /**
222
+ * content_block.delta
223
+ * @param {string} runId
224
+ * @param {string} blockId
225
+ * @param {string|object} delta If a string is provided it is wrapped into
226
+ * { text_append: delta } so app-side consumers (chat_store_unified.dart)
227
+ * can read `payload.delta['text_append']` directly.
228
+ * @param {number} [index=0] block index within the message (schema required, defaults to 0)
229
+ */
230
+ export function buildBlockDelta(runId, blockId, delta, index = 0) {
231
+ const normalizedDelta =
232
+ typeof delta === "string" ? { text_append: delta } : delta;
233
+ return {
234
+ type: "content_block.delta",
235
+ run_id: runId,
236
+ payload: { index, block_id: blockId, delta: normalizedDelta },
237
+ };
238
+ }
239
+
240
+ /**
241
+ * content_block.completed
242
+ * @param {string} runId
243
+ * @param {{ id: string, type: string, [k: string]: any }} block
244
+ * @param {number} [index=0] block index within the message (schema required, defaults to 0)
245
+ *
246
+ * Automatically fills schema-required fields for known block types:
247
+ * - All blocks: `status` defaults to "completed"
248
+ * - text blocks: `format` defaults to "plain"; `text` defaults to "" only as a
249
+ * last-resort schema guard. Callers SHOULD pass the full accumulated text
250
+ * (protocol §5.3.5: completed payload is the terminal full state).
251
+ * - thinking blocks: `text` defaults to "" with the same caveat.
252
+ */
253
+ export function buildBlockCompleted(runId, block, index = 0) {
254
+ const enrichedBlock = { ...block };
255
+ if (enrichedBlock.status === undefined) {
256
+ enrichedBlock.status = "completed";
257
+ }
258
+ if (enrichedBlock.type === "text") {
259
+ if (enrichedBlock.format === undefined) enrichedBlock.format = "plain";
260
+ if (enrichedBlock.text === undefined) enrichedBlock.text = "";
261
+ }
262
+ if (enrichedBlock.type === "thinking") {
263
+ if (enrichedBlock.text === undefined) enrichedBlock.text = "";
264
+ }
265
+ if (enrichedBlock.type === "tool_use") {
266
+ if (enrichedBlock.tool_call_id === undefined) enrichedBlock.tool_call_id = enrichedBlock.id;
267
+ if (enrichedBlock.tool_name === undefined) enrichedBlock.tool_name = "unknown";
268
+ if (enrichedBlock.input === undefined) enrichedBlock.input = {};
269
+ if (enrichedBlock.input_complete === undefined) enrichedBlock.input_complete = true;
270
+ }
271
+ if (enrichedBlock.type === "tool_result") {
272
+ if (enrichedBlock.tool_call_id === undefined) enrichedBlock.tool_call_id = enrichedBlock.id;
273
+ if (enrichedBlock.output === undefined) enrichedBlock.output = [];
274
+ if (enrichedBlock.is_error === undefined) enrichedBlock.is_error = false;
275
+ }
276
+ // subagent_ref — schema requires child_run_id (^run_[0-9A-HJKMNP-TV-Z]{26}$).
277
+ // fail-fast: blk_ prefix fallback violates schema; caller must supply valid run id.
278
+ if (enrichedBlock.type === "subagent_ref") {
279
+ if (enrichedBlock.child_run_id === undefined) throw new Error("subagent_ref block requires child_run_id");
280
+ }
281
+ return {
282
+ type: "content_block.completed",
283
+ run_id: runId,
284
+ payload: { index, block: enrichedBlock },
285
+ };
286
+ }
287
+
288
+ /**
289
+ * run.paused
290
+ * @param {string} runId
291
+ * @param {string[]} interruptIds block ids that caused the pause (e.g. ["blk_xxx..."])
292
+ *
293
+ * `reason` is always "interrupt" per protocol (RunPausedPayload requires reason: string).
294
+ * `interrupt_ids` lists the block ids that caused the pause; allowed to be empty.
295
+ */
296
+ export function buildRunPaused(runId, interruptIds) {
297
+ return {
298
+ type: "run.paused",
299
+ run_id: runId,
300
+ payload: {
301
+ reason: "interrupt",
302
+ interrupt_ids: Array.isArray(interruptIds) ? interruptIds : [],
303
+ },
304
+ };
305
+ }
306
+
307
+ /**
308
+ * run.failed — GAP-01 + GAP-19:
309
+ * - payload includes stop_reason: "error" (spec §5.2, GAP-01)
310
+ * - run_id_ref moved to extensions (not top-level, GAP-19)
311
+ * @param {string} runId
312
+ * @param {string} code error code
313
+ * @param {string} message error message
314
+ * @param {object|null} [details] optional structured details (e.g. { model, missing_modality })
315
+ */
316
+ export function buildRunFailed(runId, code, message, details = null) {
317
+ return {
318
+ type: "run.failed",
319
+ run_id: runId,
320
+ extensions: { run_id_ref: runId },
321
+ payload: {
322
+ stop_reason: "error",
323
+ error: { code, message, ...(details ? { details } : {}) },
324
+ },
325
+ };
326
+ }
327
+
328
+ // ---------------------------------------------------------------------------
329
+ // C1.1.3 — translateOpenClawChunkToEnvelope
330
+ // ---------------------------------------------------------------------------
331
+
332
+ /**
333
+ * Translate a single openclaw stream chunk into zero or more unified envelopes.
334
+ *
335
+ * Real openclaw SSE event names:
336
+ * - response.output_text.delta — streaming text delta
337
+ * - response.output_text.done — text segment complete (no-op here)
338
+ * - response.reasoning_summary_text.delta — thinking/reasoning delta
339
+ * - response.tool_use.start — tool call begin: chunk carries
340
+ * { call_id, name, input?, parent_tool_use_id? }
341
+ * - response.tool_use.arguments.delta — incremental input/arguments JSON
342
+ * (string fragment to append to input_json)
343
+ * - response.tool_use.completed — tool call args complete (input_complete=true)
344
+ * - response.tool_result — tool result envelope: chunk has
345
+ * { call_id, output[]: Block[], is_error?, summary? }
346
+ * - response.completed / failed / end — turn finished
347
+ * - __envelopes — passthrough escape hatch:
348
+ * chunk.envelopes is appended verbatim
349
+ * (used by hermes bridge to inject
350
+ * child-run run.started/run.completed
351
+ * with parent_run_id + extensions)
352
+ *
353
+ * Run-scope override: tool_use / tool_result chunks may carry chunk.run_id;
354
+ * when present, the produced envelope's run_id uses it instead of the function
355
+ * arg runId. tool_use.start records the run scope on the call state so
356
+ * arguments.delta / completed envelopes ride the same run. text / thinking
357
+ * deltas always use the function arg runId.
358
+ *
359
+ * blockState shape:
360
+ * {
361
+ * text: { blockId, started },
362
+ * thinking: { blockId, started },
363
+ * toolUses: Map<call_id, { blockId, started, argsJson }>,
364
+ * }
365
+ *
366
+ * Multiple tool_use calls can be in flight simultaneously (parallel tool_use),
367
+ * so we key by call_id. parent_tool_use_id, when present on any envelope,
368
+ * surfaces in payload extensions so app can render subagent nesting.
369
+ *
370
+ * @param {{ event?: string, type?: string, [k: string]: any }} chunk
371
+ * @param {string} runId
372
+ * @param {object} blockState
373
+ * @returns {{ envelopes: any[], blockState: object }}
374
+ */
375
+ export function translateOpenClawChunkToEnvelope(chunk, runId, blockState) {
376
+ const event = chunk.event || chunk.type;
377
+ const envelopes = [];
378
+ let text = { ...blockState.text };
379
+ let thinking = { ...blockState.thinking };
380
+ // Clone the toolUses Map shallowly so callers can detect change.
381
+ const toolUses = new Map(blockState.toolUses || []);
382
+
383
+ // hermes subagent passthrough: bridge mints child-run-scoped envelopes
384
+ // (run.started / run.completed with parent_run_id + extensions) directly
385
+ // because the translator only knows about a single (parent) runId per call.
386
+ // Anything in chunk.envelopes is appended verbatim; this is **not** a hot
387
+ // path — only used by hermes when delegate_task fires.
388
+ if (event === "__envelopes") {
389
+ if (Array.isArray(chunk.envelopes)) {
390
+ for (const env of chunk.envelopes) {
391
+ if (env && typeof env === "object") envelopes.push(env);
392
+ }
393
+ }
394
+ return { envelopes, blockState: { text, thinking, toolUses } };
395
+ }
396
+
397
+ // tool_use / tool_result chunks may override the run scope (subagent child
398
+ // run). text / thinking deltas stay on the caller's runId — child runs in
399
+ // hermes don't emit text, only tool calls.
400
+ const toolRunId = (typeof chunk.run_id === "string" && chunk.run_id) || runId;
401
+
402
+ if (event === "response.output_text.delta") {
403
+ const deltaText = chunk.delta ?? chunk.text ?? "";
404
+
405
+ if (!text.started) {
406
+ text.blockId = newBlockId();
407
+ text.content = "";
408
+ envelopes.push(buildBlockStarted(runId, { id: text.blockId, type: "text" }));
409
+ text.started = true;
410
+ }
411
+
412
+ text.content = (text.content || "") + String(deltaText);
413
+ envelopes.push(buildBlockDelta(runId, text.blockId, deltaText));
414
+ } else if (event === "response.reasoning_summary_text.delta") {
415
+ const deltaText = chunk.delta ?? chunk.text ?? "";
416
+
417
+ if (!thinking.started) {
418
+ thinking.blockId = newBlockId();
419
+ thinking.content = "";
420
+ envelopes.push(buildBlockStarted(runId, { id: thinking.blockId, type: "thinking" }));
421
+ thinking.started = true;
422
+ }
423
+
424
+ thinking.content = (thinking.content || "") + String(deltaText);
425
+ envelopes.push(buildBlockDelta(runId, thinking.blockId, deltaText));
426
+ } else if (event === "response.tool_use.start") {
427
+ // Begin a tool_use block. Stamp tool_call_id = call_id (stable across the lifecycle).
428
+ const callId = String(chunk.call_id || chunk.tool_use_id || newBlockId());
429
+ const toolName = String(chunk.name || chunk.tool_name || "unknown");
430
+ const inputInitial =
431
+ (chunk.input && typeof chunk.input === "object") ? chunk.input : {};
432
+ const blockId = newBlockId();
433
+ toolUses.set(callId, { blockId, started: true, argsJson: "", runId: toolRunId });
434
+ const startedBlock = {
435
+ id: blockId,
436
+ type: "tool_use",
437
+ tool_call_id: callId,
438
+ tool_name: toolName,
439
+ input: inputInitial,
440
+ input_complete: false,
441
+ };
442
+ const env = buildBlockStarted(toolRunId, startedBlock);
443
+ if (chunk.parent_tool_use_id) {
444
+ env.extensions = { parent_tool_use_id: chunk.parent_tool_use_id };
445
+ }
446
+ envelopes.push(env);
447
+ } else if (event === "response.function_call_arguments.delta") {
448
+ // picoclaw legacy event name → maps to tool_use.start + arguments.delta.
449
+ // chunk shape: { call_id, name, arguments } where arguments is a JSON
450
+ // fragment to append. We auto-start a tool_use block on first occurrence.
451
+ const callId = String(chunk.call_id || "");
452
+ const toolName = String(chunk.name || "unknown");
453
+ const argsFragment = String(chunk.arguments || "");
454
+ if (callId) {
455
+ let tu = toolUses.get(callId);
456
+ if (!tu) {
457
+ const blockId = newBlockId();
458
+ tu = { blockId, started: true, argsJson: "" };
459
+ toolUses.set(callId, tu);
460
+ envelopes.push(buildBlockStarted(runId, {
461
+ id: blockId, type: "tool_use",
462
+ tool_call_id: callId, tool_name: toolName,
463
+ input: {}, input_complete: false,
464
+ }));
465
+ }
466
+ if (argsFragment) {
467
+ tu.argsJson += argsFragment;
468
+ envelopes.push(buildBlockDelta(runId, tu.blockId, { input_json_delta: argsFragment }));
469
+ }
470
+ }
471
+ } else if (event === "response.tool_use.arguments.delta") {
472
+ const callId = String(chunk.call_id || chunk.tool_use_id || "");
473
+ const tu = toolUses.get(callId);
474
+ if (tu && tu.started) {
475
+ const fragment = String(chunk.delta ?? chunk.arguments ?? "");
476
+ tu.argsJson += fragment;
477
+ // Stream the arguments JSON fragment as block.delta with the
478
+ // standard input_json_delta key (matches Anthropic streaming convention).
479
+ // Delta MUST be on the same run scope as the tool_use.start envelope.
480
+ envelopes.push(
481
+ buildBlockDelta(tu.runId || runId, tu.blockId, { input_json_delta: fragment }),
482
+ );
483
+ }
484
+ // else: unknown call_id; drop silently
485
+ } else if (event === "response.tool_use.completed") {
486
+ const callId = String(chunk.call_id || chunk.tool_use_id || "");
487
+ const tu = toolUses.get(callId);
488
+ if (tu && tu.started) {
489
+ // Try to parse accumulated argsJson; if that fails, fall back to chunk.input.
490
+ let finalInput = {};
491
+ if (chunk.input && typeof chunk.input === "object") {
492
+ finalInput = chunk.input;
493
+ } else if (tu.argsJson) {
494
+ try { finalInput = JSON.parse(tu.argsJson); } catch { /* keep {} */ }
495
+ }
496
+ const completedBlock = {
497
+ id: tu.blockId,
498
+ type: "tool_use",
499
+ tool_call_id: callId,
500
+ tool_name: chunk.name || chunk.tool_name || "unknown",
501
+ input: finalInput,
502
+ input_complete: true,
503
+ };
504
+ // Same run scope as the matching .start envelope.
505
+ const env = buildBlockCompleted(tu.runId || runId, completedBlock);
506
+ if (chunk.parent_tool_use_id) {
507
+ env.extensions = { parent_tool_use_id: chunk.parent_tool_use_id };
508
+ }
509
+ envelopes.push(env);
510
+ toolUses.delete(callId);
511
+ }
512
+ } else if (event === "response.tool_result") {
513
+ // Tool result lives in a single block — emit started + completed together.
514
+ const callId = String(chunk.call_id || chunk.tool_use_id || "");
515
+ const blockId = newBlockId();
516
+ const rawOutput = Array.isArray(chunk.output) ? chunk.output : [];
517
+ // tool_result.output[*] 是嵌套 Block(block.schema.json 递归 $ref),
518
+ // 每项必须独立通过 block.schema 校验:id + type + status + 各子 schema 的
519
+ // required(text 块要 format/text)。runtime translator 大多只传
520
+ // {type, format, text},server jsonschema oneOf 会拒(误导性日志报
521
+ // "missing properties: format, text",其实是 id+status 缺失导致 text 分支
522
+ // 也跑挂)。在 builder 层集中补全。
523
+ const output = rawOutput.map(normalizeToolResultOutputItem);
524
+ const isError = !!chunk.is_error;
525
+ const summary = typeof chunk.summary === "string" ? chunk.summary : undefined;
526
+ const block = {
527
+ id: blockId, type: "tool_result", tool_call_id: callId,
528
+ output, is_error: isError, ...(summary !== undefined ? { summary } : {}),
529
+ };
530
+ // tool_result must land on the same run scope as the originating tool_use.
531
+ const started = buildBlockStarted(toolRunId, block);
532
+ const completed = buildBlockCompleted(toolRunId, block);
533
+ if (chunk.parent_tool_use_id) {
534
+ started.extensions = { parent_tool_use_id: chunk.parent_tool_use_id };
535
+ completed.extensions = { parent_tool_use_id: chunk.parent_tool_use_id };
536
+ }
537
+ envelopes.push(started, completed);
538
+ } else if (event === "response.output_text.done") {
539
+ // No incremental envelope needed — full text already accumulated via deltas.
540
+ // If runtime carries authoritative full text on .done (e.g. picoclaw), prefer it.
541
+ if (typeof chunk.text === "string" && chunk.text.length > 0) {
542
+ text.content = chunk.text;
543
+ }
544
+ } else if (
545
+ event === "response.completed" ||
546
+ event === "response.failed" ||
547
+ event === "end"
548
+ ) {
549
+ // Close any still-open tool_use blocks (defensive — runtimes SHOULD emit
550
+ // tool_use.completed for each, but if they crash mid-call, don't leak the block).
551
+ // Honor the per-tool runId so child-run tools close on their own run scope.
552
+ for (const [callId, tu] of toolUses) {
553
+ if (tu.started) {
554
+ envelopes.push(buildBlockCompleted(tu.runId || runId, {
555
+ id: tu.blockId, type: "tool_use",
556
+ tool_call_id: callId, tool_name: "unknown", input: {}, input_complete: false,
557
+ }));
558
+ }
559
+ }
560
+ toolUses.clear();
561
+ // Close thinking first, then text. Then run.completed/failed.
562
+ // Carry the accumulated full text on the completed envelope (protocol
563
+ // §5.3.5: completed payload is the terminal full state of the block).
564
+ if (thinking.started && thinking.blockId) {
565
+ envelopes.push(buildBlockCompleted(runId, {
566
+ id: thinking.blockId,
567
+ type: "thinking",
568
+ text: thinking.content || "",
569
+ }));
570
+ }
571
+ if (text.started && text.blockId) {
572
+ envelopes.push(buildBlockCompleted(runId, {
573
+ id: text.blockId,
574
+ type: "text",
575
+ text: text.content || "",
576
+ }));
577
+ }
578
+ if (event === "response.failed") {
579
+ // OpenClaw's gateway (OpenAI Responses format) nests the failure under
580
+ // `response.error`; older/other shapes use top-level `error`. Read the
581
+ // nested path first so the original message (e.g. authentication_error)
582
+ // reaches the App instead of the generic "runtime error" fallback.
583
+ const errMsg =
584
+ chunk.response?.error?.message ||
585
+ chunk.error?.message ||
586
+ chunk.message ||
587
+ chunk.text ||
588
+ "runtime error";
589
+ envelopes.push(buildRunFailed(runId, "runtime.error", errMsg));
590
+ } else {
591
+ envelopes.push(buildRunCompleted(runId, "end_turn"));
592
+ }
593
+ text = { blockId: null, started: false, content: "" };
594
+ thinking = { blockId: null, started: false, content: "" };
595
+ }
596
+ // Unknown events: return empty envelopes
597
+
598
+ return { envelopes, blockState: { text, thinking, toolUses } };
599
+ }
600
+
601
+ /**
602
+ * Convenience factory: produce an empty blockState with the shape expected by
603
+ * `translateOpenClawChunkToEnvelope`. Callers should use this instead of
604
+ * hand-rolling the shape so callsites stay correct across future shape changes.
605
+ */
606
+ export function newBlockState() {
607
+ return {
608
+ text: { blockId: null, started: false, content: "" },
609
+ thinking: { blockId: null, started: false, content: "" },
610
+ toolUses: new Map(),
611
+ };
612
+ }