@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,78 @@
1
+ // `agentlink reload` 子命令。
2
+ //
3
+ // 目的:开发者更新 agentlink-cli 源码后,长寿 agent 进程(claude / codex /
4
+ // openclaw / hermes)不会自动重新加载模块 —— 必须重启进程。此命令封装
5
+ // 三端(launchd / systemd-user / schtasks)的重启动作。
6
+ //
7
+ // 用法:
8
+ // agentlink reload # 重启所有已安装的 runtime service
9
+ // agentlink reload -r claude # 只重启指定 runtime
10
+ // agentlink reload --json # 机器可读输出
11
+ //
12
+ // 未安装的 runtime service 会显示 SKIP(not-installed),不视为错误。
13
+
14
+ import process from "node:process";
15
+ import { serviceReload, serviceReloadAll } from "../service/serviceManager.mjs";
16
+
17
+ /**
18
+ * @param {{ options: { runtime?: string, json?: boolean }, log: any }} ctx
19
+ */
20
+ export async function runReloadCommand({ options, log }) {
21
+ const runtime = (options.runtime || "").trim().toLowerCase();
22
+ const json = !!options.json;
23
+ const rlLog = log.child({ comp: "reload" });
24
+
25
+ let results;
26
+ try {
27
+ results = runtime
28
+ ? { [runtime]: serviceReload(runtime) }
29
+ : serviceReloadAll();
30
+ } catch (err) {
31
+ const msg = err?.message || String(err);
32
+ rlLog.error("reload.failed", "reload command failed", { err: msg });
33
+ if (json) {
34
+ process.stdout.write(JSON.stringify({ ok: false, error: msg }) + "\n");
35
+ } else {
36
+ process.stderr.write(`reload failed: ${msg}\n`);
37
+ }
38
+ process.exit(1);
39
+ }
40
+
41
+ if (json) {
42
+ process.stdout.write(JSON.stringify({ ok: true, results }, null, 2) + "\n");
43
+ return;
44
+ }
45
+
46
+ // 人类可读输出:每行一条 runtime 的结果
47
+ let hasError = false;
48
+ const pad = (s, n) => String(s).padEnd(n);
49
+ for (const [rt, r] of Object.entries(results)) {
50
+ const statusTag = formatStatus(r);
51
+ const detail = formatDetail(r);
52
+ process.stdout.write(`${pad(rt, 9)} ${statusTag}${detail ? " " + detail : ""}\n`);
53
+ if (r.status === "error") hasError = true;
54
+ }
55
+ rlLog.info("reload.done", "reload finished", { results });
56
+ if (hasError) process.exit(1);
57
+ }
58
+
59
+ function formatStatus(r) {
60
+ switch (r.status) {
61
+ case "restarted": return "OK";
62
+ case "not-installed": return "SKIP";
63
+ case "error": return "ERR";
64
+ default: return r.status || "?";
65
+ }
66
+ }
67
+
68
+ function formatDetail(r) {
69
+ if (r.status === "error") return r.error || "";
70
+ if (r.status === "not-installed") {
71
+ return `(${r.backend}: 未安装)`;
72
+ }
73
+ if (r.status === "restarted") {
74
+ const tgt = r.label || r.unit || r.task || "";
75
+ return `(${r.backend}: ${tgt})`;
76
+ }
77
+ return "";
78
+ }
@@ -0,0 +1,64 @@
1
+ // `agentlink-agent service <install|uninstall|status> -r <runtime>` 子命令。
2
+ //
3
+ // 老 agentlink 的 `agentlink service install/uninstall/status` 只对 openclaw/hermes
4
+ // 生效。新 runtime (claude/codex) 走这里,实现对齐。
5
+
6
+ import process from "node:process";
7
+ import {
8
+ serviceInstall,
9
+ serviceUninstall,
10
+ serviceStatus,
11
+ } from "../service/serviceManager.mjs";
12
+
13
+ export async function runServiceCommand({ options, positional, log }) {
14
+ const action = (positional[0] || "").toLowerCase();
15
+ const runtime = options.runtime || options.r || positional[1] || "";
16
+ if (!runtime) {
17
+ process.stderr.write("service 子命令需要 -r claude|codex\n");
18
+ process.exit(2);
19
+ }
20
+ const svcLog = log.child({ comp: "service", rt: runtime });
21
+
22
+ try {
23
+ switch (action) {
24
+ case "install": {
25
+ const r = await serviceInstall(runtime, svcLog);
26
+ svcLog.info("service.install.done", "service installed", r);
27
+ process.stdout.write(`service installed (backend=${r.backend})\n`);
28
+ return;
29
+ }
30
+ case "uninstall":
31
+ case "stop": {
32
+ const r = serviceUninstall(runtime, svcLog);
33
+ svcLog.info("service.uninstall.done", "service uninstalled", r);
34
+ process.stdout.write(`service uninstalled (backend=${r.backend})\n`);
35
+ return;
36
+ }
37
+ case "status": {
38
+ const r = serviceStatus(runtime);
39
+ svcLog.info("service.status", "status checked", r);
40
+ process.stdout.write(`backend=${r.backend} running=${r.running}${r.pid ? ` pid=${r.pid}` : ""}\n`);
41
+ return;
42
+ }
43
+ case "restart": {
44
+ svcLog.info("service.restart", "uninstall+install cycle");
45
+ serviceUninstall(runtime, svcLog);
46
+ const r = await serviceInstall(runtime, svcLog);
47
+ process.stdout.write(`service restarted (backend=${r.backend})\n`);
48
+ return;
49
+ }
50
+ case "":
51
+ process.stderr.write("usage: agentlink-agent service <install|uninstall|status|restart> -r <runtime>\n");
52
+ process.exit(2);
53
+ default:
54
+ process.stderr.write(`unknown service action: ${action}\n`);
55
+ process.exit(2);
56
+ }
57
+ } catch (err) {
58
+ svcLog.error("service.action.failed", "service action failed", {
59
+ action, err: err?.message || String(err),
60
+ });
61
+ process.stderr.write(`${err?.message || err}\n`);
62
+ process.exit(1);
63
+ }
64
+ }
@@ -0,0 +1,137 @@
1
+ // accountResolver —— 从本地凭证文件里解析出 CLI 登录账号(邮箱)。
2
+ //
3
+ // Codex : ~/.codex/auth.json
4
+ // 常见字段:tokens.id_token(JWT,payload.email)/ account.email / email
5
+ // Claude : ~/.claude/.credentials.json 或 ~/.config/claude/.credentials.json
6
+ // 常见字段:claudeAiOauth.email / account.email / email
7
+ //
8
+ // 失败策略:任何读取/解析失败 → 返回 null,调用方不报错,快照里 account 为空。
9
+
10
+ import { promises as fs } from "node:fs";
11
+ import os from "node:os";
12
+ import path from "node:path";
13
+ import { execFileSync } from "node:child_process";
14
+
15
+ /**
16
+ * @param {"codex"|"claude"} runtime
17
+ * @returns {Promise<string|null>}
18
+ */
19
+ export async function resolveCliAccount(runtime) {
20
+ try {
21
+ if (runtime === "codex") return await readCodexAccount();
22
+ if (runtime === "claude") return await readClaudeAccount();
23
+ } catch {
24
+ // 静默兜底 —— 账号只是展示用,缺失不阻塞。
25
+ }
26
+ return null;
27
+ }
28
+
29
+ async function readCodexAccount() {
30
+ const home = os.homedir();
31
+ // Codex 在三端都把配置放在 ~/.codex(包括 Windows 的 %USERPROFILE%\.codex)
32
+ const candidates = [path.join(home, ".codex", "auth.json")];
33
+ // Windows 额外加 %APPDATA%\codex\auth.json 兜底
34
+ if (process.platform === "win32" && process.env.APPDATA) {
35
+ candidates.push(path.join(process.env.APPDATA, "codex", "auth.json"));
36
+ }
37
+ for (const file of candidates) {
38
+ const obj = await readJsonSafe(file);
39
+ if (!obj) continue;
40
+ const email = pickEmail(obj) || decodeJwtEmail(obj?.tokens?.id_token) || decodeJwtEmail(obj?.id_token);
41
+ if (email) return email;
42
+ }
43
+ return null;
44
+ }
45
+
46
+ async function readClaudeAccount() {
47
+ // 三端凭证存储位置不同:
48
+ // - macOS: Keychain, item name "Claude Code-credentials"
49
+ // - Linux: ~/.claude/.credentials.json 或 ~/.config/claude/.credentials.json
50
+ // - Windows: %APPDATA%\claude\.credentials.json
51
+ // 读出来的 JSON 里 OAuth token 是 opaque(sk-ant-oat01-...),不是 JWT,
52
+ // 没法反解 email。只能把 `subscriptionType`(team / pro / max / free)作为
53
+ // 账号标识展示。
54
+ let obj = null;
55
+
56
+ if (process.platform === "darwin") {
57
+ obj = readMacKeychainJson("Claude Code-credentials");
58
+ }
59
+ if (!obj) {
60
+ const home = os.homedir();
61
+ const candidates = [
62
+ path.join(home, ".claude", ".credentials.json"),
63
+ path.join(home, ".config", "claude", ".credentials.json"),
64
+ ];
65
+ if (process.platform === "win32" && process.env.APPDATA) {
66
+ candidates.push(path.join(process.env.APPDATA, "claude", ".credentials.json"));
67
+ }
68
+ for (const file of candidates) {
69
+ obj = await readJsonSafe(file);
70
+ if (obj) break;
71
+ }
72
+ }
73
+ if (!obj) return null;
74
+
75
+ // 优先 email(若将来 claude 真把 email 写进来),再回退到 subscriptionType
76
+ const email =
77
+ pickEmail(obj) ||
78
+ pickEmail(obj?.claudeAiOauth) ||
79
+ pickEmail(obj?.account) ||
80
+ decodeJwtEmail(obj?.claudeAiOauth?.accessToken) ||
81
+ decodeJwtEmail(obj?.accessToken);
82
+ if (email) return email;
83
+
84
+ const sub =
85
+ obj?.claudeAiOauth?.subscriptionType ||
86
+ obj?.subscriptionType ||
87
+ obj?.account?.subscription ||
88
+ obj?.plan;
89
+ if (sub && typeof sub === "string") return `Claude ${sub}`.trim();
90
+ return null;
91
+ }
92
+
93
+ function readMacKeychainJson(service) {
94
+ try {
95
+ const out = execFileSync("/usr/bin/security",
96
+ ["find-generic-password", "-s", service, "-w"],
97
+ { encoding: "utf8", timeout: 3000, stdio: ["ignore", "pipe", "ignore"] }
98
+ ).trim();
99
+ if (!out || !out.startsWith("{")) return null;
100
+ return JSON.parse(out);
101
+ } catch {
102
+ return null;
103
+ }
104
+ }
105
+
106
+ function pickEmail(o) {
107
+ if (!o || typeof o !== "object") return null;
108
+ const candidates = [o.email, o.user_email, o.account_email, o?.account?.email];
109
+ for (const v of candidates) {
110
+ if (typeof v === "string" && v.includes("@")) return v;
111
+ }
112
+ return null;
113
+ }
114
+
115
+ function decodeJwtEmail(token) {
116
+ if (typeof token !== "string" || token.split(".").length < 2) return null;
117
+ try {
118
+ const payload = token.split(".")[1];
119
+ const pad = payload + "=".repeat((4 - payload.length % 4) % 4);
120
+ const normalized = pad.replace(/-/g, "+").replace(/_/g, "/");
121
+ const json = Buffer.from(normalized, "base64").toString("utf8");
122
+ const obj = JSON.parse(json);
123
+ const email = pickEmail(obj) || obj?.https_email || obj?.["https://api.openai.com/profile"]?.email;
124
+ return typeof email === "string" && email.includes("@") ? email : null;
125
+ } catch {
126
+ return null;
127
+ }
128
+ }
129
+
130
+ async function readJsonSafe(file) {
131
+ try {
132
+ const buf = await fs.readFile(file, "utf8");
133
+ return JSON.parse(buf);
134
+ } catch {
135
+ return null;
136
+ }
137
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * activeRuns.mjs — bridge 进程内「活跃 run → kill 句柄」登记表。
3
+ *
4
+ * 用途:App 停止按钮发 `sessions.abort` / `chat.abort` RPC(经 relay 长轮询
5
+ * 到达 bridge),runtime 的 RPC 分支据 sessionKey / runId 找到正在执行的
6
+ * spawn 子进程并 kill(P0:停止按钮不生效)。
7
+ *
8
+ * 一个 registry 实例由单个 runtime handler 闭包持有(bridge 进程 = 单 runtime)。
9
+ */
10
+
11
+ /**
12
+ * @returns {{
13
+ * register: (entry: {sessionKey?: string|null, threadId?: string|null, runId?: string|null, kill: (reason?: string) => void}) => () => void,
14
+ * abort: (params?: {key?: string, runId?: string}) => {aborted: number, matched: string[]},
15
+ * size: () => number,
16
+ * }}
17
+ */
18
+ export function createActiveRunRegistry({ log } = {}) {
19
+ /** @type {Map<number, {sessionKey: string, threadId: string, runId: string, kill: Function}>} */
20
+ const runs = new Map();
21
+ let seq = 0;
22
+
23
+ function register({ sessionKey, threadId, runId, kill }) {
24
+ if (typeof kill !== "function") throw new Error("activeRuns.register: kill must be a function");
25
+ const id = ++seq;
26
+ runs.set(id, {
27
+ sessionKey: String(sessionKey || ""),
28
+ threadId: String(threadId || ""),
29
+ runId: String(runId || ""),
30
+ kill,
31
+ });
32
+ return () => runs.delete(id);
33
+ }
34
+
35
+ /**
36
+ * 杀掉匹配的活跃 run。匹配顺序:
37
+ * 1. runId 精确命中
38
+ * 2. key 命中 sessionKey 或 threadId
39
+ * 3. 都没命中且当前只有一个活跃 run → 杀它(key 口径不一致的兜底,
40
+ * 单会话场景下用户意图无歧义)
41
+ */
42
+ function abort({ key, runId } = {}) {
43
+ const wantRun = String(runId || "").trim();
44
+ const wantKey = String(key || "").trim();
45
+ let targets = [];
46
+ if (wantRun) {
47
+ targets = [...runs.entries()].filter(([, r]) => r.runId === wantRun);
48
+ }
49
+ if (targets.length === 0 && wantKey) {
50
+ targets = [...runs.entries()].filter(
51
+ ([, r]) => r.sessionKey === wantKey || r.threadId === wantKey,
52
+ );
53
+ }
54
+ if (targets.length === 0 && runs.size === 1) {
55
+ targets = [...runs.entries()];
56
+ log?.info?.("activeRuns.abort.fallback",
57
+ "abort key matched nothing, killing the single active run",
58
+ { key: wantKey, runId: wantRun });
59
+ }
60
+ const matched = [];
61
+ for (const [id, r] of targets) {
62
+ runs.delete(id);
63
+ matched.push(r.runId || r.threadId || String(id));
64
+ try {
65
+ r.kill("remote-abort");
66
+ } catch (err) {
67
+ log?.warn?.("activeRuns.abort.kill_failed", "kill threw", {
68
+ runId: r.runId, err: err?.message || String(err),
69
+ });
70
+ }
71
+ }
72
+ return { aborted: matched.length, matched };
73
+ }
74
+
75
+ return { register, abort, size: () => runs.size };
76
+ }
@@ -0,0 +1,75 @@
1
+ // agentlinkToolsBootstrap.mjs — 给 4 个 runtime 用的一站式启动 helper。
2
+ //
3
+ // 每个 runtime 的 index.mjs 在 createRelayWorker 之后调一次:
4
+ // const tools = await bootstrapAgentlinkTools({
5
+ // runtime, gwId, relayUrl, bridgeToken, worker, log, version,
6
+ // getLastRequestId: () => lastRequestId,
7
+ // });
8
+ // 之后:
9
+ // - agentlinkToolsServer 已起,discovery 文件已写
10
+ // - agentlink_change_title / notify_user / attach_file 工具对 MCP 客户端可见
11
+ // - 进程退出时(SIGINT/SIGTERM)自动清 discovery 文件 + 关 server
12
+ //
13
+ // 给同一 bridge 内多次调用是安全的(底层 lifecycle 模块的 cleanupInstalled
14
+ // flag 保证 handler 只装一次);但实际只会有一个 runtime 入口。
15
+
16
+ import { createAgentlinkToolsRegistry } from "./agentlinkToolsRegistry.mjs";
17
+ import { startToolsServerAndPublishDiscovery } from "./toolsServerLifecycle.mjs";
18
+ import { createPathAttachScanner } from "./bridgeAttachAutoScanner.mjs";
19
+
20
+ /**
21
+ * @param {object} opts
22
+ * @param {string} opts.runtime "claude"|"codex"|"hermes"|"openclaw"|"picoclaw"
23
+ * @param {string} opts.gwId gateway id (= clientUserID 跨 pair_session 反查的键)
24
+ * @param {string} opts.relayUrl relay base URL
25
+ * @param {string} opts.bridgeToken gateway/client token, used by attach 工具调 relay sign/commit
26
+ * @param {object} opts.worker createRelayWorker 返回的实例
27
+ * @param {object} opts.log
28
+ * @param {string} [opts.version] npm_cli 包版本(写入 discovery 文件)
29
+ * @param {() => string|null} opts.getLastRequestId 闭包:返回当前 in-flight requestId,
30
+ * 无 in-flight 时返回 null(publishEvent 走 no-op)
31
+ * @returns {Promise<{ registry, port, baseUrl, authToken, discoveryPath, stop }>}
32
+ */
33
+ export async function bootstrapAgentlinkTools(opts) {
34
+ const { runtime, gwId, relayUrl, bridgeToken, worker, log, version, getLastRequestId } = opts;
35
+ if (!runtime) throw new Error("bootstrapAgentlinkTools: runtime required");
36
+ if (!gwId) throw new Error("bootstrapAgentlinkTools: gwId required");
37
+ if (!relayUrl) throw new Error("bootstrapAgentlinkTools: relayUrl required");
38
+ if (!bridgeToken) throw new Error("bootstrapAgentlinkTools: bridgeToken required");
39
+ if (!worker) throw new Error("bootstrapAgentlinkTools: worker required");
40
+ if (typeof getLastRequestId !== "function") {
41
+ throw new Error("bootstrapAgentlinkTools: getLastRequestId function required");
42
+ }
43
+ if (!log) throw new Error("bootstrapAgentlinkTools: log required");
44
+
45
+ // publishEvent 闭包:每次工具触发时读「当前」lastRequestId,在 in-flight 期间
46
+ // 投递到 worker.publishEvent;无 in-flight 时 silently 不发(避免投递到无 owner
47
+ // 的 requestId)。
48
+ const publishEvent = async (event) => {
49
+ const rid = getLastRequestId();
50
+ if (!rid) return false;
51
+ return worker.publishEvent(rid, event);
52
+ };
53
+
54
+ const registry = createAgentlinkToolsRegistry({
55
+ publishEvent,
56
+ runtime,
57
+ log,
58
+ relayConfig: { baseUrl: relayUrl, gatewayId: gwId, token: bridgeToken },
59
+ });
60
+
61
+ const lifecycle = await startToolsServerAndPublishDiscovery({
62
+ registry, log, version,
63
+ });
64
+
65
+ // 自动路径扫描器:runtime 在 assistant text delta 上调 scanner.createTurnAccumulator()
66
+ // → append(delta) → flush()。所有 attach 都走 registry.dispatch("agentlink_attach_file"),
67
+ // 复用 denylist / sha256 dedup / COS PUT / audit / publishEvent 全套流水。
68
+ const scanner = createPathAttachScanner({ registry, log });
69
+
70
+ log.info("agentlink_tools.bootstrap.ready", "tools server up + discovery published", {
71
+ runtime, gwId, port: lifecycle.port, discoveryPath: lifecycle.discoveryPath,
72
+ });
73
+
74
+ return { registry, scanner, ...lifecycle };
75
+ }