@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,7 @@
1
+ #!/usr/bin/env node
2
+ // Independent bin for external-agents (claude / codex) bridging.
3
+ // 设计意图见 agentlink-cli/src-ext/README.md。
4
+ //
5
+ // 本文件**禁止** import `../src/**`。只允许 `../src-ext/**` 和 `../src-shared/**`。
6
+
7
+ import "../src-ext/bin.mjs";
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env node
2
+ // 独立 stdio → localhost HTTP 的 MCP 桥。
3
+ //
4
+ // 调用方:Claude / Codex / Hermes / OpenClaw 的 MCP 客户端把本脚本作为
5
+ // stdio MCP server spawn。两种调用形式:
6
+ //
7
+ // 1) 旧式(直接传 url + auth, 不推荐, 端口变化时配置会过期):
8
+ // { command: "node", args: ["/path/to/agentlink-mcp-stdio",
9
+ // "--url", "http://127.0.0.1:54321",
10
+ // "--auth", "abc..."] }
11
+ //
12
+ // 2) 新式(推荐, 通过 discovery 文件解耦, bridge 重启换端口对 MCP 配置透明):
13
+ // { command: "node", args: ["/path/to/agentlink-mcp-stdio",
14
+ // "--discovery", "/Users/<user>/.agentlink/tools-server.json"] }
15
+ // discovery 文件 shape: { url, auth, pid, version, startedAt }
16
+ // 由 bridge 进程在启动时写, 退出时清理。
17
+ //
18
+ // 本脚本:
19
+ // 1. 读 discovery 或 --url/--auth 拿到 url + auth
20
+ // 2. 监听 stdin 的 JSON-RPC 行, initialize 握手本地回, tools/list /
21
+ // tools/call 转发到 url (POST, Authorization: Bearer <auth>)
22
+ // 3. 其它方法返回 method not found
23
+
24
+ import process from "node:process";
25
+ import fs from "node:fs";
26
+
27
+ function parseArgs(argv) {
28
+ const out = {};
29
+ for (let i = 2; i < argv.length; i++) {
30
+ const a = argv[i];
31
+ if (a.startsWith("--") && argv[i + 1] !== undefined && !argv[i + 1].startsWith("--")) {
32
+ out[a.slice(2)] = argv[++i];
33
+ } else if (a.startsWith("--")) {
34
+ out[a.slice(2)] = true;
35
+ }
36
+ }
37
+ return out;
38
+ }
39
+
40
+ const args = parseArgs(process.argv);
41
+
42
+ // 优先级:--discovery (推荐) > --url / --auth (legacy) > 环境变量。
43
+ // --agentlink-version 是 marker, 让 fanout 升级时识别旧条目;脚本本身不消费它。
44
+ let url = args.url || process.env.AGENTLINK_MCP_URL || "";
45
+ let auth = args.auth || process.env.AGENTLINK_MCP_AUTH || "";
46
+
47
+ if (args.discovery && (!url || !auth)) {
48
+ try {
49
+ const raw = fs.readFileSync(args.discovery, "utf8");
50
+ const doc = JSON.parse(raw);
51
+ if (typeof doc?.url === "string" && typeof doc?.auth === "string") {
52
+ url = url || doc.url;
53
+ auth = auth || doc.auth;
54
+ }
55
+ } catch (err) {
56
+ // discovery 缺失 = bridge 没在跑;干净退出, MCP 客户端把我们当 server unavailable
57
+ process.stderr.write(`agentlink tools server not running (discovery=${args.discovery}: ${err?.message || err})\n`);
58
+ process.exit(2);
59
+ }
60
+ }
61
+
62
+ // stderr 用于错误观察(stdout 是 JSON-RPC 通道,不能污染)
63
+ function logStderr(level, event, extra) {
64
+ const row = { ts: new Date().toISOString(), level, comp: "mcp_bridge", event, pid: process.pid, ...extra };
65
+ try { process.stderr.write(JSON.stringify(row) + "\n"); } catch {}
66
+ }
67
+
68
+ if (!url) {
69
+ logStderr("error", "bridge.start.fail", { err: "missing --url or --discovery with usable file" });
70
+ process.exit(2);
71
+ }
72
+
73
+ logStderr("info", "bridge.start", {
74
+ url, has_auth: !!auth,
75
+ source: args.discovery ? "discovery" : "args",
76
+ agentlink_version: args["agentlink-version"] || null,
77
+ });
78
+
79
+ function sendRpc(obj) {
80
+ try { process.stdout.write(JSON.stringify(obj) + "\n"); }
81
+ catch (err) { logStderr("error", "bridge.stdout.write", { err: err?.message }); }
82
+ }
83
+
84
+ async function postJson(path, body) {
85
+ const res = await fetch(url.replace(/\/+$/, "") + path, {
86
+ method: "POST",
87
+ headers: {
88
+ "Content-Type": "application/json",
89
+ // 优先 Authorization: Bearer(标准 MCP / 与 spec 对齐);保留 X-Agentlink-Auth
90
+ // 兼容更老的 bridge(也能识别两种)。
91
+ ...(auth ? { "Authorization": `Bearer ${auth}`, "X-Agentlink-Auth": auth } : {}),
92
+ },
93
+ body: JSON.stringify(body || {}),
94
+ });
95
+ const text = await res.text();
96
+ if (!res.ok) {
97
+ throw new Error(`agentlink tools server ${res.status}: ${text.slice(0, 200)}`);
98
+ }
99
+ return text ? JSON.parse(text) : {};
100
+ }
101
+
102
+ async function handleMessage(msg) {
103
+ const { id, method, params } = msg;
104
+ if (method === "initialize") {
105
+ sendRpc({
106
+ jsonrpc: "2.0", id,
107
+ result: {
108
+ protocolVersion: "2024-11-05",
109
+ serverInfo: { name: "agentlink", version: "p5" },
110
+ capabilities: { tools: {} },
111
+ },
112
+ });
113
+ return;
114
+ }
115
+ if (method === "notifications/initialized") {
116
+ // no-op
117
+ return;
118
+ }
119
+ if (method === "tools/list") {
120
+ try {
121
+ const r = await postJson("/tools/list", {});
122
+ sendRpc({ jsonrpc: "2.0", id, result: { tools: r.tools || [] } });
123
+ } catch (err) {
124
+ sendRpc({ jsonrpc: "2.0", id, error: { code: -32603, message: err?.message || String(err) } });
125
+ }
126
+ return;
127
+ }
128
+ if (method === "tools/call") {
129
+ try {
130
+ const r = await postJson("/tools/call", {
131
+ name: params?.name || "",
132
+ arguments: params?.arguments || {},
133
+ });
134
+ sendRpc({ jsonrpc: "2.0", id, result: r });
135
+ } catch (err) {
136
+ sendRpc({ jsonrpc: "2.0", id, error: { code: -32603, message: err?.message || String(err) } });
137
+ }
138
+ return;
139
+ }
140
+ // 未实现的方法
141
+ if (id !== undefined) {
142
+ sendRpc({ jsonrpc: "2.0", id, error: { code: -32601, message: "method not implemented" } });
143
+ }
144
+ }
145
+
146
+ let buf = "";
147
+ process.stdin.on("data", (chunk) => {
148
+ buf += chunk.toString("utf8");
149
+ if (buf.length > 8 << 20) buf = buf.slice(-(4 << 20));
150
+ let idx;
151
+ while ((idx = buf.indexOf("\n")) >= 0) {
152
+ const line = buf.slice(0, idx).replace(/\r$/, "").trim();
153
+ buf = buf.slice(idx + 1);
154
+ if (!line) continue;
155
+ let msg;
156
+ try { msg = JSON.parse(line); }
157
+ catch (err) {
158
+ logStderr("warn", "bridge.parse.fail", { err: err?.message, sample: line.slice(0, 200) });
159
+ continue;
160
+ }
161
+ Promise.resolve(handleMessage(msg)).catch((err) => {
162
+ logStderr("error", "bridge.handle.threw", { err: err?.message || String(err) });
163
+ });
164
+ }
165
+ });
166
+
167
+ process.stdin.on("end", () => {
168
+ logStderr("info", "bridge.stdin.end", {});
169
+ process.exit(0);
170
+ });
171
+
172
+ process.on("SIGTERM", () => process.exit(0));
173
+ process.on("SIGINT", () => process.exit(0));
@@ -0,0 +1,159 @@
1
+ # Agentlink Agent Logging Spec (P1 — P6 契约)
2
+
3
+ 本文档是 `agentlink-agent` 及其所有运行时桥接(Claude / Codex 等)必须遵守
4
+ 的**日志契约**。任何新代码落库前,对照本文件 review。
5
+
6
+ ## 1. 为什么有这份规范
7
+
8
+ 在多进程、多语言、带 relay 中继的架构里,bug 基本只能靠日志复盘。
9
+ "想起来打 log" 的代码长期一定乱 —— 必须**约定**。
10
+
11
+ ## 2. 格式
12
+
13
+ 所有 `agentlink-agent` 输出**一律 JSON 行**(每行一个完整 JSON 对象)。
14
+
15
+ ```json
16
+ {"ts":"2026-04-17T10:23:45.123Z","level":"info","comp":"bridge","event":"bridge.start","cid":"c_ab12","session":"agent:u1:relay-gw:gw-A::claude-1","rt":"claude","msg":"bridge starting","pid":12345}
17
+ ```
18
+
19
+ 必选字段:
20
+
21
+ | 字段 | 含义 |
22
+ |-------|------|
23
+ | `ts` | ISO8601 毫秒 UTC |
24
+ | `level` | `debug` / `info` / `warn` / `error` |
25
+ | `comp` | 组件名(见 §4) |
26
+ | `event` | 事件名(见 §5,见名知意,`scope.verb` 形式) |
27
+ | `msg` | 人类可读短描述 |
28
+
29
+ 可选:
30
+ - `cid` — correlation id,一次完整 app→server→cli→agent 交互贯穿
31
+ - `session` — agentlink 会话 key(带前缀)
32
+ - `rt` — `claude` / `codex`
33
+ - `pid` — 当前进程 pid
34
+ - 其它任意 `snake_case` 附加字段
35
+
36
+ ## 3. level 使用标准
37
+
38
+ | level | 何时用 |
39
+ |-------|--------|
40
+ | `debug` | 事件流细节(每条 stdout 行、每次 cursor advance) |
41
+ | `info` | 业务里程碑(bridge 启停、session 切换、审批完成) |
42
+ | `warn` | 异常但可恢复(schema mismatch、重连、审批超时) |
43
+ | `error` | 意外异常(spawn 失败、panic、无法 recover) |
44
+
45
+ **默认级别 info**。通过 `AGENTLINK_AGENT_LOG_LEVEL=debug` 打开 debug。
46
+
47
+ ## 4. 组件命名 (`comp` 字段)
48
+
49
+ | comp | 归属 |
50
+ |------|------|
51
+ | `bridge` | `agentlink-agent` 顶层(启动、退出、参数解析) |
52
+ | `relay` | 与 Go server 的 SSE / HTTP 交互 |
53
+ | `child` | 外部 agent 子进程(claude / codex) |
54
+ | `stdout` | claude stdout 解析器 |
55
+ | `mcp` | codex MCP 客户端 |
56
+ | `hook` | claude hook server |
57
+ | `approval` | 审批闸门 |
58
+ | `session` | 会话槽位状态机 |
59
+ | `shared` | 共享基础设施(logger 自己、schema 校验) |
60
+
61
+ ## 5. 事件清单(硬约束,必打)
62
+
63
+ 每个阶段必打的事件。新增事件时在 PR 里更新本清单。
64
+
65
+ ### P1
66
+
67
+ | event | level | 何时触发 |
68
+ |-------|-------|----------|
69
+ | `bridge.start` | info | agent 启动入口第一行 |
70
+ | `bridge.preflight.pass` | info | 检查通过 |
71
+ | `bridge.preflight.fail` | error | 检查失败(会立刻退出) |
72
+ | `bridge.exit` | info | 正常退出 |
73
+ | `bridge.signal.recv` | info | 收到 SIGTERM/SIGINT |
74
+
75
+ ### P2 (Claude)
76
+
77
+ | event | level |
78
+ |-------|-------|
79
+ | `child.spawn` | info |
80
+ | `child.exit` | info |
81
+ | `child.stderr_tail` | warn |
82
+ | `stdout.line.parsed` | debug |
83
+ | `stdout.schema.mismatch` | warn |
84
+ | `stdout.buffer.overflow` | warn |
85
+ | `session.state` | info |
86
+ | `relay.event.send` | debug |
87
+ | `relay.event.recv` | debug |
88
+
89
+ ### P3 (审批)
90
+
91
+ | event | level |
92
+ |-------|-------|
93
+ | `approval.request.sent` | info |
94
+ | `approval.pending` | info | 每 60s 打一条,显示等待时长 |
95
+ | `approval.response.recv` | info |
96
+
97
+ ### P4 (Codex)
98
+
99
+ | event | level |
100
+ |-------|-------|
101
+ | `codex.connect` | info |
102
+ | `codex.notif` | debug |
103
+ | `codex.schema.mismatch` | warn |
104
+
105
+ ### P5 (MCP 反向桥)
106
+
107
+ | event | level |
108
+ |-------|-------|
109
+ | `elicit.request` | info |
110
+ | `elicit.response` | info |
111
+ | `mcp_bridge.forward` | debug |
112
+ | `mcp_bridge.socket.connect` | info |
113
+
114
+ ### P6 (resume / 重连)
115
+
116
+ | event | level |
117
+ |-------|-------|
118
+ | `resume.attempt` | info |
119
+ | `resume.result` | info |
120
+ | `relay.reconnect.backoff` | warn |
121
+ | `relay.cursor.advance` | debug |
122
+
123
+ ## 6. Correlation ID 流转
124
+
125
+ - App 创建:`cid = "c_" + random(8)`,随消息/RPC 请求透传
126
+ - Server 透传:`relay_events.payload.meta.cid`,`relay_events` 行本身不单独存列
127
+ - CLI 读到 event → 后续由此触发的所有日志挂 `cid`
128
+ - 子进程 → parent 走 stdout / fd3 / MCP 时也透传 cid(每行都带)
129
+
130
+ 出问题时 `grep cid=c_ab12cd34` 整条链可复盘。
131
+
132
+ ## 7. 落盘规则
133
+
134
+ - **默认**:`~/.agentlink/logs/agent-<runtime>-YYYYMMDD.log`
135
+ - 滚动:按天、保留 7 天、单文件 > 50MB 时滚动
136
+ - 格式:和 stderr 一致(JSON 行),便于 `jq` 分析
137
+ - **敏感内容脱敏**:
138
+ - 用户消息 body 截断 500 字符(更长则 `text_truncated: true`)
139
+ - token / credential / cookie 整字段替换成 `<redacted>`
140
+ - 文件路径保留
141
+ - **所有级别日志走 stderr**(不走 stdout)—— stdout 是业务产出通道(help、version、未来的 JSON 响应)
142
+ 所以 `agentlink-agent --help 2>/dev/null` 只出帮助,`... 1>/dev/null` 只出日志
143
+
144
+ ## 8. 工具命令
145
+
146
+ ```bash
147
+ agentlink-agent logs tail # 实时跟当天日志
148
+ agentlink-agent logs grep <cid> # 按 cid 查
149
+ agentlink-agent logs path # 输出日志文件路径
150
+ ```
151
+
152
+ (P6 阶段实现,P1 先保证格式对。)
153
+
154
+ ## 9. 铁律
155
+
156
+ 1. **未知事件 / 未知字段** → `warn` 级别 `*.schema.mismatch` → **继续运行**,禁止 crash
157
+ 2. **任何 catch 块** → 必须打 `error.caught where=...`,然后决定吞/抛
158
+ 3. **循环 / 定时器** → 绝不打 `debug` 级别的"心跳",审批等待类用 60s 节流
159
+ 4. **禁止 `console.log`** —— 一律走 logger,未走的视为 bug
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@xyagent/cli",
3
+ "version": "0.0.1",
4
+ "private": false,
5
+ "description": "Relay-first CLI for pairing and bridging OpenClaw gateway traffic",
6
+ "type": "module",
7
+ "files": [
8
+ "bin/agentlink",
9
+ "bin/agentlink-agent",
10
+ "bin/agentlink-mcp-stdio",
11
+ "src/",
12
+ "src-shared/",
13
+ "src-ext/",
14
+ "docs/LOGGING.md",
15
+ "README.md"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "engines": {
21
+ "node": ">=22"
22
+ },
23
+ "scripts": {
24
+ "build:plugin": "node scripts/build-openclaw-plugin.mjs",
25
+ "prepublishOnly": "node scripts/build-openclaw-plugin.mjs",
26
+ "postinstall": "node -e 'import(process.cwd()+\"/src-ext/core/daemonRestart.mjs\").then(m=>m.kickstartDaemons()).catch(()=>{})'",
27
+ "test": "node --test --test-concurrency=1 'test/**/*.test.mjs'",
28
+ "test:coverage": "node --test --experimental-test-coverage test/tunnel/core.test.mjs"
29
+ },
30
+ "bin": {
31
+ "agentlink": "bin/agentlink",
32
+ "agentlink-agent": "bin/agentlink-agent",
33
+ "agentlink-mcp-stdio": "bin/agentlink-mcp-stdio"
34
+ },
35
+ "dependencies": {
36
+ "pdfjs-dist": "^4.10.38"
37
+ }
38
+ }
package/src/core.mjs ADDED
@@ -0,0 +1,320 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import path from "node:path";
3
+
4
+ export const NUMERIC_CODE_LENGTH = 4;
5
+ export const GROUP_SIZE = 4;
6
+ export const DEFAULT_BIND_PATH = "/testnextim/bind";
7
+ export const FIXED_MEMORY_FILES = Object.freeze([
8
+ "AGENTS.md",
9
+ "HEARTBEAT.md",
10
+ "IDENTITY.md",
11
+ "MEMORY.md",
12
+ "SOUL.md",
13
+ "TOOLS.md",
14
+ "USER.md",
15
+ ]);
16
+
17
+ function throwError(message) {
18
+ throw new Error(message);
19
+ }
20
+
21
+ export function buildPathString(values, delimiter = path.delimiter) {
22
+ const entries = [];
23
+ const seen = new Set();
24
+ for (const value of values) {
25
+ const raw = String(value ?? "").trim();
26
+ if (!raw) continue;
27
+ for (const part of raw.split(delimiter)) {
28
+ const normalized = part.trim();
29
+ if (!normalized || seen.has(normalized)) continue;
30
+ seen.add(normalized);
31
+ entries.push(normalized);
32
+ }
33
+ }
34
+ return entries.join(delimiter);
35
+ }
36
+
37
+ export function resolveSiblingBinDirs(executablePath, pathModule = path) {
38
+ const normalized = String(executablePath ?? "").trim();
39
+ if (!normalized) return [];
40
+ return [pathModule.dirname(normalized)];
41
+ }
42
+
43
+ export function normalizeFixedMemoryFileName(rawName, supportedFiles = FIXED_MEMORY_FILES) {
44
+ const normalized = String(rawName ?? "").trim().toUpperCase();
45
+ for (const fileName of supportedFiles) {
46
+ if (fileName.toUpperCase() === normalized) {
47
+ return fileName;
48
+ }
49
+ }
50
+ throw new Error(`unsupported memory file: ${String(rawName ?? "").trim()}`);
51
+ }
52
+
53
+ export function commandToString(command, args) {
54
+ return [command, ...args]
55
+ .map((part) => {
56
+ const value = String(part);
57
+ return /[\s"]/u.test(value) ? `"${value.replaceAll("\"", "\\\"")}"` : value;
58
+ })
59
+ .join(" ");
60
+ }
61
+
62
+ export function quoteWindowsCommandArg(value) {
63
+ const text = String(value ?? "");
64
+ if (!/[\s"]/u.test(text)) {
65
+ return text;
66
+ }
67
+ return `"${text.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"")}"`;
68
+ }
69
+
70
+ export function formatCode(raw, groupSize = GROUP_SIZE) {
71
+ return `${raw.slice(0, groupSize)}-${raw.slice(groupSize)}`;
72
+ }
73
+
74
+ export function normalizeProvidedCode(raw, onInvalid = throwError) {
75
+ const compact = String(raw ?? "")
76
+ .trim()
77
+ .toUpperCase()
78
+ .replace(/\s+/g, "")
79
+ .replace(/-/g, "");
80
+ if (/^\d{4}$/.test(compact)) return compact;
81
+ if (/^\d{6}$/.test(compact)) return compact;
82
+ if (/^[A-Z0-9]{8}$/.test(compact)) return formatCode(compact);
83
+ return onInvalid(
84
+ "invalid --code format. expected 4 digits (e.g. 1234), 6 digits (e.g. 123456), " +
85
+ "or 8 alphanumeric characters (e.g. ABCD-1234; case-insensitive, dash optional)",
86
+ );
87
+ }
88
+
89
+ export function generatePairCode(random = Math.random, numericCodeLength = NUMERIC_CODE_LENGTH) {
90
+ const min = 10 ** (numericCodeLength - 1);
91
+ const max = 10 ** numericCodeLength;
92
+ return String(min + Math.floor(random() * (max - min)));
93
+ }
94
+
95
+ export function parseNonNegativeInt(value, fallback = 0) {
96
+ if (typeof value === "number" && Number.isFinite(value)) {
97
+ return value >= 0 ? Math.trunc(value) : fallback;
98
+ }
99
+ if (typeof value === "string" && value.trim()) {
100
+ const parsed = Number.parseInt(value.trim(), 10);
101
+ if (Number.isFinite(parsed) && parsed >= 0) {
102
+ return parsed;
103
+ }
104
+ }
105
+ return fallback;
106
+ }
107
+
108
+ export function normalizePath(input, fallback) {
109
+ const value = typeof input === "string" ? input.trim() : "";
110
+ if (!value) return fallback;
111
+ return value.startsWith("/") ? value : `/${value}`;
112
+ }
113
+
114
+ export function normalizeChatTransportMode(raw, fallback = "relay") {
115
+ const value = String(raw ?? "")
116
+ .trim()
117
+ .toLowerCase();
118
+ if (value === "relay") return "relay";
119
+ return fallback;
120
+ }
121
+
122
+ export function normalizeRuntimeKind(raw, fallback = "openclaw") {
123
+ const value = String(raw ?? "")
124
+ .trim()
125
+ .toLowerCase();
126
+ if (value === "hermes") return "hermes";
127
+ if (value === "openclaw") return "openclaw";
128
+ return fallback;
129
+ }
130
+
131
+ export function trimSlash(input) {
132
+ return String(input ?? "").replace(/\/+$/, "");
133
+ }
134
+
135
+ export function normalizeBaseUrl(input) {
136
+ const value = typeof input === "string" ? input.trim() : "";
137
+ if (!value) return null;
138
+ return trimSlash(value);
139
+ }
140
+
141
+ export function buildBindUrl(
142
+ { base, bindPath, accountId, code },
143
+ defaultBindPath = DEFAULT_BIND_PATH,
144
+ ) {
145
+ if (!base || typeof base !== "string" || !base.trim()) return null;
146
+ const normalizedBase = trimSlash(base.trim());
147
+ const normalizedPath = normalizePath(bindPath, defaultBindPath);
148
+ const qp = new URLSearchParams({ accountId, code });
149
+ return `${normalizedBase}${normalizedPath}?${qp.toString()}`;
150
+ }
151
+
152
+ export function buildGatewayResponsesUrl(base, onInvalid = throwError) {
153
+ const normalized = normalizeBaseUrl(base);
154
+ if (!normalized) return onInvalid("gateway base URL is required");
155
+ let parsed;
156
+ try {
157
+ parsed = new URL(normalized);
158
+ } catch {
159
+ return onInvalid(`invalid gateway base URL: ${base}`);
160
+ }
161
+ parsed.pathname = "/v1/responses";
162
+ parsed.search = "";
163
+ parsed.hash = "";
164
+ return parsed.toString();
165
+ }
166
+
167
+ export function buildGatewayWsUrl(base, onInvalid = throwError) {
168
+ const normalized = normalizeBaseUrl(base);
169
+ if (!normalized) return onInvalid("gateway base URL is required");
170
+ let parsed;
171
+ try {
172
+ parsed = new URL(normalized);
173
+ } catch {
174
+ return onInvalid(`invalid gateway base URL: ${base}`);
175
+ }
176
+ parsed.protocol = parsed.protocol === "https:" ? "wss:" : "ws:";
177
+ parsed.pathname = "/v1/ws";
178
+ parsed.search = "";
179
+ parsed.hash = "";
180
+ return parsed.toString();
181
+ }
182
+
183
+ export function parseGatewayPortEnvValue(raw) {
184
+ const trimmed = String(raw ?? "").trim();
185
+ if (!trimmed) {
186
+ return null;
187
+ }
188
+ if (/^\d+$/.test(trimmed)) {
189
+ const parsed = Number.parseInt(trimmed, 10);
190
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
191
+ }
192
+ const bracketedIpv6Match = trimmed.match(/^\[[^\]]+\]:(\d+)$/);
193
+ if (bracketedIpv6Match?.[1]) {
194
+ const parsed = Number.parseInt(bracketedIpv6Match[1], 10);
195
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
196
+ }
197
+ const firstColon = trimmed.indexOf(":");
198
+ const lastColon = trimmed.lastIndexOf(":");
199
+ if (firstColon <= 0 || firstColon !== lastColon) {
200
+ return null;
201
+ }
202
+ const suffix = trimmed.slice(firstColon + 1);
203
+ if (!/^\d+$/.test(suffix)) {
204
+ return null;
205
+ }
206
+ const parsed = Number.parseInt(suffix, 10);
207
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
208
+ }
209
+
210
+ export function extractPortFromText(raw) {
211
+ const text = String(raw ?? "").trim();
212
+ if (!text) return null;
213
+ const direct = parseGatewayPortEnvValue(text);
214
+ if (direct != null) return direct;
215
+ const matches = text.match(/\b\d{2,5}\b/g) ?? [];
216
+ for (let i = matches.length - 1; i >= 0; i -= 1) {
217
+ const parsed = parseGatewayPortEnvValue(matches[i]);
218
+ if (parsed != null) return parsed;
219
+ }
220
+ return null;
221
+ }
222
+
223
+ export function formatHostForUrl(host) {
224
+ const value = String(host ?? "").trim();
225
+ if (!value) return "";
226
+ if (value.startsWith("[") && value.endsWith("]")) {
227
+ return value;
228
+ }
229
+ if (value.includes(":")) {
230
+ return `[${value}]`;
231
+ }
232
+ return value;
233
+ }
234
+
235
+ export function safeJsonParse(raw) {
236
+ try {
237
+ return JSON.parse(raw);
238
+ } catch {
239
+ return null;
240
+ }
241
+ }
242
+
243
+ export function extractErrorMessage(decoded, fallback) {
244
+ if (decoded && typeof decoded === "object") {
245
+ if (typeof decoded.error === "string" && decoded.error.trim()) return decoded.error.trim();
246
+ if (typeof decoded.message === "string" && decoded.message.trim()) {
247
+ return decoded.message.trim();
248
+ }
249
+ }
250
+ return fallback;
251
+ }
252
+
253
+ export function formatErrorDetails(error) {
254
+ if (!(error instanceof Error)) {
255
+ return String(error ?? "");
256
+ }
257
+ const details = [];
258
+ if (error.name && error.name !== "Error") {
259
+ details.push(`name=${error.name}`);
260
+ }
261
+ if (error.code) {
262
+ details.push(`code=${String(error.code)}`);
263
+ }
264
+ if (error.errno) {
265
+ details.push(`errno=${String(error.errno)}`);
266
+ }
267
+ if (error.type) {
268
+ details.push(`type=${String(error.type)}`);
269
+ }
270
+ if (error.cause && typeof error.cause === "object") {
271
+ const cause = error.cause;
272
+ if (cause?.code) {
273
+ details.push(`cause.code=${String(cause.code)}`);
274
+ }
275
+ if (cause?.errno) {
276
+ details.push(`cause.errno=${String(cause.errno)}`);
277
+ }
278
+ if (cause?.message) {
279
+ details.push(`cause=${String(cause.message)}`);
280
+ }
281
+ }
282
+ return details.length > 0
283
+ ? `${error.message} [${details.join(", ")}]`
284
+ : error.message;
285
+ }
286
+
287
+ export function isTransientNetworkError(error) {
288
+ const message = String(error instanceof Error ? error.message : error).toLowerCase();
289
+ return (
290
+ message.includes("timeout") ||
291
+ message.includes("fetch failed") ||
292
+ message.includes("terminated") ||
293
+ message.includes("socket") ||
294
+ message.includes("econnreset") ||
295
+ message.includes("econnrefused") ||
296
+ message.includes("ehostunreach") ||
297
+ message.includes("enotfound") ||
298
+ message.includes("etimedout") ||
299
+ message.includes("epipe") ||
300
+ message.includes("network")
301
+ );
302
+ }
303
+
304
+ export function normalizeGatewayIdRaw(value) {
305
+ return String(value ?? "")
306
+ .trim()
307
+ .toLowerCase()
308
+ .replace(/[^a-z0-9_-]/g, "-")
309
+ .replace(/-+/g, "-")
310
+ .replace(/^-+|-+$/g, "");
311
+ }
312
+
313
+ export function generateRelayGatewayId(accountId, randomHexFn = defaultRandomHex) {
314
+ const normalizedAccount = normalizeGatewayIdRaw(accountId) || "default";
315
+ return `gw-${normalizedAccount}-${randomHexFn(4)}`;
316
+ }
317
+
318
+ function defaultRandomHex(bytesLength = 16) {
319
+ return randomBytes(bytesLength).toString("hex");
320
+ }