@lotagate/cli 0.1.21 → 0.1.22

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 (490) hide show
  1. package/dist/application/agent/agent-history.d.ts +3 -0
  2. package/dist/application/agent/agent-history.js +81 -0
  3. package/dist/application/agent/agent-input-context.d.ts +9 -0
  4. package/dist/application/agent/agent-input-context.js +12 -0
  5. package/dist/application/agent/agent-limit.d.ts +3 -0
  6. package/dist/application/agent/agent-limit.js +12 -0
  7. package/dist/application/agent/agent-run-tracker.d.ts +30 -0
  8. package/dist/application/agent/agent-run-tracker.js +68 -0
  9. package/dist/application/agent/agent-session-store.d.ts +19 -0
  10. package/dist/application/agent/agent-session-store.js +74 -0
  11. package/dist/application/agent/capability-profile.d.ts +37 -0
  12. package/dist/application/agent/capability-profile.js +13 -0
  13. package/dist/application/agent/cli-agent-execution-service.d.ts +81 -0
  14. package/dist/application/agent/cli-agent-execution-service.js +279 -0
  15. package/dist/application/agent/context-compaction-persistence.d.ts +8 -0
  16. package/dist/application/agent/context-compaction-persistence.js +27 -0
  17. package/dist/application/agent/context-compaction.d.ts +20 -0
  18. package/dist/application/agent/context-compaction.js +114 -0
  19. package/dist/application/agent/prompt-data-safety.d.ts +14 -0
  20. package/dist/application/agent/prompt-data-safety.js +38 -0
  21. package/dist/application/agent/safe-system-prompt.d.ts +3 -0
  22. package/dist/application/agent/safe-system-prompt.js +19 -0
  23. package/dist/application/agent/scoped-tool-executor.d.ts +13 -0
  24. package/dist/application/agent/scoped-tool-executor.js +32 -0
  25. package/dist/application/agent/system-prompt-builder.d.ts +14 -0
  26. package/dist/application/agent/system-prompt-builder.js +199 -0
  27. package/dist/application/agent/tool-catalog.d.ts +14 -0
  28. package/dist/application/agent/tool-catalog.js +30 -0
  29. package/dist/application/agent/tool-display.d.ts +6 -0
  30. package/dist/application/agent/tool-display.js +59 -0
  31. package/dist/application/agent/tool-hook-lifecycle.d.ts +19 -0
  32. package/dist/application/agent/tool-hook-lifecycle.js +85 -0
  33. package/dist/application/auth/authentication-service.d.ts +20 -0
  34. package/dist/application/auth/authentication-service.js +44 -0
  35. package/dist/application/chat/chat-service.d.ts +12 -0
  36. package/dist/application/chat/chat-service.js +19 -0
  37. package/dist/application/chat/pending-attachment-store.d.ts +12 -0
  38. package/dist/application/chat/pending-attachment-store.js +28 -0
  39. package/dist/application/commands/application-command-executor.d.ts +20 -0
  40. package/dist/application/commands/application-command-executor.js +66 -0
  41. package/dist/application/commands/cli-args.d.ts +6 -0
  42. package/dist/application/commands/cli-args.js +43 -0
  43. package/dist/application/commands/cli-command-services.d.ts +16 -0
  44. package/dist/application/commands/cli-command-services.js +405 -0
  45. package/dist/application/commands/command-catalog.d.ts +6 -0
  46. package/dist/application/commands/command-catalog.js +159 -0
  47. package/dist/application/commands/command-contract.d.ts +58 -0
  48. package/dist/application/commands/command-contract.js +1 -0
  49. package/dist/application/commands/command-hints.d.ts +9 -0
  50. package/dist/application/commands/command-hints.js +17 -0
  51. package/dist/application/commands/command-output.d.ts +4 -0
  52. package/dist/application/commands/command-output.js +1 -0
  53. package/dist/application/commands/command-parser.d.ts +10 -0
  54. package/dist/application/commands/command-parser.js +155 -0
  55. package/dist/application/commands/command-presentation.d.ts +7 -0
  56. package/dist/application/commands/command-presentation.js +131 -0
  57. package/dist/application/commands/command-registry.d.ts +11 -0
  58. package/dist/application/commands/command-registry.js +64 -0
  59. package/dist/application/commands/command-runtime.d.ts +2 -0
  60. package/dist/application/commands/command-runtime.js +3 -0
  61. package/dist/application/commands/goal-command-handlers.d.ts +3 -0
  62. package/dist/application/commands/goal-command-handlers.js +120 -0
  63. package/dist/application/commands/media-command-handlers.d.ts +9 -0
  64. package/dist/application/commands/media-command-handlers.js +307 -0
  65. package/dist/application/commands/media-command-output.d.ts +11 -0
  66. package/dist/application/commands/media-command-output.js +8 -0
  67. package/dist/application/commands/runtime-command-handlers.d.ts +7 -0
  68. package/dist/application/commands/runtime-command-handlers.js +177 -0
  69. package/dist/application/commands/stream-output.d.ts +4 -0
  70. package/dist/application/commands/stream-output.js +10 -0
  71. package/dist/application/commands/utility-commands.d.ts +6 -0
  72. package/dist/application/commands/utility-commands.js +81 -0
  73. package/dist/application/config/execution-config.d.ts +4 -0
  74. package/dist/application/config/execution-config.js +6 -0
  75. package/dist/application/extensions/extension-list-contract.d.ts +13 -0
  76. package/dist/application/extensions/extension-list-contract.js +1 -0
  77. package/dist/application/extensions/extension-list-formatters.d.ts +31 -0
  78. package/dist/application/extensions/extension-list-formatters.js +98 -0
  79. package/dist/application/extensions/extension-list-output.d.ts +3 -0
  80. package/dist/application/extensions/extension-list-output.js +7 -0
  81. package/dist/application/extensions/plugin-contribution-registry.d.ts +15 -0
  82. package/dist/application/extensions/plugin-contribution-registry.js +80 -0
  83. package/dist/application/extensions/skill-scope-store.d.ts +23 -0
  84. package/dist/application/extensions/skill-scope-store.js +33 -0
  85. package/dist/application/formatting/compact-number.d.ts +2 -0
  86. package/dist/application/formatting/compact-number.js +18 -0
  87. package/dist/application/formatting/compact-table.d.ts +22 -0
  88. package/dist/application/formatting/compact-table.js +49 -0
  89. package/dist/application/media/video-operation-poller.d.ts +5 -0
  90. package/dist/application/media/video-operation-poller.js +42 -0
  91. package/dist/application/model/cached-model-catalog.d.ts +13 -0
  92. package/dist/application/model/cached-model-catalog.js +31 -0
  93. package/dist/application/model/initial-model-selection.d.ts +10 -0
  94. package/dist/application/model/initial-model-selection.js +11 -0
  95. package/dist/application/model/model-catalog-service.d.ts +6 -0
  96. package/dist/application/model/model-catalog-service.js +13 -0
  97. package/dist/application/model/model-context-window.d.ts +3 -0
  98. package/dist/application/model/model-context-window.js +23 -0
  99. package/dist/application/orchestration/cli-subagent-service.d.ts +70 -0
  100. package/dist/application/orchestration/cli-subagent-service.js +328 -0
  101. package/dist/application/orchestration/cli-turn-event-projector.d.ts +12 -0
  102. package/dist/application/orchestration/cli-turn-event-projector.js +81 -0
  103. package/dist/application/orchestration/cli-turn-events.d.ts +76 -0
  104. package/dist/application/orchestration/cli-turn-events.js +39 -0
  105. package/dist/application/orchestration/cli-turn-persistence.d.ts +6 -0
  106. package/dist/application/orchestration/cli-turn-persistence.js +14 -0
  107. package/dist/application/orchestration/goal-evaluator.d.ts +18 -0
  108. package/dist/application/orchestration/goal-evaluator.js +88 -0
  109. package/dist/application/orchestration/goal-input.d.ts +3 -0
  110. package/dist/application/orchestration/goal-input.js +19 -0
  111. package/dist/application/orchestration/goal-output.d.ts +2 -0
  112. package/dist/application/orchestration/goal-output.js +11 -0
  113. package/dist/application/orchestration/goal-runner.d.ts +22 -0
  114. package/dist/application/orchestration/goal-runner.js +153 -0
  115. package/dist/application/orchestration/goal-usage.d.ts +9 -0
  116. package/dist/application/orchestration/goal-usage.js +19 -0
  117. package/dist/application/orchestration/headless-agent-turn.d.ts +32 -0
  118. package/dist/application/orchestration/headless-agent-turn.js +82 -0
  119. package/dist/application/orchestration/plan-generator.d.ts +7 -0
  120. package/dist/application/orchestration/plan-generator.js +34 -0
  121. package/dist/application/orchestration/subagent-coordinator.d.ts +33 -0
  122. package/dist/application/orchestration/subagent-coordinator.js +28 -0
  123. package/dist/application/orchestration/subagent-handoff.d.ts +2 -0
  124. package/dist/application/orchestration/subagent-handoff.js +68 -0
  125. package/dist/application/orchestration/subagent-tool-executor.d.ts +12 -0
  126. package/dist/application/orchestration/subagent-tool-executor.js +93 -0
  127. package/dist/application/orchestration/task-assessment.d.ts +4 -0
  128. package/dist/application/orchestration/task-assessment.js +35 -0
  129. package/dist/application/orchestration/task-graph.d.ts +13 -0
  130. package/dist/application/orchestration/task-graph.js +56 -0
  131. package/dist/application/orchestration/task-scheduler.d.ts +18 -0
  132. package/dist/application/orchestration/task-scheduler.js +88 -0
  133. package/dist/application/project/project-trust-service.d.ts +13 -0
  134. package/dist/application/project/project-trust-service.js +74 -0
  135. package/dist/application/protocol/browser-host-tool-executor.d.ts +41 -0
  136. package/dist/application/protocol/browser-host-tool-executor.js +88 -0
  137. package/dist/application/protocol/desktop-agent-command.d.ts +9 -0
  138. package/dist/application/protocol/desktop-agent-command.js +663 -0
  139. package/dist/application/protocol/desktop-attachment-store.d.ts +16 -0
  140. package/dist/application/protocol/desktop-attachment-store.js +82 -0
  141. package/dist/application/protocol/desktop-command-catalog.d.ts +2 -0
  142. package/dist/application/protocol/desktop-command-catalog.js +19 -0
  143. package/dist/application/protocol/desktop-command-contract.d.ts +22 -0
  144. package/dist/application/protocol/desktop-command-contract.js +3 -0
  145. package/dist/application/protocol/desktop-command-executor.d.ts +16 -0
  146. package/dist/application/protocol/desktop-command-executor.js +47 -0
  147. package/dist/application/protocol/desktop-command-output.d.ts +15 -0
  148. package/dist/application/protocol/desktop-command-output.js +24 -0
  149. package/dist/application/protocol/desktop-execution-policy.d.ts +17 -0
  150. package/dist/application/protocol/desktop-execution-policy.js +49 -0
  151. package/dist/application/protocol/desktop-host-tool-executor.d.ts +57 -0
  152. package/dist/application/protocol/desktop-host-tool-executor.js +53 -0
  153. package/dist/application/protocol/desktop-orchestration-events.d.ts +5 -0
  154. package/dist/application/protocol/desktop-orchestration-events.js +37 -0
  155. package/dist/application/protocol/json-line-writer.d.ts +9 -0
  156. package/dist/application/protocol/json-line-writer.js +19 -0
  157. package/dist/application/protocol/jsonl-agent-command.d.ts +3 -0
  158. package/dist/application/protocol/jsonl-agent-command.js +97 -0
  159. package/dist/application/protocol/jsonl-protocol.d.ts +52 -0
  160. package/dist/application/protocol/jsonl-protocol.js +170 -0
  161. package/dist/application/security/desktop-tool-scope-policy.d.ts +3 -0
  162. package/dist/application/security/desktop-tool-scope-policy.js +52 -0
  163. package/dist/application/security/tool-action-risk-analyzer.d.ts +13 -0
  164. package/dist/application/security/tool-action-risk-analyzer.js +64 -0
  165. package/dist/application/security/tool-approval-service.d.ts +35 -0
  166. package/dist/application/security/tool-approval-service.js +97 -0
  167. package/dist/application/security/tool-risk-classifier.d.ts +11 -0
  168. package/dist/application/security/tool-risk-classifier.js +65 -0
  169. package/dist/application/security/workspace-permission-policy.d.ts +10 -0
  170. package/dist/application/security/workspace-permission-policy.js +50 -0
  171. package/dist/application/session/project-session-access.d.ts +8 -0
  172. package/dist/application/session/project-session-access.js +19 -0
  173. package/dist/application/session/session-compaction-service.d.ts +10 -0
  174. package/dist/application/session/session-compaction-service.js +43 -0
  175. package/dist/application/session/session-turn-lifecycle.d.ts +5 -0
  176. package/dist/application/session/session-turn-lifecycle.js +31 -0
  177. package/dist/application/workspace/workspace-file-index.d.ts +15 -0
  178. package/dist/application/workspace/workspace-file-index.js +60 -0
  179. package/dist/application/workspace/workspace-file-reference-resolver.d.ts +14 -0
  180. package/dist/application/workspace/workspace-file-reference-resolver.js +123 -0
  181. package/dist/application/workspace/workspace-instruction-loader.d.ts +8 -0
  182. package/dist/application/workspace/workspace-instruction-loader.js +55 -0
  183. package/dist/bootstrap/composition-root.d.ts +6 -0
  184. package/dist/bootstrap/composition-root.js +4 -0
  185. package/dist/bootstrap/global-cli-options.d.ts +6 -0
  186. package/dist/bootstrap/global-cli-options.js +29 -0
  187. package/dist/bootstrap/native-devtools-stub.d.ts +10 -0
  188. package/dist/bootstrap/native-devtools-stub.js +10 -0
  189. package/dist/bootstrap/native-entry.d.ts +1 -0
  190. package/dist/bootstrap/native-entry.js +6 -0
  191. package/dist/bootstrap/native-tiktoken.d.ts +4 -0
  192. package/dist/bootstrap/native-tiktoken.js +5 -0
  193. package/dist/bootstrap/runtime-factory.d.ts +35 -0
  194. package/dist/bootstrap/runtime-factory.js +44 -0
  195. package/dist/bootstrap/shutdown-manager.d.ts +10 -0
  196. package/dist/bootstrap/shutdown-manager.js +14 -0
  197. package/dist/bootstrap/startup-sequence.d.ts +5 -0
  198. package/dist/bootstrap/startup-sequence.js +10 -0
  199. package/dist/domain/auth/auth-profile.d.ts +14 -0
  200. package/dist/domain/auth/auth-profile.js +39 -0
  201. package/dist/domain/config/config-schema.d.ts +17 -0
  202. package/dist/domain/config/config-schema.js +105 -0
  203. package/dist/domain/errors/cli-command-hint.d.ts +5 -0
  204. package/dist/domain/errors/cli-command-hint.js +1 -0
  205. package/dist/domain/errors/cli-error.d.ts +35 -0
  206. package/dist/domain/errors/cli-error.js +129 -0
  207. package/dist/domain/errors/error-codes.d.ts +46 -0
  208. package/dist/domain/errors/error-codes.js +45 -0
  209. package/dist/domain/extensions/extension-scope.d.ts +3 -0
  210. package/dist/domain/extensions/extension-scope.js +23 -0
  211. package/dist/domain/extensions/extension-state.d.ts +5 -0
  212. package/dist/domain/extensions/extension-state.js +11 -0
  213. package/dist/domain/extensions/hook-manifest.d.ts +10 -0
  214. package/dist/domain/extensions/hook-manifest.js +23 -0
  215. package/dist/domain/extensions/mcp-config.d.ts +18 -0
  216. package/dist/domain/extensions/mcp-config.js +111 -0
  217. package/dist/domain/extensions/plugin-manifest.d.ts +11 -0
  218. package/dist/domain/extensions/plugin-manifest.js +43 -0
  219. package/dist/domain/extensions/skill-manifest.d.ts +10 -0
  220. package/dist/domain/extensions/skill-manifest.js +51 -0
  221. package/dist/domain/filesystem/file-change-diff.d.ts +21 -0
  222. package/dist/domain/filesystem/file-change-diff.js +60 -0
  223. package/dist/domain/media/gateway-media-contract.d.ts +23 -0
  224. package/dist/domain/media/gateway-media-contract.js +163 -0
  225. package/dist/domain/media/media-contract.d.ts +28 -0
  226. package/dist/domain/media/media-contract.js +1 -0
  227. package/dist/domain/media/media-execution-policy.d.ts +9 -0
  228. package/dist/domain/media/media-execution-policy.js +31 -0
  229. package/dist/domain/orchestration/goal.d.ts +58 -0
  230. package/dist/domain/orchestration/goal.js +113 -0
  231. package/dist/domain/orchestration/subagent-identity.d.ts +2 -0
  232. package/dist/domain/orchestration/subagent-identity.js +8 -0
  233. package/dist/domain/orchestration/subagent.d.ts +33 -0
  234. package/dist/domain/orchestration/subagent.js +1 -0
  235. package/dist/domain/orchestration/task.d.ts +31 -0
  236. package/dist/domain/orchestration/task.js +1 -0
  237. package/dist/domain/project/project-identity.d.ts +6 -0
  238. package/dist/domain/project/project-identity.js +4 -0
  239. package/dist/domain/runtime/assistant-delta-normalizer.d.ts +11 -0
  240. package/dist/domain/runtime/assistant-delta-normalizer.js +19 -0
  241. package/dist/domain/runtime/resource-limits.d.ts +60 -0
  242. package/dist/domain/runtime/resource-limits.js +60 -0
  243. package/dist/domain/session/attachment.d.ts +13 -0
  244. package/dist/domain/session/attachment.js +1 -0
  245. package/dist/domain/session/session-schema.d.ts +6 -0
  246. package/dist/domain/session/session-schema.js +28 -0
  247. package/dist/domain/session/session.d.ts +27 -0
  248. package/dist/domain/session/session.js +1 -0
  249. package/dist/domain/settings/settings-document.d.ts +8 -0
  250. package/dist/domain/settings/settings-document.js +36 -0
  251. package/dist/domain/validation/record-schema.d.ts +4 -0
  252. package/dist/domain/validation/record-schema.js +9 -0
  253. package/dist/domain/workspace/workspace-settings.d.ts +12 -0
  254. package/dist/domain/workspace/workspace-settings.js +44 -0
  255. package/dist/infrastructure/agent-sdk/agent-instance-factory.d.ts +22 -0
  256. package/dist/infrastructure/agent-sdk/agent-instance-factory.js +31 -0
  257. package/dist/infrastructure/agent-sdk/tool-calling-model-client.d.ts +11 -0
  258. package/dist/infrastructure/agent-sdk/tool-calling-model-client.js +447 -0
  259. package/dist/infrastructure/cache/cache-policy.d.ts +7 -0
  260. package/dist/infrastructure/cache/cache-policy.js +18 -0
  261. package/dist/infrastructure/cache/file-cache-store.d.ts +17 -0
  262. package/dist/infrastructure/cache/file-cache-store.js +121 -0
  263. package/dist/infrastructure/clipboard/clipboard-adapter-factory.d.ts +11 -0
  264. package/dist/infrastructure/clipboard/clipboard-adapter-factory.js +98 -0
  265. package/dist/infrastructure/clipboard/clipboard-policy.d.ts +8 -0
  266. package/dist/infrastructure/clipboard/clipboard-policy.js +19 -0
  267. package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.d.ts +10 -0
  268. package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.js +94 -0
  269. package/dist/infrastructure/clipboard/image-normalizer.d.ts +12 -0
  270. package/dist/infrastructure/clipboard/image-normalizer.js +78 -0
  271. package/dist/infrastructure/clipboard/windows-clipboard-adapter.d.ts +7 -0
  272. package/dist/infrastructure/clipboard/windows-clipboard-adapter.js +66 -0
  273. package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.d.ts +7 -0
  274. package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.js +70 -0
  275. package/dist/infrastructure/config/config-loader.d.ts +19 -0
  276. package/dist/infrastructure/config/config-loader.js +76 -0
  277. package/dist/infrastructure/config/environment-values.d.ts +2 -0
  278. package/dist/infrastructure/config/environment-values.js +7 -0
  279. package/dist/infrastructure/credentials/composite-credential-store.d.ts +11 -0
  280. package/dist/infrastructure/credentials/composite-credential-store.js +32 -0
  281. package/dist/infrastructure/credentials/encrypted-file-credential-store.d.ts +17 -0
  282. package/dist/infrastructure/credentials/encrypted-file-credential-store.js +181 -0
  283. package/dist/infrastructure/credentials/environment-credential-store.d.ts +11 -0
  284. package/dist/infrastructure/credentials/environment-credential-store.js +37 -0
  285. package/dist/infrastructure/credentials/secret-input.d.ts +7 -0
  286. package/dist/infrastructure/credentials/secret-input.js +44 -0
  287. package/dist/infrastructure/extensions/composite-mcp-config-store.d.ts +9 -0
  288. package/dist/infrastructure/extensions/composite-mcp-config-store.js +10 -0
  289. package/dist/infrastructure/extensions/extension-directory-reader.d.ts +2 -0
  290. package/dist/infrastructure/extensions/extension-directory-reader.js +15 -0
  291. package/dist/infrastructure/extensions/extension-source-resolver.d.ts +6 -0
  292. package/dist/infrastructure/extensions/extension-source-resolver.js +126 -0
  293. package/dist/infrastructure/extensions/file-mcp-config-store.d.ts +15 -0
  294. package/dist/infrastructure/extensions/file-mcp-config-store.js +66 -0
  295. package/dist/infrastructure/extensions/hook-runtime.d.ts +18 -0
  296. package/dist/infrastructure/extensions/hook-runtime.js +66 -0
  297. package/dist/infrastructure/extensions/mcp-runtime.d.ts +12 -0
  298. package/dist/infrastructure/extensions/mcp-runtime.js +52 -0
  299. package/dist/infrastructure/extensions/plugin-discovery.d.ts +5 -0
  300. package/dist/infrastructure/extensions/plugin-discovery.js +52 -0
  301. package/dist/infrastructure/extensions/plugin-manager.d.ts +26 -0
  302. package/dist/infrastructure/extensions/plugin-manager.js +139 -0
  303. package/dist/infrastructure/extensions/skill-discovery.d.ts +4 -0
  304. package/dist/infrastructure/extensions/skill-discovery.js +29 -0
  305. package/dist/infrastructure/extensions/skill-installer.d.ts +8 -0
  306. package/dist/infrastructure/extensions/skill-installer.js +88 -0
  307. package/dist/infrastructure/extensions/skill-manager.d.ts +22 -0
  308. package/dist/infrastructure/extensions/skill-manager.js +67 -0
  309. package/dist/infrastructure/extensions/skill-roots.d.ts +19 -0
  310. package/dist/infrastructure/extensions/skill-roots.js +25 -0
  311. package/dist/infrastructure/extensions/skill-tool-executor.d.ts +18 -0
  312. package/dist/infrastructure/extensions/skill-tool-executor.js +53 -0
  313. package/dist/infrastructure/filesystem/atomic-file-store.d.ts +12 -0
  314. package/dist/infrastructure/filesystem/atomic-file-store.js +106 -0
  315. package/dist/infrastructure/filesystem/bounded-file-reader.d.ts +6 -0
  316. package/dist/infrastructure/filesystem/bounded-file-reader.js +24 -0
  317. package/dist/infrastructure/filesystem/bounded-json-reader.d.ts +1 -0
  318. package/dist/infrastructure/filesystem/bounded-json-reader.js +7 -0
  319. package/dist/infrastructure/filesystem/fs-errors.d.ts +2 -0
  320. package/dist/infrastructure/filesystem/fs-errors.js +6 -0
  321. package/dist/infrastructure/filesystem/gateway-media-input-reader.d.ts +12 -0
  322. package/dist/infrastructure/filesystem/gateway-media-input-reader.js +49 -0
  323. package/dist/infrastructure/filesystem/local-filesystem-tool-executor.d.ts +21 -0
  324. package/dist/infrastructure/filesystem/local-filesystem-tool-executor.js +176 -0
  325. package/dist/infrastructure/filesystem/path-resolver.d.ts +20 -0
  326. package/dist/infrastructure/filesystem/path-resolver.js +119 -0
  327. package/dist/infrastructure/filesystem/workspace-media-artifact-store.d.ts +13 -0
  328. package/dist/infrastructure/filesystem/workspace-media-artifact-store.js +152 -0
  329. package/dist/infrastructure/logging/daily-rotating-file-writer.d.ts +20 -0
  330. package/dist/infrastructure/logging/daily-rotating-file-writer.js +75 -0
  331. package/dist/infrastructure/logging/log-redactor.d.ts +2 -0
  332. package/dist/infrastructure/logging/log-redactor.js +26 -0
  333. package/dist/infrastructure/logging/logging-policy.d.ts +6 -0
  334. package/dist/infrastructure/logging/logging-policy.js +6 -0
  335. package/dist/infrastructure/logging/structured-logger.d.ts +24 -0
  336. package/dist/infrastructure/logging/structured-logger.js +40 -0
  337. package/dist/infrastructure/network/safe-media-downloader.d.ts +23 -0
  338. package/dist/infrastructure/network/safe-media-downloader.js +239 -0
  339. package/dist/infrastructure/platform/host-platform.d.ts +14 -0
  340. package/dist/infrastructure/platform/host-platform.js +23 -0
  341. package/dist/infrastructure/platform/host-process.d.ts +17 -0
  342. package/dist/infrastructure/platform/host-process.js +116 -0
  343. package/dist/infrastructure/platform/platform-paths.d.ts +25 -0
  344. package/dist/infrastructure/platform/platform-paths.js +33 -0
  345. package/dist/infrastructure/project/file-project-trust-store.d.ts +12 -0
  346. package/dist/infrastructure/project/file-project-trust-store.js +59 -0
  347. package/dist/infrastructure/sdk/chat-completion-adapter.d.ts +8 -0
  348. package/dist/infrastructure/sdk/chat-completion-adapter.js +115 -0
  349. package/dist/infrastructure/sdk/lotagate-client-factory.d.ts +3 -0
  350. package/dist/infrastructure/sdk/lotagate-client-factory.js +8 -0
  351. package/dist/infrastructure/sdk/model-catalog-adapter.d.ts +19 -0
  352. package/dist/infrastructure/sdk/model-catalog-adapter.js +28 -0
  353. package/dist/infrastructure/sdk/sdk-media-gateway-client.d.ts +20 -0
  354. package/dist/infrastructure/sdk/sdk-media-gateway-client.js +97 -0
  355. package/dist/infrastructure/sessions/file-goal-store.d.ts +21 -0
  356. package/dist/infrastructure/sessions/file-goal-store.js +160 -0
  357. package/dist/infrastructure/sessions/file-session-store.d.ts +48 -0
  358. package/dist/infrastructure/sessions/file-session-store.js +525 -0
  359. package/dist/infrastructure/sessions/project-session-paths.d.ts +17 -0
  360. package/dist/infrastructure/sessions/project-session-paths.js +41 -0
  361. package/dist/infrastructure/sessions/session-index.d.ts +16 -0
  362. package/dist/infrastructure/sessions/session-index.js +84 -0
  363. package/dist/infrastructure/sessions/session-journal.d.ts +22 -0
  364. package/dist/infrastructure/sessions/session-journal.js +137 -0
  365. package/dist/infrastructure/sessions/subagent-journal-store.d.ts +28 -0
  366. package/dist/infrastructure/sessions/subagent-journal-store.js +30 -0
  367. package/dist/infrastructure/shell/shell-tool-executor.d.ts +17 -0
  368. package/dist/infrastructure/shell/shell-tool-executor.js +115 -0
  369. package/dist/infrastructure/tokens/tiktoken-token-estimator.d.ts +18 -0
  370. package/dist/infrastructure/tokens/tiktoken-token-estimator.js +48 -0
  371. package/dist/infrastructure/workspace/workspace-settings-store.d.ts +9 -0
  372. package/dist/infrastructure/workspace/workspace-settings-store.js +75 -0
  373. package/dist/main.d.ts +7 -0
  374. package/dist/main.js +66 -0
  375. package/dist/ports/cache-store.d.ts +10 -0
  376. package/dist/ports/cache-store.js +1 -0
  377. package/dist/ports/chat-model.d.ts +30 -0
  378. package/dist/ports/chat-model.js +1 -0
  379. package/dist/ports/clipboard-adapter.d.ts +7 -0
  380. package/dist/ports/clipboard-adapter.js +1 -0
  381. package/dist/ports/clipboard-text-adapter.d.ts +3 -0
  382. package/dist/ports/clipboard-text-adapter.js +1 -0
  383. package/dist/ports/credential-store.d.ts +7 -0
  384. package/dist/ports/credential-store.js +1 -0
  385. package/dist/ports/goal-store.d.ts +12 -0
  386. package/dist/ports/goal-store.js +1 -0
  387. package/dist/ports/logger.d.ts +8 -0
  388. package/dist/ports/logger.js +1 -0
  389. package/dist/ports/media-gateway-client.d.ts +54 -0
  390. package/dist/ports/media-gateway-client.js +1 -0
  391. package/dist/ports/model-diagnostics.d.ts +17 -0
  392. package/dist/ports/model-diagnostics.js +1 -0
  393. package/dist/ports/project-trust-store.d.ts +12 -0
  394. package/dist/ports/project-trust-store.js +1 -0
  395. package/dist/ports/session-store.d.ts +58 -0
  396. package/dist/ports/session-store.js +1 -0
  397. package/dist/ports/subagent-lifecycle.d.ts +31 -0
  398. package/dist/ports/subagent-lifecycle.js +1 -0
  399. package/dist/ports/tool-activity.d.ts +13 -0
  400. package/dist/ports/tool-activity.js +1 -0
  401. package/dist/presentation/themes/theme.d.ts +19 -0
  402. package/dist/presentation/themes/theme.js +8 -0
  403. package/dist/presentation/tui/agent-initialization-renderer.d.ts +4 -0
  404. package/dist/presentation/tui/agent-initialization-renderer.js +37 -0
  405. package/dist/presentation/tui/context-display.d.ts +21 -0
  406. package/dist/presentation/tui/context-display.js +33 -0
  407. package/dist/presentation/tui/formatters.d.ts +6 -0
  408. package/dist/presentation/tui/formatters.js +60 -0
  409. package/dist/presentation/tui/ink/choice-window.d.ts +5 -0
  410. package/dist/presentation/tui/ink/choice-window.js +5 -0
  411. package/dist/presentation/tui/ink/components/activity-entry.d.ts +6 -0
  412. package/dist/presentation/tui/ink/components/activity-entry.js +16 -0
  413. package/dist/presentation/tui/ink/components/activity-status.d.ts +10 -0
  414. package/dist/presentation/tui/ink/components/activity-status.js +21 -0
  415. package/dist/presentation/tui/ink/components/choice-modal.d.ts +11 -0
  416. package/dist/presentation/tui/ink/components/choice-modal.js +29 -0
  417. package/dist/presentation/tui/ink/components/composer.d.ts +40 -0
  418. package/dist/presentation/tui/ink/components/composer.js +271 -0
  419. package/dist/presentation/tui/ink/components/file-diff.d.ts +6 -0
  420. package/dist/presentation/tui/ink/components/file-diff.js +34 -0
  421. package/dist/presentation/tui/ink/components/modal.d.ts +8 -0
  422. package/dist/presentation/tui/ink/components/modal.js +110 -0
  423. package/dist/presentation/tui/ink/components/shimmer-text.d.ts +6 -0
  424. package/dist/presentation/tui/ink/components/shimmer-text.js +9 -0
  425. package/dist/presentation/tui/ink/components/subagent-activity.d.ts +11 -0
  426. package/dist/presentation/tui/ink/components/subagent-activity.js +61 -0
  427. package/dist/presentation/tui/ink/components/transcript.d.ts +39 -0
  428. package/dist/presentation/tui/ink/components/transcript.js +121 -0
  429. package/dist/presentation/tui/ink/components/welcome-panel.d.ts +6 -0
  430. package/dist/presentation/tui/ink/components/welcome-panel.js +20 -0
  431. package/dist/presentation/tui/ink/lotagate-tui.d.ts +6 -0
  432. package/dist/presentation/tui/ink/lotagate-tui.js +136 -0
  433. package/dist/presentation/tui/ink/markdown-inline-renderer.d.ts +4 -0
  434. package/dist/presentation/tui/ink/markdown-inline-renderer.js +20 -0
  435. package/dist/presentation/tui/ink/markdown-inline.d.ts +13 -0
  436. package/dist/presentation/tui/ink/markdown-inline.js +91 -0
  437. package/dist/presentation/tui/ink/markdown-message.d.ts +6 -0
  438. package/dist/presentation/tui/ink/markdown-message.js +66 -0
  439. package/dist/presentation/tui/ink/markdown-table.d.ts +16 -0
  440. package/dist/presentation/tui/ink/markdown-table.js +77 -0
  441. package/dist/presentation/tui/ink/tui-bridge.d.ts +195 -0
  442. package/dist/presentation/tui/ink/tui-bridge.js +289 -0
  443. package/dist/presentation/tui/terminal-capabilities.d.ts +15 -0
  444. package/dist/presentation/tui/terminal-capabilities.js +7 -0
  445. package/dist/presentation/tui/terminal-mouse.d.ts +5 -0
  446. package/dist/presentation/tui/terminal-mouse.js +19 -0
  447. package/dist/presentation/tui/terminal-screen.d.ts +10 -0
  448. package/dist/presentation/tui/terminal-screen.js +23 -0
  449. package/dist/presentation/tui/tui-agent-event-runner.d.ts +24 -0
  450. package/dist/presentation/tui/tui-agent-event-runner.js +69 -0
  451. package/dist/presentation/tui/tui-application-contract.d.ts +10 -0
  452. package/dist/presentation/tui/tui-application-contract.js +8 -0
  453. package/dist/presentation/tui/tui-application.d.ts +62 -0
  454. package/dist/presentation/tui/tui-application.js +675 -0
  455. package/dist/presentation/tui/tui-attachment-input.d.ts +2 -0
  456. package/dist/presentation/tui/tui-attachment-input.js +5 -0
  457. package/dist/presentation/tui/tui-clipboard-paste-handlers.d.ts +11 -0
  458. package/dist/presentation/tui/tui-clipboard-paste-handlers.js +25 -0
  459. package/dist/presentation/tui/tui-command-context.d.ts +3 -0
  460. package/dist/presentation/tui/tui-command-context.js +1 -0
  461. package/dist/presentation/tui/tui-command-executor.d.ts +38 -0
  462. package/dist/presentation/tui/tui-command-executor.js +214 -0
  463. package/dist/presentation/tui/tui-command-host-factory.d.ts +40 -0
  464. package/dist/presentation/tui/tui-command-host-factory.js +23 -0
  465. package/dist/presentation/tui/tui-context-compaction.d.ts +5 -0
  466. package/dist/presentation/tui/tui-context-compaction.js +22 -0
  467. package/dist/presentation/tui/tui-context-service.d.ts +34 -0
  468. package/dist/presentation/tui/tui-context-service.js +126 -0
  469. package/dist/presentation/tui/tui-file-suggestions.d.ts +3 -0
  470. package/dist/presentation/tui/tui-file-suggestions.js +8 -0
  471. package/dist/presentation/tui/tui-goal-controller.d.ts +14 -0
  472. package/dist/presentation/tui/tui-goal-controller.js +52 -0
  473. package/dist/presentation/tui/tui-initial-model.d.ts +3 -0
  474. package/dist/presentation/tui/tui-initial-model.js +28 -0
  475. package/dist/presentation/tui/tui-lifecycle-actions.d.ts +13 -0
  476. package/dist/presentation/tui/tui-lifecycle-actions.js +45 -0
  477. package/dist/presentation/tui/tui-manual-compaction.d.ts +18 -0
  478. package/dist/presentation/tui/tui-manual-compaction.js +31 -0
  479. package/dist/presentation/tui/tui-media-model-selection.d.ts +12 -0
  480. package/dist/presentation/tui/tui-media-model-selection.js +38 -0
  481. package/dist/presentation/tui/tui-prompt-dispatcher.d.ts +16 -0
  482. package/dist/presentation/tui/tui-prompt-dispatcher.js +38 -0
  483. package/dist/presentation/tui/tui-skill-controller.d.ts +11 -0
  484. package/dist/presentation/tui/tui-skill-controller.js +13 -0
  485. package/dist/presentation/tui/tui-tool-approval.d.ts +22 -0
  486. package/dist/presentation/tui/tui-tool-approval.js +73 -0
  487. package/dist/version.d.ts +1 -0
  488. package/dist/version.js +1 -0
  489. package/package.json +8 -7
  490. package/scripts/install-native.mjs +11 -11
@@ -0,0 +1,64 @@
1
+ import { CliError } from '../../domain/errors/cli-error.js';
2
+ import { CLI_ERROR_CODES } from '../../domain/errors/error-codes.js';
3
+ export class CommandRegistry {
4
+ actions;
5
+ byId = new Map();
6
+ constructor(actions) {
7
+ this.actions = actions;
8
+ for (const action of actions) {
9
+ if (action.path.length === 0)
10
+ throw new Error(`Command action ${action.id} has no path.`);
11
+ if (this.byId.has(action.id))
12
+ throw new Error(`Command action ${action.id} is already registered.`);
13
+ this.byId.set(action.id, action);
14
+ }
15
+ for (const surface of ['direct', 'tui'])
16
+ this.assertNoSurfaceCollisions(surface);
17
+ }
18
+ get(id) {
19
+ return this.byId.get(id);
20
+ }
21
+ list(surface, includeHidden = false) {
22
+ return this.actions
23
+ .filter((action) => action.surfaces.includes(surface) && (includeHidden || !action.hiddenFromHelp))
24
+ .sort(compareActionPath);
25
+ }
26
+ actionsForRoot(root, surface) {
27
+ const normalized = root.toLowerCase();
28
+ return this.actions.filter((action) => action.surfaces.includes(surface) && action.path[0] === normalized);
29
+ }
30
+ resolve(tokens, surface) {
31
+ const root = tokens[0]?.toLowerCase();
32
+ if (root === undefined)
33
+ throw invalidCommand('A command is required.');
34
+ const candidates = this.actionsForRoot(root, surface)
35
+ .filter((action) => pathMatches(action.path, tokens))
36
+ .sort((left, right) => right.path.length - left.path.length);
37
+ const action = candidates[0];
38
+ if (action !== undefined)
39
+ return action;
40
+ if (this.actionsForRoot(root, surface).length === 0)
41
+ throw invalidCommand(`Unknown command: ${root}.`);
42
+ throw invalidCommand(`Unsupported ${root} command.`);
43
+ }
44
+ assertNoSurfaceCollisions(surface) {
45
+ const seen = new Set();
46
+ for (const action of this.actions.filter((item) => item.surfaces.includes(surface))) {
47
+ const key = action.path.join(' ');
48
+ if (seen.has(key))
49
+ throw new Error(`Command path collision on ${surface}: ${key}.`);
50
+ seen.add(key);
51
+ }
52
+ }
53
+ }
54
+ function pathMatches(path, tokens) {
55
+ if (tokens.length < path.length)
56
+ return false;
57
+ return path.every((segment, index) => tokens[index]?.toLowerCase() === segment);
58
+ }
59
+ function compareActionPath(left, right) {
60
+ return left.path.join(' ').localeCompare(right.path.join(' '));
61
+ }
62
+ function invalidCommand(userMessage) {
63
+ return new CliError(CLI_ERROR_CODES.INVALID_ARGUMENT, userMessage, { category: 'arguments', userMessage });
64
+ }
@@ -0,0 +1,2 @@
1
+ import { CommandRegistry } from './command-registry.js';
2
+ export declare const COMMAND_REGISTRY: CommandRegistry;
@@ -0,0 +1,3 @@
1
+ import { COMMAND_ACTIONS } from './command-catalog.js';
2
+ import { CommandRegistry } from './command-registry.js';
3
+ export const COMMAND_REGISTRY = new CommandRegistry(COMMAND_ACTIONS);
@@ -0,0 +1,3 @@
1
+ import type { Writable } from 'node:stream';
2
+ import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
3
+ export declare function runGoalCommand(positionals: readonly string[], flags: ReadonlyMap<string, string | boolean>, runtime: CliRuntime, cwd: string, stdout: Writable): Promise<number>;
@@ -0,0 +1,120 @@
1
+ import { isFlagEnabled, requirePositional } from './cli-args.js';
2
+ import { ProjectSessionAccess } from '../session/project-session-access.js';
3
+ import { AuthenticationService } from '../auth/authentication-service.js';
4
+ import { loadExecutionConfig } from '../config/execution-config.js';
5
+ import { createLotaGateClient } from '../../infrastructure/sdk/lotagate-client-factory.js';
6
+ import { runHeadlessAgentTurn } from '../orchestration/headless-agent-turn.js';
7
+ import { runGoalLoop } from '../orchestration/goal-runner.js';
8
+ import { CliAgentSessionStore } from '../agent/agent-session-store.js';
9
+ import { formatGoalStatus } from '../orchestration/goal-output.js';
10
+ import { parseGoalInput } from '../orchestration/goal-input.js';
11
+ import { CliError } from '../../domain/errors/cli-error.js';
12
+ import { CLI_ERROR_CODES } from '../../domain/errors/error-codes.js';
13
+ import { MODEL_SELECT_HINT, TRUST_GRANT_HINT } from './command-hints.js';
14
+ import { createTurnId, recordTurnCompletion, recordTurnFailure, recordTurnStart } from '../session/session-turn-lifecycle.js';
15
+ export async function runGoalCommand(positionals, flags, runtime, cwd, stdout) {
16
+ const action = positionals[0] ?? 'status';
17
+ if (action === 'run')
18
+ return runGoalLoopCommand(positionals.slice(1).join(' ').trim(), flags, runtime, cwd, stdout);
19
+ const sessionId = requirePositional(positionals, 1, 'session id');
20
+ const identity = await runtime.projectTrust.inspect(cwd);
21
+ await new ProjectSessionAccess(runtime.sessionStore).require(sessionId, identity.fingerprint);
22
+ if (action === 'status')
23
+ return writeGoal(stdout, await runtime.goalStore.get(sessionId), isFlagEnabled(flags, 'json'));
24
+ if (action === 'set') {
25
+ const objective = requirePositional([positionals.slice(2).join(' ')], 0, 'goal objective');
26
+ const state = await runtime.goalStore.replace(sessionId, readInput(objective, flags));
27
+ return writeGoal(stdout, state, isFlagEnabled(flags, 'json'));
28
+ }
29
+ if (action === 'pause') {
30
+ const state = await runtime.goalStore.pause(sessionId);
31
+ return writeGoal(stdout, state, isFlagEnabled(flags, 'json'));
32
+ }
33
+ if (action === 'resume') {
34
+ const state = await runtime.goalStore.get(sessionId);
35
+ if (state === undefined)
36
+ throw new CliError(CLI_ERROR_CODES.GOAL_NOT_FOUND, 'Goal not found.', { category: 'goal', userMessage: 'Goal was not found.' });
37
+ return runGoalLoopCommand(state.objective, flags, runtime, cwd, stdout, sessionId);
38
+ }
39
+ if (action === 'clear') {
40
+ await runtime.goalStore.clear(sessionId);
41
+ stdout.write('Goal cleared.\n');
42
+ return 0;
43
+ }
44
+ throw new Error(`Unsupported goal action: ${action}`);
45
+ }
46
+ async function runGoalLoopCommand(objective, flags, runtime, cwd, stdout, existingSessionId) {
47
+ if (objective.length === 0)
48
+ throw new CliError(CLI_ERROR_CODES.MISSING_ARGUMENT, 'Missing goal objective.', { category: 'arguments', userMessage: 'A goal objective is required.' });
49
+ const identity = await runtime.projectTrust.inspect(cwd);
50
+ if (!await runtime.projectTrust.isTrusted(identity))
51
+ throw new CliError(CLI_ERROR_CODES.PROJECT_TRUST_REQUIRED, 'Project trust is required for goals.', { category: 'project', userMessage: 'Project is not trusted.', hint: TRUST_GRANT_HINT });
52
+ const loaded = await loadExecutionConfig(runtime, cwd);
53
+ if (loaded.config.model === null)
54
+ throw new CliError(CLI_ERROR_CODES.MODEL_NOT_FOUND, 'No model is selected.', { category: 'model', userMessage: 'No model is selected.', hint: MODEL_SELECT_HINT });
55
+ const model = loaded.config.model;
56
+ const profile = loaded.config.profile ?? AuthenticationService.defaultProfileName();
57
+ const credential = await runtime.auth.requireCredential(profile);
58
+ const session = existingSessionId === undefined
59
+ ? await runtime.sessionStore.create({ projectFingerprint: identity.fingerprint, cwd: identity.canonicalPath, model: loaded.config.model, profile, status: 'active' })
60
+ : await runtime.sessionStore.get(existingSessionId);
61
+ if (session === undefined)
62
+ throw new CliError(CLI_ERROR_CODES.SESSION_NOT_FOUND, 'Goal session not found.', { category: 'session', userMessage: 'Goal session was not found.' });
63
+ if (existingSessionId === undefined)
64
+ await runtime.goalStore.create(session.id, readInput(objective, flags));
65
+ else
66
+ await runtime.goalStore.resume(session.id);
67
+ const client = createLotaGateClient(credential.profile, credential.apiKey);
68
+ const agentSessionStore = new CliAgentSessionStore();
69
+ const abortController = new AbortController();
70
+ const onInterrupt = () => abortController.abort(new Error('Goal interrupted by user.'));
71
+ process.once('SIGINT', onInterrupt);
72
+ try {
73
+ const final = await runGoalLoop({
74
+ runtime, sessionId: session.id, objective, model, client, signal: abortController.signal,
75
+ runTurn: async (prompt, callbacks, signal) => {
76
+ const turnId = createTurnId();
77
+ await recordTurnStart(runtime.sessionStore, session.id, turnId, prompt);
78
+ try {
79
+ const state = await runtime.goalStore.get(session.id);
80
+ const response = await runHeadlessAgentTurn({
81
+ runtime, cwd, model, client, prompt, output: stdout, sessionId: session.id,
82
+ agentSessionStore, signal, turnId,
83
+ ...(state === undefined ? {} : { goal: { objective: state.objective, status: state.status, turns: state.turns, evaluatorRuns: state.evaluatorRuns, tokensUsed: state.usage.totalTokens, ...(state.tokenBudget === undefined ? {} : { tokenBudget: state.tokenBudget }), ...(state.maxTurns === undefined ? {} : { maxTurns: state.maxTurns }), ...(state.maxDurationMs === undefined ? {} : { maxDurationMs: state.maxDurationMs }), ...(state.lastError === undefined ? {} : { lastError: state.lastError }), ...(state.lastEvaluation === undefined ? {} : { lastEvaluation: state.lastEvaluation.reason }) } }),
84
+ onUsage: callbacks.onUsage, onSubagentUsage: callbacks.onUsage, onSnapshot: callbacks.onSnapshot,
85
+ });
86
+ stdout.write('\n');
87
+ await recordTurnCompletion(runtime.sessionStore, session.id, turnId, response);
88
+ return response;
89
+ }
90
+ catch (error) {
91
+ callbacks.onError(error);
92
+ await recordTurnFailure(runtime.sessionStore, session.id, turnId, error, false);
93
+ throw error;
94
+ }
95
+ },
96
+ });
97
+ await runtime.sessionStore.updateStatus(session.id, final?.status === 'completed' ? 'completed' : final?.status === 'paused' ? 'active' : 'failed');
98
+ stdout.write(`Goal session: ${session.id}\n`);
99
+ const safelyPaused = final?.status === 'paused' && final.lastError?.startsWith('Goal paused by safety limit:') === true;
100
+ return final?.status === 'completed' || safelyPaused ? 0 : 1;
101
+ }
102
+ finally {
103
+ process.off('SIGINT', onInterrupt);
104
+ }
105
+ }
106
+ function readInput(objective, flags) {
107
+ return parseGoalInput(objective, flags);
108
+ }
109
+ function writeGoal(stdout, state, json) {
110
+ if (json) {
111
+ stdout.write(`${JSON.stringify(state ?? null)}\n`);
112
+ return state === undefined ? 1 : 0;
113
+ }
114
+ if (state === undefined) {
115
+ stdout.write('No active goal.\n');
116
+ return 1;
117
+ }
118
+ stdout.write(`${formatGoalStatus(state)}\n`);
119
+ return 0;
120
+ }
@@ -0,0 +1,9 @@
1
+ import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
2
+ import type { CommandInvocation } from './command-contract.js';
3
+ import type { CommandOutput } from './command-output.js';
4
+ export interface CommandActivityObserver {
5
+ start(key: string, label: string): {
6
+ complete(isError: boolean): void;
7
+ };
8
+ }
9
+ export declare function runMediaCommand(invocation: CommandInvocation, runtime: CliRuntime, cwd: string, output: CommandOutput, activity?: CommandActivityObserver, suppliedSignal?: AbortSignal): Promise<number>;
@@ -0,0 +1,307 @@
1
+ import { AuthenticationService } from '../auth/authentication-service.js';
2
+ import { loadExecutionConfig } from '../config/execution-config.js';
3
+ import { waitForVideoOperation } from '../media/video-operation-poller.js';
4
+ import { loadModelCatalog } from '../model/model-catalog-service.js';
5
+ import { CliError } from '../../domain/errors/cli-error.js';
6
+ import { CLI_ERROR_CODES } from '../../domain/errors/error-codes.js';
7
+ import { SDK_BINARY_MEDIA_RESPONSE_BYTES, validateMediaCommandOptions, } from '../../domain/media/gateway-media-contract.js';
8
+ import { resolveMediaExecutionPolicy } from '../../domain/media/media-execution-policy.js';
9
+ import { readGatewayAudioInput, readGatewayImageEditInput } from '../../infrastructure/filesystem/gateway-media-input-reader.js';
10
+ import { WorkspaceMediaArtifactStore } from '../../infrastructure/filesystem/workspace-media-artifact-store.js';
11
+ import { normalizeImage } from '../../infrastructure/clipboard/image-normalizer.js';
12
+ import { downloadPublicMedia } from '../../infrastructure/network/safe-media-downloader.js';
13
+ import { createLotaGateClient } from '../../infrastructure/sdk/lotagate-client-factory.js';
14
+ import { SdkMediaGatewayClient } from '../../infrastructure/sdk/sdk-media-gateway-client.js';
15
+ import { MODEL_SELECT_HINT } from './command-hints.js';
16
+ import { writeMediaCommandResult } from './media-command-output.js';
17
+ import { getStringFlag, isFlagEnabled, requirePositional, requireStringFlag } from './cli-args.js';
18
+ export async function runMediaCommand(invocation, runtime, cwd, output, activity, suppliedSignal) {
19
+ validateMediaCommandOptions(invocation.action.id, invocation.positionals, invocation.options);
20
+ const ownAbort = suppliedSignal === undefined ? new AbortController() : undefined;
21
+ const signal = suppliedSignal ?? ownAbort.signal;
22
+ const onInterrupt = () => ownAbort?.abort(new Error('Media command interrupted.'));
23
+ if (ownAbort !== undefined)
24
+ process.once('SIGINT', onInterrupt);
25
+ const startedAt = Date.now();
26
+ try {
27
+ runtime.logger.info('Media command started.', { action: invocation.action.id });
28
+ const exitCode = await executeMediaCommand(invocation, runtime, cwd, output, activity, signal);
29
+ runtime.logger.info('Media command completed.', { action: invocation.action.id, exitCode, durationMs: Date.now() - startedAt });
30
+ return exitCode;
31
+ }
32
+ catch (error) {
33
+ const details = error instanceof CliError
34
+ ? { code: error.code, category: error.category, correlationId: error.correlationId }
35
+ : {};
36
+ runtime.logger.error('Media command failed.', { action: invocation.action.id, durationMs: Date.now() - startedAt, ...details });
37
+ throw error;
38
+ }
39
+ finally {
40
+ if (ownAbort !== undefined)
41
+ process.off('SIGINT', onInterrupt);
42
+ }
43
+ }
44
+ async function executeMediaCommand(invocation, runtime, cwd, output, activity, signal) {
45
+ const action = invocation.action.id;
46
+ if (action !== 'video.status')
47
+ await runtime.projectTrust.requireTrusted(await runtime.projectTrust.inspect(cwd));
48
+ const loaded = await loadExecutionConfig(runtime, cwd);
49
+ const profileName = loaded.config.profile ?? AuthenticationService.defaultProfileName();
50
+ const credential = await runtime.auth.requireCredential(profileName);
51
+ const client = new SdkMediaGatewayClient(createLotaGateClient(credential.profile, credential.apiKey));
52
+ const store = new WorkspaceMediaArtifactStore(cwd, runtime.logger);
53
+ const policy = resolveMediaExecutionPolicy();
54
+ if (action === 'video.status')
55
+ return showVideoStatus(requirePositional(invocation.positionals, 0, 'operation id'), client, runtime.logger, output, activity, signal);
56
+ if (action === 'video.download')
57
+ return downloadVideo(requirePositional(invocation.positionals, 0, 'operation id'), invocation.options, client, store, runtime.logger, output, activity, signal);
58
+ const model = await resolveModel(invocation.options, loaded.config.model, runtime, cwd);
59
+ if (action === 'image.generate')
60
+ return generateImage(invocation.positionals, invocation.options, model, client, store, policy.downloadTimeoutMs, output, activity, signal);
61
+ if (action === 'image.edit')
62
+ return editImage(invocation.positionals, invocation.options, model, client, store, cwd, policy.downloadTimeoutMs, output, activity, signal);
63
+ if (action === 'audio.speech')
64
+ return createSpeech(invocation.positionals, invocation.options, model, client, store, output, activity, signal);
65
+ if (action === 'audio.transcribe' || action === 'audio.translate')
66
+ return processAudio(action, invocation.options, model, client, store, cwd, output, activity, signal);
67
+ if (action === 'video.generate')
68
+ return createVideo(invocation.positionals, invocation.options, model, client, store, policy, runtime, output, activity, signal);
69
+ throw new Error(`Unsupported media command: ${action}`);
70
+ }
71
+ async function resolveModel(flags, selected, runtime, cwd) {
72
+ const model = getStringFlag(flags, 'model') ?? selected;
73
+ if (model === null || model === undefined)
74
+ throw new CliError(CLI_ERROR_CODES.MODEL_NOT_FOUND, 'No model is selected.', { category: 'model', userMessage: 'No model is selected.', hint: MODEL_SELECT_HINT });
75
+ const catalog = await loadModelCatalog(runtime, cwd);
76
+ if (!catalog.data.some((candidate) => candidate.id === model)) {
77
+ throw new CliError(CLI_ERROR_CODES.MODEL_NOT_FOUND, `Model is not available: ${model}`, { category: 'model', userMessage: `Model is not available: ${model}.`, hint: MODEL_SELECT_HINT });
78
+ }
79
+ return model;
80
+ }
81
+ async function generateImage(positionals, flags, model, client, store, downloadTimeoutMs, output, activity, signal) {
82
+ const prompt = requirePrompt(positionals, 'image');
83
+ const images = await withActivity(activity, 'image.generate', 'image generation', () => client.generateImage({ model, prompt, ...imageOptions(flags) }, { signal }));
84
+ const stored = await withActivity(activity, 'image.store', 'image download and save', () => storeImages(images, artifactRequest('image', prompt, requestedImageExtension(flags), flags), store, downloadTimeoutMs, signal));
85
+ const paths = stored.map((item) => item.path);
86
+ writeMediaCommandResult(output, { kind: 'media', mediaType: 'image', artifacts: paths.map((path) => ({ path })) }, formatStored('Generated image', paths));
87
+ return 0;
88
+ }
89
+ async function editImage(positionals, flags, model, client, store, cwd, downloadTimeoutMs, output, activity, signal) {
90
+ const prompt = requirePrompt(positionals, 'image edit');
91
+ const input = await readGatewayImageEditInput(requireStringFlag(flags, 'image'), getStringFlag(flags, 'mask'), cwd);
92
+ const result = await withActivity(activity, 'image.edit', 'image edit', () => client.editImage({
93
+ model,
94
+ prompt,
95
+ images: [...input.images],
96
+ ...(input.mask === undefined ? {} : { mask: input.mask }),
97
+ ...imageOptions(flags),
98
+ ...(getStringFlag(flags, 'input-fidelity') === undefined ? {} : { inputFidelity: getStringFlag(flags, 'input-fidelity') }),
99
+ }, { signal }));
100
+ const stored = await withActivity(activity, 'image.store', 'image download and save', () => storeImages(result, artifactRequest('image', prompt, requestedImageExtension(flags), flags), store, downloadTimeoutMs, signal));
101
+ const paths = stored.map((item) => item.path);
102
+ writeMediaCommandResult(output, { kind: 'media', mediaType: 'image', artifacts: paths.map((path) => ({ path })) }, formatStored('Generated image', paths));
103
+ return 0;
104
+ }
105
+ async function createSpeech(positionals, flags, model, client, store, output, activity, signal) {
106
+ const input = requirePrompt(positionals, 'speech');
107
+ const responseFormat = getStringFlag(flags, 'response-format');
108
+ const audio = await withActivity(activity, 'audio.speech', 'speech generation', () => client.createSpeech({
109
+ model,
110
+ input,
111
+ voice: requireStringFlag(flags, 'voice'),
112
+ ...(getStringFlag(flags, 'instructions') === undefined ? {} : { instructions: getStringFlag(flags, 'instructions') }),
113
+ ...(responseFormat === undefined ? {} : { responseFormat }),
114
+ ...(getNumberFlag(flags, 'speed') === undefined ? {} : { speed: getNumberFlag(flags, 'speed') }),
115
+ }, { signal }));
116
+ assertBinaryOutputSize(audio.bytes);
117
+ const extension = responseFormat ?? extensionFromContentType(audio.contentType, 'mp3');
118
+ const stored = await withActivity(activity, 'audio.store', 'speech save', () => store.writeMany(artifactRequest('speech', input, extension, flags), [audio.bytes]));
119
+ const paths = stored.map((item) => item.path);
120
+ writeMediaCommandResult(output, { kind: 'media', mediaType: 'audio', artifacts: paths.map((path) => ({ path })) }, formatStored('Generated speech', paths));
121
+ return 0;
122
+ }
123
+ async function processAudio(action, flags, model, client, store, cwd, output, activity, signal) {
124
+ const input = await readGatewayAudioInput(requireStringFlag(flags, 'file'), cwd);
125
+ const responseFormat = getStringFlag(flags, 'response-format') ?? 'json';
126
+ const payload = {
127
+ model,
128
+ file: input.bytes,
129
+ filename: input.filename,
130
+ responseFormat,
131
+ ...(getStringFlag(flags, 'prompt') === undefined ? {} : { prompt: getStringFlag(flags, 'prompt') }),
132
+ ...(getNumberFlag(flags, 'temperature') === undefined ? {} : { temperature: getNumberFlag(flags, 'temperature') }),
133
+ ...(action === 'audio.transcribe' && getStringFlag(flags, 'language') !== undefined ? { language: getStringFlag(flags, 'language') } : {}),
134
+ ...(action === 'audio.transcribe' ? optionalCsv(flags, 'timestamp-granularities', ['word', 'segment']) : {}),
135
+ ...(action === 'audio.transcribe' ? optionalCsv(flags, 'include') : {}),
136
+ };
137
+ const text = await withActivity(activity, action, action === 'audio.transcribe' ? 'audio transcription' : 'audio translation', () => (action === 'audio.transcribe' ? client.transcribe(payload, { signal }) : client.translate(payload, { signal })));
138
+ const kind = action === 'audio.transcribe' ? 'transcription' : 'translation';
139
+ const stored = await withActivity(activity, `${action}.store`, `${kind} save`, () => store.writeMany(artifactRequest(kind, input.sourceName, textExtension(responseFormat), flags), [Buffer.from(text, 'utf8')]));
140
+ if (isTextResponseFormat(responseFormat))
141
+ output.write(`${text}\nSaved ${kind}: ${stored[0].path}\n`);
142
+ else
143
+ output.write(formatStored(`${capitalize(kind)} result`, stored.map((item) => item.path)));
144
+ return 0;
145
+ }
146
+ async function createVideo(positionals, flags, model, client, store, policy, runtime, output, activity, signal) {
147
+ const prompt = requirePrompt(positionals, 'video');
148
+ const parameters = parseParameters(getStringFlag(flags, 'parameters'));
149
+ const operation = await withActivity(activity, 'video.create', 'video generation request', () => client.createVideo({ model, prompt, ...(parameters === undefined ? {} : { parameters }) }, { signal }));
150
+ if (operation.errorMessage !== undefined)
151
+ throw videoError(operation);
152
+ runtime.logger.info('Video generation accepted.', { operationId: operation.id, model });
153
+ output.write(`Video operation: ${operation.id}\n`);
154
+ if (isFlagEnabled(flags, 'no-wait'))
155
+ return 0;
156
+ const completed = operation.done ? operation : await withActivity(activity, `video.wait:${operation.id}`, 'video generation', () => waitForVideoOperation(client, operation.id, policy, signal));
157
+ if (completed.errorMessage !== undefined)
158
+ throw videoError(completed);
159
+ const binary = await withActivity(activity, `video.download:${operation.id}`, 'video download', () => client.downloadVideo(operation.id, { signal }));
160
+ assertBinaryOutputSize(binary.bytes);
161
+ const stored = await withActivity(activity, `video.store:${operation.id}`, 'video save', () => store.writeMany(artifactRequest('video', prompt, extensionFromContentType(binary.contentType, 'mp4'), flags), [binary.bytes]));
162
+ runtime.logger.info('Video artifact stored.', { operationId: operation.id, artifactCount: stored.length, artifactBytes: sumArtifactBytes(stored) });
163
+ const paths = stored.map((item) => item.path);
164
+ writeMediaCommandResult(output, { kind: 'media', mediaType: 'video', artifacts: paths.map((path) => ({ path })) }, formatStored('Generated video', paths));
165
+ return 0;
166
+ }
167
+ async function showVideoStatus(id, client, logger, output, activity, signal) {
168
+ const operation = await withActivity(activity, `video.status:${id}`, 'video status', () => client.getVideoOperation(id, { signal }), (result) => result.errorMessage !== undefined);
169
+ logger.info('Video status retrieved.', { operationId: operation.id, status: operation.errorMessage === undefined ? (operation.done ? 'completed' : 'pending') : 'failed' });
170
+ if (operation.errorMessage !== undefined) {
171
+ throw videoError(operation);
172
+ }
173
+ output.write(`Video operation ${operation.id}: ${operation.done ? 'COMPLETED' : 'PENDING'}\n`);
174
+ return 0;
175
+ }
176
+ async function downloadVideo(id, flags, client, store, logger, output, activity, signal) {
177
+ const binary = await withActivity(activity, `video.download:${id}`, 'video download', () => client.downloadVideo(id, { signal }));
178
+ assertBinaryOutputSize(binary.bytes);
179
+ const stored = await withActivity(activity, `video.store:${id}`, 'video save', () => store.writeMany(artifactRequest('video', id, extensionFromContentType(binary.contentType, 'mp4'), flags), [binary.bytes]));
180
+ logger.info('Video artifact downloaded.', { operationId: id, artifactCount: stored.length, artifactBytes: sumArtifactBytes(stored) });
181
+ const paths = stored.map((item) => item.path);
182
+ writeMediaCommandResult(output, { kind: 'media', mediaType: 'video', artifacts: paths.map((path) => ({ path })) }, formatStored('Downloaded video', paths));
183
+ return 0;
184
+ }
185
+ function imageOptions(flags) {
186
+ const quality = getStringFlag(flags, 'quality');
187
+ const background = getStringFlag(flags, 'background');
188
+ const outputFormat = getStringFlag(flags, 'output-format');
189
+ return {
190
+ ...(getIntegerFlag(flags, 'n') === undefined ? {} : { n: getIntegerFlag(flags, 'n') }),
191
+ ...(getStringFlag(flags, 'size') === undefined ? {} : { size: getStringFlag(flags, 'size') }),
192
+ ...(quality === undefined ? {} : { quality: quality }),
193
+ ...(background === undefined ? {} : { background: background }),
194
+ ...(outputFormat === undefined ? {} : { outputFormat: outputFormat }),
195
+ ...(getIntegerFlag(flags, 'output-compression') === undefined ? {} : { outputCompression: getIntegerFlag(flags, 'output-compression') }),
196
+ ...(getStringFlag(flags, 'moderation') === undefined ? {} : { moderation: getStringFlag(flags, 'moderation') }),
197
+ ...(getStringFlag(flags, 'user') === undefined ? {} : { user: getStringFlag(flags, 'user') }),
198
+ };
199
+ }
200
+ function artifactRequest(kind, source, extension, flags) {
201
+ const out = getStringFlag(flags, 'out');
202
+ const outDir = getStringFlag(flags, 'out-dir');
203
+ return { kind, source, extension, ...(out === undefined ? {} : { out }), ...(outDir === undefined ? {} : { outDir }), force: isFlagEnabled(flags, 'force') };
204
+ }
205
+ async function storeImages(images, request, store, downloadTimeoutMs, signal) {
206
+ const bytes = [];
207
+ let extension = request.extension;
208
+ for (const image of images) {
209
+ const normalized = image.base64 === undefined
210
+ ? await downloadGeneratedImage(image.url, downloadTimeoutMs, signal)
211
+ : decodeImage(image.base64);
212
+ bytes.push(normalized.bytes);
213
+ extension = imageExtension(normalized.mimeType, extension);
214
+ }
215
+ return store.writeMany({ ...request, extension }, bytes);
216
+ }
217
+ function decodeImage(value) {
218
+ if (!/^[A-Za-z0-9+/]*={0,2}$/u.test(value) || value.length % 4 !== 0)
219
+ throw mediaError('The provider returned invalid Base64 image data.');
220
+ const bytes = Buffer.from(value, 'base64');
221
+ assertBinaryOutputSize(bytes);
222
+ return normalizeImage(bytes, undefined, SDK_BINARY_MEDIA_RESPONSE_BYTES);
223
+ }
224
+ async function downloadGeneratedImage(value, timeoutMs, signal) {
225
+ const download = await downloadPublicMedia(value, { maxBytes: SDK_BINARY_MEDIA_RESPONSE_BYTES, timeoutMs, signal });
226
+ const normalized = normalizeImage(download.bytes, download.contentType, SDK_BINARY_MEDIA_RESPONSE_BYTES);
227
+ if (!['image/png', 'image/jpeg', 'image/webp'].includes(normalized.mimeType))
228
+ throw mediaError(`Unsupported generated image format: ${normalized.mimeType}.`);
229
+ return normalized;
230
+ }
231
+ function requirePrompt(positionals, label) {
232
+ const value = positionals.join(' ').trim();
233
+ if (value.length === 0)
234
+ throw mediaError(`A prompt is required for ${label}.`);
235
+ return value;
236
+ }
237
+ function getIntegerFlag(flags, name) {
238
+ const value = getStringFlag(flags, name);
239
+ if (value === undefined)
240
+ return undefined;
241
+ if (!/^\d+$/u.test(value) || !Number.isSafeInteger(Number(value)))
242
+ throw mediaError(`--${name} must be an integer.`);
243
+ return Number(value);
244
+ }
245
+ function getNumberFlag(flags, name) {
246
+ const value = getStringFlag(flags, name);
247
+ if (value === undefined)
248
+ return undefined;
249
+ const parsed = Number(value);
250
+ if (!Number.isFinite(parsed))
251
+ throw mediaError(`--${name} must be a finite number.`);
252
+ return parsed;
253
+ }
254
+ function optionalCsv(flags, name, allowed) {
255
+ const value = getStringFlag(flags, name);
256
+ if (value === undefined)
257
+ return {};
258
+ const values = value.split(',').map((item) => item.trim()).filter(Boolean);
259
+ if (values.length === 0 || (allowed !== undefined && values.some((item) => !allowed.includes(item))))
260
+ throw mediaError(`--${name} contains an unsupported value.`);
261
+ return name === 'timestamp-granularities' ? { timestampGranularities: values } : { include: values };
262
+ }
263
+ function parseParameters(raw) {
264
+ if (raw === undefined)
265
+ return undefined;
266
+ try {
267
+ const value = JSON.parse(raw);
268
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
269
+ throw new Error();
270
+ return value;
271
+ }
272
+ catch {
273
+ throw mediaError('--parameters must be a JSON object.');
274
+ }
275
+ }
276
+ function requestedImageExtension(flags) { return getStringFlag(flags, 'output-format') ?? 'png'; }
277
+ function imageExtension(mimeType, fallback) { return mimeType === 'image/jpeg' ? 'jpeg' : mimeType === 'image/webp' ? 'webp' : mimeType === 'image/png' ? 'png' : fallback; }
278
+ function extensionFromContentType(contentType, fallback) { const type = contentType?.toLowerCase(); if (type === 'audio/mpeg')
279
+ return 'mp3'; if (type === 'audio/ogg')
280
+ return 'opus'; if (type === 'audio/aac')
281
+ return 'aac'; if (type === 'audio/flac')
282
+ return 'flac'; if (type === 'audio/wav' || type === 'audio/x-wav')
283
+ return 'wav'; if (type === 'video/webm')
284
+ return 'webm'; if (type === 'video/quicktime')
285
+ return 'mov'; if (type === 'video/mp4')
286
+ return 'mp4'; return fallback; }
287
+ function textExtension(format) { return format === 'text' ? 'txt' : format === 'verbose_json' || format === 'diarized_json' ? 'json' : format; }
288
+ function isTextResponseFormat(format) { return format === 'text' || format === 'srt' || format === 'vtt'; }
289
+ function assertBinaryOutputSize(bytes) { if (bytes.byteLength === 0 || bytes.byteLength > SDK_BINARY_MEDIA_RESPONSE_BYTES)
290
+ throw mediaError('Generated media exceeds the supported binary output limit.'); }
291
+ function formatStored(label, paths) { return `${label}${paths.length === 1 ? '' : 's'} saved:\n${paths.map((item) => ` ${item}`).join('\n')}\n`; }
292
+ function capitalize(value) { return `${value[0]?.toUpperCase() ?? ''}${value.slice(1)}`; }
293
+ function sumArtifactBytes(artifacts) { return artifacts.reduce((total, artifact) => total + artifact.bytes, 0); }
294
+ function mediaError(userMessage) { return new CliError(CLI_ERROR_CODES.INVALID_ARGUMENT, userMessage, { category: 'media', userMessage }); }
295
+ function videoError(operation) { return new CliError('MEDIA_VIDEO_FAILED', `Video operation failed: ${operation.id}`, { category: 'media', userMessage: operation.errorMessage ?? `Video operation failed: ${operation.id}` }); }
296
+ async function withActivity(activity, key, label, operation, isFailure = () => false) {
297
+ const entry = activity?.start(key, label);
298
+ try {
299
+ const result = await operation();
300
+ entry?.complete(isFailure(result));
301
+ return result;
302
+ }
303
+ catch (error) {
304
+ entry?.complete(true);
305
+ throw error;
306
+ }
307
+ }
@@ -0,0 +1,11 @@
1
+ import type { CommandOutput } from './command-output.js';
2
+ export type MediaArtifactType = 'image' | 'audio' | 'video';
3
+ export interface MediaCommandResult {
4
+ readonly kind: 'media';
5
+ readonly mediaType: MediaArtifactType;
6
+ readonly artifacts: readonly {
7
+ readonly path: string;
8
+ }[];
9
+ }
10
+ /** Keeps normal CLI output text while exposing media metadata to Desktop protocol callers. */
11
+ export declare function writeMediaCommandResult(output: CommandOutput, result: MediaCommandResult, fallbackText: string): void;
@@ -0,0 +1,8 @@
1
+ /** Keeps normal CLI output text while exposing media metadata to Desktop protocol callers. */
2
+ export function writeMediaCommandResult(output, result, fallbackText) {
3
+ if (output.writeStructured === undefined) {
4
+ output.write(fallbackText);
5
+ return;
6
+ }
7
+ output.writeStructured(result, fallbackText);
8
+ }
@@ -0,0 +1,7 @@
1
+ import type { CommandOutput } from './command-output.js';
2
+ import type { createCompositionRoot } from '../../bootstrap/composition-root.js';
3
+ type CliRuntime = ReturnType<typeof createCompositionRoot>;
4
+ export declare function runSessionCommand(positionals: readonly string[], flags: ReadonlyMap<string, string | boolean>, runtime: CliRuntime, cwd: string, stdout: CommandOutput, resumeInteractive?: (sessionId: string) => Promise<number>): Promise<number>;
5
+ export declare function runChatCommand(positionals: readonly string[], runtime: CliRuntime, cwd: string, stdout: CommandOutput): Promise<number>;
6
+ export declare function runExecCommand(positionals: readonly string[], flags: ReadonlyMap<string, string | boolean>, runtime: CliRuntime, cwd: string, stdout: CommandOutput): Promise<number>;
7
+ export {};