@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,699 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import process from "node:process";
6
+
7
+ export function startTunnelRuntime({
8
+ localPort,
9
+ relayUrl,
10
+ cliPath,
11
+ tunnelID,
12
+ tunnelToken,
13
+ slug,
14
+ protocol,
15
+ targetBaseUrl,
16
+ logPath,
17
+ agentlinkHome,
18
+ }) {
19
+ const startArgs = [
20
+ cliPath,
21
+ "tunnel",
22
+ "agent",
23
+ String(localPort),
24
+ "--relay",
25
+ relayUrl,
26
+ "--tunnel-id",
27
+ tunnelID,
28
+ "--tunnel-token",
29
+ tunnelToken,
30
+ "--slug",
31
+ slug,
32
+ "--tunnel-protocol",
33
+ protocol || "http",
34
+ "--target",
35
+ targetBaseUrl,
36
+ ];
37
+ const installContext = {
38
+ localPort,
39
+ relayUrl,
40
+ cliPath,
41
+ logPath,
42
+ agentlinkHome,
43
+ nodePath: process.execPath,
44
+ startArgs,
45
+ };
46
+
47
+ try {
48
+ if (process.platform === "darwin") {
49
+ return installTunnelServiceMac(installContext);
50
+ }
51
+ if (process.platform === "linux") {
52
+ if (isSystemdUserAvailable()) {
53
+ return installTunnelServiceLinux(installContext);
54
+ }
55
+ if (isSystemdSystemAvailable()) {
56
+ return installTunnelSystemServiceLinux(installContext);
57
+ }
58
+ return startDetachedTunnelProcess({ ...installContext, warning: "systemd user session unavailable; using detached process" });
59
+ }
60
+ if (process.platform === "win32") {
61
+ return installTunnelServiceWindows(installContext);
62
+ }
63
+ return startDetachedTunnelProcess({
64
+ ...installContext,
65
+ warning: `service manager not configured for platform ${process.platform}; using detached process`,
66
+ });
67
+ } catch (error) {
68
+ return startDetachedTunnelProcess({
69
+ ...installContext,
70
+ warning: `service install failed; using detached process (${String(error instanceof Error ? error.message : error)})`,
71
+ });
72
+ }
73
+ }
74
+
75
+ export function stopTunnelRuntime({ localPort, runtime, pid }) {
76
+ if (runtime?.mode === "service") {
77
+ return uninstallTunnelService(localPort, runtime);
78
+ }
79
+ if (pid && isPidAlive(pid)) {
80
+ safeKill(pid);
81
+ }
82
+ return {
83
+ mode: "process",
84
+ manager: "detached",
85
+ running: false,
86
+ target: null,
87
+ ref: null,
88
+ };
89
+ }
90
+
91
+ export function getTunnelRuntimeStatus({ localPort, runtime, pid }) {
92
+ if (runtime?.mode === "service") {
93
+ return getTunnelServiceStatus(localPort, runtime);
94
+ }
95
+ return {
96
+ mode: "process",
97
+ manager: "detached",
98
+ running: isPidAlive(pid),
99
+ pid: pid ?? null,
100
+ installed: false,
101
+ target: null,
102
+ ref: null,
103
+ };
104
+ }
105
+
106
+ function startDetachedTunnelProcess({ startArgs, logPath, warning }) {
107
+ fs.mkdirSync(path.dirname(logPath), { recursive: true });
108
+ const logFd = fs.openSync(logPath, "a");
109
+ const child = spawn(process.execPath, startArgs, {
110
+ detached: true,
111
+ stdio: ["ignore", logFd, logFd],
112
+ windowsHide: process.platform === "win32",
113
+ });
114
+ child.unref();
115
+ fs.closeSync(logFd);
116
+ return {
117
+ mode: "process",
118
+ manager: "detached",
119
+ running: true,
120
+ pid: child.pid ?? null,
121
+ target: null,
122
+ ref: null,
123
+ warning: warning || null,
124
+ };
125
+ }
126
+
127
+ function installTunnelServiceMac(installContext) {
128
+ const names = tunnelServiceNames(installContext.localPort);
129
+ const plistPath = resolveMacLaunchAgentPath(installContext.localPort);
130
+ const launchScriptPath = writeTunnelLaunchScript(installContext);
131
+ fs.mkdirSync(path.dirname(plistPath), { recursive: true });
132
+ const plist = [
133
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
134
+ "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">",
135
+ "<plist version=\"1.0\">",
136
+ "<dict>",
137
+ ` <key>Label</key><string>${names.label}</string>`,
138
+ " <key>ProgramArguments</key>",
139
+ " <array>",
140
+ ` <string>${escapeXmlText(launchScriptPath)}</string>`,
141
+ " </array>",
142
+ " <key>RunAtLoad</key><true/>",
143
+ " <key>KeepAlive</key><true/>",
144
+ ` <key>WorkingDirectory</key><string>${escapeXmlText(installContext.agentlinkHome)}</string>`,
145
+ ` <key>StandardOutPath</key><string>${escapeXmlText(installContext.logPath)}</string>`,
146
+ ` <key>StandardErrorPath</key><string>${escapeXmlText(installContext.logPath)}</string>`,
147
+ "</dict>",
148
+ "</plist>",
149
+ "",
150
+ ].join("\n");
151
+ fs.writeFileSync(plistPath, plist, "utf8");
152
+
153
+ const uid = typeof process.getuid === "function" ? process.getuid() : null;
154
+ const domains = uid == null ? [] : [`gui/${uid}`, `user/${uid}`];
155
+ let selectedDomain = null;
156
+ for (const domain of domains) {
157
+ runCommand("launchctl", ["bootout", domain, plistPath]);
158
+ const bootstrap = runCommand("launchctl", ["bootstrap", domain, plistPath]);
159
+ if (bootstrap.status === 0) {
160
+ selectedDomain = domain;
161
+ runCommand("launchctl", ["enable", `${domain}/${names.label}`]);
162
+ runCommand("launchctl", ["kickstart", "-k", `${domain}/${names.label}`]);
163
+ break;
164
+ }
165
+ }
166
+ if (!selectedDomain) {
167
+ const fallback = runCommand("launchctl", ["load", "-w", plistPath]);
168
+ if (fallback.status !== 0) {
169
+ safeUnlink(plistPath);
170
+ safeUnlink(launchScriptPath);
171
+ throw new Error((fallback.stderr || fallback.stdout || "launchctl bootstrap failed").trim());
172
+ }
173
+ selectedDomain = "launchd";
174
+ }
175
+ const status = readMacLaunchdServiceStatus(uid, plistPath, names);
176
+ if (!status.running) {
177
+ throw new Error(status.lastExitCode ? `launchd last exit code: ${status.lastExitCode}` : "launchd service failed to stay running");
178
+ }
179
+ return {
180
+ mode: "service",
181
+ manager: "launchd",
182
+ running: true,
183
+ pid: status.pid ?? null,
184
+ target: plistPath,
185
+ ref: `${selectedDomain}/${names.label}`,
186
+ launchScriptPath,
187
+ };
188
+ }
189
+
190
+ function installTunnelServiceLinux(installContext) {
191
+ const names = tunnelServiceNames(installContext.localPort);
192
+ const unitPath = resolveLinuxUserUnitPath(installContext.localPort);
193
+ const launchScriptPath = writeTunnelLaunchScript(installContext);
194
+ fs.mkdirSync(path.dirname(unitPath), { recursive: true });
195
+ const unit = [
196
+ "[Unit]",
197
+ `Description=Agentlink tunnel ${installContext.localPort}`,
198
+ "After=network-online.target",
199
+ "Wants=network-online.target",
200
+ "",
201
+ "[Service]",
202
+ "Type=simple",
203
+ `Environment=\"HOME=${escapeSystemdValue(os.homedir())}\"`,
204
+ `Environment=\"AGENTLINK_HOME=${escapeSystemdValue(installContext.agentlinkHome)}\"`,
205
+ `WorkingDirectory=${escapeSystemdPath(installContext.agentlinkHome)}`,
206
+ `ExecStart=${escapeSystemdPath(launchScriptPath)}`,
207
+ "Restart=always",
208
+ "RestartSec=5",
209
+ `StandardOutput=append:${escapeSystemdPath(installContext.logPath)}`,
210
+ `StandardError=append:${escapeSystemdPath(installContext.logPath)}`,
211
+ "",
212
+ "[Install]",
213
+ "WantedBy=default.target",
214
+ "",
215
+ ].join("\n");
216
+ fs.writeFileSync(unitPath, unit, "utf8");
217
+
218
+ for (const [command, args] of [
219
+ ["systemctl", ["--user", "daemon-reload"]],
220
+ ["systemctl", ["--user", "enable", "--now", names.unit]],
221
+ ]) {
222
+ const result = runCommand(command, args);
223
+ if (result.status !== 0) {
224
+ runCommand("systemctl", ["--user", "disable", "--now", names.unit]);
225
+ safeUnlink(unitPath);
226
+ safeUnlink(launchScriptPath);
227
+ throw new Error((result.stderr || result.stdout || `${command} failed`).trim());
228
+ }
229
+ }
230
+
231
+ return {
232
+ mode: "service",
233
+ manager: "systemd-user",
234
+ running: true,
235
+ pid: null,
236
+ target: unitPath,
237
+ ref: names.unit,
238
+ launchScriptPath,
239
+ };
240
+ }
241
+
242
+ function installTunnelSystemServiceLinux(installContext) {
243
+ const names = tunnelServiceNames(installContext.localPort);
244
+ const unitPath = resolveLinuxSystemUnitPath(installContext.localPort);
245
+ const launchScriptPath = writeTunnelLaunchScript(installContext);
246
+ fs.mkdirSync(path.dirname(unitPath), { recursive: true });
247
+ const unit = [
248
+ "[Unit]",
249
+ `Description=Agentlink tunnel ${installContext.localPort}`,
250
+ "After=network-online.target",
251
+ "Wants=network-online.target",
252
+ "",
253
+ "[Service]",
254
+ "Type=simple",
255
+ "User=root",
256
+ `Environment=\"HOME=${escapeSystemdValue(os.homedir())}\"`,
257
+ `Environment=\"AGENTLINK_HOME=${escapeSystemdValue(installContext.agentlinkHome)}\"`,
258
+ `WorkingDirectory=${escapeSystemdPath(installContext.agentlinkHome)}`,
259
+ `ExecStart=${escapeSystemdPath(launchScriptPath)}`,
260
+ "Restart=always",
261
+ "RestartSec=5",
262
+ `StandardOutput=append:${escapeSystemdPath(installContext.logPath)}`,
263
+ `StandardError=append:${escapeSystemdPath(installContext.logPath)}`,
264
+ "",
265
+ "[Install]",
266
+ "WantedBy=multi-user.target",
267
+ "",
268
+ ].join("\n");
269
+ fs.writeFileSync(unitPath, unit, "utf8");
270
+
271
+ for (const [command, args] of [
272
+ ["systemctl", ["daemon-reload"]],
273
+ ["systemctl", ["enable", "--now", names.systemUnit]],
274
+ ]) {
275
+ const result = runCommand(command, args);
276
+ if (result.status !== 0) {
277
+ runCommand("systemctl", ["disable", "--now", names.systemUnit]);
278
+ safeUnlink(unitPath);
279
+ safeUnlink(launchScriptPath);
280
+ throw new Error((result.stderr || result.stdout || `${command} failed`).trim());
281
+ }
282
+ }
283
+
284
+ return {
285
+ mode: "service",
286
+ manager: "systemd-system",
287
+ running: true,
288
+ pid: null,
289
+ target: unitPath,
290
+ ref: names.systemUnit,
291
+ launchScriptPath,
292
+ };
293
+ }
294
+
295
+ function installTunnelServiceWindows(installContext) {
296
+ const names = tunnelServiceNames(installContext.localPort);
297
+ const launchScriptPath = writeTunnelLaunchScript(installContext);
298
+ const commandPath =
299
+ (process.env.ComSpec ?? "").trim() ||
300
+ path.join(process.env.SystemRoot ?? "C:\\Windows", "System32", "cmd.exe");
301
+ const commandArgs = `/d /c ${quoteWindowsCommandArg(launchScriptPath)}`;
302
+ const script = [
303
+ `$Action = New-ScheduledTaskAction -Execute '${commandPath.replaceAll("'", "''")}' -Argument '${commandArgs.replaceAll("'", "''")}'`,
304
+ "$Trigger = New-ScheduledTaskTrigger -AtLogOn",
305
+ "$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -RestartCount 999 -RestartInterval (New-TimeSpan -Minutes 1)",
306
+ `Register-ScheduledTask -TaskName '${names.task}' -Action $Action -Trigger $Trigger -Settings $Settings -Description 'Agentlink tunnel ${installContext.localPort}' -Force | Out-Null`,
307
+ `Start-ScheduledTask -TaskName '${names.task}'`,
308
+ ].join("; ");
309
+ const encoded = Buffer.from(script, "utf16le").toString("base64");
310
+ const result = runCommand("powershell.exe", ["-NoProfile", "-EncodedCommand", encoded]);
311
+ if (result.status !== 0) {
312
+ safeUnlink(launchScriptPath);
313
+ throw new Error((result.stderr || result.stdout || "scheduled task install failed").trim());
314
+ }
315
+ return {
316
+ mode: "service",
317
+ manager: "task-scheduler",
318
+ running: true,
319
+ pid: null,
320
+ target: names.task,
321
+ ref: names.task,
322
+ launchScriptPath,
323
+ };
324
+ }
325
+
326
+ function uninstallTunnelService(localPort, runtime) {
327
+ const names = tunnelServiceNames(localPort);
328
+ const launchScriptPath = runtime?.launchScriptPath || resolveTunnelLaunchScriptPath(localPort);
329
+ if (process.platform === "darwin") {
330
+ const plistPath = resolveMacLaunchAgentPath(localPort);
331
+ const uid = typeof process.getuid === "function" ? process.getuid() : null;
332
+ if (uid != null) {
333
+ runCommand("launchctl", ["bootout", `gui/${uid}`, plistPath]);
334
+ runCommand("launchctl", ["bootout", `user/${uid}`, plistPath]);
335
+ }
336
+ runCommand("launchctl", ["remove", names.label]);
337
+ safeUnlink(plistPath);
338
+ safeUnlink(launchScriptPath);
339
+ return {
340
+ mode: "service",
341
+ manager: "launchd",
342
+ running: false,
343
+ target: plistPath,
344
+ ref: names.label,
345
+ };
346
+ }
347
+ if (process.platform === "linux") {
348
+ if (runtime?.manager === "systemd-system") {
349
+ const unitPath = resolveLinuxSystemUnitPath(localPort);
350
+ runCommand("systemctl", ["disable", "--now", names.systemUnit]);
351
+ safeUnlink(unitPath);
352
+ safeUnlink(launchScriptPath);
353
+ runCommand("systemctl", ["daemon-reload"]);
354
+ return {
355
+ mode: "service",
356
+ manager: "systemd-system",
357
+ running: false,
358
+ target: unitPath,
359
+ ref: names.systemUnit,
360
+ };
361
+ }
362
+ const unitPath = resolveLinuxUserUnitPath(localPort);
363
+ runCommand("systemctl", ["--user", "disable", "--now", names.unit]);
364
+ safeUnlink(unitPath);
365
+ safeUnlink(launchScriptPath);
366
+ runCommand("systemctl", ["--user", "daemon-reload"]);
367
+ return {
368
+ mode: "service",
369
+ manager: "systemd-user",
370
+ running: false,
371
+ target: unitPath,
372
+ ref: names.unit,
373
+ };
374
+ }
375
+ if (process.platform === "win32") {
376
+ runCommand("powershell.exe", ["-NoProfile", "-Command", `Unregister-ScheduledTask -TaskName '${names.task}' -Confirm:$false -ErrorAction SilentlyContinue`]);
377
+ safeUnlink(launchScriptPath);
378
+ return {
379
+ mode: "service",
380
+ manager: "task-scheduler",
381
+ running: false,
382
+ target: names.task,
383
+ ref: names.task,
384
+ };
385
+ }
386
+ safeUnlink(launchScriptPath);
387
+ return {
388
+ mode: "service",
389
+ manager: runtime?.manager ?? process.platform,
390
+ running: false,
391
+ target: runtime?.target ?? null,
392
+ ref: runtime?.ref ?? null,
393
+ };
394
+ }
395
+
396
+ function getTunnelServiceStatus(localPort, runtime) {
397
+ const names = tunnelServiceNames(localPort);
398
+ if (process.platform === "darwin") {
399
+ const uid = typeof process.getuid === "function" ? process.getuid() : null;
400
+ const plistPath = resolveMacLaunchAgentPath(localPort);
401
+ const status = readMacLaunchdServiceStatus(uid, plistPath, names);
402
+ return {
403
+ mode: "service",
404
+ manager: "launchd",
405
+ running: Boolean(status.running),
406
+ pid: status.pid ?? null,
407
+ installed: Boolean(status.installed),
408
+ target: plistPath,
409
+ ref: status.ref,
410
+ };
411
+ }
412
+ if (process.platform === "linux") {
413
+ if (runtime?.manager === "systemd-system") {
414
+ const unitPath = resolveLinuxSystemUnitPath(localPort);
415
+ const active = runCommand("systemctl", ["is-active", names.systemUnit]);
416
+ return {
417
+ mode: "service",
418
+ manager: "systemd-system",
419
+ running: active.status === 0 && String(active.stdout ?? "").trim() === "active",
420
+ pid: null,
421
+ installed: fs.existsSync(unitPath),
422
+ target: unitPath,
423
+ ref: names.systemUnit,
424
+ };
425
+ }
426
+ const unitPath = resolveLinuxUserUnitPath(localPort);
427
+ const active = runCommand("systemctl", ["--user", "is-active", names.unit]);
428
+ return {
429
+ mode: "service",
430
+ manager: "systemd-user",
431
+ running: active.status === 0 && String(active.stdout ?? "").trim() === "active",
432
+ pid: null,
433
+ installed: fs.existsSync(unitPath),
434
+ target: unitPath,
435
+ ref: names.unit,
436
+ };
437
+ }
438
+ if (process.platform === "win32") {
439
+ const ps = [
440
+ `try {`,
441
+ ` $task = Get-ScheduledTask -TaskName '${names.task.replaceAll("'", "''")}' -ErrorAction Stop`,
442
+ ` $info = Get-ScheduledTaskInfo -TaskName '${names.task.replaceAll("'", "''")}'`,
443
+ ` [Console]::Out.Write((@{ installed = $true; running = ($info.State -eq 'Running'); state = [string]$info.State } | ConvertTo-Json -Compress))`,
444
+ `} catch {`,
445
+ ` [Console]::Out.Write((@{ installed = $false; running = $false; state = 'missing' } | ConvertTo-Json -Compress))`,
446
+ `}`,
447
+ ].join(" ");
448
+ const result = runCommand("powershell.exe", ["-NoProfile", "-Command", ps]);
449
+ let parsed = { installed: false, running: false };
450
+ try {
451
+ parsed = JSON.parse(String(result.stdout ?? "").trim() || "{}");
452
+ } catch {
453
+ parsed = { installed: false, running: false };
454
+ }
455
+ return {
456
+ mode: "service",
457
+ manager: "task-scheduler",
458
+ running: Boolean(parsed.running),
459
+ pid: null,
460
+ installed: Boolean(parsed.installed),
461
+ target: names.task,
462
+ ref: names.task,
463
+ };
464
+ }
465
+ return {
466
+ mode: "service",
467
+ manager: runtime?.manager ?? process.platform,
468
+ running: false,
469
+ pid: null,
470
+ installed: false,
471
+ target: runtime?.target ?? null,
472
+ ref: runtime?.ref ?? null,
473
+ };
474
+ }
475
+
476
+ function writeTunnelLaunchScript({ localPort, startArgs, nodePath, agentlinkHome }) {
477
+ const scriptPath = resolveTunnelLaunchScriptPath(localPort);
478
+ fs.mkdirSync(path.dirname(scriptPath), { recursive: true });
479
+ const capturedHome = os.homedir();
480
+ const capturedAgentlinkHome = agentlinkHome;
481
+ if (process.platform === "win32") {
482
+ const appData =
483
+ (process.env.APPDATA ?? "").trim() ||
484
+ path.join(capturedHome, "AppData", "Roaming");
485
+ const script = [
486
+ "@echo off",
487
+ `set "HOME=${capturedHome}"`,
488
+ `set "USERPROFILE=${capturedHome}"`,
489
+ `set "APPDATA=${appData}"`,
490
+ `set "AGENTLINK_HOME=${capturedAgentlinkHome}"`,
491
+ `"${nodePath}" ${startArgs.map((arg) => quoteWindowsCommandArg(arg)).join(" ")}`,
492
+ "",
493
+ ].join("\r\n");
494
+ fs.writeFileSync(scriptPath, script, { encoding: "utf8" });
495
+ return scriptPath;
496
+ }
497
+ const script = [
498
+ "#!/bin/sh",
499
+ "set -eu",
500
+ `export HOME='${escapePosixShellSingleQuoted(capturedHome)}'`,
501
+ `export AGENTLINK_HOME='${escapePosixShellSingleQuoted(capturedAgentlinkHome)}'`,
502
+ `exec '${escapePosixShellSingleQuoted(nodePath)}' ${startArgs.map((arg) => `'${escapePosixShellSingleQuoted(arg)}'`).join(" ")}`,
503
+ "",
504
+ ].join("\n");
505
+ fs.writeFileSync(scriptPath, script, { encoding: "utf8", mode: 0o755 });
506
+ return scriptPath;
507
+ }
508
+
509
+ function tunnelServiceNames(localPort) {
510
+ const suffix = String(localPort);
511
+ return {
512
+ label: `ai.agentlink.tunnel.${suffix}`,
513
+ unit: `agentlink-tunnel-${suffix}.service`,
514
+ systemUnit: `agentlink-tunnel-${suffix}.service`,
515
+ task: `Agentlink Tunnel ${suffix}`,
516
+ };
517
+ }
518
+
519
+ function resolveTunnelLaunchScriptPath(localPort) {
520
+ const ext = process.platform === "win32" ? "cmd" : "sh";
521
+ return path.join(resolveAgentlinkHome(), "tunnels", `launch-${localPort}.${ext}`);
522
+ }
523
+
524
+ function resolveMacLaunchAgentPath(localPort) {
525
+ return path.join(os.homedir(), "Library", "LaunchAgents", `${tunnelServiceNames(localPort).label}.plist`);
526
+ }
527
+
528
+ function resolveLinuxUserUnitPath(localPort) {
529
+ return path.join(os.homedir(), ".config", "systemd", "user", tunnelServiceNames(localPort).unit);
530
+ }
531
+
532
+ function resolveLinuxSystemUnitPath(localPort) {
533
+ return path.join("/etc", "systemd", "system", tunnelServiceNames(localPort).systemUnit);
534
+ }
535
+
536
+ function readMacLaunchdServiceStatus(uid, plistPath, names) {
537
+ const refs = uid == null ? [] : [`gui/${uid}/${names.label}`, `user/${uid}/${names.label}`];
538
+ for (const ref of refs) {
539
+ const result = runCommand("launchctl", ["print", ref]);
540
+ if (result.status !== 0) {
541
+ continue;
542
+ }
543
+ const output = `${result.stdout ?? ""}\n${result.stderr ?? ""}`;
544
+ const stateMatch = output.match(/state = ([^\n]+)/u);
545
+ const activeCountMatch = output.match(/active count = (\d+)/u);
546
+ const pidMatch = output.match(/\bpid = (\d+)/u);
547
+ const exitCodeMatch = output.match(/last exit code = (\d+)/u);
548
+ const state = stateMatch?.[1]?.trim() ?? "";
549
+ const activeCount = Number.parseInt(activeCountMatch?.[1] ?? "0", 10) || 0;
550
+ const pid = Number.parseInt(pidMatch?.[1] ?? "0", 10) || 0;
551
+ const lastExitCode = Number.parseInt(exitCodeMatch?.[1] ?? "0", 10) || 0;
552
+ return {
553
+ installed: true,
554
+ running: state.toLowerCase() === "running" || activeCount > 0 || (pid > 0 && isPidAlive(pid)),
555
+ pid: pid || null,
556
+ ref,
557
+ lastExitCode,
558
+ };
559
+ }
560
+ return {
561
+ installed: fs.existsSync(plistPath),
562
+ running: false,
563
+ pid: null,
564
+ ref: names.label,
565
+ lastExitCode: 0,
566
+ };
567
+ }
568
+
569
+ function isSystemdUserAvailable() {
570
+ if (process.platform !== "linux") {
571
+ return false;
572
+ }
573
+ const uid = typeof process.getuid === "function" ? process.getuid() : null;
574
+ if (uid === 0) {
575
+ return runCommand("systemctl", ["--user", "is-system-running"]).status === 0;
576
+ }
577
+ return runCommand("systemctl", ["--user", "--version"]).status === 0;
578
+ }
579
+
580
+ function isSystemdSystemAvailable() {
581
+ if (process.platform !== "linux") {
582
+ return false;
583
+ }
584
+ return runCommand("systemctl", ["--version"]).status === 0;
585
+ }
586
+
587
+ function runCommand(command, args, options = {}) {
588
+ const result = spawnSync(command, args, {
589
+ encoding: "utf8",
590
+ windowsHide: true,
591
+ ...options,
592
+ });
593
+ return {
594
+ status: result.status ?? 1,
595
+ stdout: String(result.stdout ?? ""),
596
+ stderr: String(result.stderr ?? ""),
597
+ };
598
+ }
599
+
600
+ function escapeXmlText(value) {
601
+ return String(value)
602
+ .replaceAll("&", "&amp;")
603
+ .replaceAll("<", "&lt;")
604
+ .replaceAll(">", "&gt;");
605
+ }
606
+
607
+ function escapeSystemdValue(value) {
608
+ return String(value ?? "").replaceAll("\"", "");
609
+ }
610
+
611
+ function escapeSystemdPath(value) {
612
+ return String(value ?? "").replaceAll(" ", "\\x20");
613
+ }
614
+
615
+ function escapePosixShellSingleQuoted(value) {
616
+ return String(value ?? "").replaceAll("'", `'\"'\"'`);
617
+ }
618
+
619
+ function quoteWindowsCommandArg(value) {
620
+ const text = String(value ?? "");
621
+ if (!/[\s"]/u.test(text)) {
622
+ return text;
623
+ }
624
+ return `"${text.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"")}"`;
625
+ }
626
+
627
+ function resolveAgentlinkHome() {
628
+ const fromEnv = String(process.env.AGENTLINK_HOME ?? "").trim();
629
+ if (fromEnv) return fromEnv;
630
+ const home = String(process.env.HOME ?? process.env.USERPROFILE ?? "").trim() || os.homedir();
631
+ if (!home || home === "/") {
632
+ if (process.platform === "win32") {
633
+ const appData = String(process.env.APPDATA ?? "").trim();
634
+ if (appData) return path.join(appData, ".agentlink");
635
+ const userProfile = String(process.env.USERPROFILE ?? "").trim();
636
+ if (userProfile) return path.join(userProfile, ".agentlink");
637
+ }
638
+ let username = "";
639
+ try {
640
+ username = os.userInfo().username || "";
641
+ } catch {
642
+ username = "";
643
+ }
644
+ if (username) {
645
+ const bases = username === "root" ? ["/root"] : ["/home", "/Users"];
646
+ for (const base of bases) {
647
+ const candidate = username === "root"
648
+ ? path.join(base, ".agentlink")
649
+ : path.join(base, username, ".agentlink");
650
+ if (fs.existsSync(candidate)) return candidate;
651
+ }
652
+ if (username === "root") return "/root/.agentlink";
653
+ if (process.platform === "darwin") return path.join("/Users", username, ".agentlink");
654
+ return path.join("/home", username, ".agentlink");
655
+ }
656
+ }
657
+ return path.join(home, ".agentlink");
658
+ }
659
+
660
+ function safeUnlink(filePath) {
661
+ try {
662
+ fs.unlinkSync(filePath);
663
+ } catch {
664
+ // noop
665
+ }
666
+ }
667
+
668
+ function isPidAlive(pid) {
669
+ const normalized = Number(pid);
670
+ if (!Number.isFinite(normalized) || normalized <= 0) {
671
+ return false;
672
+ }
673
+ if (process.platform === "win32") {
674
+ const result = runCommand("tasklist", ["/FI", `PID eq ${normalized}`, "/NH"]);
675
+ return result.status === 0 && result.stdout.includes(String(normalized));
676
+ }
677
+ try {
678
+ process.kill(normalized, 0);
679
+ return true;
680
+ } catch (error) {
681
+ return Boolean(error && typeof error === "object" && error.code === "EPERM");
682
+ }
683
+ }
684
+
685
+ function safeKill(pid) {
686
+ const normalized = Number(pid);
687
+ if (!Number.isFinite(normalized) || normalized <= 0) {
688
+ return;
689
+ }
690
+ if (process.platform === "win32") {
691
+ runCommand("taskkill", ["/PID", String(normalized), "/T", "/F"]);
692
+ return;
693
+ }
694
+ try {
695
+ process.kill(normalized, "SIGTERM");
696
+ } catch {
697
+ // noop
698
+ }
699
+ }