talos-code 0.0.1 → 0.1.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 (401) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +111 -3
  3. package/THIRD_PARTY_NOTICES.md +40 -0
  4. package/dist/archive/zip.js +73 -0
  5. package/dist/args.js +97 -0
  6. package/dist/automations/history-store.js +34 -0
  7. package/dist/automations/policy-store.js +43 -0
  8. package/dist/automations/runner.js +107 -0
  9. package/dist/automations/schedule.js +85 -0
  10. package/dist/automations/windows-task.js +53 -0
  11. package/dist/commands/advanced-cli.js +233 -0
  12. package/dist/commands/checkpoint-cli.js +45 -0
  13. package/dist/commands/config-cli.js +107 -0
  14. package/dist/commands/context.js +17 -0
  15. package/dist/commands/extensions-cli.js +207 -0
  16. package/dist/commands/project-cli.js +74 -0
  17. package/dist/commands/project-commands.js +143 -0
  18. package/dist/commands/provider-cli.js +185 -0
  19. package/dist/commands/services-cli.js +248 -0
  20. package/dist/commands/session-cli.js +171 -0
  21. package/dist/commands/system-cli.js +405 -0
  22. package/dist/config/commands.js +60 -0
  23. package/dist/config/load.js +382 -0
  24. package/dist/config/migrations.js +48 -0
  25. package/dist/config/types.js +11 -0
  26. package/dist/diagnostics/development-log.js +154 -0
  27. package/dist/diagnostics/doctor.js +104 -0
  28. package/dist/diagnostics/redact.js +80 -0
  29. package/dist/diagnostics/zip.js +52 -0
  30. package/dist/errors.js +156 -0
  31. package/dist/events/bridge.js +130 -0
  32. package/dist/extensions/installer.js +178 -0
  33. package/dist/extensions/package-schema.js +24 -0
  34. package/dist/headless/result.js +84 -0
  35. package/dist/headless/run.js +230 -0
  36. package/dist/i18n/en/approval.js +43 -0
  37. package/dist/i18n/en/common.js +9 -0
  38. package/dist/i18n/en/credentials.js +82 -0
  39. package/dist/i18n/en/errors.js +246 -0
  40. package/dist/i18n/en/firstrun.js +89 -0
  41. package/dist/i18n/en/providers.js +37 -0
  42. package/dist/i18n/en/screen.js +736 -0
  43. package/dist/i18n/en/tools.js +127 -0
  44. package/dist/i18n/en.js +14 -0
  45. package/dist/i18n/error-view.js +307 -0
  46. package/dist/i18n/index.js +19 -0
  47. package/dist/i18n/kernel-map.js +139 -0
  48. package/dist/io.js +45 -0
  49. package/dist/main.js +330 -0
  50. package/dist/paths.js +41 -0
  51. package/dist/protocol/v2/codec.js +9 -0
  52. package/dist/protocol/v2/events.js +555 -0
  53. package/dist/protocol/v2/index.js +4 -0
  54. package/dist/protocol/v2/replay.js +28 -0
  55. package/dist/protocol/v2/types.js +1 -0
  56. package/dist/provider/control-plane.js +135 -0
  57. package/dist/provider/environment-keys.js +275 -0
  58. package/dist/provider/health.js +110 -0
  59. package/dist/provider/missing-key.js +48 -0
  60. package/dist/provider/model-catalog.js +168 -0
  61. package/dist/provider/provider-text.js +13 -0
  62. package/dist/provider/store.js +95 -0
  63. package/dist/provider/system-keyring.js +214 -0
  64. package/dist/runtime/active-run.js +63 -0
  65. package/dist/runtime/agent-tree.js +74 -0
  66. package/dist/runtime/attachments.js +84 -0
  67. package/dist/runtime/brokered-executor.js +395 -0
  68. package/dist/runtime/context-status.js +76 -0
  69. package/dist/runtime/create-runtime.js +111 -0
  70. package/dist/runtime/model-profile.js +361 -0
  71. package/dist/runtime/output-store.js +137 -0
  72. package/dist/runtime/provider-attempts.js +185 -0
  73. package/dist/runtime/replay-buffer.js +153 -0
  74. package/dist/runtime/repo.js +95 -0
  75. package/dist/runtime/session-facade.js +135 -0
  76. package/dist/runtime/session-summary.js +125 -0
  77. package/dist/runtime/supervisor.js +262 -0
  78. package/dist/runtime/talos-composition.js +1006 -0
  79. package/dist/runtime/types.js +5 -0
  80. package/dist/runtime/usage-snapshot.js +82 -0
  81. package/dist/security/auto-classifier.js +38 -0
  82. package/dist/security/credential-free-environment.js +54 -0
  83. package/dist/security/evaluate.js +243 -0
  84. package/dist/security/execution-backends.js +236 -0
  85. package/dist/security/execution-broker.js +102 -0
  86. package/dist/security/forge-scan.js +74 -0
  87. package/dist/security/from-approval.js +39 -0
  88. package/dist/security/mxc-execution-backend.js +281 -0
  89. package/dist/security/permission-engine.js +138 -0
  90. package/dist/security/permission-explanation.js +54 -0
  91. package/dist/security/persist.js +179 -0
  92. package/dist/security/plugin-guard.js +230 -0
  93. package/dist/security/process-tree-evidence-store.js +74 -0
  94. package/dist/security/process-tree-probe.js +554 -0
  95. package/dist/security/project-resource-inventory.js +186 -0
  96. package/dist/security/project-trust-gate.js +38 -0
  97. package/dist/security/project-trust.js +367 -0
  98. package/dist/security/rule-parser.js +201 -0
  99. package/dist/security/shell-segmentation.js +68 -0
  100. package/dist/security/trust-authority.js +324 -0
  101. package/dist/security/types.js +1 -0
  102. package/dist/security/workspace-identity.js +102 -0
  103. package/dist/services/automation-facade.js +59 -0
  104. package/dist/services/forge-facade.js +77 -0
  105. package/dist/services/hook-facade.js +240 -0
  106. package/dist/services/index.js +16 -0
  107. package/dist/services/library-facade.js +174 -0
  108. package/dist/services/mcp-facade.js +348 -0
  109. package/dist/services/memory-facade.js +126 -0
  110. package/dist/services/notes-facade.js +157 -0
  111. package/dist/services/plugin-facade.js +308 -0
  112. package/dist/services/research-facade.js +110 -0
  113. package/dist/services/task-board-facade.js +236 -0
  114. package/dist/services/workflow-catalog.js +246 -0
  115. package/dist/sessions/export-format.js +98 -0
  116. package/dist/sessions/metadata-store.js +160 -0
  117. package/dist/sessions/share.js +122 -0
  118. package/dist/sessions/transfer.js +16 -0
  119. package/dist/subcommands.js +62 -0
  120. package/dist/tui/agent-roster.js +36 -0
  121. package/dist/tui/app.js +3761 -0
  122. package/dist/tui/approval.js +36 -0
  123. package/dist/tui/boot/boot-sequence.js +76 -0
  124. package/dist/tui/boot/cinematic.js +243 -0
  125. package/dist/tui/boot/desktop-logo.js +82 -0
  126. package/dist/tui/boot.js +3 -0
  127. package/dist/tui/busy-input.js +58 -0
  128. package/dist/tui/catalog-service.js +559 -0
  129. package/dist/tui/components/assistant-stream.js +1 -0
  130. package/dist/tui/components/command-menu.js +68 -0
  131. package/dist/tui/components/composer.js +219 -0
  132. package/dist/tui/components/diff.js +35 -0
  133. package/dist/tui/components/footer.js +48 -0
  134. package/dist/tui/components/header.js +6 -0
  135. package/dist/tui/components/markdown.js +305 -0
  136. package/dist/tui/components/status-indicator.js +32 -0
  137. package/dist/tui/components/terminal-shell.js +205 -0
  138. package/dist/tui/components/thinking-row.js +19 -0
  139. package/dist/tui/components/tool-row.js +97 -0
  140. package/dist/tui/components/transcript-virtualizer.js +165 -0
  141. package/dist/tui/components/transcript.js +43 -0
  142. package/dist/tui/diff-model.js +77 -0
  143. package/dist/tui/editor-history.js +21 -0
  144. package/dist/tui/editor.js +210 -0
  145. package/dist/tui/event-adapter.js +436 -0
  146. package/dist/tui/exit-output.js +58 -0
  147. package/dist/tui/external-editor.js +53 -0
  148. package/dist/tui/file-completion.js +89 -0
  149. package/dist/tui/focus-manager.js +5 -0
  150. package/dist/tui/highlight.js +30 -0
  151. package/dist/tui/input-router.js +18 -0
  152. package/dist/tui/interrupt.js +99 -0
  153. package/dist/tui/keybindings.js +194 -0
  154. package/dist/tui/keymap-resolver.js +91 -0
  155. package/dist/tui/launch-state.js +139 -0
  156. package/dist/tui/line-diff.js +57 -0
  157. package/dist/tui/live-activity.js +45 -0
  158. package/dist/tui/metrics.js +123 -0
  159. package/dist/tui/onboarding.js +36 -0
  160. package/dist/tui/overlays/agent-tree.js +39 -0
  161. package/dist/tui/overlays/approval-dialog.js +640 -0
  162. package/dist/tui/overlays/automation-center.js +51 -0
  163. package/dist/tui/overlays/checkpoint-picker.js +47 -0
  164. package/dist/tui/overlays/context-inspector.js +36 -0
  165. package/dist/tui/overlays/effort-line.js +110 -0
  166. package/dist/tui/overlays/forge-center.js +46 -0
  167. package/dist/tui/overlays/help-dialog.js +16 -0
  168. package/dist/tui/overlays/history-picker.js +37 -0
  169. package/dist/tui/overlays/hook-center.js +70 -0
  170. package/dist/tui/overlays/library-center.js +55 -0
  171. package/dist/tui/overlays/mcp-center.js +60 -0
  172. package/dist/tui/overlays/memory-center.js +63 -0
  173. package/dist/tui/overlays/model-picker.js +72 -0
  174. package/dist/tui/overlays/notes-center.js +53 -0
  175. package/dist/tui/overlays/overlay-host.js +8 -0
  176. package/dist/tui/overlays/plugin-center.js +76 -0
  177. package/dist/tui/overlays/provider-picker.js +145 -0
  178. package/dist/tui/overlays/queue-editor.js +32 -0
  179. package/dist/tui/overlays/research-center.js +59 -0
  180. package/dist/tui/overlays/scroll-window.js +234 -0
  181. package/dist/tui/overlays/session-picker.js +115 -0
  182. package/dist/tui/overlays/tasks-center.js +83 -0
  183. package/dist/tui/overlays/theme-picker.js +21 -0
  184. package/dist/tui/overlays/transcript-search.js +58 -0
  185. package/dist/tui/overlays/trust-center.js +29 -0
  186. package/dist/tui/overlays/workflow-center.js +46 -0
  187. package/dist/tui/project-file-index.js +214 -0
  188. package/dist/tui/project-references.js +85 -0
  189. package/dist/tui/project-trust-prompt.js +287 -0
  190. package/dist/tui/prompt-history-store.js +116 -0
  191. package/dist/tui/queue-store.js +110 -0
  192. package/dist/tui/regions/budget.js +59 -0
  193. package/dist/tui/regions/views.js +96 -0
  194. package/dist/tui/render-coordinator.js +148 -0
  195. package/dist/tui/render-scheduler.js +4 -0
  196. package/dist/tui/run.js +69 -0
  197. package/dist/tui/selection-list.js +29 -0
  198. package/dist/tui/session-controller.js +778 -0
  199. package/dist/tui/session-export.js +54 -0
  200. package/dist/tui/shell-input.js +35 -0
  201. package/dist/tui/shell-layout.js +48 -0
  202. package/dist/tui/shell-model.js +98 -0
  203. package/dist/tui/slash-commands.js +80 -0
  204. package/dist/tui/state.js +151 -0
  205. package/dist/tui/status-bar.js +125 -0
  206. package/dist/tui/status-view.js +40 -0
  207. package/dist/tui/terminal-capabilities.js +9 -0
  208. package/dist/tui/terminal-session.js +11 -0
  209. package/dist/tui/text-width.js +66 -0
  210. package/dist/tui/theme-catalog.js +25 -0
  211. package/dist/tui/theme-store.js +23 -0
  212. package/dist/tui/theme.js +23 -0
  213. package/dist/tui/tool-display.js +135 -0
  214. package/dist/tui/tool-facts.js +1 -0
  215. package/dist/tui/tools/bash-renderer.js +32 -0
  216. package/dist/tui/tools/change.js +61 -0
  217. package/dist/tui/tools/edit-renderer.js +17 -0
  218. package/dist/tui/tools/generic-renderer.js +13 -0
  219. package/dist/tui/tools/list-renderer.js +14 -0
  220. package/dist/tui/tools/read-renderer.js +13 -0
  221. package/dist/tui/tools/registry.js +20 -0
  222. package/dist/tui/tools/row-format.js +187 -0
  223. package/dist/tui/tools/search-renderer.js +38 -0
  224. package/dist/tui/tools/shared.js +97 -0
  225. package/dist/tui/tools/write-renderer.js +15 -0
  226. package/dist/tui/transcript-model.js +441 -0
  227. package/dist/tui/ui-preferences.js +79 -0
  228. package/dist/tui/usage-view.js +77 -0
  229. package/dist/tui/vim-mode.js +99 -0
  230. package/dist/update/check.js +15 -0
  231. package/dist/update/npm.js +51 -0
  232. package/dist/update/run.js +129 -0
  233. package/dist/version.js +2 -0
  234. package/dist/workspace/checkpoint-store.js +210 -0
  235. package/dist/workspace/checkpoint.js +413 -0
  236. package/dist/workspace/restore.js +232 -0
  237. package/package.json +63 -5
  238. package/vendor/context-engine/package.json +11 -0
  239. package/vendor/context-engine/src/compaction-planner.mjs +57 -0
  240. package/vendor/context-engine/src/contracts.mjs +48 -0
  241. package/vendor/context-engine/src/engine.mjs +445 -0
  242. package/vendor/context-engine/src/node/context-export.mjs +164 -0
  243. package/vendor/context-engine/src/node/legacy-import.mjs +92 -0
  244. package/vendor/context-engine/src/node/migrations/001-context.sql +126 -0
  245. package/vendor/context-engine/src/node/sqlite-store.mjs +85 -0
  246. package/vendor/context-engine/src/node/sqlite-worker.mjs +559 -0
  247. package/vendor/context-engine/src/profiles.mjs +10 -0
  248. package/vendor/context-engine/src/retrieval.mjs +104 -0
  249. package/vendor/context-engine/src/summary.mjs +97 -0
  250. package/vendor/context-engine/src/usage.mjs +34 -0
  251. package/vendor/harness-ui/package.json +38 -0
  252. package/vendor/harness-ui/src/acp-agent.mjs +350 -0
  253. package/vendor/harness-ui/src/agent-service.mjs +2188 -0
  254. package/vendor/harness-ui/src/agui-events.mjs +452 -0
  255. package/vendor/harness-ui/src/ambiente-solo-server.mjs +121 -0
  256. package/vendor/harness-ui/src/artifact-store.mjs +39 -0
  257. package/vendor/harness-ui/src/assistenza.mjs +123 -0
  258. package/vendor/harness-ui/src/automation-scheduler.mjs +69 -0
  259. package/vendor/harness-ui/src/automation-store.mjs +145 -0
  260. package/vendor/harness-ui/src/browser-annota.mjs +639 -0
  261. package/vendor/harness-ui/src/browser-frame.mjs +211 -0
  262. package/vendor/harness-ui/src/browser-proxy-universale.mjs +519 -0
  263. package/vendor/harness-ui/src/browser-proxy.mjs +87 -0
  264. package/vendor/harness-ui/src/browser-sessione-viva.mjs +329 -0
  265. package/vendor/harness-ui/src/browser-stream.mjs +445 -0
  266. package/vendor/harness-ui/src/browser-vivo.mjs +694 -0
  267. package/vendor/harness-ui/src/chat-image-attachments.mjs +72 -0
  268. package/vendor/harness-ui/src/config.mjs +697 -0
  269. package/vendor/harness-ui/src/contesto-del-progetto.mjs +385 -0
  270. package/vendor/harness-ui/src/context-asset-adapter.mjs +72 -0
  271. package/vendor/harness-ui/src/context-desktop-service.mjs +253 -0
  272. package/vendor/harness-ui/src/context-embedding-runtime.mjs +252 -0
  273. package/vendor/harness-ui/src/context-inference-scheduler.mjs +81 -0
  274. package/vendor/harness-ui/src/context-native-compaction.mjs +75 -0
  275. package/vendor/harness-ui/src/context-provider-adapter.mjs +141 -0
  276. package/vendor/harness-ui/src/context-runtime.mjs +118 -0
  277. package/vendor/harness-ui/src/context-token-counters.mjs +184 -0
  278. package/vendor/harness-ui/src/context-tool-catalog.mjs +86 -0
  279. package/vendor/harness-ui/src/context-tool-output.mjs +72 -0
  280. package/vendor/harness-ui/src/costo-elenco.mjs +252 -0
  281. package/vendor/harness-ui/src/custom-task.mjs +171 -0
  282. package/vendor/harness-ui/src/doctor.mjs +142 -0
  283. package/vendor/harness-ui/src/document-filename.mjs +97 -0
  284. package/vendor/harness-ui/src/document-generator.mjs +493 -0
  285. package/vendor/harness-ui/src/document-report.mjs +331 -0
  286. package/vendor/harness-ui/src/duckduckgo-search.mjs +155 -0
  287. package/vendor/harness-ui/src/elenco-profondo.mjs +337 -0
  288. package/vendor/harness-ui/src/favicon-proxy.mjs +113 -0
  289. package/vendor/harness-ui/src/forge-contract.mjs +221 -0
  290. package/vendor/harness-ui/src/frequent-dirs.mjs +134 -0
  291. package/vendor/harness-ui/src/generated-image-store.mjs +147 -0
  292. package/vendor/harness-ui/src/generation-idle.mjs +332 -0
  293. package/vendor/harness-ui/src/gguf-header.mjs +207 -0
  294. package/vendor/harness-ui/src/git-service.mjs +626 -0
  295. package/vendor/harness-ui/src/gitignore-elenco.mjs +604 -0
  296. package/vendor/harness-ui/src/harness-receipt-keypair.mjs +207 -0
  297. package/vendor/harness-ui/src/hf-direct-transfer.mjs +170 -0
  298. package/vendor/harness-ui/src/hf-hub-client.mjs +106 -0
  299. package/vendor/harness-ui/src/hf-image-proxy.mjs +105 -0
  300. package/vendor/harness-ui/src/hf-model-transfer.mjs +245 -0
  301. package/vendor/harness-ui/src/hook-registry.mjs +186 -0
  302. package/vendor/harness-ui/src/http-app.mjs +6259 -0
  303. package/vendor/harness-ui/src/http-lifecycle.mjs +132 -0
  304. package/vendor/harness-ui/src/id-archivio.mjs +27 -0
  305. package/vendor/harness-ui/src/image-generator.mjs +143 -0
  306. package/vendor/harness-ui/src/istruzioni-di-progetto.mjs +234 -0
  307. package/vendor/harness-ui/src/kernel/dist/kernelPerIlBanco.js +518 -0
  308. package/vendor/harness-ui/src/kernel/talosHarness.mjs +10437 -0
  309. package/vendor/harness-ui/src/library-policy-store.mjs +175 -0
  310. package/vendor/harness-ui/src/library-store.mjs +652 -0
  311. package/vendor/harness-ui/src/llama-server-supervisor.mjs +629 -0
  312. package/vendor/harness-ui/src/local-model-store.mjs +339 -0
  313. package/vendor/harness-ui/src/local-runtime-contract.mjs +66 -0
  314. package/vendor/harness-ui/src/local-runtime-events.mjs +44 -0
  315. package/vendor/harness-ui/src/local-runtime-llama-server.mjs +244 -0
  316. package/vendor/harness-ui/src/local-runtime-probe.mjs +401 -0
  317. package/vendor/harness-ui/src/machine-capacity.mjs +66 -0
  318. package/vendor/harness-ui/src/mappa-cartelle.mjs +491 -0
  319. package/vendor/harness-ui/src/mcp-client.mjs +98 -0
  320. package/vendor/harness-ui/src/mcp-registry.mjs +157 -0
  321. package/vendor/harness-ui/src/mcp-session.mjs +177 -0
  322. package/vendor/harness-ui/src/memory-store.mjs +227 -0
  323. package/vendor/harness-ui/src/model-catalog-models-dev.mjs +276 -0
  324. package/vendor/harness-ui/src/model-catalog.mjs +129 -0
  325. package/vendor/harness-ui/src/model-destination.mjs +189 -0
  326. package/vendor/harness-ui/src/modifica-ancorata.mjs +177 -0
  327. package/vendor/harness-ui/src/native-provider-adapter.mjs +205 -0
  328. package/vendor/harness-ui/src/notes-store.mjs +250 -0
  329. package/vendor/harness-ui/src/openai-compatible-runtime.mjs +428 -0
  330. package/vendor/harness-ui/src/openrouter-oauth.mjs +339 -0
  331. package/vendor/harness-ui/src/path-policy.mjs +442 -0
  332. package/vendor/harness-ui/src/plugin-registry.mjs +780 -0
  333. package/vendor/harness-ui/src/plugin-session.mjs +180 -0
  334. package/vendor/harness-ui/src/process-policy.mjs +345 -0
  335. package/vendor/harness-ui/src/prompt-enhancer-provider.mjs +94 -0
  336. package/vendor/harness-ui/src/provider-auth-cloud.mjs +95 -0
  337. package/vendor/harness-ui/src/provider-credential-store.mjs +541 -0
  338. package/vendor/harness-ui/src/provider-probe.mjs +582 -0
  339. package/vendor/harness-ui/src/provider-registry.mjs +1633 -0
  340. package/vendor/harness-ui/src/pty-terminal.mjs +312 -0
  341. package/vendor/harness-ui/src/public-problem.mjs +109 -0
  342. package/vendor/harness-ui/src/research/card.mjs +235 -0
  343. package/vendor/harness-ui/src/research/citations.mjs +142 -0
  344. package/vendor/harness-ui/src/research/collector.mjs +275 -0
  345. package/vendor/harness-ui/src/research/deposito-a-pezzi.mjs +139 -0
  346. package/vendor/harness-ui/src/research/dossier.mjs +114 -0
  347. package/vendor/harness-ui/src/research/esportazioni.mjs +560 -0
  348. package/vendor/harness-ui/src/research/fetch-cache.mjs +465 -0
  349. package/vendor/harness-ui/src/research/fidelity.mjs +122 -0
  350. package/vendor/harness-ui/src/research/independence.mjs +159 -0
  351. package/vendor/harness-ui/src/research/ledger.mjs +166 -0
  352. package/vendor/harness-ui/src/research/markdown-server.mjs +565 -0
  353. package/vendor/harness-ui/src/research/narration.mjs +181 -0
  354. package/vendor/harness-ui/src/research/open-cards.mjs +131 -0
  355. package/vendor/harness-ui/src/research/opposing.mjs +305 -0
  356. package/vendor/harness-ui/src/research/outline.mjs +111 -0
  357. package/vendor/harness-ui/src/research/page-budget.mjs +209 -0
  358. package/vendor/harness-ui/src/research/pdf.mjs +291 -0
  359. package/vendor/harness-ui/src/research/plan.mjs +301 -0
  360. package/vendor/harness-ui/src/research/raccolta-viva.mjs +452 -0
  361. package/vendor/harness-ui/src/research/recheck-document.mjs +69 -0
  362. package/vendor/harness-ui/src/research/recheck-history.mjs +192 -0
  363. package/vendor/harness-ui/src/research/recheck.mjs +194 -0
  364. package/vendor/harness-ui/src/research/report.mjs +203 -0
  365. package/vendor/harness-ui/src/research/run.mjs +527 -0
  366. package/vendor/harness-ui/src/research/synthesis.mjs +318 -0
  367. package/vendor/harness-ui/src/research/verification.mjs +572 -0
  368. package/vendor/harness-ui/src/research-orchestrator.mjs +2679 -0
  369. package/vendor/harness-ui/src/research-store.mjs +1133 -0
  370. package/vendor/harness-ui/src/runtime-build-manifest.mjs +26 -0
  371. package/vendor/harness-ui/src/runtime-contract.mjs +59 -0
  372. package/vendor/harness-ui/src/runtime-owner-adapter.mjs +1348 -0
  373. package/vendor/harness-ui/src/runtime-owner-contract.mjs +32 -0
  374. package/vendor/harness-ui/src/scheda-di-lavoro.mjs +249 -0
  375. package/vendor/harness-ui/src/search-source-store.mjs +172 -0
  376. package/vendor/harness-ui/src/session-registry.mjs +6095 -0
  377. package/vendor/harness-ui/src/session-store.mjs +220 -0
  378. package/vendor/harness-ui/src/sessione-pronta.mjs +73 -0
  379. package/vendor/harness-ui/src/setup-stato.mjs +31 -0
  380. package/vendor/harness-ui/src/sezioni-istruzioni.mjs +204 -0
  381. package/vendor/harness-ui/src/skill-registry.mjs +120 -0
  382. package/vendor/harness-ui/src/sse-replay-coalescente.mjs +0 -0
  383. package/vendor/harness-ui/src/static-files.mjs +96 -0
  384. package/vendor/harness-ui/src/stream-partition.mjs +123 -0
  385. package/vendor/harness-ui/src/subagent-orchestrator.mjs +453 -0
  386. package/vendor/harness-ui/src/task-catalog.mjs +65 -0
  387. package/vendor/harness-ui/src/tasks-store.mjs +220 -0
  388. package/vendor/harness-ui/src/terminal-registry.mjs +312 -0
  389. package/vendor/harness-ui/src/terminal-ws.mjs +170 -0
  390. package/vendor/harness-ui/src/tool-forge-store.mjs +299 -0
  391. package/vendor/harness-ui/src/tool-schema-normalize.mjs +100 -0
  392. package/vendor/harness-ui/src/usage-cache.mjs +315 -0
  393. package/vendor/harness-ui/src/workspace-browser.mjs +213 -0
  394. package/vendor/harness-ui/src/workspace-context.mjs +124 -0
  395. package/vendor/harness-ui/src/workspace-disk.mjs +62 -0
  396. package/vendor/harness-ui/src/workspace-files.mjs +589 -0
  397. package/vendor/harness-ui/src/workspace-info.mjs +189 -0
  398. package/vendor/harness-ui/src/workspace-launch-store.mjs +150 -0
  399. package/vendor/harness-ui/src/workspace-tree.mjs +67 -0
  400. package/vendor/harness-ui/src/workspace-watcher.mjs +161 -0
  401. package/vendor/manifest.json +170 -0
@@ -0,0 +1,53 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join, win32 } from 'node:path';
3
+ import { spawnSync } from 'node:child_process';
4
+ export const TALOS_AUTOMATION_TASK_NAME = 'TALOS CLI Automation Runner';
5
+ function requireWindows(platform) { if (platform !== 'win32')
6
+ throw Object.assign(new Error('WINDOWS_REQUIRED'), { code: 'WINDOWS_REQUIRED' }); }
7
+ function xmlEscape(value) { return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&apos;'); }
8
+ function output(value) { if (Buffer.isBuffer(value))
9
+ return value.toString('utf8'); return typeof value === 'string' ? value : ''; }
10
+ function schtasksPath(systemRoot) { return systemRoot ? win32.join(systemRoot, 'System32', 'schtasks.exe') : 'schtasks.exe'; }
11
+ function ensureSuccess(result, operation) { if (result.error)
12
+ throw Object.assign(new Error(`${operation}: ${result.error.message}`), { code: 'AUTOMATION_TASK_FAILED' }); if (result.status !== 0)
13
+ throw Object.assign(new Error(`${operation}: ${output(result.stderr) || output(result.stdout) || `exit ${result.status}`}`), { code: 'AUTOMATION_TASK_FAILED' }); }
14
+ export function windowsAutomationTaskDefinition(input) {
15
+ const command = `\"${input.launcher}\" automation serve`;
16
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">\n <RegistrationInfo><Description>${TALOS_AUTOMATION_TASK_NAME}</Description></RegistrationInfo>\n <Triggers><LogonTrigger><Enabled>true</Enabled><UserId>${xmlEscape(input.username)}</UserId></LogonTrigger></Triggers>\n <Principals><Principal id="Author"><UserId>${xmlEscape(input.username)}</UserId><LogonType>InteractiveToken</LogonType><RunLevel>LeastPrivilege</RunLevel></Principal></Principals>\n <Settings><MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy><DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries><StopIfGoingOnBatteries>false</StopIfGoingOnBatteries><AllowHardTerminate>true</AllowHardTerminate><StartWhenAvailable>true</StartWhenAvailable><Enabled>true</Enabled><ExecutionTimeLimit>PT0S</ExecutionTimeLimit></Settings>\n <Actions Context="Author"><Exec><Command>${xmlEscape(input.launcher)}</Command><Arguments>automation serve</Arguments></Exec></Actions>\n</Task>\n<!-- Equivalent action: ${xmlEscape(command)} -->\n`;
17
+ }
18
+ export async function installWindowsAutomationRunner(input) {
19
+ const platform = input.platform ?? process.platform;
20
+ requireWindows(platform);
21
+ if (!input.username.trim())
22
+ throw Object.assign(new Error('AUTOMATION_USERNAME_REQUIRED'), { code: 'AUTOMATION_USERNAME_REQUIRED' });
23
+ const launcher = win32.join(input.cliRoot, 'bin', 'talos.cmd');
24
+ await mkdir(input.definitionDir, { recursive: true });
25
+ const definitionFile = join(input.definitionDir, 'windows-task.xml');
26
+ await writeFile(definitionFile, windowsAutomationTaskDefinition({ launcher, username: input.username }), 'utf8');
27
+ const action = `\"${launcher}\" automation serve`;
28
+ const spawnImpl = input.spawnSyncImpl ?? spawnSync;
29
+ const result = spawnImpl(schtasksPath(input.systemRoot ?? process.env.SystemRoot), ['/Create', '/F', '/TN', TALOS_AUTOMATION_TASK_NAME, '/SC', 'ONLOGON', '/RU', input.username, '/RL', 'LIMITED', '/TR', action], { encoding: 'utf8', windowsHide: true });
30
+ ensureSuccess(result, 'schtasks /Create');
31
+ return { ok: true, taskName: TALOS_AUTOMATION_TASK_NAME, definitionFile, launcher };
32
+ }
33
+ export function uninstallWindowsAutomationRunner(input = {}) {
34
+ requireWindows(input.platform ?? process.platform);
35
+ const spawnImpl = input.spawnSyncImpl ?? spawnSync;
36
+ const result = spawnImpl(schtasksPath(input.systemRoot ?? process.env.SystemRoot), ['/Delete', '/F', '/TN', TALOS_AUTOMATION_TASK_NAME], { encoding: 'utf8', windowsHide: true });
37
+ ensureSuccess(result, 'schtasks /Delete');
38
+ return { ok: true, taskName: TALOS_AUTOMATION_TASK_NAME };
39
+ }
40
+ export async function probeWindowsAutomationRunner(input = {}) {
41
+ const platform = input.platform ?? process.platform;
42
+ if (platform !== 'win32')
43
+ return { state: 'unsupported', platform, taskName: TALOS_AUTOMATION_TASK_NAME };
44
+ const spawnImpl = input.spawnSyncImpl ?? spawnSync;
45
+ const result = spawnImpl(schtasksPath(input.systemRoot ?? process.env.SystemRoot), ['/Query', '/TN', TALOS_AUTOMATION_TASK_NAME, '/XML'], { encoding: 'utf8', windowsHide: true });
46
+ if (result.status === 1 && !result.error)
47
+ return { state: 'missing', platform, taskName: TALOS_AUTOMATION_TASK_NAME };
48
+ if (result.error || result.status !== 0)
49
+ return { state: 'unhealthy', platform, taskName: TALOS_AUTOMATION_TASK_NAME, code: 'AUTOMATION_TASK_QUERY_FAILED' };
50
+ const xml = output(result.stdout);
51
+ const healthy = /<Arguments>\s*automation serve\s*<\/Arguments>/u.test(xml);
52
+ return healthy ? { state: 'healthy', platform, taskName: TALOS_AUTOMATION_TASK_NAME } : { state: 'unhealthy', platform, taskName: TALOS_AUTOMATION_TASK_NAME, code: 'AUTOMATION_TASK_DEFINITION_MISMATCH' };
53
+ }
@@ -0,0 +1,233 @@
1
+ import { dirname, join, resolve } from 'node:path';
2
+ import { assertNoUnknownOptions, takeFlag, takeOption, writeValue } from "./context.js";
3
+ import { importTalosModule } from "../runtime/repo.js";
4
+ import { createResearchFacade } from "../services/research-facade.js";
5
+ import { createAutomationFacade } from "../services/automation-facade.js";
6
+ import { createAutomationPolicyStore } from "../automations/policy-store.js";
7
+ import { createAutomationHistoryStore } from "../automations/history-store.js";
8
+ import { runAutomationTick } from "../automations/runner.js";
9
+ import { installWindowsAutomationRunner, probeWindowsAutomationRunner, uninstallWindowsAutomationRunner } from "../automations/windows-task.js";
10
+ import { keyOriginForEntry, stateKeyOrigin } from "../provider/environment-keys.js";
11
+ function need(v, name) { if (!v)
12
+ throw new Error(`${name}_REQUIRED`); return v; }
13
+ function int(raw, name, min = 1) { if (raw === undefined)
14
+ throw new Error(`${name}_REQUIRED`); const n = Number(raw); if (!Number.isSafeInteger(n) || n < min)
15
+ throw new Error(`${name}_INVALID`); return n; }
16
+ export async function runResearchCommand(ctx, args0) {
17
+ const args = [...args0];
18
+ const op = args.shift() ?? 'list';
19
+ const mod = await importTalosModule(ctx.repoRoot, 'research-store.mjs');
20
+ if (op === 'start') {
21
+ const depthRaw = takeOption(args, '--depth') ?? '4';
22
+ const depth = int(depthRaw, 'RESEARCH_DEPTH', 2);
23
+ if (![2, 4, 6].includes(depth))
24
+ throw new Error('RESEARCH_DEPTH_INVALID');
25
+ assertNoUnknownOptions(args);
26
+ const question = args.join(' ').trim();
27
+ if (!question)
28
+ throw new Error('RESEARCH_QUERY_REQUIRED');
29
+ const model = ctx.invocation.model ?? 'openai:gpt-5-mini';
30
+ /* B1 slice 18: a one-shot command that runs a model uses an environment key without asking, states its origin, and names a missing key before sending. */
31
+ const rc = await ctx.createRuntimeContext({ projectRoot: ctx.projectRoot, paths: ctx.paths, repoRoot: ctx.repoRoot, model, environmentKeys: 'use' });
32
+ const origin = stateKeyOrigin(ctx.io, ctx.invocation.outputFormat, keyOriginForEntry(rc.runtime, model, { refuseMissing: true }));
33
+ await rc.registry.ripristina?.();
34
+ const prompt = `Use TALOS Deep Research for the following question. Start the research with depth ${depth}, follow its verification and source-retention workflow, and report the research id immediately; do not replace Deep Research with an ordinary web summary.\n\n${question}`;
35
+ const sessionId = await rc.runtime.start({ projectRoot: ctx.projectRoot, prompt, model, permissionMode: 'plan' });
36
+ writeValue(ctx, { sessionId, question, depth, started: true, ...origin }, `${sessionId}\n`);
37
+ return 0;
38
+ }
39
+ if (op === 'list') {
40
+ assertNoUnknownOptions(args);
41
+ const rows = await mod.elencaRicerche({ cartella: ctx.projectRoot });
42
+ writeValue(ctx, rows);
43
+ return 0;
44
+ }
45
+ const id = need(args.shift(), 'RESEARCH_ID');
46
+ if (op === 'read') {
47
+ assertNoUnknownOptions(args);
48
+ const row = await mod.leggiRicerca({ cartella: ctx.projectRoot, id });
49
+ if (!row)
50
+ throw new Error('RESEARCH_NOT_FOUND');
51
+ writeValue(ctx, row);
52
+ return 0;
53
+ }
54
+ if (op === 'rename') {
55
+ const title = need(args.shift(), 'RESEARCH_TITLE');
56
+ assertNoUnknownOptions(args);
57
+ const row = await mod.aggiornaRicerca({ cartella: ctx.projectRoot, id, titolo: title });
58
+ writeValue(ctx, row);
59
+ return 0;
60
+ }
61
+ if (op === 'delete') {
62
+ assertNoUnknownOptions(args);
63
+ await mod.eliminaRicerca({ cartella: ctx.projectRoot, id });
64
+ writeValue(ctx, { ok: true, id }, `Deleted research ${id}\n`);
65
+ return 0;
66
+ }
67
+ if (op === 'export') {
68
+ const format = need(args.shift(), 'RESEARCH_EXPORT_FORMAT');
69
+ const out = args.shift();
70
+ const tone = takeOption(args, '--tone');
71
+ assertNoUnknownOptions(args);
72
+ const facade = createResearchFacade({ projectRoot: ctx.projectRoot, repoRoot: ctx.repoRoot });
73
+ const result = await facade.exportFile(id, format, out, tone);
74
+ writeValue(ctx, result, `${result.path}\n`);
75
+ return 0;
76
+ }
77
+ if (op === 'pause' || op === 'resume' || op === 'cancel') {
78
+ assertNoUnknownOptions(args);
79
+ const model = ctx.invocation.model ?? 'openai:gpt-5-mini';
80
+ const rc = await ctx.createRuntimeContext({ projectRoot: ctx.projectRoot, paths: ctx.paths, repoRoot: ctx.repoRoot, model, environmentKeys: 'use' });
81
+ await rc.registry.ripristina?.();
82
+ const facade = createResearchFacade({ projectRoot: ctx.projectRoot, repoRoot: ctx.repoRoot }, { registry: rc.registry });
83
+ const result = op === 'pause' ? await facade.pause(id, id) : op === 'resume' ? await facade.resume(id, id) : await facade.cancel(id, id);
84
+ writeValue(ctx, result);
85
+ return 0;
86
+ }
87
+ throw new Error(`Unsupported research operation: ${op}`);
88
+ }
89
+ export async function runAutomationCommand(ctx, args0, deps = {}) {
90
+ const args = [...args0];
91
+ const op = args.shift() ?? 'list';
92
+ if (op === 'install-runner' || op === 'uninstall-runner') {
93
+ const yes = takeFlag(args, '--yes');
94
+ assertNoUnknownOptions(args);
95
+ if (!yes)
96
+ throw Object.assign(new Error('AUTOMATION_CONFIRM_REQUIRED'), { code: 'AUTOMATION_CONFIRM_REQUIRED' });
97
+ const platform = deps.platform ?? process.platform;
98
+ if (platform !== 'win32')
99
+ throw Object.assign(new Error('WINDOWS_REQUIRED'), { code: 'WINDOWS_REQUIRED' });
100
+ const cliRoot = deps.cliRoot ?? resolve(dirname(process.execPath), '..');
101
+ const username = deps.username ?? ([process.env.USERDOMAIN, process.env.USERNAME].filter(Boolean).join('\\\\') || process.env.USERNAME || '');
102
+ if (op === 'install-runner') {
103
+ const install = deps.installRunnerFn ?? installWindowsAutomationRunner;
104
+ const result = await install({ platform, cliRoot, definitionDir: join(ctx.paths.dataRoot, 'automations', 'runner'), username });
105
+ writeValue(ctx, result, 'Automation runner installed\\n');
106
+ return 0;
107
+ }
108
+ const uninstall = deps.uninstallRunnerFn ?? uninstallWindowsAutomationRunner;
109
+ const result = await uninstall({ platform });
110
+ writeValue(ctx, result, 'Automation runner removed\\n');
111
+ return 0;
112
+ }
113
+ if (op === 'health') {
114
+ assertNoUnknownOptions(args);
115
+ const probe = deps.probeRunnerFn ?? probeWindowsAutomationRunner;
116
+ const result = await probe({ platform: deps.platform ?? process.platform });
117
+ writeValue(ctx, result);
118
+ return 0;
119
+ }
120
+ const mod = await importTalosModule(ctx.repoRoot, 'automation-store.mjs');
121
+ const store = mod.createAutomationStore({ cartella: join(ctx.paths.dataRoot, 'automations') });
122
+ const policyStore = createAutomationPolicyStore(join(ctx.paths.dataRoot, 'automation-policies'));
123
+ const historyStore = createAutomationHistoryStore(join(ctx.paths.dataRoot, 'automation-history'));
124
+ const facade = createAutomationFacade({ projectRoot: ctx.projectRoot, dataRoot: ctx.paths.dataRoot, repoRoot: ctx.repoRoot }, { loadAutomationStore: async () => store, policyStore, historyStore, probeHealth: deps.probeRunnerFn ?? probeWindowsAutomationRunner });
125
+ if (op === 'list') {
126
+ assertNoUnknownOptions(args);
127
+ writeValue(ctx, await facade.list());
128
+ return 0;
129
+ }
130
+ if (op === 'add') {
131
+ const taskId = need(args.shift(), 'AUTOMATION_TASK');
132
+ const interval = int(takeOption(args, '--interval') ?? '5', 'AUTOMATION_INTERVAL', 5);
133
+ const limit = int(takeOption(args, '--limit') ?? '3', 'AUTOMATION_LIMIT');
134
+ const name = takeOption(args, '--name');
135
+ assertNoUnknownOptions(args);
136
+ const row = await store.crea({ taskId, nome: name, intervalloMinuti: interval, limiteAlGiorno: limit });
137
+ writeValue(ctx, row);
138
+ return 0;
139
+ }
140
+ if (op === 'serve') {
141
+ const once = takeFlag(args, '--once');
142
+ assertNoUnknownOptions(args);
143
+ const model = ctx.invocation.model ?? 'openai:gpt-5-mini';
144
+ const rc = await ctx.createRuntimeContext({ projectRoot: ctx.projectRoot, paths: ctx.paths, repoRoot: ctx.repoRoot, model, environmentKeys: 'use' });
145
+ const origin = stateKeyOrigin(ctx.io, ctx.invocation.outputFormat, keyOriginForEntry(rc.runtime, model, { refuseMissing: false }));
146
+ await rc.registry.ripristina?.();
147
+ const tick = async () => runAutomationTick({ rows: await store.elenca(), policyFor: (id) => policyStore.get(id), savePolicy: (id, p) => policyStore.put(id, p), appendHistory: (id, h) => historyStore.append(id, h), recordExecution: (id) => store.registraEsecuzione(id), registry: rc.registry });
148
+ if (once) {
149
+ const result = await tick();
150
+ writeValue(ctx, { ok: true, once: true, result, ...origin }, 'Automation tick complete\\n');
151
+ return 0;
152
+ }
153
+ let inFlight = null;
154
+ const startTick = () => { if (inFlight)
155
+ return; inFlight = tick().catch(() => undefined).finally(() => { inFlight = null; }); };
156
+ const timer = setInterval(startTick, 30_000);
157
+ writeValue(ctx, { ok: true, running: true, ...origin }, 'TALOS automation runner active; Ctrl+C to stop\\n');
158
+ await new Promise((resolve) => { const stop = () => { clearInterval(timer); process.off('SIGINT', stop); process.off('SIGTERM', stop); resolve(); }; process.once('SIGINT', stop); process.once('SIGTERM', stop); });
159
+ return 0;
160
+ }
161
+ const id = need(args.shift(), 'AUTOMATION_ID');
162
+ if (op === 'schedule') {
163
+ const at = need(takeOption(args, '--at'), 'AUTOMATION_TIME');
164
+ const timezone = need(takeOption(args, '--timezone'), 'AUTOMATION_TIMEZONE');
165
+ const missed = need(takeOption(args, '--missed'), 'AUTOMATION_MISSED_POLICY');
166
+ if (missed !== 'skip' && missed !== 'latest')
167
+ throw new Error('AUTOMATION_MISSED_POLICY_INVALID');
168
+ const grace = int(takeOption(args, '--grace-minutes') ?? '5', 'AUTOMATION_GRACE', 0);
169
+ const catchup = int(takeOption(args, '--catchup-minutes') ?? (missed === 'latest' ? '180' : '0'), 'AUTOMATION_CATCHUP', 0);
170
+ const base = int(takeOption(args, '--backoff-base-seconds') ?? '30', 'AUTOMATION_BACKOFF_BASE');
171
+ const max = int(takeOption(args, '--backoff-max-seconds') ?? '900', 'AUTOMATION_BACKOFF_MAX');
172
+ assertNoUnknownOptions(args);
173
+ if (max < base)
174
+ throw new Error('AUTOMATION_BACKOFF_INVALID');
175
+ const result = await facade.configureDaily(id, { at, timezone, missed, graceMinutes: grace, catchupWindowMinutes: catchup, baseSeconds: base, maxSeconds: max });
176
+ writeValue(ctx, result);
177
+ return 0;
178
+ }
179
+ if (op === 'dry-run') {
180
+ assertNoUnknownOptions(args);
181
+ writeValue(ctx, await facade.dryRun(id));
182
+ return 0;
183
+ }
184
+ if (op === 'history') {
185
+ assertNoUnknownOptions(args);
186
+ writeValue(ctx, await facade.history(id));
187
+ return 0;
188
+ }
189
+ if (op === 'enable' || op === 'disable') {
190
+ assertNoUnknownOptions(args);
191
+ writeValue(ctx, await facade.setEnabled(id, op === 'enable'));
192
+ return 0;
193
+ }
194
+ if (op === 'delete') {
195
+ assertNoUnknownOptions(args);
196
+ await store.elimina(id);
197
+ await Promise.all([policyStore.delete(id), historyStore.delete(id)]);
198
+ writeValue(ctx, { ok: true, id }, 'Deleted automation ' + id + '\\n');
199
+ return 0;
200
+ }
201
+ if (op === 'run') {
202
+ assertNoUnknownOptions(args);
203
+ const row = await store.leggi(id);
204
+ if (!row)
205
+ throw new Error('AUTOMATION_NOT_FOUND');
206
+ const model = ctx.invocation.model ?? 'openai:gpt-5-mini';
207
+ const rc = await ctx.createRuntimeContext({ projectRoot: ctx.projectRoot, paths: ctx.paths, repoRoot: ctx.repoRoot, model, environmentKeys: 'use' });
208
+ const origin = stateKeyOrigin(ctx.io, ctx.invocation.outputFormat, keyOriginForEntry(rc.runtime, model, { refuseMissing: false }));
209
+ await rc.registry.ripristina?.();
210
+ const attemptedAt = new Date().toISOString();
211
+ try {
212
+ let result;
213
+ if (typeof rc.registry.avvia === 'function')
214
+ result = await rc.registry.avvia(row.taskId, {}, { kind: 'talos-cli-automation-manual' });
215
+ else
216
+ result = await rc.runtime.start({ projectRoot: ctx.projectRoot, prompt: 'Run TALOS task ' + row.taskId, model, permissionMode: 'dontAsk' });
217
+ if (result?.erroreAvvio)
218
+ throw Object.assign(new Error(result.erroreAvvio), { code: result.code });
219
+ const sessionId = typeof result === 'string' ? result : result?.sessionId;
220
+ if (!sessionId)
221
+ throw Object.assign(new Error('AUTOMATION_SESSION_ID_MISSING'), { code: 'AUTOMATION_SESSION_ID_MISSING' });
222
+ await store.registraEsecuzione(id);
223
+ await historyStore.append(id, { attemptedAt, scheduledAt: null, slotKey: null, outcome: 'dispatch-started', sessionId, errorCode: null, errorMessage: null, nextRetryAt: null });
224
+ writeValue(ctx, { ok: true, id, sessionId, ...origin }, sessionId + '\\n');
225
+ return 0;
226
+ }
227
+ catch (error) {
228
+ await historyStore.append(id, { attemptedAt, scheduledAt: null, slotKey: null, outcome: 'dispatch-failed', sessionId: null, errorCode: typeof error?.code === 'string' ? error.code : 'AUTOMATION_DISPATCH_FAILED', errorMessage: error instanceof Error ? error.message : String(error), nextRetryAt: null });
229
+ throw error;
230
+ }
231
+ }
232
+ throw new Error('Unsupported automation operation: ' + op);
233
+ }
@@ -0,0 +1,45 @@
1
+ import { join } from 'node:path';
2
+ import { hasActiveRuns } from "../runtime/active-run.js";
3
+ import { checkpointFilesText } from "../tui/overlays/checkpoint-picker.js";
4
+ import { checkpointChanges, createCheckpointStore } from "../workspace/checkpoint-store.js";
5
+ import { redoCheckpoint, undoCheckpoint } from "../workspace/restore.js";
6
+ import { assertNoUnknownOptions, writeValue } from "./context.js";
7
+ function usage() { throw Object.assign(new Error('Usage: talos checkpoint <list|show|undo|redo> [checkpoint-id]'), { code: 'CLI_USAGE_ERROR' }); }
8
+ function summary(record) { return { id: record.id, operation: record.operation, sessionId: record.sessionId, commandId: record.commandId, state: record.state, createdAt: record.createdAt, finalizedAt: record.finalizedAt, reversible: record.reversible, nonReversibleReason: record.nonReversibleReason, coverage: record.pre.coverage, exclusions: record.pre.exclusions, writeEvidenceCount: record.writeEvidence.length, files: checkpointChanges(record) }; }
9
+ /* R5b D3 (Q-R5-13): the files each checkpoint changed, under its line (gate finding 10: the list named no file). */
10
+ export function checkpointFilesLine(record) { return checkpointFilesText(checkpointChanges(record)); }
11
+ function humanSummary(record) { return `${record.id} ${record.state} ${record.operation} ${record.createdAt}${record.reversible ? '' : ` non-reversible:${record.nonReversibleReason ?? 'unknown'}`}\n ${checkpointFilesLine(record)}\n`; }
12
+ export async function runCheckpointCommand(ctx, argv) {
13
+ const args = [...argv];
14
+ assertNoUnknownOptions(args);
15
+ const action = args.shift();
16
+ if (!action)
17
+ usage();
18
+ const store = createCheckpointStore({ rootDir: ctx.paths.checkpointsRoot ?? join(ctx.paths.dataRoot, 'checkpoints'), projectRoot: ctx.projectRoot });
19
+ if (action === 'list') {
20
+ if (args.length)
21
+ usage();
22
+ const rows = await store.list();
23
+ writeValue(ctx, rows.map(summary), rows.length ? rows.map(humanSummary).join('') : 'No checkpoints.\n');
24
+ return 0;
25
+ }
26
+ if (action === 'show') {
27
+ const id = args.shift();
28
+ if (!id || args.length)
29
+ usage();
30
+ const record = await store.show(id);
31
+ writeValue(ctx, record, `${humanSummary(record)}Coverage: ${JSON.stringify(record.pre.coverage)}\nExclusions: ${record.pre.exclusions.join(' | ') || 'none'}\n`);
32
+ return 0;
33
+ }
34
+ if (action === 'undo' || action === 'redo') {
35
+ const id = args.shift();
36
+ if (args.length)
37
+ usage();
38
+ if (await hasActiveRuns(ctx.paths))
39
+ throw Object.assign(new Error('CHECKPOINT_ACTIVE_RUN_CONFLICT'), { code: 'CHECKPOINT_ACTIVE_RUN_CONFLICT' });
40
+ const record = action === 'undo' ? await undoCheckpoint({ store, ...(id ? { id } : {}) }) : await redoCheckpoint({ store, ...(id ? { id } : {}) });
41
+ writeValue(ctx, record, `${action} ${record.id}: ${record.state}\n`);
42
+ return 0;
43
+ }
44
+ usage();
45
+ }
@@ -0,0 +1,107 @@
1
+ import { loadEffectiveConfig, migrateConfigScope, readConfigScope, rollbackConfigMigration } from "../config/load.js";
2
+ import { configGet, configOrigins, configSet, configUnset } from "../config/commands.js";
3
+ import { formatPermissionSimulation, simulatePermission } from "../security/permission-explanation.js";
4
+ import { assertNoUnknownOptions, parseJsonValue, takeOption, writeValue } from "./context.js";
5
+ function scope(args) { const s = takeOption(args, '--scope') ?? 'user'; if (!['user', 'project', 'project-user'].includes(s))
6
+ throw new Error('CONFIG_SCOPE_INVALID'); return s; }
7
+ function keymapPath(path) { return path === 'ui.keymap' || path.startsWith('ui.keymap.'); }
8
+ function valueContainsKeymap(path, value) { return keymapPath(path) || (path === 'ui' && !!value && typeof value === 'object' && !Array.isArray(value) && Object.hasOwn(value, 'keymap')); }
9
+ const PERMISSION_TOOLS = new Set(['Read', 'Write', 'Edit', 'Bash', 'WebFetch', 'Mcp', 'Hook', 'Plugin', 'TalosService']);
10
+ function permissionDryRunAction(args) {
11
+ const toolRaw = takeOption(args, '--tool');
12
+ if (!toolRaw || !PERMISSION_TOOLS.has(toolRaw))
13
+ throw new Error('PERMISSION_DRY_RUN_TOOL_INVALID');
14
+ const tool = toolRaw;
15
+ const command = takeOption(args, '--command'), resource = takeOption(args, '--resource'), serverId = takeOption(args, '--server-id'), operation = takeOption(args, '--operation');
16
+ assertNoUnknownOptions(args);
17
+ if (args.length)
18
+ throw new Error(`Unexpected argument: ${args[0]}`);
19
+ if (tool === 'Bash' && !command)
20
+ throw new Error('PERMISSION_DRY_RUN_COMMAND_REQUIRED');
21
+ if (['Read', 'Write', 'Edit'].includes(tool) && !resource)
22
+ throw new Error('PERMISSION_DRY_RUN_RESOURCE_REQUIRED');
23
+ if (tool === 'Mcp' && !serverId)
24
+ throw new Error('PERMISSION_DRY_RUN_SERVER_REQUIRED');
25
+ if (tool !== 'Bash' && !resource && !serverId && !operation)
26
+ throw new Error('PERMISSION_DRY_RUN_TARGET_REQUIRED');
27
+ return { tool, ...(command ? { command } : {}), ...(resource ? { resource } : {}), ...(serverId ? { serverId } : {}), ...(operation ? { operation } : {}) };
28
+ }
29
+ export async function runConfigCommand(ctx, args0) {
30
+ const args = [...args0];
31
+ const op = args.shift() ?? 'list';
32
+ if (op === 'permissions') {
33
+ const sub = args.shift();
34
+ if (sub !== 'dry-run')
35
+ throw new Error('CONFIG_PERMISSIONS_OPERATION_INVALID');
36
+ const action = permissionDryRunAction(args);
37
+ const effective = await loadEffectiveConfig({ paths: ctx.paths, projectRoot: ctx.projectRoot });
38
+ const rules = (effective.value.permissions ?? { allow: [], ask: [], deny: [] });
39
+ const result = simulatePermission({ rules, action, projectRoot: ctx.projectRoot });
40
+ writeValue(ctx, result, formatPermissionSimulation(result));
41
+ return 0;
42
+ }
43
+ if (op === 'list') {
44
+ const e = await loadEffectiveConfig({ paths: ctx.paths, projectRoot: ctx.projectRoot });
45
+ writeValue(ctx, e.value);
46
+ return 0;
47
+ }
48
+ if (op === 'origins') {
49
+ const e = await loadEffectiveConfig({ paths: ctx.paths, projectRoot: ctx.projectRoot });
50
+ writeValue(ctx, configOrigins(e));
51
+ return 0;
52
+ }
53
+ if (op === 'get') {
54
+ const path = args.shift();
55
+ if (!path)
56
+ throw new Error('CONFIG_PATH_REQUIRED');
57
+ assertNoUnknownOptions(args);
58
+ const e = await loadEffectiveConfig({ paths: ctx.paths, projectRoot: ctx.projectRoot });
59
+ writeValue(ctx, configGet(e.value, path));
60
+ return 0;
61
+ }
62
+ if (op === 'set') {
63
+ const path = args.shift(), raw = args.shift();
64
+ if (!path || raw === undefined)
65
+ throw new Error('CONFIG_SET_REQUIRES_PATH_VALUE');
66
+ const sc = scope(args);
67
+ assertNoUnknownOptions(args);
68
+ const value = parseJsonValue(raw);
69
+ if (sc === 'project' && valueContainsKeymap(path, value))
70
+ throw new Error('CONFIG_KEYMAP_SCOPE_INVALID');
71
+ await configSet({ paths: ctx.paths, projectRoot: ctx.projectRoot, scope: sc, path, value });
72
+ writeValue(ctx, { ok: true, scope: sc, path }, `Set ${path} (${sc})\n`);
73
+ return 0;
74
+ }
75
+ if (op === 'unset') {
76
+ const path = args.shift();
77
+ if (!path)
78
+ throw new Error('CONFIG_PATH_REQUIRED');
79
+ const sc = scope(args);
80
+ assertNoUnknownOptions(args);
81
+ if (sc === 'project' && keymapPath(path))
82
+ throw new Error('CONFIG_KEYMAP_SCOPE_INVALID');
83
+ await configUnset({ paths: ctx.paths, projectRoot: ctx.projectRoot, scope: sc, path });
84
+ writeValue(ctx, { ok: true, scope: sc, path }, `Unset ${path} (${sc})\n`);
85
+ return 0;
86
+ }
87
+ if (op === 'show') {
88
+ const user = await readConfigScope({ paths: ctx.paths, projectRoot: ctx.projectRoot, scope: 'user' });
89
+ writeValue(ctx, user);
90
+ return 0;
91
+ }
92
+ if (op === 'migrate') {
93
+ const sc = scope(args);
94
+ assertNoUnknownOptions(args);
95
+ const result = await migrateConfigScope({ paths: ctx.paths, projectRoot: ctx.projectRoot, scope: sc });
96
+ writeValue(ctx, result, `Migrated config ${sc}: ${result.fromVersion} -> ${result.toVersion}${result.changed ? '' : ' (already current)'}\n`);
97
+ return 0;
98
+ }
99
+ if (op === 'rollback') {
100
+ const sc = scope(args);
101
+ assertNoUnknownOptions(args);
102
+ const result = await rollbackConfigMigration({ paths: ctx.paths, projectRoot: ctx.projectRoot, scope: sc });
103
+ writeValue(ctx, result, `Rolled back config ${sc}\n`);
104
+ return 0;
105
+ }
106
+ throw new Error(`Unsupported config operation: ${op}`);
107
+ }
@@ -0,0 +1,17 @@
1
+ export function writeValue(ctx, value, human) { if (ctx.invocation.outputFormat === 'json')
2
+ ctx.io.writeOut(`${JSON.stringify(value)}\n`);
3
+ else
4
+ ctx.io.writeOut(human ?? `${JSON.stringify(value, null, 2)}\n`); }
5
+ export function parseJsonValue(raw) { try {
6
+ return JSON.parse(raw);
7
+ }
8
+ catch {
9
+ throw new Error('CONFIG_VALUE_MUST_BE_JSON');
10
+ } }
11
+ export function takeOption(args, name) { const i = args.indexOf(name); if (i < 0)
12
+ return undefined; if (i === args.length - 1)
13
+ throw new Error(`${name} requires a value`); const value = args[i + 1]; args.splice(i, 2); return value; }
14
+ export function takeFlag(args, name) { const i = args.indexOf(name); if (i < 0)
15
+ return false; args.splice(i, 1); return true; }
16
+ export function assertNoUnknownOptions(args) { const bad = args.find(x => x.startsWith('-')); if (bad)
17
+ throw new Error(`Unknown option: ${bad}`); }