@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,418 @@
1
+ /**
2
+ * sessionPicker.mjs — 多 runtime 历史会话枚举
3
+ *
4
+ * 导出 listSessionsForRuntime(runtimeKind) → Promise<SessionEntry[]>
5
+ *
6
+ * SessionEntry:
7
+ * {
8
+ * session_id: string, // 唯一标识,用于 --resume 参数
9
+ * title: string, // 展示名
10
+ * updated_at: string, // ISO 8601
11
+ * cwd?: string, // 会话关联工作目录(hermes 无此字段)
12
+ * runtime: string, // "claude" | "codex" | "hermes"
13
+ * }
14
+ *
15
+ * options 项 label 格式:`<title> · <cwd>(<relative updated_at>)`
16
+ * 由 sessionPicker 统一生成,不在各 handleRequest 各自渲染。
17
+ */
18
+
19
+ import { promises as fsp } from "node:fs";
20
+ import path from "node:path";
21
+ import os from "node:os";
22
+
23
+ // 最多返回 50 条(按 updated_at 降序取最近的)
24
+ export const MAX_SESSIONS = 50;
25
+
26
+ // ---------------------------------------------------------------------------
27
+ // 公共工具
28
+ // ---------------------------------------------------------------------------
29
+
30
+ /** 相对时间描述(简短) */
31
+ function relativeTime(isoString) {
32
+ try {
33
+ const diff = Date.now() - new Date(isoString).getTime();
34
+ const sec = Math.floor(diff / 1000);
35
+ if (sec < 60) return "刚刚";
36
+ const min = Math.floor(sec / 60);
37
+ if (min < 60) return `${min} 分钟前`;
38
+ const hr = Math.floor(min / 60);
39
+ if (hr < 24) return `${hr} 小时前`;
40
+ const day = Math.floor(hr / 24);
41
+ if (day < 30) return `${day} 天前`;
42
+ const mon = Math.floor(day / 30);
43
+ if (mon < 12) return `${mon} 个月前`;
44
+ return `${Math.floor(mon / 12)} 年前`;
45
+ } catch {
46
+ return "";
47
+ }
48
+ }
49
+
50
+ /**
51
+ * 选项主标题 = 会话名字(不含路径、不含时间)。时间走 buildSessionSubtitle。
52
+ * @param {SessionEntry} entry
53
+ * @returns {string}
54
+ */
55
+ export function buildSessionLabel(entry) {
56
+ return (entry.title || "").trim() || "未命名会话";
57
+ }
58
+
59
+ /**
60
+ * 选项副标题 = 相对时间("3 分钟前" 等),App 端在标题下方另起一行展示。
61
+ * @param {SessionEntry} entry
62
+ * @returns {string}
63
+ */
64
+ export function buildSessionSubtitle(entry) {
65
+ const rel = relativeTime(entry.updated_at) || "";
66
+ const branch = (entry.gitBranch || "").trim();
67
+ if (rel && branch) return `${rel} · ${branch}`;
68
+ return rel || branch;
69
+ }
70
+
71
+ /** 归一化工作目录:解析为绝对路径并去掉尾部分隔符,便于精确比较。 */
72
+ function normalizeCwd(p) {
73
+ let r = path.resolve(p);
74
+ if (r.length > 1 && r.endsWith(path.sep)) r = r.slice(0, -1);
75
+ return r;
76
+ }
77
+
78
+ /**
79
+ * 按当前工作区过滤会话。规则:
80
+ * - filterCwd 为空 / 未给 → 不过滤,原样返回(兼容旧的「全量」行为)。
81
+ * - 否则仅丢弃「有 cwd 且与 filterCwd 不匹配」的项。
82
+ * - 无 cwd 的项(如 hermes,session 文件不含工作目录)一律保留——
83
+ * 它们没有工作区概念,按工作区过滤对其无意义。
84
+ * 暴露为 _testFilterByCwd 供单元测试注入假数据。
85
+ * @param {SessionEntry[]} entries
86
+ * @param {string|null|undefined} filterCwd 当前工作区绝对路径
87
+ * @returns {SessionEntry[]}
88
+ */
89
+ export function _testFilterByCwd(entries, filterCwd) {
90
+ if (!filterCwd || typeof filterCwd !== "string" || !filterCwd.trim()) {
91
+ return entries;
92
+ }
93
+ const target = normalizeCwd(filterCwd);
94
+ return entries.filter((e) => !e.cwd || normalizeCwd(e.cwd) === target);
95
+ }
96
+
97
+ /**
98
+ * 排序 + 截断。暴露为 _testListWithEntries 供单元测试注入假数据。
99
+ * @param {SessionEntry[]} entries
100
+ * @returns {SessionEntry[]}
101
+ */
102
+ export function _testListWithEntries(entries) {
103
+ return entries
104
+ .slice()
105
+ .sort((a, b) => {
106
+ const ta = new Date(a.updated_at).getTime();
107
+ const tb = new Date(b.updated_at).getTime();
108
+ return tb - ta; // 降序
109
+ })
110
+ .slice(0, MAX_SESSIONS);
111
+ }
112
+
113
+ // ---------------------------------------------------------------------------
114
+ // claude mapper
115
+ // ---------------------------------------------------------------------------
116
+
117
+ /**
118
+ * 还原 claude 的项目目录编码:把 cwd 里所有非字母数字字符替换成 '-'。
119
+ * 例 /Users/cece/company/agentlink → -Users-cece-company-agentlink
120
+ * /Users/cece/.hermes → -Users-cece--hermes('.' 也变 '-',故双横线)
121
+ * 与 claude CLI 内部编码一致,用于「只扫当前工作区」时直接定位目录。
122
+ */
123
+ function encodeClaudeProjectDir(cwd) {
124
+ return path.resolve(cwd).replace(/[^a-zA-Z0-9]/g, "-");
125
+ }
126
+
127
+ /**
128
+ * 扫描 ~/.claude/projects/<proj>/*.jsonl
129
+ * session_id = 文件名(不含 .jsonl)
130
+ * updated_at = mtime
131
+ * cwd = 首行 JSON 里的 cwd 字段 or 目录名(人类可读)
132
+ * title = 首行 JSON 里 summary/title or 目录名的末节
133
+ *
134
+ * @param {string|null} [filterCwd] 给定时只扫该工作区对应的单个项目目录
135
+ * (claude 按 cwd 编码成目录名存放 session),不再 readdir 整个 projects/。
136
+ */
137
+ async function listClaudeSessions(filterCwd) {
138
+ const projectsDir = path.join(os.homedir(), ".claude", "projects");
139
+ const entries = [];
140
+
141
+ // 只扫当前工作区:直接由 cwd 算出项目目录名,省去遍历全部项目 + 逐文件解析 cwd。
142
+ let dirNames;
143
+ if (filterCwd && typeof filterCwd === "string" && filterCwd.trim()) {
144
+ dirNames = [encodeClaudeProjectDir(filterCwd)];
145
+ } else {
146
+ try {
147
+ const projDirs = await fsp.readdir(projectsDir, { withFileTypes: true });
148
+ dirNames = projDirs.filter((d) => d.isDirectory()).map((d) => d.name);
149
+ } catch {
150
+ return [];
151
+ }
152
+ }
153
+
154
+ for (const dirName of dirNames) {
155
+ const projPath = path.join(projectsDir, dirName);
156
+ let files;
157
+ try {
158
+ files = await fsp.readdir(projPath, { withFileTypes: true });
159
+ } catch {
160
+ continue; // 目录不存在(如该工作区尚无历史会话)→ 跳过
161
+ }
162
+ for (const f of files) {
163
+ if (!f.isFile() || !f.name.endsWith(".jsonl")) continue;
164
+ const fullPath = path.join(projPath, f.name);
165
+ const sessionId = f.name.slice(0, -".jsonl".length);
166
+ let mtime;
167
+ let cwd = dirName; // fallback: decoded dir name
168
+ let title = dirName;
169
+ let gitBranch = "";
170
+
171
+ try {
172
+ const stat = await fsp.stat(fullPath);
173
+ mtime = stat.mtime.toISOString();
174
+ } catch {
175
+ mtime = new Date(0).toISOString();
176
+ }
177
+
178
+ // 扫描前若干行 JSON 取真实 cwd / summary。
179
+ // 注意:claude jsonl 首行常是 summary 行(无 cwd),cwd 在后续 message 行里,
180
+ // 只读首行会取不到真实 cwd → 回退成编码目录名(如 "-Users-cece-xxx"),
181
+ // 导致 `claude --resume` 用错 cwd 失败。故读较大 buffer 并逐行找 cwd。
182
+ try {
183
+ const fd = await fsp.open(fullPath, "r");
184
+ const buf = Buffer.alloc(65536);
185
+ const { bytesRead } = await fd.read(buf, 0, 65536, 0);
186
+ await fd.close();
187
+ const lines = buf.slice(0, bytesRead).toString("utf8").split("\n");
188
+ let foundCwd = false;
189
+ let foundTitle = false;
190
+ let firstUserMsg = null;
191
+ for (const line of lines) {
192
+ const trimmed = line.trim();
193
+ if (!trimmed) continue;
194
+ let obj;
195
+ try {
196
+ obj = JSON.parse(trimmed);
197
+ } catch {
198
+ continue; // 半行/非 JSON,跳过
199
+ }
200
+ if (!foundCwd && typeof obj.cwd === "string" && obj.cwd) {
201
+ cwd = obj.cwd;
202
+ foundCwd = true;
203
+ }
204
+ // git 分支(与 cwd 同在 message 行):副标题里展示在时间后。
205
+ if (!gitBranch && typeof obj.gitBranch === "string" && obj.gitBranch) {
206
+ gitBranch = obj.gitBranch;
207
+ }
208
+ if (!foundTitle) {
209
+ if (typeof obj.summary === "string" && obj.summary) {
210
+ title = obj.summary;
211
+ foundTitle = true;
212
+ } else if (typeof obj.title === "string" && obj.title) {
213
+ title = obj.title;
214
+ foundTitle = true;
215
+ }
216
+ }
217
+ // 捕获首条 user 消息文本作为会话名字兜底(claude 通常无 summary)。
218
+ if (!firstUserMsg && obj.type === "user") {
219
+ const c = obj.message && obj.message.content;
220
+ if (typeof c === "string" && c.trim()) {
221
+ firstUserMsg = c.trim();
222
+ } else if (Array.isArray(c)) {
223
+ const ti = c.find(
224
+ (it) => it && it.type === "text" && typeof it.text === "string",
225
+ );
226
+ if (ti && ti.text.trim()) firstUserMsg = ti.text.trim();
227
+ }
228
+ }
229
+ if (foundCwd && (foundTitle || firstUserMsg)) break;
230
+ }
231
+ // title 优先级:summary/title > 首条 user 消息(截断) > 项目目录名
232
+ if (!foundTitle) {
233
+ if (firstUserMsg) {
234
+ title = firstUserMsg.length > 40
235
+ ? `${firstUserMsg.slice(0, 40)}…`
236
+ : firstUserMsg;
237
+ } else if (foundCwd) {
238
+ title = path.basename(cwd);
239
+ }
240
+ }
241
+ } catch {
242
+ // 读取失败,用 dirEntry.name 作 title/cwd fallback
243
+ }
244
+
245
+ entries.push({
246
+ session_id: sessionId,
247
+ title,
248
+ updated_at: mtime,
249
+ cwd,
250
+ gitBranch,
251
+ runtime: "claude",
252
+ });
253
+ }
254
+ }
255
+ return entries;
256
+ }
257
+
258
+ // ---------------------------------------------------------------------------
259
+ // hermes mapper
260
+ // ---------------------------------------------------------------------------
261
+
262
+ /**
263
+ * 调用 hermes/sessionStore.mjs::listSessions(),派生 title/cwd。
264
+ * hermes session 文件只含 {messages: [...]},无 title/cwd 字段。
265
+ * - title: 首条 user message 的前 40 字
266
+ * - updated_at: 文件 mtime
267
+ * - cwd: 不可得,省略
268
+ */
269
+ async function listHermesSessions() {
270
+ const { listSessions } = await import("../hermes/sessionStore.mjs");
271
+ let ids;
272
+ try {
273
+ ids = await listSessions();
274
+ } catch {
275
+ return [];
276
+ }
277
+
278
+ const hermesRoot = path.join(os.homedir(), ".agentlink", "hermes", "sessions");
279
+ const entries = [];
280
+
281
+ for (const sessionId of ids) {
282
+ const filePath = path.join(hermesRoot, `${sessionId}.json`);
283
+ let mtime = new Date(0).toISOString();
284
+ let title = sessionId;
285
+
286
+ try {
287
+ const stat = await fsp.stat(filePath);
288
+ mtime = stat.mtime.toISOString();
289
+ } catch { /* skip */ }
290
+
291
+ try {
292
+ const buf = await fsp.readFile(filePath, "utf8");
293
+ const data = JSON.parse(buf);
294
+ if (Array.isArray(data?.messages)) {
295
+ // 找首条 user message
296
+ const firstUser = data.messages.find((m) => m.role === "user");
297
+ if (firstUser) {
298
+ const content = typeof firstUser.content === "string"
299
+ ? firstUser.content
300
+ : (Array.isArray(firstUser.content)
301
+ ? firstUser.content.map((c) => (typeof c === "string" ? c : c?.text || "")).join("")
302
+ : "");
303
+ title = content.slice(0, 40).trim() || sessionId;
304
+ }
305
+ }
306
+ } catch { /* skip */ }
307
+
308
+ entries.push({
309
+ session_id: sessionId,
310
+ title,
311
+ updated_at: mtime,
312
+ runtime: "hermes",
313
+ });
314
+ }
315
+ return entries;
316
+ }
317
+
318
+ // ---------------------------------------------------------------------------
319
+ // codex mapper
320
+ // ---------------------------------------------------------------------------
321
+
322
+ /**
323
+ * 扫描 ~/.codex/sessions/*.jsonl(递归,因 codex 按日期分级目录)。
324
+ * session_id = 文件名(不含 .jsonl),cwd 取首行 JSON 的 cwd 字段。
325
+ */
326
+ async function listCodexSessions() {
327
+ const sessionsDir = path.join(os.homedir(), ".codex", "sessions");
328
+ const entries = [];
329
+
330
+ async function walk(dir) {
331
+ let items;
332
+ try {
333
+ items = await fsp.readdir(dir, { withFileTypes: true });
334
+ } catch {
335
+ return;
336
+ }
337
+ for (const item of items) {
338
+ const fullPath = path.join(dir, item.name);
339
+ if (item.isDirectory()) {
340
+ await walk(fullPath);
341
+ } else if (item.isFile() && item.name.endsWith(".jsonl")) {
342
+ const sessionId = item.name.slice(0, -".jsonl".length);
343
+ let mtime = new Date(0).toISOString();
344
+ let cwd = "";
345
+ let title = sessionId;
346
+
347
+ try {
348
+ const stat = await fsp.stat(fullPath);
349
+ mtime = stat.mtime.toISOString();
350
+ } catch { /* skip */ }
351
+
352
+ // 取首行 JSON
353
+ try {
354
+ const fd = await fsp.open(fullPath, "r");
355
+ const buf = Buffer.alloc(4096);
356
+ const { bytesRead } = await fd.read(buf, 0, 4096, 0);
357
+ await fd.close();
358
+ const firstLine = buf.slice(0, bytesRead).toString("utf8").split("\n")[0].trim();
359
+ if (firstLine) {
360
+ const obj = JSON.parse(firstLine);
361
+ if (typeof obj.cwd === "string" && obj.cwd) cwd = obj.cwd;
362
+ // codex sessions 的 title 可能在 payload 里
363
+ const payload = obj.payload || obj;
364
+ if (typeof payload.title === "string" && payload.title) title = payload.title;
365
+ else if (cwd) title = path.basename(cwd);
366
+ }
367
+ } catch { /* skip */ }
368
+
369
+ entries.push({
370
+ session_id: sessionId,
371
+ title,
372
+ updated_at: mtime,
373
+ cwd,
374
+ runtime: "codex",
375
+ });
376
+ }
377
+ }
378
+ }
379
+
380
+ await walk(sessionsDir);
381
+ return entries;
382
+ }
383
+
384
+ // ---------------------------------------------------------------------------
385
+ // Public API
386
+ // ---------------------------------------------------------------------------
387
+
388
+ /**
389
+ * @param {"claude"|"codex"|"hermes"} runtimeKind
390
+ * @param {{ filterCwd?: string|null }} [opts]
391
+ * filterCwd: 当前工作区绝对路径。给定时只返回该工作区下的会话(claude/codex
392
+ * 按 session 的 cwd 匹配;hermes 无 cwd,过滤对其无效,原样保留)。
393
+ * 不给则返回全量(旧行为)。
394
+ * @returns {Promise<SessionEntry[]>} filtered by cwd, sorted by updated_at desc, capped at MAX_SESSIONS
395
+ */
396
+ export async function listSessionsForRuntime(runtimeKind, { filterCwd = null } = {}) {
397
+ let rawEntries;
398
+ try {
399
+ if (runtimeKind === "claude") {
400
+ // claude 按 cwd 编码目录存放 session → 直接只扫当前工作区那一个目录。
401
+ rawEntries = await listClaudeSessions(filterCwd);
402
+ } else if (runtimeKind === "hermes") {
403
+ rawEntries = await listHermesSessions();
404
+ } else if (runtimeKind === "codex") {
405
+ // codex 的 session 按日期目录存放、cwd 只在文件内容里,无法靠目录定位,
406
+ // 仍需全量扫描后由下方 _testFilterByCwd 按 cwd 过滤。
407
+ rawEntries = await listCodexSessions();
408
+ } else {
409
+ return [];
410
+ }
411
+ } catch (err) {
412
+ // any unexpected error → warn + empty array
413
+ // (per-runtime internal try/catch should handle fs errors, but belt+suspenders)
414
+ console.warn(`[sessionPicker] ${runtimeKind} enumeration failed:`, err?.message || err);
415
+ return [];
416
+ }
417
+ return _testListWithEntries(_testFilterByCwd(rawEntries, filterCwd));
418
+ }