talos-code 0.0.1 → 0.2.0

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 (407) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/LICENSE +661 -0
  3. package/README.md +116 -3
  4. package/THIRD_PARTY_NOTICES.md +40 -0
  5. package/dist/archive/zip.js +73 -0
  6. package/dist/args.js +100 -0
  7. package/dist/automations/history-store.js +34 -0
  8. package/dist/automations/policy-store.js +43 -0
  9. package/dist/automations/runner.js +107 -0
  10. package/dist/automations/schedule.js +85 -0
  11. package/dist/automations/windows-task.js +53 -0
  12. package/dist/commands/advanced-cli.js +233 -0
  13. package/dist/commands/checkpoint-cli.js +45 -0
  14. package/dist/commands/config-cli.js +107 -0
  15. package/dist/commands/context.js +17 -0
  16. package/dist/commands/extensions-cli.js +207 -0
  17. package/dist/commands/project-cli.js +74 -0
  18. package/dist/commands/project-commands.js +143 -0
  19. package/dist/commands/provider-cli.js +244 -0
  20. package/dist/commands/services-cli.js +248 -0
  21. package/dist/commands/session-cli.js +171 -0
  22. package/dist/commands/system-cli.js +405 -0
  23. package/dist/config/commands.js +60 -0
  24. package/dist/config/load.js +382 -0
  25. package/dist/config/migrations.js +48 -0
  26. package/dist/config/types.js +11 -0
  27. package/dist/diagnostics/development-log.js +154 -0
  28. package/dist/diagnostics/doctor.js +104 -0
  29. package/dist/diagnostics/redact.js +80 -0
  30. package/dist/diagnostics/zip.js +52 -0
  31. package/dist/errors.js +156 -0
  32. package/dist/events/bridge.js +130 -0
  33. package/dist/extensions/installer.js +178 -0
  34. package/dist/extensions/package-schema.js +24 -0
  35. package/dist/headless/result.js +84 -0
  36. package/dist/headless/run.js +230 -0
  37. package/dist/i18n/en/approval.js +46 -0
  38. package/dist/i18n/en/common.js +9 -0
  39. package/dist/i18n/en/credentials.js +92 -0
  40. package/dist/i18n/en/errors.js +267 -0
  41. package/dist/i18n/en/firstrun.js +101 -0
  42. package/dist/i18n/en/providers.js +37 -0
  43. package/dist/i18n/en/screen.js +774 -0
  44. package/dist/i18n/en/tools.js +127 -0
  45. package/dist/i18n/en.js +14 -0
  46. package/dist/i18n/error-view.js +307 -0
  47. package/dist/i18n/index.js +19 -0
  48. package/dist/i18n/kernel-map.js +139 -0
  49. package/dist/io.js +45 -0
  50. package/dist/main.js +331 -0
  51. package/dist/paths.js +41 -0
  52. package/dist/protocol/v2/codec.js +9 -0
  53. package/dist/protocol/v2/events.js +555 -0
  54. package/dist/protocol/v2/index.js +4 -0
  55. package/dist/protocol/v2/replay.js +28 -0
  56. package/dist/protocol/v2/types.js +1 -0
  57. package/dist/provider/control-plane.js +135 -0
  58. package/dist/provider/environment-keys.js +275 -0
  59. package/dist/provider/health.js +110 -0
  60. package/dist/provider/missing-key.js +48 -0
  61. package/dist/provider/model-catalog.js +168 -0
  62. package/dist/provider/openrouter-login.js +172 -0
  63. package/dist/provider/provider-text.js +13 -0
  64. package/dist/provider/store.js +95 -0
  65. package/dist/provider/system-keyring.js +214 -0
  66. package/dist/runtime/active-run.js +63 -0
  67. package/dist/runtime/agent-tree.js +74 -0
  68. package/dist/runtime/attachments.js +84 -0
  69. package/dist/runtime/brokered-executor.js +395 -0
  70. package/dist/runtime/context-archive.js +69 -0
  71. package/dist/runtime/context-status.js +76 -0
  72. package/dist/runtime/create-runtime.js +111 -0
  73. package/dist/runtime/model-profile.js +361 -0
  74. package/dist/runtime/output-store.js +137 -0
  75. package/dist/runtime/provider-attempts.js +185 -0
  76. package/dist/runtime/replay-buffer.js +153 -0
  77. package/dist/runtime/repo.js +95 -0
  78. package/dist/runtime/session-facade.js +135 -0
  79. package/dist/runtime/session-summary.js +125 -0
  80. package/dist/runtime/supervisor.js +265 -0
  81. package/dist/runtime/talos-composition.js +1011 -0
  82. package/dist/runtime/types.js +5 -0
  83. package/dist/runtime/usage-snapshot.js +82 -0
  84. package/dist/security/auto-classifier.js +38 -0
  85. package/dist/security/credential-free-environment.js +54 -0
  86. package/dist/security/evaluate.js +243 -0
  87. package/dist/security/execution-backends.js +236 -0
  88. package/dist/security/execution-broker.js +102 -0
  89. package/dist/security/forge-scan.js +74 -0
  90. package/dist/security/from-approval.js +39 -0
  91. package/dist/security/mxc-execution-backend.js +281 -0
  92. package/dist/security/permission-engine.js +138 -0
  93. package/dist/security/permission-explanation.js +54 -0
  94. package/dist/security/persist.js +179 -0
  95. package/dist/security/plugin-guard.js +230 -0
  96. package/dist/security/process-tree-evidence-store.js +74 -0
  97. package/dist/security/process-tree-probe.js +554 -0
  98. package/dist/security/project-resource-inventory.js +186 -0
  99. package/dist/security/project-trust-gate.js +38 -0
  100. package/dist/security/project-trust.js +367 -0
  101. package/dist/security/rule-parser.js +201 -0
  102. package/dist/security/shell-segmentation.js +68 -0
  103. package/dist/security/trust-authority.js +324 -0
  104. package/dist/security/types.js +1 -0
  105. package/dist/security/workspace-identity.js +102 -0
  106. package/dist/services/automation-facade.js +59 -0
  107. package/dist/services/forge-facade.js +77 -0
  108. package/dist/services/hook-facade.js +240 -0
  109. package/dist/services/index.js +16 -0
  110. package/dist/services/library-facade.js +174 -0
  111. package/dist/services/mcp-facade.js +348 -0
  112. package/dist/services/memory-facade.js +126 -0
  113. package/dist/services/notes-facade.js +157 -0
  114. package/dist/services/plugin-facade.js +308 -0
  115. package/dist/services/research-facade.js +110 -0
  116. package/dist/services/task-board-facade.js +236 -0
  117. package/dist/services/workflow-catalog.js +246 -0
  118. package/dist/sessions/export-format.js +98 -0
  119. package/dist/sessions/metadata-store.js +160 -0
  120. package/dist/sessions/share.js +122 -0
  121. package/dist/sessions/transfer.js +16 -0
  122. package/dist/subcommands.js +62 -0
  123. package/dist/tui/agent-roster.js +36 -0
  124. package/dist/tui/agent-view.js +51 -0
  125. package/dist/tui/app.js +4098 -0
  126. package/dist/tui/approval.js +36 -0
  127. package/dist/tui/boot/boot-sequence.js +76 -0
  128. package/dist/tui/boot/cinematic.js +243 -0
  129. package/dist/tui/boot/desktop-logo.js +82 -0
  130. package/dist/tui/boot.js +3 -0
  131. package/dist/tui/busy-input.js +58 -0
  132. package/dist/tui/catalog-service.js +560 -0
  133. package/dist/tui/components/assistant-stream.js +1 -0
  134. package/dist/tui/components/command-menu.js +68 -0
  135. package/dist/tui/components/composer.js +219 -0
  136. package/dist/tui/components/diff.js +35 -0
  137. package/dist/tui/components/footer.js +48 -0
  138. package/dist/tui/components/header.js +6 -0
  139. package/dist/tui/components/markdown.js +305 -0
  140. package/dist/tui/components/status-indicator.js +38 -0
  141. package/dist/tui/components/terminal-shell.js +214 -0
  142. package/dist/tui/components/thinking-row.js +19 -0
  143. package/dist/tui/components/tool-row.js +97 -0
  144. package/dist/tui/components/transcript-virtualizer.js +165 -0
  145. package/dist/tui/components/transcript.js +43 -0
  146. package/dist/tui/descendant-approvals.js +104 -0
  147. package/dist/tui/diff-model.js +77 -0
  148. package/dist/tui/editor-history.js +21 -0
  149. package/dist/tui/editor.js +210 -0
  150. package/dist/tui/event-adapter.js +436 -0
  151. package/dist/tui/exit-output.js +58 -0
  152. package/dist/tui/external-editor.js +53 -0
  153. package/dist/tui/file-completion.js +89 -0
  154. package/dist/tui/focus-manager.js +5 -0
  155. package/dist/tui/highlight.js +30 -0
  156. package/dist/tui/input-router.js +18 -0
  157. package/dist/tui/interrupt.js +99 -0
  158. package/dist/tui/keybindings.js +194 -0
  159. package/dist/tui/keymap-resolver.js +91 -0
  160. package/dist/tui/launch-state.js +148 -0
  161. package/dist/tui/line-diff.js +57 -0
  162. package/dist/tui/live-activity.js +56 -0
  163. package/dist/tui/metrics.js +123 -0
  164. package/dist/tui/onboarding.js +36 -0
  165. package/dist/tui/overlays/agent-tree.js +43 -0
  166. package/dist/tui/overlays/approval-dialog.js +642 -0
  167. package/dist/tui/overlays/automation-center.js +51 -0
  168. package/dist/tui/overlays/checkpoint-picker.js +47 -0
  169. package/dist/tui/overlays/context-inspector.js +36 -0
  170. package/dist/tui/overlays/effort-line.js +110 -0
  171. package/dist/tui/overlays/forge-center.js +46 -0
  172. package/dist/tui/overlays/help-dialog.js +16 -0
  173. package/dist/tui/overlays/history-picker.js +37 -0
  174. package/dist/tui/overlays/hook-center.js +70 -0
  175. package/dist/tui/overlays/library-center.js +55 -0
  176. package/dist/tui/overlays/mcp-center.js +60 -0
  177. package/dist/tui/overlays/memory-center.js +63 -0
  178. package/dist/tui/overlays/model-picker.js +77 -0
  179. package/dist/tui/overlays/notes-center.js +53 -0
  180. package/dist/tui/overlays/overlay-host.js +8 -0
  181. package/dist/tui/overlays/plugin-center.js +76 -0
  182. package/dist/tui/overlays/provider-picker.js +171 -0
  183. package/dist/tui/overlays/queue-editor.js +32 -0
  184. package/dist/tui/overlays/research-center.js +59 -0
  185. package/dist/tui/overlays/scroll-window.js +234 -0
  186. package/dist/tui/overlays/session-picker.js +115 -0
  187. package/dist/tui/overlays/tasks-center.js +83 -0
  188. package/dist/tui/overlays/theme-picker.js +21 -0
  189. package/dist/tui/overlays/transcript-search.js +58 -0
  190. package/dist/tui/overlays/trust-center.js +29 -0
  191. package/dist/tui/overlays/workflow-center.js +46 -0
  192. package/dist/tui/project-file-index.js +214 -0
  193. package/dist/tui/project-references.js +85 -0
  194. package/dist/tui/project-trust-prompt.js +289 -0
  195. package/dist/tui/prompt-history-store.js +116 -0
  196. package/dist/tui/queue-store.js +110 -0
  197. package/dist/tui/regions/budget.js +59 -0
  198. package/dist/tui/regions/views.js +96 -0
  199. package/dist/tui/render-coordinator.js +148 -0
  200. package/dist/tui/render-scheduler.js +4 -0
  201. package/dist/tui/run.js +69 -0
  202. package/dist/tui/selection-list.js +29 -0
  203. package/dist/tui/session-controller.js +791 -0
  204. package/dist/tui/session-export.js +54 -0
  205. package/dist/tui/setup-wizard.js +46 -0
  206. package/dist/tui/shell-input.js +35 -0
  207. package/dist/tui/shell-layout.js +48 -0
  208. package/dist/tui/shell-model.js +98 -0
  209. package/dist/tui/slash-commands.js +82 -0
  210. package/dist/tui/state.js +151 -0
  211. package/dist/tui/status-bar.js +125 -0
  212. package/dist/tui/status-view.js +40 -0
  213. package/dist/tui/terminal-capabilities.js +9 -0
  214. package/dist/tui/terminal-session.js +11 -0
  215. package/dist/tui/text-width.js +66 -0
  216. package/dist/tui/theme-catalog.js +27 -0
  217. package/dist/tui/theme-store.js +23 -0
  218. package/dist/tui/theme.js +23 -0
  219. package/dist/tui/tool-display.js +135 -0
  220. package/dist/tui/tool-facts.js +1 -0
  221. package/dist/tui/tools/bash-renderer.js +32 -0
  222. package/dist/tui/tools/change.js +61 -0
  223. package/dist/tui/tools/edit-renderer.js +17 -0
  224. package/dist/tui/tools/generic-renderer.js +13 -0
  225. package/dist/tui/tools/list-renderer.js +14 -0
  226. package/dist/tui/tools/read-renderer.js +13 -0
  227. package/dist/tui/tools/registry.js +20 -0
  228. package/dist/tui/tools/row-format.js +187 -0
  229. package/dist/tui/tools/search-renderer.js +38 -0
  230. package/dist/tui/tools/shared.js +97 -0
  231. package/dist/tui/tools/write-renderer.js +15 -0
  232. package/dist/tui/transcript-model.js +441 -0
  233. package/dist/tui/ui-preferences.js +79 -0
  234. package/dist/tui/usage-view.js +77 -0
  235. package/dist/tui/vim-mode.js +99 -0
  236. package/dist/update/check.js +15 -0
  237. package/dist/update/npm.js +51 -0
  238. package/dist/update/run.js +129 -0
  239. package/dist/version.js +2 -0
  240. package/dist/workspace/checkpoint-store.js +210 -0
  241. package/dist/workspace/checkpoint.js +413 -0
  242. package/dist/workspace/restore.js +232 -0
  243. package/package.json +64 -5
  244. package/vendor/context-engine/package.json +11 -0
  245. package/vendor/context-engine/src/compaction-planner.mjs +57 -0
  246. package/vendor/context-engine/src/contracts.mjs +48 -0
  247. package/vendor/context-engine/src/engine.mjs +445 -0
  248. package/vendor/context-engine/src/node/context-export.mjs +164 -0
  249. package/vendor/context-engine/src/node/legacy-import.mjs +92 -0
  250. package/vendor/context-engine/src/node/migrations/001-context.sql +126 -0
  251. package/vendor/context-engine/src/node/sqlite-store.mjs +85 -0
  252. package/vendor/context-engine/src/node/sqlite-worker.mjs +559 -0
  253. package/vendor/context-engine/src/profiles.mjs +10 -0
  254. package/vendor/context-engine/src/retrieval.mjs +104 -0
  255. package/vendor/context-engine/src/summary.mjs +97 -0
  256. package/vendor/context-engine/src/usage.mjs +34 -0
  257. package/vendor/harness-ui/package.json +38 -0
  258. package/vendor/harness-ui/src/acp-agent.mjs +350 -0
  259. package/vendor/harness-ui/src/agent-service.mjs +2188 -0
  260. package/vendor/harness-ui/src/agui-events.mjs +452 -0
  261. package/vendor/harness-ui/src/ambiente-solo-server.mjs +121 -0
  262. package/vendor/harness-ui/src/artifact-store.mjs +39 -0
  263. package/vendor/harness-ui/src/assistenza.mjs +123 -0
  264. package/vendor/harness-ui/src/automation-scheduler.mjs +69 -0
  265. package/vendor/harness-ui/src/automation-store.mjs +145 -0
  266. package/vendor/harness-ui/src/browser-annota.mjs +639 -0
  267. package/vendor/harness-ui/src/browser-frame.mjs +211 -0
  268. package/vendor/harness-ui/src/browser-proxy-universale.mjs +519 -0
  269. package/vendor/harness-ui/src/browser-proxy.mjs +87 -0
  270. package/vendor/harness-ui/src/browser-sessione-viva.mjs +329 -0
  271. package/vendor/harness-ui/src/browser-stream.mjs +445 -0
  272. package/vendor/harness-ui/src/browser-vivo.mjs +694 -0
  273. package/vendor/harness-ui/src/chat-image-attachments.mjs +72 -0
  274. package/vendor/harness-ui/src/config.mjs +697 -0
  275. package/vendor/harness-ui/src/contesto-del-progetto.mjs +385 -0
  276. package/vendor/harness-ui/src/context-asset-adapter.mjs +72 -0
  277. package/vendor/harness-ui/src/context-desktop-service.mjs +253 -0
  278. package/vendor/harness-ui/src/context-embedding-runtime.mjs +252 -0
  279. package/vendor/harness-ui/src/context-inference-scheduler.mjs +81 -0
  280. package/vendor/harness-ui/src/context-native-compaction.mjs +75 -0
  281. package/vendor/harness-ui/src/context-provider-adapter.mjs +141 -0
  282. package/vendor/harness-ui/src/context-runtime.mjs +118 -0
  283. package/vendor/harness-ui/src/context-token-counters.mjs +184 -0
  284. package/vendor/harness-ui/src/context-tool-catalog.mjs +86 -0
  285. package/vendor/harness-ui/src/context-tool-output.mjs +72 -0
  286. package/vendor/harness-ui/src/costo-elenco.mjs +252 -0
  287. package/vendor/harness-ui/src/custom-task.mjs +171 -0
  288. package/vendor/harness-ui/src/doctor.mjs +142 -0
  289. package/vendor/harness-ui/src/document-filename.mjs +97 -0
  290. package/vendor/harness-ui/src/document-generator.mjs +493 -0
  291. package/vendor/harness-ui/src/document-report.mjs +331 -0
  292. package/vendor/harness-ui/src/duckduckgo-search.mjs +155 -0
  293. package/vendor/harness-ui/src/elenco-profondo.mjs +337 -0
  294. package/vendor/harness-ui/src/favicon-proxy.mjs +113 -0
  295. package/vendor/harness-ui/src/forge-contract.mjs +221 -0
  296. package/vendor/harness-ui/src/frequent-dirs.mjs +134 -0
  297. package/vendor/harness-ui/src/generated-image-store.mjs +147 -0
  298. package/vendor/harness-ui/src/generation-idle.mjs +332 -0
  299. package/vendor/harness-ui/src/gguf-header.mjs +207 -0
  300. package/vendor/harness-ui/src/git-service.mjs +626 -0
  301. package/vendor/harness-ui/src/gitignore-elenco.mjs +604 -0
  302. package/vendor/harness-ui/src/harness-receipt-keypair.mjs +207 -0
  303. package/vendor/harness-ui/src/hf-direct-transfer.mjs +170 -0
  304. package/vendor/harness-ui/src/hf-hub-client.mjs +106 -0
  305. package/vendor/harness-ui/src/hf-image-proxy.mjs +105 -0
  306. package/vendor/harness-ui/src/hf-model-transfer.mjs +245 -0
  307. package/vendor/harness-ui/src/hook-registry.mjs +186 -0
  308. package/vendor/harness-ui/src/http-app.mjs +6259 -0
  309. package/vendor/harness-ui/src/http-lifecycle.mjs +132 -0
  310. package/vendor/harness-ui/src/id-archivio.mjs +27 -0
  311. package/vendor/harness-ui/src/image-generator.mjs +143 -0
  312. package/vendor/harness-ui/src/istruzioni-di-progetto.mjs +234 -0
  313. package/vendor/harness-ui/src/kernel/dist/kernelPerIlBanco.js +518 -0
  314. package/vendor/harness-ui/src/kernel/talosHarness.mjs +10437 -0
  315. package/vendor/harness-ui/src/library-policy-store.mjs +175 -0
  316. package/vendor/harness-ui/src/library-store.mjs +652 -0
  317. package/vendor/harness-ui/src/llama-server-supervisor.mjs +629 -0
  318. package/vendor/harness-ui/src/local-model-store.mjs +339 -0
  319. package/vendor/harness-ui/src/local-runtime-contract.mjs +66 -0
  320. package/vendor/harness-ui/src/local-runtime-events.mjs +44 -0
  321. package/vendor/harness-ui/src/local-runtime-llama-server.mjs +244 -0
  322. package/vendor/harness-ui/src/local-runtime-probe.mjs +401 -0
  323. package/vendor/harness-ui/src/machine-capacity.mjs +66 -0
  324. package/vendor/harness-ui/src/mappa-cartelle.mjs +491 -0
  325. package/vendor/harness-ui/src/mcp-client.mjs +98 -0
  326. package/vendor/harness-ui/src/mcp-registry.mjs +157 -0
  327. package/vendor/harness-ui/src/mcp-session.mjs +177 -0
  328. package/vendor/harness-ui/src/memory-store.mjs +227 -0
  329. package/vendor/harness-ui/src/model-catalog-models-dev.mjs +276 -0
  330. package/vendor/harness-ui/src/model-catalog.mjs +129 -0
  331. package/vendor/harness-ui/src/model-destination.mjs +189 -0
  332. package/vendor/harness-ui/src/modifica-ancorata.mjs +177 -0
  333. package/vendor/harness-ui/src/native-provider-adapter.mjs +205 -0
  334. package/vendor/harness-ui/src/notes-store.mjs +250 -0
  335. package/vendor/harness-ui/src/openai-compatible-runtime.mjs +428 -0
  336. package/vendor/harness-ui/src/openrouter-oauth.mjs +339 -0
  337. package/vendor/harness-ui/src/path-policy.mjs +442 -0
  338. package/vendor/harness-ui/src/plugin-registry.mjs +780 -0
  339. package/vendor/harness-ui/src/plugin-session.mjs +180 -0
  340. package/vendor/harness-ui/src/process-policy.mjs +345 -0
  341. package/vendor/harness-ui/src/prompt-enhancer-provider.mjs +94 -0
  342. package/vendor/harness-ui/src/provider-auth-cloud.mjs +95 -0
  343. package/vendor/harness-ui/src/provider-credential-store.mjs +541 -0
  344. package/vendor/harness-ui/src/provider-probe.mjs +582 -0
  345. package/vendor/harness-ui/src/provider-registry.mjs +1633 -0
  346. package/vendor/harness-ui/src/pty-terminal.mjs +312 -0
  347. package/vendor/harness-ui/src/public-problem.mjs +109 -0
  348. package/vendor/harness-ui/src/research/card.mjs +235 -0
  349. package/vendor/harness-ui/src/research/citations.mjs +142 -0
  350. package/vendor/harness-ui/src/research/collector.mjs +275 -0
  351. package/vendor/harness-ui/src/research/deposito-a-pezzi.mjs +139 -0
  352. package/vendor/harness-ui/src/research/dossier.mjs +114 -0
  353. package/vendor/harness-ui/src/research/esportazioni.mjs +560 -0
  354. package/vendor/harness-ui/src/research/fetch-cache.mjs +465 -0
  355. package/vendor/harness-ui/src/research/fidelity.mjs +122 -0
  356. package/vendor/harness-ui/src/research/independence.mjs +159 -0
  357. package/vendor/harness-ui/src/research/ledger.mjs +166 -0
  358. package/vendor/harness-ui/src/research/markdown-server.mjs +565 -0
  359. package/vendor/harness-ui/src/research/narration.mjs +181 -0
  360. package/vendor/harness-ui/src/research/open-cards.mjs +131 -0
  361. package/vendor/harness-ui/src/research/opposing.mjs +305 -0
  362. package/vendor/harness-ui/src/research/outline.mjs +111 -0
  363. package/vendor/harness-ui/src/research/page-budget.mjs +209 -0
  364. package/vendor/harness-ui/src/research/pdf.mjs +291 -0
  365. package/vendor/harness-ui/src/research/plan.mjs +301 -0
  366. package/vendor/harness-ui/src/research/raccolta-viva.mjs +452 -0
  367. package/vendor/harness-ui/src/research/recheck-document.mjs +69 -0
  368. package/vendor/harness-ui/src/research/recheck-history.mjs +192 -0
  369. package/vendor/harness-ui/src/research/recheck.mjs +194 -0
  370. package/vendor/harness-ui/src/research/report.mjs +203 -0
  371. package/vendor/harness-ui/src/research/run.mjs +527 -0
  372. package/vendor/harness-ui/src/research/synthesis.mjs +318 -0
  373. package/vendor/harness-ui/src/research/verification.mjs +572 -0
  374. package/vendor/harness-ui/src/research-orchestrator.mjs +2679 -0
  375. package/vendor/harness-ui/src/research-store.mjs +1133 -0
  376. package/vendor/harness-ui/src/runtime-build-manifest.mjs +26 -0
  377. package/vendor/harness-ui/src/runtime-contract.mjs +59 -0
  378. package/vendor/harness-ui/src/runtime-owner-adapter.mjs +1348 -0
  379. package/vendor/harness-ui/src/runtime-owner-contract.mjs +32 -0
  380. package/vendor/harness-ui/src/scheda-di-lavoro.mjs +249 -0
  381. package/vendor/harness-ui/src/search-source-store.mjs +172 -0
  382. package/vendor/harness-ui/src/session-registry.mjs +6095 -0
  383. package/vendor/harness-ui/src/session-store.mjs +220 -0
  384. package/vendor/harness-ui/src/sessione-pronta.mjs +73 -0
  385. package/vendor/harness-ui/src/setup-stato.mjs +31 -0
  386. package/vendor/harness-ui/src/sezioni-istruzioni.mjs +204 -0
  387. package/vendor/harness-ui/src/skill-registry.mjs +120 -0
  388. package/vendor/harness-ui/src/sse-replay-coalescente.mjs +0 -0
  389. package/vendor/harness-ui/src/static-files.mjs +96 -0
  390. package/vendor/harness-ui/src/stream-partition.mjs +123 -0
  391. package/vendor/harness-ui/src/subagent-orchestrator.mjs +453 -0
  392. package/vendor/harness-ui/src/task-catalog.mjs +65 -0
  393. package/vendor/harness-ui/src/tasks-store.mjs +220 -0
  394. package/vendor/harness-ui/src/terminal-registry.mjs +312 -0
  395. package/vendor/harness-ui/src/terminal-ws.mjs +170 -0
  396. package/vendor/harness-ui/src/tool-forge-store.mjs +299 -0
  397. package/vendor/harness-ui/src/tool-schema-normalize.mjs +100 -0
  398. package/vendor/harness-ui/src/usage-cache.mjs +315 -0
  399. package/vendor/harness-ui/src/workspace-browser.mjs +213 -0
  400. package/vendor/harness-ui/src/workspace-context.mjs +124 -0
  401. package/vendor/harness-ui/src/workspace-disk.mjs +62 -0
  402. package/vendor/harness-ui/src/workspace-files.mjs +589 -0
  403. package/vendor/harness-ui/src/workspace-info.mjs +189 -0
  404. package/vendor/harness-ui/src/workspace-launch-store.mjs +150 -0
  405. package/vendor/harness-ui/src/workspace-tree.mjs +67 -0
  406. package/vendor/harness-ui/src/workspace-watcher.mjs +161 -0
  407. package/vendor/manifest.json +170 -0
@@ -0,0 +1,168 @@
1
+ import { REASONING_EFFORTS } from "../config/types.js";
2
+ const SOURCE_RANK = Object.freeze({
3
+ unknown: 0, documented: 1, configured: 2, live: 3,
4
+ });
5
+ const CAPABILITY_RANK = Object.freeze({
6
+ unknown: 0, configured: 1, documented: 2, live: 3,
7
+ });
8
+ export function catalogSourceFromKernel(source, { successfulCatalogBoundary = false } = {}) {
9
+ const value = String(source ?? '').trim().toLowerCase().replace(/[_ ]+/gu, '-');
10
+ if (['config', 'configured', 'configurazione'].includes(value))
11
+ return 'configured';
12
+ if (['documented', 'documentation', 'documentazione', 'riserva', 'fallback'].includes(value))
13
+ return 'documented';
14
+ if (['live', 'fornitore', 'provider', 'remote', 'runtime', 'runtime-locale'].includes(value))
15
+ return 'live';
16
+ if (!value && successfulCatalogBoundary)
17
+ return 'live';
18
+ return 'unknown';
19
+ }
20
+ function effortsFrom(...values) {
21
+ let observed = false;
22
+ const out = [];
23
+ for (const value of values) {
24
+ if (!Array.isArray(value))
25
+ continue;
26
+ observed = true;
27
+ for (const item of value) {
28
+ if (typeof item !== 'string' || !REASONING_EFFORTS.includes(item))
29
+ continue;
30
+ const effort = item;
31
+ if (!out.includes(effort))
32
+ out.push(effort);
33
+ }
34
+ }
35
+ return observed ? out : null;
36
+ }
37
+ function evidenceMeta(row) {
38
+ const url = [row?.fonteMetadati, row?.fonteDichiarazione, row?.metadataSource, row?.declarationSource, row?.fonte]
39
+ .find(value => typeof value === 'string' && /^(?:https?:\/\/|urn:)/u.test(value)) ?? null;
40
+ const date = [row?.dataMetadati, row?.dataDichiarazione, row?.metadataDate, row?.declarationDate, row?.data]
41
+ .find(value => typeof value === 'string' && value.trim() !== '') ?? null;
42
+ return { url, date };
43
+ }
44
+ function evidence(value, source, meta = { url: null, date: null }) {
45
+ if (value === null)
46
+ return { value: null, source: 'unknown', evidenceUrl: null, evidenceDate: null };
47
+ return { value, source, evidenceUrl: meta.url, evidenceDate: meta.date };
48
+ }
49
+ function documentedCapabilitySource(row, rowSource, kind) {
50
+ if (rowSource === 'documented')
51
+ return 'documented';
52
+ const hasDocumentedMeta = typeof row?.fonteMetadati === 'string' || typeof row?.fonteDichiarazione === 'string'
53
+ || typeof row?.dataMetadati === 'string' || typeof row?.dataDichiarazione === 'string';
54
+ return hasDocumentedMeta && (kind === 'context' || kind === 'reasoning') ? 'documented' : rowSource;
55
+ }
56
+ export function normalizeModelRows(rows, provider, source) {
57
+ const seen = new Set();
58
+ const out = [];
59
+ for (const row of rows) {
60
+ const raw = String(row?.id ?? row?.modelId ?? row?.model ?? '').trim();
61
+ if (!raw)
62
+ continue;
63
+ const id = raw.startsWith(`${provider}:`) ? raw : `${provider}:${raw}`;
64
+ if (seen.has(id))
65
+ continue;
66
+ seen.add(id);
67
+ const explicitSource = catalogSourceFromKernel(row?.fonte);
68
+ const rowSource = explicitSource === 'unknown' ? source : explicitSource;
69
+ const caps = row?.capacita ?? row?.capabilities ?? {};
70
+ const supportedParameters = Array.isArray(row?.supported_parameters) ? row.supported_parameters : Array.isArray(row?.supportedParameters) ? row.supportedParameters : null;
71
+ const supportedParameterSet = supportedParameters ? new Set(supportedParameters.filter((value) => typeof value === 'string').map((value) => value.toLowerCase())) : null;
72
+ const ownReasoning = row?.reasoning && typeof row.reasoning === 'object' && !Array.isArray(row.reasoning) ? row.reasoning : null;
73
+ const capReasoning = caps?.reasoning && typeof caps.reasoning === 'object' && !Array.isArray(caps.reasoning) ? caps.reasoning : null;
74
+ const reasoningEfforts = effortsFrom(row?.reasoningEfforts, row?.livelliRagionamento, row?.ragionamento?.livelli, ownReasoning?.supportedEfforts, ownReasoning?.supported_efforts, ownReasoning?.allowed_options, capReasoning?.supportedEfforts, capReasoning?.supported_efforts, capReasoning?.allowed_options, caps?.ragionamento?.livelli);
75
+ const structuredReasoning = Boolean(ownReasoning || capReasoning || row?.ragionamento && typeof row.ragionamento === 'object' || caps?.ragionamento && typeof caps.ragionamento === 'object');
76
+ const reasoning = typeof row?.reasoning === 'boolean' ? row.reasoning
77
+ : typeof row?.supportsReasoning === 'boolean' ? row.supportsReasoning
78
+ : typeof caps?.reasoning === 'boolean' ? caps.reasoning
79
+ : structuredReasoning || reasoningEfforts !== null || supportedParameterSet?.has('reasoning') === true || supportedParameterSet?.has('include_reasoning') === true ? true : null;
80
+ const contextWindow = Number.isFinite(row?.contextLength) ? Number(row.contextLength)
81
+ : Number.isFinite(row?.contextWindow) ? Number(row.contextWindow)
82
+ : Number.isFinite(row?.finestraContesto) ? Number(row.finestraContesto)
83
+ : Number.isFinite(row?.context_length) ? Number(row.context_length) : null;
84
+ const toolCalling = typeof row?.toolCalling === 'boolean' ? row.toolCalling
85
+ : typeof row?.supportsTools === 'boolean' ? row.supportsTools
86
+ : typeof caps?.toolCall === 'boolean' ? caps.toolCall
87
+ : typeof caps?.tools === 'boolean' ? caps.tools
88
+ : supportedParameterSet?.has('tools') || supportedParameterSet?.has('tool_choice') ? true : null;
89
+ const explicitModalities = Array.isArray(row?.inputModalities) ? row.inputModalities
90
+ : Array.isArray(row?.input_modalities) ? row.input_modalities
91
+ : Array.isArray(row?.architecture?.input_modalities) ? row.architecture.input_modalities
92
+ : Array.isArray(row?.architecture?.inputModalities) ? row.architecture.inputModalities : null;
93
+ const images = explicitModalities ? explicitModalities.includes('image')
94
+ : typeof row?.images === 'boolean' ? row.images
95
+ : typeof caps?.images === 'boolean' ? caps.images
96
+ : typeof caps?.imageInput === 'boolean' ? caps.imageInput : null;
97
+ const meta = evidenceMeta(row);
98
+ const contextSource = documentedCapabilitySource(row, rowSource, 'context');
99
+ const reasoningSource = documentedCapabilitySource(row, rowSource, 'reasoning');
100
+ const capabilityEvidence = {
101
+ contextWindow: evidence(contextWindow, contextSource, contextSource === 'documented' ? meta : { url: null, date: null }),
102
+ toolCalling: evidence(toolCalling, rowSource, rowSource === 'documented' ? meta : { url: null, date: null }),
103
+ reasoning: evidence(reasoning, reasoningSource, reasoningSource === 'documented' ? meta : { url: null, date: null }),
104
+ reasoningEfforts: evidence(reasoningEfforts, reasoningSource, reasoningSource === 'documented' ? meta : { url: null, date: null }),
105
+ images: evidence(images, rowSource, rowSource === 'documented' ? meta : { url: null, date: null }),
106
+ };
107
+ out.push({
108
+ id, provider, name: String(row?.nome ?? row?.name ?? raw),
109
+ source: rowSource, available: rowSource, availabilityVerified: rowSource === 'live',
110
+ contextWindow, toolCalling, reasoning, reasoningEfforts, images,
111
+ capabilityEvidence,
112
+ });
113
+ }
114
+ return out;
115
+ }
116
+ function preferredCapability(left, right) {
117
+ if (left.value === null)
118
+ return right;
119
+ if (right.value === null)
120
+ return left;
121
+ return CAPABILITY_RANK[right.source] > CAPABILITY_RANK[left.source] ? right : left;
122
+ }
123
+ function withFlatCapabilities(row) {
124
+ const evidence = row.capabilityEvidence;
125
+ const reasoningEfforts = evidence.reasoningEfforts.value;
126
+ const reasoning = evidence.reasoning.value ?? (reasoningEfforts !== null ? true : null);
127
+ return {
128
+ ...row,
129
+ contextWindow: evidence.contextWindow.value,
130
+ toolCalling: evidence.toolCalling.value,
131
+ reasoning,
132
+ reasoningEfforts,
133
+ images: evidence.images.value,
134
+ };
135
+ }
136
+ function mergeTwo(left, right) {
137
+ const preferred = SOURCE_RANK[right.source] > SOURCE_RANK[left.source] ? right : left;
138
+ const capabilityEvidence = {
139
+ contextWindow: preferredCapability(left.capabilityEvidence.contextWindow, right.capabilityEvidence.contextWindow),
140
+ toolCalling: preferredCapability(left.capabilityEvidence.toolCalling, right.capabilityEvidence.toolCalling),
141
+ reasoning: preferredCapability(left.capabilityEvidence.reasoning, right.capabilityEvidence.reasoning),
142
+ reasoningEfforts: preferredCapability(left.capabilityEvidence.reasoningEfforts, right.capabilityEvidence.reasoningEfforts),
143
+ images: preferredCapability(left.capabilityEvidence.images, right.capabilityEvidence.images),
144
+ };
145
+ return withFlatCapabilities({
146
+ id: left.id,
147
+ provider: left.provider,
148
+ name: preferred.name,
149
+ source: preferred.source,
150
+ available: preferred.source,
151
+ availabilityVerified: preferred.source === 'live',
152
+ capabilityEvidence,
153
+ });
154
+ }
155
+ export function mergeModelRows(...rows) {
156
+ const byId = new Map();
157
+ const order = [];
158
+ for (const row of rows) {
159
+ const previous = byId.get(row.id);
160
+ if (!previous) {
161
+ byId.set(row.id, row);
162
+ order.push(row.id);
163
+ continue;
164
+ }
165
+ byId.set(row.id, mergeTwo(previous, row));
166
+ }
167
+ return order.map(id => byId.get(id));
168
+ }
@@ -0,0 +1,172 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ /*
10
+ * P21 (owner, 2026-09-26: "la possibilità di fare accesso oauth con Open Router, come fa l'applicazione desktop"; decisions
11
+ * the same day): sign in to OpenRouter from the CLI without pasting a key. The end of the flow is a plain OpenRouter API key,
12
+ * stored like a pasted one.
13
+ *
14
+ * The PKCE arithmetic is the desktop's own (`harness-ui/src/openrouter-oauth.mjs`, researched 2026-09-10 on OpenRouter's
15
+ * OAuth PKCE docs and RFC 7636): S256 always, the verifier never leaves this process, a single-use code that OpenRouter lets
16
+ * live 10 minutes, `state` carried in the callback PATH because OpenRouter documents no `state`, and error codes without
17
+ * response bodies. This file adds what a CLI needs, read on 2026-09-26:
18
+ * - a one-shot loopback server on 127.0.0.1 and a port the system picks, open only while the sign-in lasts (RFC 8252 §7.3,
19
+ * §8.3: the IP literal, not `localhost`; listen on loopback only; close the port once the answer is in); the system browser,
20
+ * never an embedded one (§8.12). Pi (`packages/ai/src/auth/oauth/openrouter.ts`) and Hermes (`hermes_cli/auth_openrouter.py`)
21
+ * do the same, Codex for its own sign-in (`codex-rs/login/src/server.rs`);
22
+ * - a code pasted by hand, raced against the browser (Pi): the code alone or the whole address the browser landed on;
23
+ * - a remote session (SSH) goes to OpenRouter's no-callback mode at once, where the page SHOWS the code (Hermes).
24
+ */
25
+ import { spawn } from 'node:child_process';
26
+ import { createServer } from 'node:http';
27
+ import { join } from 'node:path';
28
+ import { pathToFileURL } from 'node:url';
29
+ /** The desktop's PKCE module, from the checkout or from the package's own copy of the kernel (`vendor/harness-ui`). */
30
+ export async function loadOpenRouterOAuth(repoRoot) {
31
+ return await import(__rewriteRelativeImportExtension(pathToFileURL(join(repoRoot, 'harness-ui', 'src', 'openrouter-oauth.mjs')).href));
32
+ }
33
+ /** What OpenRouter writes beside the key on the person's key page, so they can tell which program asked and revoke it. */
34
+ export const LOGIN_LABEL = 'TALOS CLI';
35
+ /** OpenRouter's code lives 10 minutes ("The code is single-use and expires after 10 minutes"); the wait is the same. */
36
+ export const LOGIN_TIMEOUT_MS = 10 * 60 * 1000;
37
+ const EXCHANGE_TIMEOUT_MS = 30_000;
38
+ export function isRemoteSession(env = process.env) {
39
+ return Boolean(env.SSH_CONNECTION || env.SSH_CLIENT || env.SSH_TTY);
40
+ }
41
+ /** The code in what the person pasted: the code itself, or the address (or query) the browser landed on. */
42
+ export function codeFromInput(input) {
43
+ const value = String(input ?? '').trim();
44
+ if (!value)
45
+ return null;
46
+ try {
47
+ const url = new URL(value);
48
+ return url.searchParams.get('code') || null;
49
+ }
50
+ catch { /* not an address */ }
51
+ if (value.includes('code=')) {
52
+ const code = new URLSearchParams(value.replace(/^[^?]*\?/u, '')).get('code');
53
+ return code || null;
54
+ }
55
+ return /\s/u.test(value) ? null : value;
56
+ }
57
+ /**
58
+ * Opens the address in the system browser, without a shell (on Windows `&` in an address would split a `cmd` line).
59
+ * A test profile never opens a window: the address is only shown.
60
+ */
61
+ export function openInBrowser(url, { env = process.env, platform = process.platform, spawnImpl = spawn } = {}) {
62
+ if (env.TALOS_TEST_PROFILE === '1')
63
+ return false;
64
+ if (!/^https:\/\//u.test(url))
65
+ return false;
66
+ const [command, args] = platform === 'win32' ? ['rundll32', ['url.dll,FileProtocolHandler', url]] : platform === 'darwin' ? ['open', [url]] : ['xdg-open', [url]];
67
+ try {
68
+ const child = spawnImpl(command, args, { detached: true, stdio: 'ignore', windowsHide: true });
69
+ child.on('error', () => { });
70
+ child.unref();
71
+ return true;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ export class OpenRouterLoginError extends Error {
78
+ code;
79
+ status;
80
+ constructor(code, message, status = null) { super(message); this.name = 'OpenRouterLoginError'; this.code = code; this.status = status; }
81
+ }
82
+ const failure = (error) => error instanceof OpenRouterLoginError ? error : new OpenRouterLoginError(String(error?.code ?? 'OAUTH_FAILED'), 'The sign-in did not complete.', typeof error?.stato === 'number' ? error.stato : null);
83
+ const PAGE = (title) => `<!doctype html><html lang="en"><head><meta charset="utf-8"><title>TALOS</title></head><body style="font-family:sans-serif;margin:3em"><h1>${title}</h1></body></html>`;
84
+ export async function startOpenRouterLogin({ oauth, env = process.env, paste = false, open = openInBrowser, fetchImpl = globalThis.fetch, timeoutMs = LOGIN_TIMEOUT_MS, label = LOGIN_LABEL }) {
85
+ const { verifier, challenge } = oauth.creaCoppiaPkce();
86
+ const state = oauth.creaStato();
87
+ const byHand = paste || isRemoteSession(env);
88
+ let settled = false, claimed = false, server = null, timer = null;
89
+ let resolveKey = () => { };
90
+ let rejectKey = () => { };
91
+ const key = new Promise((resolve, reject) => { resolveKey = resolve; rejectKey = reject; });
92
+ key.catch(() => { });
93
+ /* The port stops taking requests as soon as the sign-in is decided (RFC 8252 §8.3); the page the browser is waiting for is
94
+ still sent (a forced close there showed the person a broken connection instead of "Signed in"). Only a cancel or a
95
+ timeout drops the open connections too. */
96
+ const close = (force) => { if (timer) {
97
+ clearTimeout(timer);
98
+ timer = null;
99
+ } if (server) {
100
+ server.close();
101
+ if (force)
102
+ server.closeAllConnections?.();
103
+ server = null;
104
+ } };
105
+ const finish = (outcome, force = false) => { if (settled)
106
+ return; settled = true; close(force); if ('key' in outcome)
107
+ resolveKey(outcome.key);
108
+ else
109
+ rejectKey(outcome.error); };
110
+ const fetchDiRete = ((input, init) => fetchImpl(input, { ...init, signal: AbortSignal.timeout(EXCHANGE_TIMEOUT_MS) }));
111
+ const exchange = async (code) => {
112
+ claimed = true;
113
+ try {
114
+ const { chiave } = await oauth.scambiaCodicePerChiave({ codice: code, verifier, fetchDiRete });
115
+ finish({ key: chiave });
116
+ }
117
+ catch (error) {
118
+ finish({ error: failure(error) });
119
+ }
120
+ return key;
121
+ };
122
+ let callbackUrl = null;
123
+ if (!byHand) {
124
+ const path = `/openrouter/callback/${encodeURIComponent(state)}`;
125
+ server = createServer((request, response) => {
126
+ const send = (status, title) => { response.statusCode = status; response.setHeader('content-type', 'text/html; charset=utf-8'); response.setHeader('cache-control', 'no-store'); response.setHeader('connection', 'close'); response.end(PAGE(title)); };
127
+ const requestUrl = new URL(request.url ?? '/', 'http://127.0.0.1');
128
+ if (request.method !== 'GET' || requestUrl.pathname !== path) {
129
+ send(404, 'Not found.');
130
+ return;
131
+ }
132
+ if (claimed || settled) {
133
+ send(409, 'This sign-in has already been used.');
134
+ return;
135
+ }
136
+ if (requestUrl.searchParams.get('error')) {
137
+ send(400, 'OpenRouter sign-in was cancelled. You can close this page.');
138
+ finish({ error: new OpenRouterLoginError('OAUTH_DENIED', 'OpenRouter sign-in was cancelled in the browser.') });
139
+ return;
140
+ }
141
+ const code = requestUrl.searchParams.get('code');
142
+ if (!code) {
143
+ send(400, 'OpenRouter returned no code.');
144
+ return;
145
+ }
146
+ void exchange(code).then(() => send(200, 'Signed in to OpenRouter. You can close this page and go back to TALOS.'), () => send(502, 'The sign-in did not complete. Go back to TALOS.'));
147
+ });
148
+ await new Promise((resolve, reject) => { server.once('error', reject); server.listen(0, '127.0.0.1', () => { server.removeListener('error', reject); resolve(); }); });
149
+ const address = server.address();
150
+ if (!address || typeof address === 'string') {
151
+ close(true);
152
+ throw new OpenRouterLoginError('OAUTH_CALLBACK_UNAVAILABLE', 'TALOS could not listen for OpenRouter on this machine.');
153
+ }
154
+ callbackUrl = `http://127.0.0.1:${address.port}${path}`;
155
+ }
156
+ const url = oauth.indirizzoDiAutorizzazione({ challenge, callbackUrl, etichetta: label });
157
+ timer = setTimeout(() => finish({ error: new OpenRouterLoginError('OAUTH_TIMEOUT', 'The sign-in took longer than 10 minutes.') }, true), timeoutMs);
158
+ timer.unref?.();
159
+ const opened = byHand ? false : open(url);
160
+ return {
161
+ url, mode: byHand ? 'paste' : 'browser', opened, key,
162
+ async submit(input) {
163
+ if (settled || claimed)
164
+ return key;
165
+ const code = codeFromInput(input);
166
+ if (!code)
167
+ throw new OpenRouterLoginError('OAUTH_CODE_MISSING', 'That is not a code from OpenRouter.');
168
+ return exchange(code);
169
+ },
170
+ cancel() { finish({ error: new OpenRouterLoginError('OAUTH_CANCELLED', 'The sign-in was cancelled.') }, true); },
171
+ };
172
+ }
@@ -0,0 +1,13 @@
1
+ /*
2
+ * R2 (D-05, gate E1/E4): the one place a provider's label and description reach the screen or `talos provider list`. Mapped
3
+ * by provider ID, never by the kernel's words; the kernel registry (and what the model or the kernel receives) is untouched.
4
+ */
5
+ import { en, t } from "../i18n/index.js";
6
+ function entry(id, field) {
7
+ const key = `provider.${id}.${field}`;
8
+ return Object.hasOwn(en, key) ? t(key) : null;
9
+ }
10
+ /** The English label for provider `id`, or `fallback` (the registry text) when the registry label is already English. */
11
+ export function providerLabelText(id, fallback) { return entry(id, 'label') ?? fallback; }
12
+ /** The English description for provider `id`, or `fallback` (the registry text). */
13
+ export function providerDescriptionText(id, fallback) { return entry(id, 'description') ?? fallback; }
@@ -0,0 +1,95 @@
1
+ import { loadTalosSystemKeyring, systemKeyringAdapter } from "./system-keyring.js";
2
+ import { t } from "../i18n/index.js";
3
+ import { CliRuntimeError } from "../runtime/types.js";
4
+ import { CREDENTIAL_STORES } from "../config/types.js";
5
+ const SERVICE = 'talos-cli-provider';
6
+ function cleanKey(v) { const x = v.trim(); if (!x || x.length > 4096 || /[\r\n\0]/u.test(x))
7
+ throw new Error('PROVIDER_KEY_INVALID'); return x; }
8
+ export function createCliProviderStore({ env, keyring, definitions }) {
9
+ const def = (id) => { const d = definitions[id]; if (!d)
10
+ throw new Error('PROVIDER_INVALID'); return d; };
11
+ const envKey = (id) => { for (const n of def(id).env) {
12
+ const v = env[n];
13
+ if (v?.trim())
14
+ return cleanKey(v);
15
+ } return null; };
16
+ return {
17
+ async getKey(id) { const e = envKey(id); if (e)
18
+ return e; const v = await keyring.get(SERVICE, id); return v ? cleanKey(v) : null; },
19
+ async setKey(id, value) { def(id); await keyring.set(SERVICE, id, cleanKey(value)); },
20
+ async removeKey(id) { def(id); await keyring.remove(SERVICE, id); },
21
+ async listPublic() { const rows = []; for (const [id, d] of Object.entries(definitions)) {
22
+ rows.push({ id, label: d.label ?? id, requiresKey: d.requiresKey, configured: d.requiresKey ? Boolean(await this.getKey(id)) : true });
23
+ } return rows; },
24
+ };
25
+ }
26
+ export const CREDENTIAL_STORE_VARIABLE = 'TALOS_CREDENTIAL_STORE';
27
+ export const TEST_PROFILE_VARIABLE = 'TALOS_TEST_PROFILE';
28
+ export function isTestProfile(env) {
29
+ return env[TEST_PROFILE_VARIABLE] === '1' || (typeof env.NODE_TEST_CONTEXT === 'string' && env.NODE_TEST_CONTEXT !== '');
30
+ }
31
+ export function chooseCredentialStore({ env, config, ownLoader = false }) {
32
+ const testProfile = isTestProfile(env);
33
+ const raw = env[CREDENTIAL_STORE_VARIABLE];
34
+ if (typeof raw === 'string' && raw.trim() !== '') {
35
+ const kind = raw.trim().toLowerCase();
36
+ if (!CREDENTIAL_STORES.includes(kind))
37
+ throw new CliRuntimeError('CREDENTIAL_STORE_INVALID', t('store.invalid', { value: raw.trim(), variable: CREDENTIAL_STORE_VARIABLE }), { variable: CREDENTIAL_STORE_VARIABLE });
38
+ return { kind: kind, source: 'environment', testProfile };
39
+ }
40
+ const configured = config?.credentials?.store;
41
+ if (configured === 'system' || configured === 'memory')
42
+ return { kind: configured, source: 'config', testProfile };
43
+ return testProfile && !ownLoader ? { kind: 'memory', source: 'test-profile', testProfile } : { kind: 'system', source: 'default', testProfile };
44
+ }
45
+ /** The name `doctor` and the refusal give the store: the OS store's own name on this platform. */
46
+ export function credentialStoreName(kind, platform = process.platform) {
47
+ if (kind === 'memory')
48
+ return t('store.name.memory');
49
+ return t(platform === 'win32' ? 'store.name.system.win32' : platform === 'darwin' ? 'store.name.system.darwin' : 'store.name.system.other');
50
+ }
51
+ export function credentialStoreSourceText(choice) {
52
+ return choice.source === 'environment' ? t('store.source.environment', { variable: CREDENTIAL_STORE_VARIABLE })
53
+ : choice.source === 'config' ? t('store.source.config') : choice.source === 'test-profile' ? t('store.source.testProfile') : t('store.source.default');
54
+ }
55
+ /* Per profile (Codex keys its ephemeral store by `compute_store_key(codex_home)`): a runtime rebuilt in the same process (the
56
+ supervisor's restart) still sees a key saved a minute ago, and two profiles in one test process do not share keys. */
57
+ const MEMORY_STORES = new Map();
58
+ export function createMemoryKeyring(scope) {
59
+ let values = MEMORY_STORES.get(scope);
60
+ if (!values) {
61
+ values = new Map();
62
+ MEMORY_STORES.set(scope, values);
63
+ }
64
+ const map = values;
65
+ const key = (service, account) => `${service}\u0000${account}`;
66
+ return { get: (service, account) => map.get(key(service, account)) ?? null, set: (service, account, value) => { map.set(key(service, account), value); }, remove: (service, account) => { map.delete(key(service, account)); } };
67
+ }
68
+ let active = null;
69
+ /** The store the last resolution in this process chose (for the sentences that name it), or null before any. */
70
+ export function activeCredentialStore() { return active; }
71
+ /** What `/provider` says after a key passed its test and was saved: where it now lives. */
72
+ export function keySavedText() { return t(active?.kind === 'memory' ? 'store.saved.memory' : 'store.saved.system'); }
73
+ /**
74
+ * Resolves and opens the store. `scope` separates memory stores (the profile's data root). Throws `CREDENTIAL_STORE_INVALID` or
75
+ * `CREDENTIAL_STORE_REAL_IN_TEST`; a system store that cannot be loaded is `keyring: null` with its `problem`, as before R2.
76
+ */
77
+ export function openCredentialStore({ repoRoot, scope, env = process.env, config, loader }) {
78
+ const ownLoader = typeof loader?.load === 'function';
79
+ const choice = chooseCredentialStore({ env, config: config ?? null, ownLoader });
80
+ if (choice.kind === 'system' && choice.testProfile && !ownLoader) {
81
+ throw new CliRuntimeError('CREDENTIAL_STORE_REAL_IN_TEST', t('store.refusedInTest', { store: credentialStoreName('system'), variable: CREDENTIAL_STORE_VARIABLE }), { store: 'system', source: choice.source });
82
+ }
83
+ active = choice;
84
+ if (choice.kind === 'memory')
85
+ return { ...choice, keyring: createMemoryKeyring(scope), problem: null };
86
+ const loaded = loadTalosSystemKeyring(repoRoot, loader ?? {});
87
+ return loaded.ok ? { ...choice, keyring: systemKeyringAdapter(loaded.Entry), problem: null } : { ...choice, keyring: null, problem: loaded };
88
+ }
89
+ /** R2 (E13): through the resolver, so a test profile never reaches the OS store from here either. */
90
+ export async function createSystemKeyring(repoRoot, { scope = repoRoot, env = process.env, config } = {}) {
91
+ const opened = openCredentialStore({ repoRoot, scope, env, config: config ?? null });
92
+ if (!opened.keyring)
93
+ throw new Error('PROVIDER_STORE_UNAVAILABLE');
94
+ return opened.keyring;
95
+ }