@lotagate/cli 0.1.23 → 0.1.25

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 (607) hide show
  1. package/README.md +70 -3
  2. package/SECURITY.md +2 -0
  3. package/dist/application/agent/agent-history.d.ts +3 -0
  4. package/dist/application/agent/agent-history.js +5 -0
  5. package/dist/application/agent/agent-input-context.d.ts +12 -0
  6. package/dist/application/agent/agent-input-context.js +5 -0
  7. package/dist/application/agent/agent-limit.d.ts +3 -0
  8. package/dist/application/agent/agent-limit.js +1 -0
  9. package/dist/application/agent/agent-run-tracker.d.ts +30 -0
  10. package/dist/application/agent/agent-run-tracker.js +1 -0
  11. package/dist/application/agent/agent-runtime-context.d.ts +22 -0
  12. package/dist/application/agent/agent-runtime-context.js +1 -0
  13. package/dist/application/agent/agent-session-store.d.ts +19 -0
  14. package/dist/application/agent/agent-session-store.js +6 -0
  15. package/dist/application/agent/capability-profile.d.ts +55 -0
  16. package/dist/application/agent/capability-profile.js +1 -0
  17. package/dist/application/agent/cli-agent-execution-service.d.ts +110 -0
  18. package/dist/application/agent/cli-agent-execution-service.js +1 -0
  19. package/dist/application/agent/cli-agent-run-request.d.ts +12 -0
  20. package/dist/application/agent/cli-agent-run-request.js +0 -0
  21. package/dist/application/agent/context-compaction-persistence.d.ts +8 -0
  22. package/dist/application/agent/context-compaction-persistence.js +1 -0
  23. package/dist/application/agent/context-compaction.d.ts +21 -0
  24. package/dist/application/agent/context-compaction.js +7 -0
  25. package/dist/application/agent/interactive-agent-guidance.d.ts +5 -0
  26. package/dist/application/agent/interactive-agent-guidance.js +2 -0
  27. package/dist/application/agent/prompt-data-safety.d.ts +14 -0
  28. package/dist/application/agent/prompt-data-safety.js +4 -0
  29. package/dist/application/agent/scoped-tool-executor.d.ts +13 -0
  30. package/dist/application/agent/scoped-tool-executor.js +1 -0
  31. package/dist/application/agent/tool-catalog.d.ts +14 -0
  32. package/dist/application/agent/tool-catalog.js +1 -0
  33. package/dist/application/agent/tool-display.d.ts +7 -0
  34. package/dist/application/agent/tool-display.js +1 -0
  35. package/dist/application/agent/tool-hook-lifecycle.d.ts +19 -0
  36. package/dist/application/agent/tool-hook-lifecycle.js +1 -0
  37. package/dist/application/auth/authentication-service.d.ts +20 -0
  38. package/dist/application/auth/authentication-service.js +1 -0
  39. package/dist/application/chat/chat-service.d.ts +12 -0
  40. package/dist/application/chat/chat-service.js +1 -0
  41. package/dist/application/chat/pending-attachment-store.d.ts +12 -0
  42. package/dist/application/chat/pending-attachment-store.js +1 -0
  43. package/dist/application/commands/application-command-executor.d.ts +23 -0
  44. package/dist/application/commands/application-command-executor.js +3 -0
  45. package/dist/application/commands/cli-args.d.ts +6 -0
  46. package/dist/application/commands/cli-args.js +1 -0
  47. package/dist/application/commands/cli-command-services.d.ts +17 -0
  48. package/dist/application/commands/cli-command-services.js +33 -0
  49. package/dist/application/commands/command-cancellation.d.ts +6 -0
  50. package/dist/application/commands/command-cancellation.js +1 -0
  51. package/dist/application/commands/command-catalog.d.ts +6 -0
  52. package/dist/application/commands/command-catalog.js +1 -0
  53. package/dist/application/commands/command-contract.d.ts +60 -0
  54. package/dist/application/commands/command-contract.js +0 -0
  55. package/dist/application/commands/command-hints.d.ts +9 -0
  56. package/dist/application/commands/command-hints.js +1 -0
  57. package/dist/application/commands/command-output.d.ts +4 -0
  58. package/dist/application/commands/command-output.js +0 -0
  59. package/dist/application/commands/command-parser.d.ts +10 -0
  60. package/dist/application/commands/command-parser.js +1 -0
  61. package/dist/application/commands/command-presentation.d.ts +7 -0
  62. package/dist/application/commands/command-presentation.js +3 -0
  63. package/dist/application/commands/command-registry.d.ts +11 -0
  64. package/dist/application/commands/command-registry.js +1 -0
  65. package/dist/application/commands/command-runtime.d.ts +2 -0
  66. package/dist/application/commands/command-runtime.js +1 -0
  67. package/dist/application/commands/goal-command-handlers.d.ts +3 -0
  68. package/dist/application/commands/goal-command-handlers.js +7 -0
  69. package/dist/application/commands/media-command-handlers.d.ts +9 -0
  70. package/dist/application/commands/media-command-handlers.js +8 -0
  71. package/dist/application/commands/media-command-output.d.ts +11 -0
  72. package/dist/application/commands/media-command-output.js +1 -0
  73. package/dist/application/commands/memory-command-handler.d.ts +29 -0
  74. package/dist/application/commands/memory-command-handler.js +12 -0
  75. package/dist/application/commands/runtime-command-handlers.d.ts +7 -0
  76. package/dist/application/commands/runtime-command-handlers.js +14 -0
  77. package/dist/application/commands/stream-output.d.ts +4 -0
  78. package/dist/application/commands/stream-output.js +1 -0
  79. package/dist/application/commands/utility-commands.d.ts +6 -0
  80. package/dist/application/commands/utility-commands.js +10 -0
  81. package/dist/application/config/execution-config.d.ts +4 -0
  82. package/dist/application/config/execution-config.js +1 -0
  83. package/dist/application/extensions/extension-list-contract.d.ts +18 -0
  84. package/dist/application/extensions/extension-list-contract.js +0 -0
  85. package/dist/application/extensions/extension-list-formatters.d.ts +38 -0
  86. package/dist/application/extensions/extension-list-formatters.js +1 -0
  87. package/dist/application/extensions/extension-list-output.d.ts +3 -0
  88. package/dist/application/extensions/extension-list-output.js +3 -0
  89. package/dist/application/extensions/plugin-contribution-registry.d.ts +31 -0
  90. package/dist/application/extensions/plugin-contribution-registry.js +1 -0
  91. package/dist/application/extensions/plugin-detail-contract.d.ts +25 -0
  92. package/dist/application/extensions/plugin-detail-contract.js +0 -0
  93. package/dist/application/extensions/plugin-detail-service.d.ts +3 -0
  94. package/dist/application/extensions/plugin-detail-service.js +1 -0
  95. package/dist/application/extensions/skill-scope-store.d.ts +23 -0
  96. package/dist/application/extensions/skill-scope-store.js +1 -0
  97. package/dist/application/formatting/compact-number.d.ts +2 -0
  98. package/dist/application/formatting/compact-number.js +1 -0
  99. package/dist/application/formatting/compact-table.d.ts +22 -0
  100. package/dist/application/formatting/compact-table.js +2 -0
  101. package/dist/application/intent/completion-gate.d.ts +6 -0
  102. package/dist/application/intent/completion-gate.js +1 -0
  103. package/dist/application/intent/evidence-ledger.d.ts +21 -0
  104. package/dist/application/intent/evidence-ledger.js +1 -0
  105. package/dist/application/intent/evidence-recording-tool-executor.d.ts +16 -0
  106. package/dist/application/intent/evidence-recording-tool-executor.js +1 -0
  107. package/dist/application/intent/intent-compiler.d.ts +11 -0
  108. package/dist/application/intent/intent-compiler.js +2 -0
  109. package/dist/application/intent/intent-execution-gate.d.ts +11 -0
  110. package/dist/application/intent/intent-execution-gate.js +1 -0
  111. package/dist/application/intent/intent-host-context.d.ts +6 -0
  112. package/dist/application/intent/intent-host-context.js +1 -0
  113. package/dist/application/intent/intent-run-controller.d.ts +56 -0
  114. package/dist/application/intent/intent-run-controller.js +3 -0
  115. package/dist/application/intent/project-policy.d.ts +16 -0
  116. package/dist/application/intent/project-policy.js +1 -0
  117. package/dist/application/media/video-operation-poller.d.ts +5 -0
  118. package/dist/application/media/video-operation-poller.js +1 -0
  119. package/dist/application/memory/memory-capture-policy.d.ts +10 -0
  120. package/dist/application/memory/memory-capture-policy.js +1 -0
  121. package/dist/application/memory/memory-consolidation-service.d.ts +12 -0
  122. package/dist/application/memory/memory-consolidation-service.js +1 -0
  123. package/dist/application/memory/memory-context-assembler.d.ts +24 -0
  124. package/dist/application/memory/memory-context-assembler.js +1 -0
  125. package/dist/application/memory/memory-extractor.d.ts +21 -0
  126. package/dist/application/memory/memory-extractor.js +2 -0
  127. package/dist/application/memory/memory-service.d.ts +34 -0
  128. package/dist/application/memory/memory-service.js +1 -0
  129. package/dist/application/model/cached-model-catalog.d.ts +13 -0
  130. package/dist/application/model/cached-model-catalog.js +1 -0
  131. package/dist/application/model/initial-model-selection.d.ts +10 -0
  132. package/dist/application/model/initial-model-selection.js +1 -0
  133. package/dist/application/model/model-catalog-service.d.ts +6 -0
  134. package/dist/application/model/model-catalog-service.js +1 -0
  135. package/dist/application/model/model-context-window.d.ts +3 -0
  136. package/dist/application/model/model-context-window.js +1 -0
  137. package/dist/application/model/model-response-retry.d.ts +9 -0
  138. package/dist/application/model/model-response-retry.js +1 -0
  139. package/dist/application/orchestration/abortable-wait.d.ts +2 -0
  140. package/dist/application/orchestration/abortable-wait.js +1 -0
  141. package/dist/application/orchestration/cli-subagent-service.d.ts +73 -0
  142. package/dist/application/orchestration/cli-subagent-service.js +13 -0
  143. package/dist/application/orchestration/cli-turn-event-projector.d.ts +15 -0
  144. package/dist/application/orchestration/cli-turn-event-projector.js +1 -0
  145. package/dist/application/orchestration/cli-turn-events.d.ts +83 -0
  146. package/dist/application/orchestration/cli-turn-events.js +1 -0
  147. package/dist/application/orchestration/cli-turn-persistence.d.ts +6 -0
  148. package/dist/application/orchestration/cli-turn-persistence.js +1 -0
  149. package/dist/application/orchestration/goal-evaluator.d.ts +18 -0
  150. package/dist/application/orchestration/goal-evaluator.js +3 -0
  151. package/dist/application/orchestration/goal-input.d.ts +3 -0
  152. package/dist/application/orchestration/goal-input.js +1 -0
  153. package/dist/application/orchestration/goal-output.d.ts +2 -0
  154. package/dist/application/orchestration/goal-output.js +2 -0
  155. package/dist/application/orchestration/goal-runner.d.ts +22 -0
  156. package/dist/application/orchestration/goal-runner.js +10 -0
  157. package/dist/application/orchestration/goal-usage.d.ts +9 -0
  158. package/dist/application/orchestration/goal-usage.js +1 -0
  159. package/dist/application/orchestration/headless-agent-turn.d.ts +35 -0
  160. package/dist/application/orchestration/headless-agent-turn.js +4 -0
  161. package/dist/application/orchestration/subagent-coordinator.d.ts +41 -0
  162. package/dist/application/orchestration/subagent-coordinator.js +1 -0
  163. package/dist/application/orchestration/subagent-handoff.d.ts +3 -0
  164. package/dist/application/orchestration/subagent-handoff.js +3 -0
  165. package/dist/application/orchestration/subagent-tool-executor.d.ts +12 -0
  166. package/dist/application/orchestration/subagent-tool-executor.js +1 -0
  167. package/dist/application/orchestration/task-graph.d.ts +13 -0
  168. package/dist/application/orchestration/task-graph.js +1 -0
  169. package/dist/application/orchestration/task-scheduler.d.ts +18 -0
  170. package/dist/application/orchestration/task-scheduler.js +1 -0
  171. package/dist/application/project/project-trust-service.d.ts +13 -0
  172. package/dist/application/project/project-trust-service.js +1 -0
  173. package/dist/application/project-intelligence/project-intelligence-service.d.ts +14 -0
  174. package/dist/application/project-intelligence/project-intelligence-service.js +1 -0
  175. package/dist/application/protocol/browser-host-tool-executor.d.ts +41 -0
  176. package/dist/application/protocol/browser-host-tool-executor.js +2 -0
  177. package/dist/application/protocol/computer-host-tool-executor.d.ts +42 -0
  178. package/dist/application/protocol/computer-host-tool-executor.js +2 -0
  179. package/dist/application/protocol/desktop-agent-command.d.ts +9 -0
  180. package/dist/application/protocol/desktop-agent-command.js +3 -0
  181. package/dist/application/protocol/desktop-agent-request-parser.d.ts +186 -0
  182. package/dist/application/protocol/desktop-agent-request-parser.js +1 -0
  183. package/dist/application/protocol/desktop-approval-broker.d.ts +16 -0
  184. package/dist/application/protocol/desktop-approval-broker.js +1 -0
  185. package/dist/application/protocol/desktop-attachment-store.d.ts +16 -0
  186. package/dist/application/protocol/desktop-attachment-store.js +1 -0
  187. package/dist/application/protocol/desktop-command-catalog.d.ts +2 -0
  188. package/dist/application/protocol/desktop-command-catalog.js +1 -0
  189. package/dist/application/protocol/desktop-command-contract.d.ts +26 -0
  190. package/dist/application/protocol/desktop-command-contract.js +1 -0
  191. package/dist/application/protocol/desktop-command-executor.d.ts +17 -0
  192. package/dist/application/protocol/desktop-command-executor.js +1 -0
  193. package/dist/application/protocol/desktop-command-output.d.ts +15 -0
  194. package/dist/application/protocol/desktop-command-output.js +1 -0
  195. package/dist/application/protocol/desktop-execution-policy.d.ts +17 -0
  196. package/dist/application/protocol/desktop-execution-policy.js +1 -0
  197. package/dist/application/protocol/desktop-extension-request-handler.d.ts +14 -0
  198. package/dist/application/protocol/desktop-extension-request-handler.js +1 -0
  199. package/dist/application/protocol/desktop-extension-service.d.ts +44 -0
  200. package/dist/application/protocol/desktop-extension-service.js +3 -0
  201. package/dist/application/protocol/desktop-host-tool-executor.d.ts +63 -0
  202. package/dist/application/protocol/desktop-host-tool-executor.js +2 -0
  203. package/dist/application/protocol/desktop-intent-event-writer.d.ts +20 -0
  204. package/dist/application/protocol/desktop-intent-event-writer.js +1 -0
  205. package/dist/application/protocol/desktop-mcp-events.d.ts +10 -0
  206. package/dist/application/protocol/desktop-mcp-events.js +1 -0
  207. package/dist/application/protocol/desktop-orchestration-events.d.ts +2 -0
  208. package/dist/application/protocol/desktop-orchestration-events.js +2 -0
  209. package/dist/application/protocol/desktop-protocol-helpers.d.ts +13 -0
  210. package/dist/application/protocol/desktop-protocol-helpers.js +1 -0
  211. package/dist/application/protocol/document-host-tool-definitions.d.ts +4 -0
  212. package/dist/application/protocol/document-host-tool-definitions.js +1 -0
  213. package/dist/application/protocol/document-host-tool-executor.d.ts +49 -0
  214. package/dist/application/protocol/document-host-tool-executor.js +2 -0
  215. package/dist/application/protocol/json-line-writer.d.ts +9 -0
  216. package/dist/application/protocol/json-line-writer.js +2 -0
  217. package/dist/application/protocol/jsonl-agent-command.d.ts +3 -0
  218. package/dist/application/protocol/jsonl-agent-command.js +3 -0
  219. package/dist/application/protocol/jsonl-protocol.d.ts +82 -0
  220. package/dist/application/protocol/jsonl-protocol.js +2 -0
  221. package/dist/application/protocol/tool-image-content.d.ts +4 -0
  222. package/dist/application/protocol/tool-image-content.js +1 -0
  223. package/dist/application/security/delegated-worker-policy.d.ts +3 -0
  224. package/dist/application/security/delegated-worker-policy.js +1 -0
  225. package/dist/application/security/desktop-tool-scope-policy.d.ts +4 -0
  226. package/dist/application/security/desktop-tool-scope-policy.js +1 -0
  227. package/dist/application/security/tool-action-risk-analyzer.d.ts +13 -0
  228. package/dist/application/security/tool-action-risk-analyzer.js +1 -0
  229. package/dist/application/security/tool-approval-service.d.ts +37 -0
  230. package/dist/application/security/tool-approval-service.js +1 -0
  231. package/dist/application/security/tool-risk-classifier.d.ts +18 -0
  232. package/dist/application/security/tool-risk-classifier.js +1 -0
  233. package/dist/application/security/workspace-permission-policy.d.ts +10 -0
  234. package/dist/application/security/workspace-permission-policy.js +1 -0
  235. package/dist/application/session/project-session-access.d.ts +8 -0
  236. package/dist/application/session/project-session-access.js +1 -0
  237. package/dist/application/session/session-compaction-service.d.ts +10 -0
  238. package/dist/application/session/session-compaction-service.js +1 -0
  239. package/dist/application/session/session-turn-lifecycle.d.ts +5 -0
  240. package/dist/application/session/session-turn-lifecycle.js +1 -0
  241. package/dist/application/workspace/session-execution-workspace.d.ts +59 -0
  242. package/dist/application/workspace/session-execution-workspace.js +3 -0
  243. package/dist/application/workspace/workspace-file-index.d.ts +15 -0
  244. package/dist/application/workspace/workspace-file-index.js +1 -0
  245. package/dist/application/workspace/workspace-file-reference-resolver.d.ts +20 -0
  246. package/dist/application/workspace/workspace-file-reference-resolver.js +17 -0
  247. package/dist/application/workspace/workspace-instruction-loader.d.ts +8 -0
  248. package/dist/application/workspace/workspace-instruction-loader.js +1 -0
  249. package/dist/bootstrap/composition-root.d.ts +6 -0
  250. package/dist/bootstrap/composition-root.js +1 -0
  251. package/dist/bootstrap/global-cli-options.d.ts +6 -0
  252. package/dist/bootstrap/global-cli-options.js +1 -0
  253. package/dist/bootstrap/native-devtools-stub.d.ts +10 -0
  254. package/dist/bootstrap/native-devtools-stub.js +1 -0
  255. package/dist/bootstrap/native-entry.d.ts +1 -0
  256. package/dist/bootstrap/native-entry.js +2 -0
  257. package/dist/bootstrap/native-tiktoken.d.ts +4 -0
  258. package/dist/bootstrap/native-tiktoken.js +1 -0
  259. package/dist/bootstrap/runtime-factory.d.ts +41 -0
  260. package/dist/bootstrap/runtime-factory.js +1 -0
  261. package/dist/bootstrap/shutdown-manager.d.ts +11 -0
  262. package/dist/bootstrap/shutdown-manager.js +1 -0
  263. package/dist/bootstrap/startup-sequence.d.ts +5 -0
  264. package/dist/bootstrap/startup-sequence.js +1 -0
  265. package/dist/domain/auth/auth-profile.d.ts +14 -0
  266. package/dist/domain/auth/auth-profile.js +1 -0
  267. package/dist/domain/config/config-schema.d.ts +24 -0
  268. package/dist/domain/config/config-schema.js +1 -0
  269. package/dist/domain/errors/cli-command-hint.d.ts +5 -0
  270. package/dist/domain/errors/cli-command-hint.js +0 -0
  271. package/dist/domain/errors/cli-error.d.ts +35 -0
  272. package/dist/domain/errors/cli-error.js +1 -0
  273. package/dist/domain/errors/error-codes.d.ts +51 -0
  274. package/dist/domain/errors/error-codes.js +1 -0
  275. package/dist/domain/extensions/extension-scope.d.ts +3 -0
  276. package/dist/domain/extensions/extension-scope.js +1 -0
  277. package/dist/domain/extensions/extension-state.d.ts +5 -0
  278. package/dist/domain/extensions/extension-state.js +1 -0
  279. package/dist/domain/extensions/hook-manifest.d.ts +13 -0
  280. package/dist/domain/extensions/hook-manifest.js +1 -0
  281. package/dist/domain/extensions/host-tool-plugin-ids.d.ts +9 -0
  282. package/dist/domain/extensions/host-tool-plugin-ids.js +1 -0
  283. package/dist/domain/extensions/mcp-config.d.ts +35 -0
  284. package/dist/domain/extensions/mcp-config.js +1 -0
  285. package/dist/domain/extensions/plugin-agent-manifest.d.ts +8 -0
  286. package/dist/domain/extensions/plugin-agent-manifest.js +1 -0
  287. package/dist/domain/extensions/plugin-manifest.d.ts +23 -0
  288. package/dist/domain/extensions/plugin-manifest.js +1 -0
  289. package/dist/domain/extensions/skill-manifest.d.ts +10 -0
  290. package/dist/domain/extensions/skill-manifest.js +3 -0
  291. package/dist/domain/extensions/yaml-subset.d.ts +9 -0
  292. package/dist/domain/extensions/yaml-subset.js +2 -0
  293. package/dist/domain/filesystem/file-change-diff.d.ts +21 -0
  294. package/dist/domain/filesystem/file-change-diff.js +3 -0
  295. package/dist/domain/intent/intent-contract.d.ts +41 -0
  296. package/dist/domain/intent/intent-contract.js +1 -0
  297. package/dist/domain/media/gateway-media-contract.d.ts +23 -0
  298. package/dist/domain/media/gateway-media-contract.js +1 -0
  299. package/dist/domain/media/media-contract.d.ts +28 -0
  300. package/dist/domain/media/media-contract.js +0 -0
  301. package/dist/domain/media/media-execution-policy.d.ts +9 -0
  302. package/dist/domain/media/media-execution-policy.js +1 -0
  303. package/dist/domain/memory/memory-kinds.d.ts +15 -0
  304. package/dist/domain/memory/memory-kinds.js +1 -0
  305. package/dist/domain/memory/memory-retrieval-policy.d.ts +3 -0
  306. package/dist/domain/memory/memory-retrieval-policy.js +1 -0
  307. package/dist/domain/memory/memory-search.d.ts +33 -0
  308. package/dist/domain/memory/memory-search.js +2 -0
  309. package/dist/domain/memory/memory.d.ts +48 -0
  310. package/dist/domain/memory/memory.js +1 -0
  311. package/dist/domain/orchestration/goal.d.ts +58 -0
  312. package/dist/domain/orchestration/goal.js +1 -0
  313. package/dist/domain/orchestration/subagent-identity.d.ts +2 -0
  314. package/dist/domain/orchestration/subagent-identity.js +1 -0
  315. package/dist/domain/orchestration/subagent.d.ts +33 -0
  316. package/dist/domain/orchestration/subagent.js +0 -0
  317. package/dist/domain/orchestration/work-plan.d.ts +77 -0
  318. package/dist/domain/orchestration/work-plan.js +1 -0
  319. package/dist/domain/project/project-identity.d.ts +6 -0
  320. package/dist/domain/project/project-identity.js +1 -0
  321. package/dist/domain/runtime/assistant-delta-normalizer.d.ts +11 -0
  322. package/dist/domain/runtime/assistant-delta-normalizer.js +1 -0
  323. package/dist/domain/runtime/resource-limits.d.ts +75 -0
  324. package/dist/domain/runtime/resource-limits.js +1 -0
  325. package/dist/domain/session/attachment.d.ts +13 -0
  326. package/dist/domain/session/attachment.js +0 -0
  327. package/dist/domain/session/session-schema.d.ts +6 -0
  328. package/dist/domain/session/session-schema.js +1 -0
  329. package/dist/domain/session/session.d.ts +27 -0
  330. package/dist/domain/session/session.js +0 -0
  331. package/dist/domain/settings/settings-document.d.ts +8 -0
  332. package/dist/domain/settings/settings-document.js +1 -0
  333. package/dist/domain/validation/record-schema.d.ts +4 -0
  334. package/dist/domain/validation/record-schema.js +1 -0
  335. package/dist/domain/workspace/workspace-settings.d.ts +12 -0
  336. package/dist/domain/workspace/workspace-settings.js +1 -0
  337. package/dist/infrastructure/agent-sdk/agent-instance-factory.d.ts +22 -0
  338. package/dist/infrastructure/agent-sdk/agent-instance-factory.js +1 -0
  339. package/dist/infrastructure/agent-sdk/model-tool-name-mapper.d.ts +13 -0
  340. package/dist/infrastructure/agent-sdk/model-tool-name-mapper.js +1 -0
  341. package/dist/infrastructure/agent-sdk/tool-calling-completion-client.d.ts +4 -0
  342. package/dist/infrastructure/agent-sdk/tool-calling-completion-client.js +1 -0
  343. package/dist/infrastructure/agent-sdk/tool-calling-model-client.d.ts +11 -0
  344. package/dist/infrastructure/agent-sdk/tool-calling-model-client.js +1 -0
  345. package/dist/infrastructure/cache/cache-policy.d.ts +7 -0
  346. package/dist/infrastructure/cache/cache-policy.js +1 -0
  347. package/dist/infrastructure/cache/file-cache-store.d.ts +17 -0
  348. package/dist/infrastructure/cache/file-cache-store.js +2 -0
  349. package/dist/infrastructure/clipboard/clipboard-adapter-factory.d.ts +11 -0
  350. package/dist/infrastructure/clipboard/clipboard-adapter-factory.js +1 -0
  351. package/dist/infrastructure/clipboard/clipboard-policy.d.ts +8 -0
  352. package/dist/infrastructure/clipboard/clipboard-policy.js +1 -0
  353. package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.d.ts +10 -0
  354. package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.js +1 -0
  355. package/dist/infrastructure/clipboard/image-normalizer.d.ts +12 -0
  356. package/dist/infrastructure/clipboard/image-normalizer.js +1 -0
  357. package/dist/infrastructure/clipboard/windows-clipboard-adapter.d.ts +7 -0
  358. package/dist/infrastructure/clipboard/windows-clipboard-adapter.js +1 -0
  359. package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.d.ts +7 -0
  360. package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.js +1 -0
  361. package/dist/infrastructure/config/config-loader.d.ts +19 -0
  362. package/dist/infrastructure/config/config-loader.js +2 -0
  363. package/dist/infrastructure/config/environment-values.d.ts +2 -0
  364. package/dist/infrastructure/config/environment-values.js +1 -0
  365. package/dist/infrastructure/credentials/composite-credential-store.d.ts +11 -0
  366. package/dist/infrastructure/credentials/composite-credential-store.js +1 -0
  367. package/dist/infrastructure/credentials/encrypted-file-credential-store.d.ts +17 -0
  368. package/dist/infrastructure/credentials/encrypted-file-credential-store.js +3 -0
  369. package/dist/infrastructure/credentials/environment-credential-store.d.ts +11 -0
  370. package/dist/infrastructure/credentials/environment-credential-store.js +1 -0
  371. package/dist/infrastructure/credentials/secret-input.d.ts +7 -0
  372. package/dist/infrastructure/credentials/secret-input.js +3 -0
  373. package/dist/infrastructure/extensions/composite-mcp-config-store.d.ts +9 -0
  374. package/dist/infrastructure/extensions/composite-mcp-config-store.js +1 -0
  375. package/dist/infrastructure/extensions/extension-directory-reader.d.ts +2 -0
  376. package/dist/infrastructure/extensions/extension-directory-reader.js +1 -0
  377. package/dist/infrastructure/extensions/extension-integrity.d.ts +7 -0
  378. package/dist/infrastructure/extensions/extension-integrity.js +1 -0
  379. package/dist/infrastructure/extensions/extension-source-resolver.d.ts +6 -0
  380. package/dist/infrastructure/extensions/extension-source-resolver.js +1 -0
  381. package/dist/infrastructure/extensions/file-mcp-config-store.d.ts +15 -0
  382. package/dist/infrastructure/extensions/file-mcp-config-store.js +2 -0
  383. package/dist/infrastructure/extensions/hook-runtime.d.ts +18 -0
  384. package/dist/infrastructure/extensions/hook-runtime.js +1 -0
  385. package/dist/infrastructure/extensions/mcp-runtime.d.ts +51 -0
  386. package/dist/infrastructure/extensions/mcp-runtime.js +1 -0
  387. package/dist/infrastructure/extensions/plugin-agent-discovery.d.ts +4 -0
  388. package/dist/infrastructure/extensions/plugin-agent-discovery.js +1 -0
  389. package/dist/infrastructure/extensions/plugin-discovery.d.ts +5 -0
  390. package/dist/infrastructure/extensions/plugin-discovery.js +1 -0
  391. package/dist/infrastructure/extensions/plugin-manager.d.ts +23 -0
  392. package/dist/infrastructure/extensions/plugin-manager.js +2 -0
  393. package/dist/infrastructure/extensions/skill-discovery.d.ts +4 -0
  394. package/dist/infrastructure/extensions/skill-discovery.js +1 -0
  395. package/dist/infrastructure/extensions/skill-installer.d.ts +9 -0
  396. package/dist/infrastructure/extensions/skill-installer.js +1 -0
  397. package/dist/infrastructure/extensions/skill-manager.d.ts +22 -0
  398. package/dist/infrastructure/extensions/skill-manager.js +2 -0
  399. package/dist/infrastructure/extensions/skill-roots.d.ts +19 -0
  400. package/dist/infrastructure/extensions/skill-roots.js +1 -0
  401. package/dist/infrastructure/extensions/skill-tool-executor.d.ts +18 -0
  402. package/dist/infrastructure/extensions/skill-tool-executor.js +2 -0
  403. package/dist/infrastructure/filesystem/atomic-file-store.d.ts +17 -0
  404. package/dist/infrastructure/filesystem/atomic-file-store.js +1 -0
  405. package/dist/infrastructure/filesystem/bounded-file-reader.d.ts +6 -0
  406. package/dist/infrastructure/filesystem/bounded-file-reader.js +1 -0
  407. package/dist/infrastructure/filesystem/bounded-json-reader.d.ts +1 -0
  408. package/dist/infrastructure/filesystem/bounded-json-reader.js +1 -0
  409. package/dist/infrastructure/filesystem/fs-errors.d.ts +2 -0
  410. package/dist/infrastructure/filesystem/fs-errors.js +1 -0
  411. package/dist/infrastructure/filesystem/gateway-media-input-reader.d.ts +12 -0
  412. package/dist/infrastructure/filesystem/gateway-media-input-reader.js +1 -0
  413. package/dist/infrastructure/filesystem/local-filesystem-tool-executor.d.ts +22 -0
  414. package/dist/infrastructure/filesystem/local-filesystem-tool-executor.js +3 -0
  415. package/dist/infrastructure/filesystem/path-resolver.d.ts +20 -0
  416. package/dist/infrastructure/filesystem/path-resolver.js +1 -0
  417. package/dist/infrastructure/filesystem/workspace-media-artifact-store.d.ts +13 -0
  418. package/dist/infrastructure/filesystem/workspace-media-artifact-store.js +1 -0
  419. package/dist/infrastructure/logging/daily-rotating-file-writer.d.ts +26 -0
  420. package/dist/infrastructure/logging/daily-rotating-file-writer.js +2 -0
  421. package/dist/infrastructure/logging/log-redactor.d.ts +2 -0
  422. package/dist/infrastructure/logging/log-redactor.js +1 -0
  423. package/dist/infrastructure/logging/logging-policy.d.ts +6 -0
  424. package/dist/infrastructure/logging/logging-policy.js +1 -0
  425. package/dist/infrastructure/logging/structured-logger.d.ts +24 -0
  426. package/dist/infrastructure/logging/structured-logger.js +4 -0
  427. package/dist/infrastructure/memory/file-memory-store.d.ts +37 -0
  428. package/dist/infrastructure/memory/file-memory-store.js +11 -0
  429. package/dist/infrastructure/network/safe-media-downloader.d.ts +23 -0
  430. package/dist/infrastructure/network/safe-media-downloader.js +1 -0
  431. package/dist/infrastructure/platform/host-platform.d.ts +14 -0
  432. package/dist/infrastructure/platform/host-platform.js +1 -0
  433. package/dist/infrastructure/platform/host-process.d.ts +29 -0
  434. package/dist/infrastructure/platform/host-process.js +1 -0
  435. package/dist/infrastructure/platform/platform-paths.d.ts +25 -0
  436. package/dist/infrastructure/platform/platform-paths.js +1 -0
  437. package/dist/infrastructure/platform/process-termination.d.ts +4 -0
  438. package/dist/infrastructure/platform/process-termination.js +1 -0
  439. package/dist/infrastructure/platform/read-only-executable.d.ts +3 -0
  440. package/dist/infrastructure/platform/read-only-executable.js +1 -0
  441. package/dist/infrastructure/project/file-project-trust-store.d.ts +12 -0
  442. package/dist/infrastructure/project/file-project-trust-store.js +2 -0
  443. package/dist/infrastructure/sdk/chat-completion-adapter.d.ts +8 -0
  444. package/dist/infrastructure/sdk/chat-completion-adapter.js +1 -0
  445. package/dist/infrastructure/sdk/lotagate-client-factory.d.ts +3 -0
  446. package/dist/infrastructure/sdk/lotagate-client-factory.js +1 -0
  447. package/dist/infrastructure/sdk/model-catalog-adapter.d.ts +19 -0
  448. package/dist/infrastructure/sdk/model-catalog-adapter.js +1 -0
  449. package/dist/infrastructure/sdk/sdk-media-gateway-client.d.ts +20 -0
  450. package/dist/infrastructure/sdk/sdk-media-gateway-client.js +1 -0
  451. package/dist/infrastructure/sessions/file-goal-store.d.ts +21 -0
  452. package/dist/infrastructure/sessions/file-goal-store.js +1 -0
  453. package/dist/infrastructure/sessions/file-session-store.d.ts +47 -0
  454. package/dist/infrastructure/sessions/file-session-store.js +4 -0
  455. package/dist/infrastructure/sessions/project-session-paths.d.ts +17 -0
  456. package/dist/infrastructure/sessions/project-session-paths.js +1 -0
  457. package/dist/infrastructure/sessions/session-index.d.ts +16 -0
  458. package/dist/infrastructure/sessions/session-index.js +3 -0
  459. package/dist/infrastructure/sessions/session-journal.d.ts +22 -0
  460. package/dist/infrastructure/sessions/session-journal.js +6 -0
  461. package/dist/infrastructure/sessions/subagent-journal-store.d.ts +28 -0
  462. package/dist/infrastructure/sessions/subagent-journal-store.js +2 -0
  463. package/dist/infrastructure/shell/shell-tool-executor.d.ts +17 -0
  464. package/dist/infrastructure/shell/shell-tool-executor.js +2 -0
  465. package/dist/infrastructure/tokens/tiktoken-token-estimator.d.ts +18 -0
  466. package/dist/infrastructure/tokens/tiktoken-token-estimator.js +1 -0
  467. package/dist/infrastructure/workspace/workspace-settings-store.d.ts +9 -0
  468. package/dist/infrastructure/workspace/workspace-settings-store.js +4 -0
  469. package/dist/main.d.ts +7 -0
  470. package/dist/main.js +3 -0
  471. package/dist/ports/cache-store.d.ts +10 -0
  472. package/dist/ports/cache-store.js +0 -0
  473. package/dist/ports/chat-model.d.ts +30 -0
  474. package/dist/ports/chat-model.js +0 -0
  475. package/dist/ports/clipboard-adapter.d.ts +7 -0
  476. package/dist/ports/clipboard-adapter.js +0 -0
  477. package/dist/ports/clipboard-text-adapter.d.ts +3 -0
  478. package/dist/ports/clipboard-text-adapter.js +0 -0
  479. package/dist/ports/credential-store.d.ts +7 -0
  480. package/dist/ports/credential-store.js +0 -0
  481. package/dist/ports/goal-store.d.ts +12 -0
  482. package/dist/ports/goal-store.js +0 -0
  483. package/dist/ports/logger.d.ts +8 -0
  484. package/dist/ports/logger.js +0 -0
  485. package/dist/ports/media-gateway-client.d.ts +54 -0
  486. package/dist/ports/media-gateway-client.js +0 -0
  487. package/dist/ports/memory-store.d.ts +26 -0
  488. package/dist/ports/memory-store.js +0 -0
  489. package/dist/ports/model-completion-client.d.ts +8 -0
  490. package/dist/ports/model-completion-client.js +0 -0
  491. package/dist/ports/model-diagnostics.d.ts +17 -0
  492. package/dist/ports/model-diagnostics.js +0 -0
  493. package/dist/ports/project-trust-store.d.ts +12 -0
  494. package/dist/ports/project-trust-store.js +0 -0
  495. package/dist/ports/session-store.d.ts +58 -0
  496. package/dist/ports/session-store.js +0 -0
  497. package/dist/ports/subagent-lifecycle.d.ts +31 -0
  498. package/dist/ports/subagent-lifecycle.js +0 -0
  499. package/dist/ports/tool-activity.d.ts +13 -0
  500. package/dist/ports/tool-activity.js +0 -0
  501. package/dist/presentation/themes/theme.d.ts +19 -0
  502. package/dist/presentation/themes/theme.js +1 -0
  503. package/dist/presentation/tui/agent-initialization-renderer.d.ts +4 -0
  504. package/dist/presentation/tui/agent-initialization-renderer.js +1 -0
  505. package/dist/presentation/tui/context-display.d.ts +21 -0
  506. package/dist/presentation/tui/context-display.js +2 -0
  507. package/dist/presentation/tui/formatters.d.ts +6 -0
  508. package/dist/presentation/tui/formatters.js +1 -0
  509. package/dist/presentation/tui/ink/choice-window.d.ts +5 -0
  510. package/dist/presentation/tui/ink/choice-window.js +1 -0
  511. package/dist/presentation/tui/ink/components/activity-animation.d.ts +3 -0
  512. package/dist/presentation/tui/ink/components/activity-animation.js +1 -0
  513. package/dist/presentation/tui/ink/components/activity-entry.d.ts +6 -0
  514. package/dist/presentation/tui/ink/components/activity-entry.js +1 -0
  515. package/dist/presentation/tui/ink/components/activity-status.d.ts +10 -0
  516. package/dist/presentation/tui/ink/components/activity-status.js +1 -0
  517. package/dist/presentation/tui/ink/components/choice-modal.d.ts +11 -0
  518. package/dist/presentation/tui/ink/components/choice-modal.js +1 -0
  519. package/dist/presentation/tui/ink/components/composer.d.ts +40 -0
  520. package/dist/presentation/tui/ink/components/composer.js +8 -0
  521. package/dist/presentation/tui/ink/components/file-diff.d.ts +6 -0
  522. package/dist/presentation/tui/ink/components/file-diff.js +1 -0
  523. package/dist/presentation/tui/ink/components/modal.d.ts +8 -0
  524. package/dist/presentation/tui/ink/components/modal.js +2 -0
  525. package/dist/presentation/tui/ink/components/shimmer-text.d.ts +8 -0
  526. package/dist/presentation/tui/ink/components/shimmer-text.js +1 -0
  527. package/dist/presentation/tui/ink/components/subagent-activity.d.ts +11 -0
  528. package/dist/presentation/tui/ink/components/subagent-activity.js +1 -0
  529. package/dist/presentation/tui/ink/components/transcript.d.ts +39 -0
  530. package/dist/presentation/tui/ink/components/transcript.js +5 -0
  531. package/dist/presentation/tui/ink/components/welcome-panel.d.ts +6 -0
  532. package/dist/presentation/tui/ink/components/welcome-panel.js +1 -0
  533. package/dist/presentation/tui/ink/lotagate-tui.d.ts +6 -0
  534. package/dist/presentation/tui/ink/lotagate-tui.js +2 -0
  535. package/dist/presentation/tui/ink/markdown-inline-renderer.d.ts +4 -0
  536. package/dist/presentation/tui/ink/markdown-inline-renderer.js +1 -0
  537. package/dist/presentation/tui/ink/markdown-inline.d.ts +13 -0
  538. package/dist/presentation/tui/ink/markdown-inline.js +1 -0
  539. package/dist/presentation/tui/ink/markdown-message.d.ts +6 -0
  540. package/dist/presentation/tui/ink/markdown-message.js +2 -0
  541. package/dist/presentation/tui/ink/markdown-table.d.ts +16 -0
  542. package/dist/presentation/tui/ink/markdown-table.js +1 -0
  543. package/dist/presentation/tui/ink/tui-bridge.d.ts +193 -0
  544. package/dist/presentation/tui/ink/tui-bridge.js +1 -0
  545. package/dist/presentation/tui/terminal-capabilities.d.ts +15 -0
  546. package/dist/presentation/tui/terminal-capabilities.js +1 -0
  547. package/dist/presentation/tui/terminal-mouse.d.ts +5 -0
  548. package/dist/presentation/tui/terminal-mouse.js +1 -0
  549. package/dist/presentation/tui/terminal-screen.d.ts +10 -0
  550. package/dist/presentation/tui/terminal-screen.js +1 -0
  551. package/dist/presentation/tui/tui-agent-event-runner.d.ts +29 -0
  552. package/dist/presentation/tui/tui-agent-event-runner.js +1 -0
  553. package/dist/presentation/tui/tui-application-contract.d.ts +10 -0
  554. package/dist/presentation/tui/tui-application-contract.js +1 -0
  555. package/dist/presentation/tui/tui-application.d.ts +64 -0
  556. package/dist/presentation/tui/tui-application.js +3 -0
  557. package/dist/presentation/tui/tui-clipboard-paste-handlers.d.ts +11 -0
  558. package/dist/presentation/tui/tui-clipboard-paste-handlers.js +1 -0
  559. package/dist/presentation/tui/tui-command-context.d.ts +3 -0
  560. package/dist/presentation/tui/tui-command-context.js +0 -0
  561. package/dist/presentation/tui/tui-command-executor.d.ts +38 -0
  562. package/dist/presentation/tui/tui-command-executor.js +4 -0
  563. package/dist/presentation/tui/tui-command-host-factory.d.ts +40 -0
  564. package/dist/presentation/tui/tui-command-host-factory.js +1 -0
  565. package/dist/presentation/tui/tui-context-compaction.d.ts +5 -0
  566. package/dist/presentation/tui/tui-context-compaction.js +1 -0
  567. package/dist/presentation/tui/tui-context-service.d.ts +34 -0
  568. package/dist/presentation/tui/tui-context-service.js +2 -0
  569. package/dist/presentation/tui/tui-extension-loader.d.ts +21 -0
  570. package/dist/presentation/tui/tui-extension-loader.js +1 -0
  571. package/dist/presentation/tui/tui-file-suggestions.d.ts +3 -0
  572. package/dist/presentation/tui/tui-file-suggestions.js +1 -0
  573. package/dist/presentation/tui/tui-goal-controller.d.ts +14 -0
  574. package/dist/presentation/tui/tui-goal-controller.js +1 -0
  575. package/dist/presentation/tui/tui-initial-model.d.ts +3 -0
  576. package/dist/presentation/tui/tui-initial-model.js +1 -0
  577. package/dist/presentation/tui/tui-lifecycle-actions.d.ts +13 -0
  578. package/dist/presentation/tui/tui-lifecycle-actions.js +1 -0
  579. package/dist/presentation/tui/tui-manual-compaction.d.ts +18 -0
  580. package/dist/presentation/tui/tui-manual-compaction.js +1 -0
  581. package/dist/presentation/tui/tui-media-model-selection.d.ts +12 -0
  582. package/dist/presentation/tui/tui-media-model-selection.js +1 -0
  583. package/dist/presentation/tui/tui-prompt-dispatcher.d.ts +16 -0
  584. package/dist/presentation/tui/tui-prompt-dispatcher.js +1 -0
  585. package/dist/presentation/tui/tui-skill-controller.d.ts +11 -0
  586. package/dist/presentation/tui/tui-skill-controller.js +3 -0
  587. package/dist/presentation/tui/tui-tool-approval.d.ts +22 -0
  588. package/dist/presentation/tui/tui-tool-approval.js +1 -0
  589. package/dist/version.d.ts +1 -0
  590. package/dist/version.js +1 -0
  591. package/package.json +12 -10
  592. package/skills/architecture-review/SKILL.md +41 -14
  593. package/skills/code-review/SKILL.md +41 -12
  594. package/skills/debugging/SKILL.md +49 -12
  595. package/skills/documentation/SKILL.md +43 -9
  596. package/skills/feature-implementation/SKILL.md +58 -19
  597. package/skills/api-contract-review/SKILL.md +0 -17
  598. package/skills/database-review/SKILL.md +0 -17
  599. package/skills/dependency-review/SKILL.md +0 -16
  600. package/skills/frontend-review/SKILL.md +0 -18
  601. package/skills/incident-response/SKILL.md +0 -18
  602. package/skills/performance-review/SKILL.md +0 -17
  603. package/skills/refactor/SKILL.md +0 -23
  604. package/skills/release-readiness/SKILL.md +0 -16
  605. package/skills/security-review/SKILL.md +0 -16
  606. package/skills/test-plan/SKILL.md +0 -22
  607. package/skills/verify/SKILL.md +0 -13
@@ -0,0 +1,14 @@
1
+ import type { ToolDefinition } from '@lotagate/sdk';
2
+ import type { ToolExecutor } from '@lotagate/agent-sdk';
3
+ export interface CliToolCatalog {
4
+ readonly definitions: readonly ToolDefinition[];
5
+ readonly names: readonly string[];
6
+ readonly details: readonly {
7
+ name: string;
8
+ description: string;
9
+ }[];
10
+ }
11
+ /** Builds one authoritative capability view from the executors registered by CLI. */
12
+ export declare function buildToolCatalog(executors: readonly ToolExecutor[]): CliToolCatalog;
13
+ /** Creates a stable capability catalog from CLI-owned tool definitions. */
14
+ export declare function buildToolCatalogFromDefinitions(definitions: readonly ToolDefinition[]): CliToolCatalog;
@@ -0,0 +1 @@
1
+ function c(n){return a(n.flatMap(e=>[...e.listTools()]))}function a(n){const e=new Map;for(const t of n){const o=s(t);o===void 0||e.has(o)||e.set(o,{name:o,description:u(t)})}const r=[...e.values()].sort((t,o)=>t.name.localeCompare(o.name));return{definitions:n,names:r.map(t=>t.name),details:r}}function s(n){if("function"in n&&typeof n.function.name=="string")return n.function.name;if("name"in n&&typeof n.name=="string")return n.name}function u(n){return"function"in n&&typeof n.function.description=="string"?n.function.description:"description"in n&&typeof n.description=="string"?n.description:"Host-provided tool."}export{c as buildToolCatalog,a as buildToolCatalogFromDefinitions};
@@ -0,0 +1,7 @@
1
+ /** Converts internal tool identifiers into safe, human-readable activity text. */
2
+ export declare function formatToolActivityName(toolName: string): string;
3
+ /** Returns the MCP category plus the human-readable final tool name. */
4
+ export declare function formatMcpActivityName(toolName: string): string;
5
+ /** Formats the effective command while hiding a platform shell wrapper. */
6
+ export declare function formatShellCommandForDisplay(command: string, args: readonly string[], maximum?: number): string;
7
+ export declare function formatFilesystemActivityName(toolName: string, path: unknown, maximum?: number): string;
@@ -0,0 +1 @@
1
+ function l(t){if(!t.startsWith("mcp__"))return t;const e=t.lastIndexOf("__");return e<5||e===t.length-2?t:o(t.slice(e+2))}function a(t){return`MCP ${l(t)}`}function d(t,e,s=180){const i=f(t,e),n=p(t)&&i.length===1?h(i[0]??""):h(i.map(r=>/\s/u.test(r)?JSON.stringify(r):r).join(" "));return n.length<=s?n:`${n.slice(0,Math.max(0,s-3))}...`}function w(t,e,s=180){const i=typeof e=="string"&&e.trim().length>0?e.trim():".",n=i==="."?"workspace":i,r=t==="filesystem.read"?"Read file":t==="filesystem.write"?"Write file":t==="filesystem.list"?"List":t==="filesystem.exists"?"Check file":l(t);if(t!=="filesystem.read"&&t!=="filesystem.write")return`${r} ${n}${t==="filesystem.list"&&n!=="workspace"&&!n.endsWith("/")?"/":""}`;const c=`${r} ${n}`;return c.length<=s?c:`${c.slice(0,Math.max(0,s-3))}...`}function f(t,e){const s=t.replace(/^.*[\\/]/u,"").toLowerCase();if(s==="cmd"||s==="cmd.exe"){const i=e.findIndex(r=>/^\/(?:c|k)$/iu.test(r)),n=i<0?e:e.slice(i+1);if(n.length>0)return u(n)}if(s==="powershell"||s==="powershell.exe"||s==="pwsh"||s==="pwsh.exe"||s==="sh"||s==="bash"||s==="zsh"){const i=e.findIndex(r=>/^(?:-c|--command)$/iu.test(r)),n=i<0?e:e.slice(i+1);if(n.length>0)return u(n)}return[t,...e]}function p(t){const e=t.replace(/^.*[\\/]/u,"").toLowerCase();return e==="cmd"||e==="cmd.exe"||e==="powershell"||e==="powershell.exe"||e==="pwsh"||e==="pwsh.exe"||e==="sh"||e==="bash"||e==="zsh"}function u(t){if(t.length!==1)return t;const e=t[0]??"";return e.length>=2&&(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))?[e.slice(1,-1)]:t}function h(t){return t.replace(/Bearer\s+[^\s]+/giu,"Bearer [REDACTED]").replace(/sk-[A-Za-z0-9_-]{8,}/gu,"[REDACTED]")}function o(t){return t.split(/[_-]+/u).filter(Boolean).map(e=>`${e.slice(0,1).toUpperCase()}${e.slice(1)}`).join(" ")}export{w as formatFilesystemActivityName,a as formatMcpActivityName,d as formatShellCommandForDisplay,l as formatToolActivityName};
@@ -0,0 +1,19 @@
1
+ import type { AgentEvent, ToolExecutionContext } from '@lotagate/agent-sdk';
2
+ import type { HookDefinition } from '../../domain/extensions/hook-manifest.js';
3
+ export interface ToolHookRunner {
4
+ runEvent(hooks: readonly HookDefinition[], event: 'tool.before' | 'tool.after', context: ToolExecutionContext): Promise<number>;
5
+ }
6
+ export interface ToolHookLifecycleOptions {
7
+ runner: ToolHookRunner;
8
+ hooks: readonly HookDefinition[];
9
+ cwd: string;
10
+ workspaceRoot: string;
11
+ sessionId?: string;
12
+ signal?: AbortSignal;
13
+ maxResultBytes: number;
14
+ }
15
+ /**
16
+ * Applies CLI-owned tool lifecycle hooks at the Agent SDK event boundary.
17
+ * Keeping this adapter outside the SDK also covers both local and MCP tools.
18
+ */
19
+ export declare function runWithToolHooks(events: AsyncIterable<AgentEvent>, options: ToolHookLifecycleOptions): AsyncIterable<AgentEvent>;
@@ -0,0 +1 @@
1
+ async function*l(e,r){if(r.hooks.length===0){yield*e;return}let o=r.sessionId;const n=new Map;for await(const t of e){if(t.type==="session.started"){o=t.sessionId,yield t;continue}if(t.type==="tool.called"){const d=a(t,r,o),u=s(t.runId,t.toolName);n.set(u,[...n.get(u)??[],d]),await r.runner.runEvent(r.hooks,"tool.before",d),yield t;continue}if(t.type==="tool.completed"){const d=s(t.runId,t.toolName),u=i(n,d)??c(t,r,o);await r.runner.runEvent(r.hooks,"tool.after",u),yield t;continue}yield t}}function a(e,r,o){return{sessionId:o??e.runId,runId:e.runId,iteration:e.iteration,...r.signal===void 0?{}:{signal:r.signal},cwd:r.cwd,workspaceRoot:r.workspaceRoot,maxResultBytes:r.maxResultBytes,metadata:{toolName:e.toolName,parentRunId:e.runId,...e.source===void 0?{}:{source:e.source},...e.executorId===void 0?{}:{executorId:e.executorId},...e.serverId===void 0?{}:{serverId:e.serverId}}}}function c(e,r,o){return{sessionId:o??e.runId,runId:e.runId,iteration:0,...r.signal===void 0?{}:{signal:r.signal},cwd:r.cwd,workspaceRoot:r.workspaceRoot,maxResultBytes:r.maxResultBytes,metadata:{toolName:e.toolName,parentRunId:e.runId,...e.source===void 0?{}:{source:e.source},...e.executorId===void 0?{}:{executorId:e.executorId},...e.serverId===void 0?{}:{serverId:e.serverId},isError:e.isError}}}function i(e,r){const o=e.get(r);if(o===void 0||o.length===0)return;const[n,...t]=o;return t.length===0?e.delete(r):e.set(r,t),n}function s(e,r){return`${e}:${r}`}export{l as runWithToolHooks};
@@ -0,0 +1,20 @@
1
+ import { type AuthProfile } from '../../domain/auth/auth-profile.js';
2
+ import type { CredentialStore } from '../../ports/credential-store.js';
3
+ export interface LoginInput {
4
+ profileName: string;
5
+ baseUrl: string;
6
+ apiKey: string;
7
+ }
8
+ export declare class AuthenticationService {
9
+ private readonly store;
10
+ constructor(store: CredentialStore);
11
+ login(input: LoginInput): Promise<AuthProfile>;
12
+ requireCredential(profileName: string): Promise<{
13
+ profile: AuthProfile;
14
+ apiKey: string;
15
+ }>;
16
+ logout(profileName: string): Promise<boolean>;
17
+ list(): Promise<readonly AuthProfile[]>;
18
+ status(profileName: string): Promise<AuthProfile | undefined>;
19
+ static defaultProfileName(): string;
20
+ }
@@ -0,0 +1 @@
1
+ import{validateApiKey as i,validateBaseUrl as s,validateProfileName as r}from"../../domain/auth/auth-profile.js";import{CliError as n}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as l}from"../../domain/errors/error-codes.js";import{AUTH_LOGIN_HINT as c}from"../commands/command-hints.js";class p{store;constructor(t){this.store=t}async login(t){const e=r(t.profileName),o=new Date().toISOString(),a={name:e,baseUrl:s(t.baseUrl),credentialRef:`file:${e}`,createdAt:o,updatedAt:o};return await this.store.set({profile:a,apiKey:i(t.apiKey)}),a}async requireCredential(t){const e=await this.store.get(t);if(e===void 0)throw new n(l.AUTH_PROFILE_NOT_FOUND,`Profile not found: ${t}`,{category:"auth",userMessage:`Auth profile \`${t}\` was not found.`,hint:c});return e}async logout(t){return this.store.delete(r(t))}async list(){return this.store.list()}async status(t){return(await this.store.get(r(t)))?.profile}static defaultProfileName(){return process.env.LOTAGATE_PROFILE?.trim()||"default"}}export{p as AuthenticationService};
@@ -0,0 +1,12 @@
1
+ import type { ChatModelEvent, ChatModelPort } from '../../ports/chat-model.js';
2
+ import type { AttachmentPayload } from '../../domain/session/attachment.js';
3
+ export interface ChatStreamOptions {
4
+ reasoningEffort?: string;
5
+ signal?: AbortSignal;
6
+ attachments?: readonly AttachmentPayload[];
7
+ }
8
+ export declare class ChatService {
9
+ private readonly model;
10
+ constructor(model: ChatModelPort);
11
+ stream(modelName: string, prompt: string, options?: ChatStreamOptions): AsyncIterable<ChatModelEvent>;
12
+ }
@@ -0,0 +1 @@
1
+ import{AssistantDeltaNormalizer as s}from"../../domain/runtime/assistant-delta-normalizer.js";class c{model;constructor(t){this.model=t}async*stream(t,r,e={}){const i=new s;for await(const n of this.model.stream({model:t,prompt:r,...e.reasoningEffort===void 0?{}:{reasoningEffort:e.reasoningEffort},...e.signal===void 0?{}:{signal:e.signal},...e.attachments===void 0?{}:{attachments:e.attachments}})){if(n.type!=="delta"){yield n;continue}const a=i.normalize(n.content);a.length>0&&(yield{type:"delta",content:a})}}}export{c as ChatService};
@@ -0,0 +1,12 @@
1
+ import type { AttachmentPayload } from '../../domain/session/attachment.js';
2
+ export declare class PendingAttachmentStore {
3
+ private readonly items;
4
+ private sequence;
5
+ list(): readonly AttachmentPayload[];
6
+ get size(): number;
7
+ nextId(prefix?: string): string;
8
+ assertCanAdd(byteLength: number): void;
9
+ add(payload: AttachmentPayload): void;
10
+ remove(id: string): boolean;
11
+ clear(): void;
12
+ }
@@ -0,0 +1 @@
1
+ import{CliError as r}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as m}from"../../domain/errors/error-codes.js";import{RESOURCE_LIMITS as i}from"../../domain/runtime/resource-limits.js";class d{items=[];sequence=0;list(){return this.items}get size(){return this.items.length}nextId(e="image"){return this.sequence+=1,`${e}-${this.sequence}`}assertCanAdd(e){const t=this.items.reduce((s,n)=>s+n.bytes.byteLength,0);if(this.items.length>=i.pendingAttachments||t+e>i.pendingAttachmentTotalBytes)throw new r(m.ATTACHMENT_TOO_LARGE,"Pending attachment limits exceeded.",{category:"attachment",userMessage:"Too many or too-large attachments are pending. Remove an attachment and retry."})}add(e){this.assertCanAdd(e.bytes.byteLength),this.items.push(e)}remove(e){const t=this.items.findIndex(({attachment:s})=>s.id===e);return t<0?!1:(this.items.splice(t,1),!0)}clear(){this.items.splice(0,this.items.length)}}export{d as PendingAttachmentStore};
@@ -0,0 +1,23 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
3
+ import type { CommandInvocation } from './command-contract.js';
4
+ import type { CommandOutput } from './command-output.js';
5
+ import { type CommandActivityObserver } from './media-command-handlers.js';
6
+ import type { ExtensionScope } from '../../domain/extensions/extension-scope.js';
7
+ export interface ApplicationCommandHost {
8
+ readonly runtime: CliRuntime;
9
+ readonly cwd: string;
10
+ readonly output: CommandOutput;
11
+ readonly secrets?: Readonly<{
12
+ apiKey?: string;
13
+ }>;
14
+ readonly stdin?: Readable;
15
+ readonly writableOutput?: Writable;
16
+ readonly selectScope?: (title: string) => Promise<ExtensionScope | undefined>;
17
+ readonly resumeInteractive?: (sessionId: string) => Promise<number>;
18
+ readonly activity?: CommandActivityObserver;
19
+ readonly signal?: AbortSignal;
20
+ }
21
+ export declare function executeApplicationCommand(invocation: CommandInvocation, host: ApplicationCommandHost): Promise<number>;
22
+ /** Runs commands that do not require a runtime or any persistent CLI state. */
23
+ export declare function executeInformationalCommand(invocation: CommandInvocation, output: CommandOutput): number | undefined;
@@ -0,0 +1,3 @@
1
+ import{runAgentCommand as a}from"../protocol/jsonl-agent-command.js";import{runAuthCommand as t,runConfigCommand as o,runEffortCommand as m,runHookCommand as d,runMcpCommand as c,runModelCommand as l,runPluginCommand as p,runSkillCommand as s,runTrustCommand as f}from"./cli-command-services.js";import{formatCommandHelp as w}from"./command-presentation.js";import{COMMAND_REGISTRY as C}from"./command-runtime.js";import{runGoalCommand as y}from"./goal-command-handlers.js";import{runChatCommand as P,runExecCommand as g,runSessionCommand as x}from"./runtime-command-handlers.js";import{runMediaCommand as E}from"./media-command-handlers.js";import{runCompletionsCommand as S,runDoctorCommand as I,runInspectCommand as O,runUpdateCommand as b}from"./utility-commands.js";import{runMemoryCommand as M}from"./memory-command-handler.js";import{CLI_VERSION as $}from"../../version.js";const k={help:async(r,n)=>i(r,n.output),version:async(r,n)=>i(r,n.output),config:async(r,n)=>o(r.handlerPositionals,n.runtime.configLoader,n.cwd,n.output),auth:async(r,n)=>t(r.handlerPositionals,r.options,n.runtime,n.cwd,n.output,n.secrets?.apiKey),trust:async(r,n)=>f(r.handlerPositionals,n.runtime,n.cwd,n.output),inspect:async(r,n)=>O(n.runtime,n.cwd,n.output),hook:async(r,n)=>d(r.handlerPositionals,n.runtime,n.cwd,n.output),model:async(r,n)=>l(r.handlerPositionals,n.runtime,n.cwd,n.output),effort:async(r,n)=>m(r.handlerPositionals,n.runtime,n.cwd,n.output),mcp:async(r,n)=>c(r.handlerPositionals,r.options,n.runtime,n.cwd,n.output,u(n),n.signal),plugin:async(r,n)=>p(r.handlerPositionals,r.options,n.runtime,n.cwd,n.output,u(n),n.signal),skill:async(r,n)=>s(r.handlerPositionals,r.options,n.runtime,n.cwd,n.output,u(n),n.signal),session:async(r,n)=>x(r.handlerPositionals,r.options,n.runtime,n.cwd,n.output,n.resumeInteractive,n.signal),goal:async(r,n)=>{if(n.writableOutput===void 0)throw new Error("Goal commands require a writable terminal output.");return y(r.handlerPositionals,r.options,n.runtime,n.cwd,n.writableOutput,n.signal)},memory:async(r,n)=>M(r.handlerPositionals,r.options,n.runtime,n.cwd,n.output),doctor:async(r,n)=>I(n.runtime,n.cwd,n.output),chat:async(r,n)=>P(r.handlerPositionals,n.runtime,n.cwd,n.output,n.signal),exec:async(r,n)=>g(r.handlerPositionals,r.options,n.runtime,n.cwd,n.output,n.signal),media:async(r,n)=>E(r,n.runtime,n.cwd,n.output,n.activity,n.signal),agent:async(r,n)=>{if(n.stdin===void 0||n.writableOutput===void 0)throw new Error("The JSONL agent protocol requires stdin and a writable terminal output.");return a(r.handlerPositionals,n.runtime,n.cwd,n.stdin,n.writableOutput)},completions:async(r,n)=>S(r.handlerPositionals,n.output),update:async(r,n)=>b(r.handlerPositionals,n.runtime,n.cwd,n.output)};async function J(r,n){const e=k[r.action.executor];if(e===void 0)throw new Error(`Command ${r.action.id} requires a ${r.surface}-specific executor.`);return e(r,n)}function q(r,n){if(r.action.executor==="help")return n.write(`${w(C,r.surface)}
2
+ `),0;if(r.action.executor==="version")return n.write(`${$}
3
+ `),0}function i(r,n){const e=q(r,n);if(e===void 0)throw new Error(`Command ${r.action.id} is not informational.`);return e}function u(r){return r.selectScope===void 0?{}:{selectScope:r.selectScope}}export{J as executeApplicationCommand,q as executeInformationalCommand};
@@ -0,0 +1,6 @@
1
+ export declare function getFlag(flags: ReadonlyMap<string, string | boolean>, name: string): string | boolean | undefined;
2
+ export declare function isFlagEnabled(flags: ReadonlyMap<string, string | boolean>, name: string): boolean;
3
+ export declare function getStringFlag(flags: ReadonlyMap<string, string | boolean>, name: string): string | undefined;
4
+ export declare function requireStringFlag(flags: ReadonlyMap<string, string | boolean>, name: string): string;
5
+ export declare function getPositiveIntegerFlag(flags: ReadonlyMap<string, string | boolean>, name: string, maximum: number): number | undefined;
6
+ export declare function requirePositional(positionals: readonly string[], index: number, label: string): string;
@@ -0,0 +1 @@
1
+ import{CliError as u}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as o}from"../../domain/errors/error-codes.js";function s(r,e){return r.get(e)}function d(r,e){const t=r.get(e);return t===!0||t==="true"}function g(r,e){const t=s(r,e);return typeof t=="string"&&t.trim().length>0?t.trim():void 0}function c(r,e){const t=g(r,e);if(t===void 0)throw new u(o.MISSING_ARGUMENT,`Missing --${e}.`,{category:"arguments",userMessage:`Missing required option --${e}.`});return t}function l(r,e,t){const n=s(r,e);if(n===void 0)return;const i=typeof n=="string"&&/^\d+$/u.test(n)?Number(n):Number.NaN;if(!Number.isSafeInteger(i)||i<=0||i>t)throw new u(o.INVALID_ARGUMENT,`Invalid --${e}.`,{category:"arguments",userMessage:`--${e} must be a positive integer no greater than ${t}.`});return i}function p(r,e,t){const n=r[e];if(n===void 0||n.trim().length===0)throw new u(o.MISSING_ARGUMENT,`Missing ${t}.`,{category:"arguments",userMessage:`Missing required argument: ${t}.`});return n}export{s as getFlag,l as getPositiveIntegerFlag,g as getStringFlag,d as isFlagEnabled,p as requirePositional,c as requireStringFlag};
@@ -0,0 +1,17 @@
1
+ import { type ExtensionScope } from '../../domain/extensions/extension-scope.js';
2
+ import type { ConfigLoader } from '../../infrastructure/config/config-loader.js';
3
+ import type { createCompositionRoot } from '../../bootstrap/composition-root.js';
4
+ import type { CommandOutput } from './command-output.js';
5
+ export type CliRuntime = ReturnType<typeof createCompositionRoot>;
6
+ export interface CommandInteraction {
7
+ selectScope?: (title: string) => Promise<ExtensionScope | undefined>;
8
+ }
9
+ export declare function runConfigCommand(positionals: readonly string[], loader: ConfigLoader, cwd: string, output: CommandOutput): Promise<number>;
10
+ export declare function runAuthCommand(positionals: readonly string[], flags: ReadonlyMap<string, string | boolean>, runtime: CliRuntime, cwd: string, output: CommandOutput, desktopApiKey?: string): Promise<number>;
11
+ export declare function runTrustCommand(positionals: readonly string[], runtime: CliRuntime, cwd: string, output: CommandOutput): Promise<number>;
12
+ export declare function runModelCommand(positionals: readonly string[], runtime: CliRuntime, cwd: string, output: CommandOutput): Promise<number>;
13
+ export declare function runEffortCommand(positionals: readonly string[], runtime: CliRuntime, cwd: string, output: CommandOutput): Promise<number>;
14
+ export declare function runMcpCommand(positionals: readonly string[], flags: ReadonlyMap<string, string | boolean>, runtime: CliRuntime, cwd: string, output: CommandOutput, interaction?: CommandInteraction, signal?: AbortSignal): Promise<number>;
15
+ export declare function runPluginCommand(positionals: readonly string[], flags: ReadonlyMap<string, string | boolean>, runtime: CliRuntime, cwd: string, output: CommandOutput, interaction?: CommandInteraction, signal?: AbortSignal): Promise<number>;
16
+ export declare function runSkillCommand(positionals: readonly string[], flags: ReadonlyMap<string, string | boolean>, runtime: CliRuntime, cwd: string, output: CommandOutput, interaction?: CommandInteraction, signal?: AbortSignal): Promise<number>;
17
+ export declare function runHookCommand(positionals: readonly string[], runtime: CliRuntime, cwd: string, output: CommandOutput): Promise<number>;
@@ -0,0 +1,33 @@
1
+ import j from"node:path";import{AuthenticationService as D}from"../auth/authentication-service.js";import{CONFIGURABLE_KEYS as V,DEFAULT_CONFIG as B,REASONING_EFFORTS as H}from"../../domain/config/config-schema.js";import{requirePositional as S,getFlag as $,requireStringFlag as _}from"./cli-args.js";import{readSecret as Y}from"../../infrastructure/credentials/secret-input.js";import{getModelContextWindow as z}from"../../infrastructure/sdk/model-catalog-adapter.js";import{FileMcpConfigStore as F}from"../../infrastructure/extensions/file-mcp-config-store.js";import{McpRuntime as Q}from"../../infrastructure/extensions/mcp-runtime.js";import{PluginManager as G}from"../../infrastructure/extensions/plugin-manager.js";import{SkillManager as X}from"../../infrastructure/extensions/skill-manager.js";import{SkillInstaller as Z}from"../../infrastructure/extensions/skill-installer.js";import{resolveExtensionSource as ee}from"../../infrastructure/extensions/extension-source-resolver.js";import{resolveSkillRootScopes as te}from"../../infrastructure/extensions/skill-roots.js";import{CompositeMcpConfigStore as oe}from"../../infrastructure/extensions/composite-mcp-config-store.js";import{PluginContributionRegistry as x}from"../extensions/plugin-contribution-registry.js";import{parseExtensionScope as ne,requireExtensionScope as re}from"../../domain/extensions/extension-scope.js";import{CliError as P}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as C}from"../../domain/errors/error-codes.js";import{createHookListResult as J,createMcpListResult as ie,createPluginListResult as ae,createSkillListResult as se,formatExtensionList as v}from"../extensions/extension-list-formatters.js";import{writeExtensionListResult as E}from"../extensions/extension-list-output.js";import{HookRuntime as le}from"../../infrastructure/extensions/hook-runtime.js";import{ShellToolExecutor as ce}from"../../infrastructure/shell/shell-tool-executor.js";import{ToolPolicy as fe}from"@lotagate/agent-sdk";import{formatMcpDetails as de}from"../extensions/extension-list-formatters.js";import{loadExecutionConfig as W}from"../config/execution-config.js";import{redactLogText as K}from"../../infrastructure/logging/log-redactor.js";import{formatCompactTable as R}from"../formatting/compact-table.js";import{formatCompactNumber as pe}from"../formatting/compact-number.js";import{loadModelCatalog as ue}from"../model/model-catalog-service.js";import{describeInstalledPlugin as ge}from"../extensions/plugin-detail-service.js";import{throwIfCommandAborted as w}from"./command-cancellation.js";const we={empty:"No models are available.",maxWidth:160,columns:[{key:"name",header:"Name",width:52,minWidth:16},{key:"category",header:"Model category",width:16,minWidth:8},{key:"contextWindow",header:"Context window",width:14,minWidth:8},{key:"status",header:"Status",width:12,minWidth:6},{key:"detail",header:"Detail",minWidth:6}]};async function ze(s,r,e,o){const t=s[0]??"get";if(t==="path")return o.write(`${JSON.stringify({global:r.platformPaths.globalConfigFile,project:j.join(e,".lotagate")},null,2)}
2
+ `),0;if(t==="get"){const l=await r.load(e),n=s[1];return o.write(`${JSON.stringify(n===void 0?l.config:l.config[n]??null,null,2)}
3
+ `),0}if(t==="set"){const l=S(s,1,"config key");if(!V.includes(l))throw new P(C.INVALID_ARGUMENT,`Unsupported config key: ${l}`,{category:"arguments",userMessage:`Unsupported configuration key: ${l}.`});return await r.setGlobal(l,ye(S(s,2,"config value"))),0}throw new Error(`Unsupported config action: ${t}`)}async function Qe(s,r,e,o,t,l){const n=s[0]??"status",p=await e.configLoader.load(o,{includeProject:!1}),g=p.config.profile??D.defaultProfileName();if(n==="login"){const i=String($(r,"profile")??g),a=String($(r,"base-url")??p.config.baseUrl??B.baseUrl),d=await e.auth.login({profileName:i,baseUrl:a,apiKey:l??await Y("LotaGate API key: ")});return await e.configLoader.setGlobal("profile",d.name),t.write(`Logged in profile: ${d.name}
4
+ `),0}if(n==="list"){const i=await e.auth.list();return t.write(`${R(i.map(a=>({name:a.name,status:a.name===g?"ACTIVE":"READY",detail:K(a.baseUrl)})),{empty:"No authentication profiles."})}
5
+ `),0}if(n==="status"){const i=await e.credentialStore.get(g);return t.write(`${JSON.stringify(i===void 0?{authenticated:!1,profile:g}:{authenticated:!0,profile:i.profile.name,baseUrl:i.profile.baseUrl,credentialRef:i.profile.credentialRef},null,2)}
6
+ `),0}if(n==="logout"){const i=s[1]??g,a=await e.auth.logout(i);return t.write(`${a?`Logged out profile: ${i}`:`Profile not found: ${i}`}
7
+ `),a?0:1}if(n==="use"){const i=S(s,1,"profile name");return await e.auth.requireCredential(i),await e.configLoader.setGlobal("profile",i),t.write(`Active profile: ${i}
8
+ `),0}throw new Error(`Unsupported auth action: ${n}`)}async function Xe(s,r,e,o){const t=s[0]??"status";if(t==="list")return o.write(`${R((await r.projectTrust.list()).map(n=>({name:n.canonicalPath,status:"TRUSTED",detail:n.fingerprint})),{empty:"No trusted projects."})}
9
+ `),0;const l=await r.projectTrust.inspect(e);if(t==="status")return o.write(`${JSON.stringify({...l,trusted:await r.projectTrust.isTrusted(l)},null,2)}
10
+ `),0;if(t==="grant")return await r.projectTrust.grant(l),await r.workspaceSettings.ensureInitialized(l.canonicalPath),o.write(`Trusted project: ${l.canonicalPath}
11
+ `),0;if(t==="revoke"){const n=await r.projectTrust.revoke(l);return o.write(`${n?`Revoked project: ${l.canonicalPath}`:"Project was not trusted."}
12
+ `),n?0:1}throw new Error(`Unsupported trust action: ${t}`)}async function Ze(s,r,e,o){const t=s[0]??"current",l=await W(r,e);if(t==="current")return o.write(`${JSON.stringify({model:l.config.model,profile:l.config.profile},null,2)}
13
+ `),0;if(t==="use"){const n=S(s,1,"model id");return await r.configLoader.setGlobal("model",n),o.write(`Active model: ${n}
14
+ `),0}if(t==="list"||t==="refresh"){const n=await ue(r,e,t==="refresh");return o.write(`${R(n.data.map(p=>({name:typeof p.display_name=="string"?p.display_name:p.id,status:p.id===l.config.model?"ACTIVE":"AVAILABLE",...typeof p.owned_by=="string"?{detail:p.owned_by}:{},values:{category:typeof p.model_category=="string"?p.model_category:"-",contextWindow:me(p)}})),we)}
15
+ `),0}if(t==="doctor"){const n=l.config.profile??D.defaultProfileName(),p=await r.auth.status(n);return o.write(`${JSON.stringify({profile:n,authenticated:p!==void 0,model:l.config.model,baseUrl:p?.baseUrl??l.config.baseUrl},null,2)}
16
+ `),0}throw new Error(`Unsupported model action: ${t}`)}async function et(s,r,e,o){const t=s[0]??"current",l=await W(r,e);if(t==="current")return o.write(`${JSON.stringify({effort:l.config.effort},null,2)}
17
+ `),0;if(t==="use"){const n=S(s,1,"effort");if(!H.includes(n))throw new Error(`Unsupported reasoning effort: ${n}`);return await r.configLoader.setGlobal("effort",n),o.write(`Active effort: ${n}
18
+ `),0}throw new Error(`Unsupported effort action: ${t}`)}function me(s){const r=z(s);return r===void 0?"-":pe(r)}async function tt(s,r,e,o,t,l={},n){w(n);const p=F.forScope(o,e.paths.globalConfigDir,"project"),g=F.forScope(o,e.paths.globalConfigDir,"user"),i=s[0]??"list";if(i==="list"){const c=await e.projectTrust.inspect(o),h=await e.projectTrust.isTrusted(c),f=await new x(e.paths.globalConfigDir).resolve(o,h),m=ie([{scope:"user",config:await g.list()},{scope:"project",config:await p.list()},...h&&Object.keys(f.mcpConfig).length>0?[{scope:"plugin",config:f.mcpConfig,sourceNames:Object.fromEntries(f.mcpContributions.map(b=>[b.qualifiedName,b.sourceName])),pluginNames:Object.fromEntries(f.mcpContributions.map(b=>[b.qualifiedName,b.pluginName]))}]:[]]);return E(t,m,v(m)),0}if(i==="reload"||i==="doctor"){w(n),i==="reload"&&await e.mcpRuntime.invalidate(o);const c=new Q(()=>new oe([g,p]));try{const h=await e.projectTrust.inspect(o),f=await c.connectConfigured(o,await e.projectTrust.isTrusted(h));return w(n),t.write(`${R(f.map(({serverId:m,status:b,protocolEra:T,protocolVersion:N,error:M})=>({name:m,status:b==="connected"?"OK":b.toUpperCase(),detail:M===void 0?[T,N].filter(Boolean).join(" \xB7 "):K(M.message)})),{empty:"No MCP servers configured."})}
19
+ `),f.some(m=>m.status==="failed")?1:0}finally{await c.close()}}const a=S(s,1,"MCP server name"),d=await U(r,l,"MCP server scope",!0);if(d===void 0)throw new Error("MCP server scope was not selected.");const u={store:d==="project"?p:g,scope:d},y=u.store;if(i==="get"){const c=await y.get(a);return t.write(`${de(a,u.scope,c)}
20
+ `),0}if(i==="remove"){w(n),await k(e,o,u.scope);const c=await y.remove(a);return c&&await e.mcpRuntime.invalidate(o),e.logger.info("MCP server removal completed.",{name:a,scope:u.scope,removed:c}),t.write(`${c?`Removed MCP server: ${a}`:`MCP server not found: ${a}`}
21
+ `),c?0:1}if(i==="enable"||i==="disable")return w(n),await k(e,o,u.scope),await y.setEnabled(a,i==="enable"),await e.mcpRuntime.invalidate(o),e.logger.info("MCP server state changed.",{name:a,scope:u.scope,enabled:i==="enable"}),t.write(`${i==="enable"?"Enabled":"Disabled"} MCP server: ${a}
22
+ `),0;if(i==="add"){w(n),await k(e,o,d??"project");const c=String($(r,"type")??"stdio");if(c==="stdio"){const h=_(r,"command"),f=$(r,"args");await y.add(a,{type:"stdio",command:h,...typeof f=="string"?{args:f.split(",").map(m=>m.trim()).filter(Boolean)}:{}})}else if(c==="http"||c==="sse")await y.add(a,{type:c,url:_(r,"url")});else throw new P(C.INVALID_ARGUMENT,`Unsupported MCP type: ${c}`,{category:"arguments",userMessage:"MCP type must be stdio, http, or sse."});return w(n),await e.mcpRuntime.invalidate(o),e.logger.info("MCP server added.",{name:a,scope:d??"project",type:c}),t.write(`Added MCP server successfully: ${a}
23
+ `),0}throw new Error(`Unsupported MCP action: ${i}`)}async function ot(s,r,e,o,t,l={},n){w(n);const p=new G(e.paths.pluginsDir),g=new G(j.join(j.resolve(o),".lotagate","plugins")),i=s[0]??"list";if(i==="list"){const f=ae([{scope:"user",plugins:await p.list(void 0,{verifyIntegrity:!1})},{scope:"project",plugins:await g.list(void 0,{verifyIntegrity:!1})}]);return E(t,f,v(f)),0}if(i==="install"){const f=S(s,1,"plugin or skill source"),m=await U(r,l,"Plugin installation scope",!0);if(m===void 0)throw new Error("Plugin installation scope was not selected.");await k(e,o,m);const b=$(r,"sha256"),T=$(r,"signature"),N=$(r,"public-key"),M=m==="project"?g:p,q=m==="project"?j.join(j.resolve(o),".lotagate","skills"):e.paths.skillsDir,O=await ee(f,e.platform,n);try{w(n);const A={...typeof b=="string"?{sha256:b}:{},...typeof T=="string"?{signature:T}:{},...typeof N=="string"?{publicKeyPem:N}:{}},L=await new Z().install(O.directory,q,A);if(L!==void 0)return w(n),e.logger.info("Skill installed.",{name:L.manifest.name,scope:m}),t.write(`Added skill successfully: ${L.manifest.name}
24
+ `),0;const I=await M.install(O.directory,A);return w(n),e.logger.info("Plugin installed.",{name:I.manifest.name,scope:m}),t.write(`Added plugin successfully: ${I.manifest.name}
25
+ `),0}finally{await O.cleanup()}}const a=S(s,1,"plugin name"),d=await U(r,l,"Plugin scope",!0);if(d===void 0)throw new Error("Plugin scope was not selected.");const u={manager:d==="project"?g:p,scope:d},y=u.manager,h=(await y.list(void 0,{verifyIntegrity:!1})).find(f=>f.manifest.name===a);if(h===void 0)throw new P(C.PLUGIN_NOT_FOUND,`Plugin not found: ${a}`,{category:"extension",userMessage:`Plugin not found: ${a}.`});if(i==="info"){const f=await ge(h,d);return t.writeStructured===void 0?t.write(`${JSON.stringify(f,null,2)}
26
+ `):t.writeStructured(f,`${JSON.stringify(f,null,2)}
27
+ `),0}if(i==="enable"||i==="disable")return w(n),await k(e,o,u.scope),await y.setEnabled(a,i==="enable"),e.logger.info("Plugin state changed.",{name:a,scope:u.scope,enabled:i==="enable"}),t.write(`${i==="enable"?"Enabled":"Disabled"} plugin: ${a}
28
+ `),0;if(i==="uninstall"){w(n),await k(e,o,u.scope);const f=await y.uninstall(a);return e.logger.info("Plugin uninstallation completed.",{name:a,scope:u.scope,removed:f}),t.write(`${f?`Uninstalled plugin: ${a}`:`Plugin not found: ${a}`}
29
+ `),f?0:1}throw new Error(`Unsupported plugin action: ${i}`)}async function U(s,r,e,o){const t=ne($(s,"scope"));if(t!==void 0)return t;const l=r.selectScope===void 0?void 0:await r.selectScope(e);return l!==void 0?l:o?re(void 0):void 0}async function k(s,r,e){if(e!=="project")return;const o=await s.projectTrust.inspect(r);if(!await s.projectTrust.isTrusted(o))throw new P(C.PROJECT_TRUST_REQUIRED,"Project scope requires trust.",{category:"project",userMessage:"Trust the project before writing project-scoped extensions."})}async function nt(s,r,e,o,t,l={},n){w(n);const p=await e.projectTrust.inspect(o),g=await new x(e.paths.globalConfigDir).resolve(o,await e.projectTrust.isTrusted(p)),i=te(o,e.paths.globalConfigDir,g.skillRoots),a=new X(j.join(e.paths.globalConfigDir,"skills-state.json")),d=s[0]??"list";if(d==="list"){const f=se(await a.listScoped(i,{includeShadowed:!0}));return E(t,f,v(f)),0}const u=S(s,1,"skill name"),y=await U(r,l,"Skill scope",!0);if(y===void 0)throw new Error("Skill scope was not selected.");const c=(await a.listScoped(i,{includeShadowed:!0})).find(f=>f.skillKey===u&&f.scope===y);if(c===void 0)throw new P(C.SKILL_NOT_FOUND,`Skill not found: ${u}`,{category:"extension",userMessage:`Skill not found: ${u}.`});if(d==="remove"&&c.scope!=="user"&&c.scope!=="project")throw new P(C.INVALID_ARGUMENT,`Skill cannot be removed from the ${c.scope} scope: ${u}`,{category:"arguments",userMessage:"Only user- and project-scoped skills can be removed."});const h=c.scope==="project";if((d==="remove"||d==="enable"||d==="disable")&&await k(e,o,h?"project":"user"),d==="info")return t.write(`${JSON.stringify(he(c),null,2)}
30
+ `),0;if(d==="enable"||d==="disable")return w(n),await a.setEnabled(c.skillKey,d==="enable",c.statePath),e.logger.info("Skill state changed.",{name:u,scope:c.scope,enabled:d==="enable"}),t.write(`${d==="enable"?"Enabled":"Disabled"} skill: ${u}
31
+ `),0;if(d==="remove"){w(n);const f=await a.remove(c.skillKey,c.root,c.statePath);return e.logger.info("Skill removal completed.",{name:u,scope:c.scope,removed:f}),t.write(`${f?`Removed skill: ${u}`:`Skill not found: ${u}`}
32
+ `),f?0:1}if(d==="run"){if(!c.enabled)throw new P(C.SKILL_NOT_FOUND,`Skill is disabled: ${u}`,{category:"extension",userMessage:`Skill is disabled: ${u}.`});return t.write(`${c.body}
33
+ `),0}throw new Error(`Unsupported skill action: ${d}`)}async function rt(s,r,e,o){const t=s[0]??"list";if(t!=="list")throw new Error(`Unsupported hook action: ${t}`);const l=await r.projectTrust.inspect(e);if(!await r.projectTrust.isTrusted(l)){const a=J([]);return E(o,a,v(a)),0}const n=new le(new ce({platform:r.platform}),{trustedProject:!0,enabled:!0,toolPolicy:new fe}),p=await new x(r.paths.globalConfigDir).resolve(e,!0),g=[...await n.loadProject(l.canonicalPath)];for(const a of p.plugins)g.push(...await n.load(a));const i=J(g);return E(o,i,v(i)),0}function ye(s){return s==="true"?!0:s==="false"?!1:s==="null"?null:s}function he(s){const{root:r,statePath:e,...o}=s;return o}export{Qe as runAuthCommand,ze as runConfigCommand,et as runEffortCommand,rt as runHookCommand,tt as runMcpCommand,Ze as runModelCommand,ot as runPluginCommand,nt as runSkillCommand,Xe as runTrustCommand};
@@ -0,0 +1,6 @@
1
+ /** Links a command-owned controller to the host lifecycle without leaking listeners. */
2
+ export declare function createCommandAbortController(parent?: AbortSignal): {
3
+ controller: AbortController;
4
+ dispose: () => void;
5
+ };
6
+ export declare function throwIfCommandAborted(signal?: AbortSignal): void;
@@ -0,0 +1 @@
1
+ function t(o){const e=new AbortController,r=()=>e.abort(o?.reason);return o?.aborted===!0?r():o?.addEventListener("abort",r,{once:!0}),{controller:e,dispose:()=>o?.removeEventListener("abort",r)}}function n(o){if(o?.aborted===!0)throw o.reason??new Error("Command cancelled.")}export{t as createCommandAbortController,n as throwIfCommandAborted};
@@ -0,0 +1,6 @@
1
+ import type { CommandActionSpec } from './command-contract.js';
2
+ /**
3
+ * Executable command contract for every public direct and slash command.
4
+ * Presentation layers consume this catalog; application handlers remain separate.
5
+ */
6
+ export declare const COMMAND_ACTIONS: readonly CommandActionSpec[];
@@ -0,0 +1 @@
1
+ const e=["direct","tui"],r=["direct"],a=["tui"],s={name:"scope",valueName:"<user|project>",description:"Extension scope",allowedValues:["user","project"],requiredOn:r},u=[{name:"token-budget",valueName:"<n>",description:"Maximum token budget"},{name:"max-turns",valueName:"<n>",description:"Maximum goal turns"},{name:"max-duration-ms",valueName:"<n>",description:"Maximum goal duration"}],o={name:"model",valueName:"<model-id>",description:"Use this model for this request only"},i=[{name:"out",valueName:"<filename>",description:"Output filename without extension"},{name:"out-dir",valueName:"<directory>",description:"Local output directory, inside or outside the workspace"},{name:"force",description:"Allow --out to replace an existing generated file"}],n=[o,{name:"n",valueName:"<count>",description:"Number of images"},{name:"size",valueName:"<size>",description:"Requested image size"},{name:"quality",valueName:"<low|medium|high|auto>",description:"Image quality",allowedValues:["low","medium","high","auto"]},{name:"background",valueName:"<transparent|opaque|auto>",description:"Image background",allowedValues:["transparent","opaque","auto"]},{name:"output-format",valueName:"<png|jpeg|webp>",description:"Image output format",allowedValues:["png","jpeg","webp"]},{name:"output-compression",valueName:"<0-100>",description:"Image output compression"},{name:"moderation",valueName:"<mode>",description:"Image moderation mode"},{name:"user",valueName:"<id>",description:"End-user identifier"},...i],m={name:"kind",valueName:"<kind>",description:"Memory kind"};function d(t){return t}const c=[{id:"help",path:["help"],surfaces:e,summary:"Show available commands",executor:"help"},{id:"version",path:["version"],surfaces:e,summary:"Show the CLI version",executor:"version"},{id:"config.get.default",path:["config"],handlerPath:["get"],surfaces:e,summary:"Read effective configuration",arguments:[{name:"key",required:!1}],executor:"config",defaultAction:!0,hiddenFromHelp:!0},{id:"config.get",path:["config","get"],handlerPath:["get"],surfaces:e,summary:"Read effective configuration",arguments:[{name:"key",required:!1}],executor:"config"},{id:"config.set",path:["config","set"],handlerPath:["set"],surfaces:e,summary:"Update global configuration",arguments:[{name:"key",required:!0},{name:"value",required:!0}],executor:"config"},{id:"config.path",path:["config","path"],handlerPath:["path"],surfaces:e,summary:"Show configuration paths",executor:"config"},{id:"auth.status.default",path:["auth"],handlerPath:["status"],surfaces:e,summary:"Show authentication status",executor:"auth",defaultAction:!0,hiddenFromHelp:!0},{id:"auth.login.direct",path:["auth","login"],handlerPath:["login"],surfaces:r,summary:"Save an API-key profile",options:[{name:"profile",valueName:"<name>",description:"Profile name"},{name:"base-url",valueName:"<url>",description:"Provider base URL"}],executor:"auth",desktop:{exposed:!0}},{id:"auth.login.tui",path:["auth","login"],handlerPath:["login"],surfaces:a,summary:"Save an API-key profile",options:[{name:"profile",valueName:"<name>",description:"Profile name"},{name:"base-url",valueName:"<url>",description:"Provider base URL"}],executor:"tui-auth-login"},{id:"auth.logout",path:["auth","logout"],handlerPath:["logout"],surfaces:e,summary:"Remove an API-key profile",arguments:[{name:"profile",required:!1}],executor:"auth"},{id:"auth.list",path:["auth","list"],handlerPath:["list"],surfaces:e,summary:"List authentication profiles",executor:"auth"},{id:"auth.status",path:["auth","status"],handlerPath:["status"],surfaces:e,summary:"Show authentication status",executor:"auth"},{id:"auth.use",path:["auth","use"],handlerPath:["use"],surfaces:e,summary:"Select an authentication profile",arguments:[{name:"profile",required:!0}],executor:"auth"},{id:"model.current.direct",path:["model"],handlerPath:["current"],surfaces:r,summary:"Show the selected model",executor:"model",defaultAction:!0,hiddenFromHelp:!0},{id:"model.select.tui",path:["model"],surfaces:a,summary:"Select a model",executor:"tui-model-select",defaultAction:!0,hiddenFromHelp:!0},{id:"model.current",path:["model","current"],handlerPath:["current"],surfaces:e,summary:"Show the selected model",executor:"model"},{id:"model.use",path:["model","use"],handlerPath:["use"],surfaces:e,summary:"Select a model",arguments:[{name:"model",required:!0}],executor:"model"},{id:"model.list",path:["model","list"],handlerPath:["list"],surfaces:e,summary:"Fetch the model catalog",executor:"model"},{id:"model.refresh",path:["model","refresh"],handlerPath:["refresh"],surfaces:e,summary:"Refresh the model catalog",executor:"model"},{id:"model.doctor",path:["model","doctor"],handlerPath:["doctor"],surfaces:e,summary:"Inspect model configuration",executor:"model"},{id:"effort.current.direct",path:["effort"],handlerPath:["current"],surfaces:r,summary:"Show the selected reasoning effort",executor:"effort",defaultAction:!0,hiddenFromHelp:!0},{id:"effort.select.tui",path:["effort"],surfaces:a,summary:"Select a reasoning effort",executor:"tui-effort-select",defaultAction:!0,hiddenFromHelp:!0},{id:"effort.current",path:["effort","current"],handlerPath:["current"],surfaces:e,summary:"Show the selected reasoning effort",executor:"effort"},{id:"effort.use",path:["effort","use"],handlerPath:["use"],surfaces:e,summary:"Select a reasoning effort",arguments:[{name:"effort",required:!0}],executor:"effort"},{id:"trust.status.default",path:["trust"],handlerPath:["status"],surfaces:e,summary:"Show current project trust",executor:"trust",defaultAction:!0,hiddenFromHelp:!0},{id:"trust.status",path:["trust","status"],handlerPath:["status"],surfaces:e,summary:"Show current project trust",executor:"trust"},{id:"trust.list",path:["trust","list"],handlerPath:["list"],surfaces:e,summary:"List trusted projects",executor:"trust"},{id:"trust.grant",path:["trust","grant"],handlerPath:["grant"],surfaces:e,summary:"Trust the current project",executor:"trust"},{id:"trust.revoke",path:["trust","revoke"],handlerPath:["revoke"],surfaces:e,summary:"Revoke current project trust",executor:"trust"},{id:"inspect",path:["inspect"],surfaces:e,summary:"Inspect current project identity",executor:"inspect"},{id:"hook.list.default",path:["hook"],handlerPath:["list"],surfaces:e,summary:"List project and plugin hooks",executor:"hook",defaultAction:!0,hiddenFromHelp:!0},{id:"hook.list",path:["hook","list"],handlerPath:["list"],surfaces:e,summary:"List project and plugin hooks",executor:"hook"},{id:"mcp.list.default",path:["mcp"],surfaces:e,summary:"List configured MCP servers",executor:"mcp",defaultAction:!0,hiddenFromHelp:!0},{id:"mcp.list",path:["mcp","list"],handlerPath:["list"],surfaces:e,summary:"List configured MCP servers",executor:"mcp"},{id:"mcp.get",path:["mcp","get"],handlerPath:["get"],surfaces:e,summary:"Inspect an MCP server",arguments:[{name:"name",required:!0}],options:[s],executor:"mcp"},{id:"mcp.add",path:["mcp","add"],handlerPath:["add"],surfaces:e,summary:"Add an MCP server",arguments:[{name:"name",required:!0}],options:[{name:"type",valueName:"<stdio|http|sse>",description:"MCP transport type (defaults to stdio)",allowedValues:["stdio","http","sse"]},{name:"command",valueName:"<command>",description:"stdio command",requiredWhen:{option:"type",values:["stdio"],absent:!0}},{name:"url",valueName:"<url>",description:"HTTP or SSE URL",requiredWhen:{option:"type",values:["http","sse"]}},{name:"args",valueName:"<a,b>",description:"Comma-separated stdio arguments"},s],executor:"mcp",desktop:{mutationKey:"mcp"}},{id:"mcp.reload",path:["mcp","reload"],handlerPath:["reload"],surfaces:e,summary:"Reconnect configured MCP servers",executor:"mcp",desktop:{mutationKey:"mcp"}},{id:"mcp.doctor",path:["mcp","doctor"],handlerPath:["doctor"],surfaces:e,summary:"Validate MCP servers",executor:"mcp"},...["enable","disable","remove"].map(t=>({id:`mcp.${t}`,path:["mcp",t],handlerPath:[t],surfaces:e,summary:`${t[0].toUpperCase()}${t.slice(1)} an MCP server`,arguments:[{name:"name",required:!0}],options:[s],executor:"mcp",desktop:{mutationKey:"mcp"}})),{id:"plugin.list.default",path:["plugin"],surfaces:e,summary:"List installed plugins",executor:"plugin",defaultAction:!0,hiddenFromHelp:!0},{id:"plugin.list",path:["plugin","list"],handlerPath:["list"],surfaces:e,summary:"List installed plugins",executor:"plugin"},{id:"plugin.info",path:["plugin","info"],handlerPath:["info"],surfaces:e,summary:"Inspect a plugin and its contributions",executor:"plugin",arguments:[{name:"name",required:!0}],options:[s]},{id:"plugin.install",path:["plugin","install"],handlerPath:["install"],surfaces:e,summary:"Install a plugin or standalone skill",arguments:[{name:"source",required:!0}],options:[s,{name:"sha256",valueName:"<hex>",description:"Expected archive checksum"},{name:"signature",valueName:"<base64>",description:"Archive signature"},{name:"public-key",valueName:"<pem>",description:"Signature public key"}],executor:"plugin",desktop:{mutationKey:"extensions"}},...["enable","disable","uninstall"].map(t=>({id:`plugin.${t}`,path:["plugin",t],handlerPath:[t],surfaces:e,summary:`${t[0].toUpperCase()}${t.slice(1)} a plugin`,arguments:[{name:"name",required:!0}],options:[s],executor:"plugin",desktop:{mutationKey:"extensions"}})),{id:"skill.list.default",path:["skill"],surfaces:e,summary:"List available skills",executor:"skill",defaultAction:!0,hiddenFromHelp:!0},{id:"skill.list",path:["skill","list"],handlerPath:["list"],surfaces:e,summary:"List available skills",executor:"skill"},...["info","enable","disable","remove"].map(t=>({id:`skill.${t}`,path:["skill",t],handlerPath:[t],surfaces:e,summary:`${t[0].toUpperCase()}${t.slice(1)} a skill`,arguments:[{name:"name",required:!0}],options:[s],executor:"skill",...t==="info"?{}:{desktop:{mutationKey:"extensions"}}})),{id:"skill.run.direct",path:["skill","run"],handlerPath:["run"],surfaces:r,summary:"Print an enabled skill prompt",arguments:[{name:"name",required:!0}],options:[s],executor:"skill"},{id:"skill.run.tui",path:["skill","run"],surfaces:a,summary:"Run an enabled skill",arguments:[{name:"name",required:!0},{name:"arguments",required:!1,variadic:!0}],options:[s],executor:"tui-skill-run"},{id:"session.list.default",path:["session"],surfaces:e,summary:"List durable sessions",executor:"session",defaultAction:!0,hiddenFromHelp:!0},{id:"session.list",path:["session","list"],handlerPath:["list"],surfaces:e,summary:"List durable sessions",executor:"session"},{id:"session.show",path:["session","show"],handlerPath:["show"],surfaces:e,summary:"Show a session transcript",arguments:[{name:"id",required:!0}],executor:"session"},{id:"session.import",path:["session","import"],handlerPath:["import"],surfaces:e,summary:"Import a session bundle",options:[{name:"file",valueName:"<path>",description:"Session bundle path",required:!0}],executor:"session"},{id:"session.resume.direct",path:["session","resume"],handlerPath:["resume"],surfaces:r,summary:"Inspect or resume a session",arguments:[{name:"id",required:!0}],options:[{name:"interactive",description:"Open the session in the TUI"}],executor:"session"},{id:"session.resume.tui",path:["session","resume"],surfaces:a,summary:"Resume a session in this TUI",arguments:[{name:"id",required:!0}],executor:"tui-session-resume"},{id:"session.fork",path:["session","fork"],handlerPath:["fork"],surfaces:e,summary:"Fork a session",arguments:[{name:"id",required:!0}],executor:"session"},{id:"session.compact.direct",path:["session","compact"],handlerPath:["compact"],surfaces:r,summary:"Compact a session",arguments:[{name:"id",required:!0}],executor:"session"},{id:"session.compact.tui",path:["session","compact"],surfaces:a,summary:"Compact the active session",executor:"tui-session-compact"},{id:"session.export",path:["session","export"],handlerPath:["export"],surfaces:e,summary:"Export a session bundle",arguments:[{name:"id",required:!0}],options:[{name:"out",valueName:"<path>",description:"Output path"}],executor:"session"},...["recover","repair","delete"].map(t=>({id:`session.${t}`,path:["session",t],handlerPath:[t],surfaces:e,summary:`${t[0].toUpperCase()}${t.slice(1)} a session`,arguments:[{name:"id",required:!0}],executor:"session",...t==="delete"?{desktop:{mutationKey:"session"}}:{}})),{id:"session.rename",path:["session","rename"],surfaces:a,summary:"Rename the active session",arguments:[{name:"name",required:!0,variadic:!0}],executor:"tui-session-rename"},{id:"memory.list.default",path:["memory"],handlerPath:["list"],surfaces:e,summary:"List project memories",options:[m,{name:"state",valueName:"<active|superseded|expired>",description:"Memory lifecycle state",allowedValues:["active","superseded","expired"]}],executor:"memory",defaultAction:!0,hiddenFromHelp:!0},{id:"memory.list",path:["memory","list"],handlerPath:["list"],surfaces:e,summary:"List project memories",options:[m,{name:"state",valueName:"<active|superseded|expired>",description:"Memory lifecycle state",allowedValues:["active","superseded","expired"]}],executor:"memory"},{id:"memory.show",path:["memory","show"],handlerPath:["show"],surfaces:e,summary:"Show a project memory",arguments:[{name:"id",required:!0}],executor:"memory"},{id:"memory.forget",path:["memory","forget"],handlerPath:["forget"],surfaces:e,summary:"Forget a project memory",arguments:[{name:"id",required:!0}],executor:"memory"},{id:"memory.clear",path:["memory","clear"],handlerPath:["clear"],surfaces:e,summary:"Clear project memory",executor:"memory"},{id:"memory.export",path:["memory","export"],handlerPath:["export"],surfaces:e,summary:"Export project memory",options:[{name:"out",valueName:"<path>",description:"Output bundle path"}],executor:"memory"},{id:"memory.import",path:["memory","import"],handlerPath:["import"],surfaces:e,summary:"Validate or import a project memory bundle",options:[{name:"file",valueName:"<path>",description:"Memory bundle path",required:!0},{name:"apply",description:"Apply the validated import"}],executor:"memory"},{id:"goal.status.direct",path:["goal","status"],handlerPath:["status"],surfaces:r,summary:"Show a session goal",arguments:[{name:"id",required:!0}],options:[{name:"json",description:"Use JSON output"}],executor:"goal"},{id:"goal.set",path:["goal","set"],handlerPath:["set"],surfaces:r,summary:"Set a session goal",arguments:[{name:"id",required:!0},{name:"objective",required:!0,variadic:!0}],options:[...u,{name:"json",description:"Use JSON output"}],executor:"goal"},{id:"goal.pause.direct",path:["goal","pause"],handlerPath:["pause"],surfaces:r,summary:"Pause a session goal",arguments:[{name:"id",required:!0}],options:[{name:"json",description:"Use JSON output"}],executor:"goal"},{id:"goal.resume.direct",path:["goal","resume"],handlerPath:["resume"],surfaces:r,summary:"Resume a session goal",arguments:[{name:"id",required:!0}],options:[...u,{name:"json",description:"Use JSON output"}],executor:"goal"},{id:"goal.clear.direct",path:["goal","clear"],handlerPath:["clear"],surfaces:r,summary:"Clear a session goal",arguments:[{name:"id",required:!0}],executor:"goal"},{id:"goal.run",path:["goal","run"],handlerPath:["run"],surfaces:r,summary:"Run a durable multi-turn goal",arguments:[{name:"objective",required:!0,variadic:!0}],options:u,executor:"goal"},...["status","pause","resume","clear"].map(t=>({id:`goal.${t}.tui`,path:["goal",t],surfaces:a,summary:`${t[0].toUpperCase()}${t.slice(1)} the active goal`,executor:"tui-goal"})),{id:"goal.start.tui",path:["goal"],surfaces:a,summary:"Start a goal for the active session",arguments:[{name:"objective",required:!0,variadic:!0}],options:u,executor:"tui-goal",defaultAction:!0,hiddenFromHelp:!0},{id:"doctor",path:["doctor"],surfaces:e,summary:"Run local diagnostics",executor:"doctor"},{id:"chat.direct",path:["chat"],surfaces:r,summary:"Stream a chat completion",arguments:[{name:"prompt",required:!1,variadic:!0}],executor:"chat"},{id:"chat.tui",path:["chat"],surfaces:a,summary:"Send an interactive chat prompt",arguments:[{name:"prompt",required:!0,variadic:!0}],executor:"tui-prompt"},{id:"image.generate",path:["image"],surfaces:e,summary:"Generate image artifacts",arguments:[{name:"prompt",required:!0,variadic:!0}],options:n,executor:"media"},{id:"image.edit",path:["image","edit"],handlerPath:["edit"],surfaces:e,summary:"Edit image artifacts",arguments:[{name:"prompt",required:!0,variadic:!0}],options:[...n,{name:"image",valueName:"<path[,path]>",description:"Source local image files",required:!0},{name:"mask",valueName:"<path>",description:"Optional local mask image"},{name:"input-fidelity",valueName:"<low|high>",description:"Input image fidelity",allowedValues:["low","high"]}],executor:"media"},{id:"audio.speech",path:["audio","speech"],handlerPath:["speech"],surfaces:e,summary:"Generate speech audio",arguments:[{name:"input",required:!0,variadic:!0}],options:[o,{name:"voice",valueName:"<voice>",description:"Voice identifier",required:!0},{name:"instructions",valueName:"<text>",description:"Voice instructions"},{name:"response-format",valueName:"<mp3|opus|aac|flac|wav|pcm>",description:"Audio output format",allowedValues:["mp3","opus","aac","flac","wav","pcm"]},{name:"speed",valueName:"<number>",description:"Speech speed"},...i],executor:"media"},{id:"audio.transcribe",path:["audio","transcribe"],handlerPath:["transcribe"],surfaces:e,summary:"Transcribe an audio file",options:[o,{name:"file",valueName:"<path>",description:"Local audio file",required:!0},{name:"language",valueName:"<code>",description:"Input language code"},{name:"prompt",valueName:"<text>",description:"Transcript prompt"},{name:"response-format",valueName:"<json|text|srt|verbose_json|vtt|diarized_json>",description:"Transcript format",allowedValues:["json","text","srt","verbose_json","vtt","diarized_json"]},{name:"temperature",valueName:"<number>",description:"Sampling temperature"},{name:"timestamp-granularities",valueName:"<word,segment>",description:"Timestamp granularities"},{name:"include",valueName:"<value[,value]>",description:"Provider response fields"},...i],executor:"media"},{id:"audio.translate",path:["audio","translate"],handlerPath:["translate"],surfaces:e,summary:"Translate an audio file",options:[o,{name:"file",valueName:"<path>",description:"Local audio file",required:!0},{name:"prompt",valueName:"<text>",description:"Translation prompt"},{name:"response-format",valueName:"<json|text|srt|verbose_json|vtt>",description:"Translation format",allowedValues:["json","text","srt","verbose_json","vtt"]},{name:"temperature",valueName:"<number>",description:"Sampling temperature"},...i],executor:"media"},{id:"video.generate",path:["video"],surfaces:e,summary:"Create and retrieve a video artifact",arguments:[{name:"prompt",required:!0,variadic:!0}],options:[o,{name:"parameters",valueName:"<json>",description:"Provider video parameter object"},{name:"no-wait",description:"Return the operation id without waiting"},...i],executor:"media"},{id:"video.status",path:["video","status"],handlerPath:["status"],surfaces:e,summary:"Show a video operation status",arguments:[{name:"operation-id",required:!0}],executor:"media"},{id:"video.download",path:["video","download"],handlerPath:["download"],surfaces:e,summary:"Download a completed video artifact",arguments:[{name:"operation-id",required:!0}],options:i,executor:"media"},{id:"exec.direct",path:["exec"],surfaces:r,summary:"Run a headless agent prompt",arguments:[{name:"prompt",required:!0,variadic:!0}],options:[{name:"image",valueName:"<path[,path]>",description:"Image attachments"},{name:"json",description:"Use JSON events"},{name:"jsonl",description:"Use JSONL events"}],executor:"exec",desktop:{exposed:!1}},{id:"exec.tui",path:["exec"],surfaces:a,summary:"Run an interactive agent prompt",arguments:[{name:"prompt",required:!0,variadic:!0}],executor:"tui-prompt"},{id:"agent.stdio",path:["agent","stdio"],handlerPath:["stdio"],surfaces:r,summary:"Run the JSONL agent protocol",executor:"agent",desktop:{exposed:!1}},{id:"agent.desktop",path:["agent","desktop"],handlerPath:["desktop"],surfaces:r,summary:"Run the desktop application protocol",executor:"agent",desktop:{exposed:!1}},{id:"agent.info",path:["agent"],surfaces:a,summary:"Explain the direct JSONL agent protocol",executor:"tui-agent-info"},...["bash","zsh","powershell"].map(t=>({id:`completions.${t}`,path:["completions",t],handlerPath:[t],surfaces:e,summary:`Print ${t} completion definitions`,executor:"completions",desktop:{exposed:!1}})),{id:"completions.default",path:["completions"],surfaces:e,summary:"Print PowerShell completion definitions",executor:"completions",defaultAction:!0,hiddenFromHelp:!0,desktop:{exposed:!1}},{id:"update.check.default",path:["update"],handlerPath:["check"],surfaces:e,summary:"Check update policy",executor:"update",defaultAction:!0,hiddenFromHelp:!0},{id:"update.check",path:["update","check"],handlerPath:["check"],surfaces:e,summary:"Check update policy",executor:"update"},{id:"tui.clear",path:["clear"],surfaces:a,summary:"Clear the current transcript view",executor:"tui-clear"},{id:"tui.stop",path:["stop"],surfaces:a,summary:"Stop the active response",executor:"tui-stop"},{id:"tui.context",path:["context"],surfaces:a,summary:"Show context usage and session composition",executor:"tui-context"},{id:"tui.details",path:["details"],surfaces:a,summary:"Toggle tool execution details",executor:"tui-details"},{id:"tui.exit",path:["exit"],surfaces:a,summary:"Exit the interactive session",executor:"tui-exit"},{id:"attachments.list.default",path:["attachments"],surfaces:a,summary:"List pending attachments",executor:"tui-attachments",defaultAction:!0,hiddenFromHelp:!0},{id:"attachments.list",path:["attachments","list"],surfaces:a,summary:"List pending attachments",executor:"tui-attachments"},{id:"attachments.paste",path:["attachments","paste"],surfaces:a,summary:"Add an image from the clipboard",executor:"tui-attachments"},{id:"attachments.remove",path:["attachments","remove"],surfaces:a,summary:"Remove a pending attachment",arguments:[{name:"id",required:!0}],executor:"tui-attachments"}];export{c as COMMAND_ACTIONS};
@@ -0,0 +1,60 @@
1
+ export type CommandSurface = 'direct' | 'tui';
2
+ export type CommandExecutorId = 'help' | 'version' | 'config' | 'auth' | 'tui-auth-login' | 'trust' | 'inspect' | 'hook' | 'model' | 'tui-model-select' | 'effort' | 'tui-effort-select' | 'mcp' | 'plugin' | 'skill' | 'tui-skill-run' | 'session' | 'tui-session-resume' | 'tui-session-compact' | 'tui-session-rename' | 'goal' | 'memory' | 'tui-goal' | 'doctor' | 'chat' | 'exec' | 'media' | 'tui-prompt' | 'agent' | 'tui-agent-info' | 'completions' | 'update' | 'tui-clear' | 'tui-stop' | 'tui-context' | 'tui-details' | 'tui-attachments' | 'tui-exit';
3
+ export interface CommandArgumentSpec {
4
+ readonly name: string;
5
+ readonly required: boolean;
6
+ readonly variadic?: boolean;
7
+ }
8
+ export interface CommandOptionRequirement {
9
+ readonly option: string;
10
+ readonly values?: readonly string[];
11
+ readonly absent?: boolean;
12
+ }
13
+ export interface CommandOptionSpec {
14
+ readonly name: string;
15
+ readonly valueName?: string;
16
+ readonly description: string;
17
+ readonly required?: boolean;
18
+ readonly requiredOn?: readonly CommandSurface[];
19
+ readonly requiredWhen?: CommandOptionRequirement;
20
+ readonly allowedValues?: readonly string[];
21
+ }
22
+ export interface CommandActionSpec {
23
+ readonly id: string;
24
+ /** Tokens used to select this action on a supported surface. */
25
+ readonly path: readonly string[];
26
+ /** Tokens the existing application handler expects before parsed arguments. */
27
+ readonly handlerPath?: readonly string[];
28
+ readonly surfaces: readonly CommandSurface[];
29
+ readonly summary: string;
30
+ readonly arguments?: readonly CommandArgumentSpec[];
31
+ readonly options?: readonly CommandOptionSpec[];
32
+ readonly executor: CommandExecutorId;
33
+ /**
34
+ * Optional exposure policy for the Desktop JSONL protocol. Direct and TUI
35
+ * users continue to resolve commands from `surfaces`; this metadata only
36
+ * controls whether a command is safe and meaningful for a non-terminal
37
+ * Desktop client.
38
+ */
39
+ readonly desktop?: {
40
+ readonly exposed?: boolean;
41
+ /** Resource domain that must not mutate concurrently with turns/commands. */
42
+ readonly mutationKey?: string;
43
+ };
44
+ /** Default action for a command group, such as `mcp` → `mcp list`. */
45
+ readonly defaultAction?: boolean;
46
+ /** Default routes are executable but excluded from command lists. */
47
+ readonly hiddenFromHelp?: boolean;
48
+ }
49
+ export interface CommandInvocation {
50
+ readonly surface: CommandSurface;
51
+ readonly action: CommandActionSpec;
52
+ readonly positionals: readonly string[];
53
+ readonly options: ReadonlyMap<string, string | boolean>;
54
+ readonly handlerPositionals: readonly string[];
55
+ }
56
+ export interface CommandSuggestion {
57
+ readonly value: string;
58
+ readonly label: string;
59
+ readonly description: string;
60
+ }
File without changes
@@ -0,0 +1,9 @@
1
+ import type { CliError } from '../../domain/errors/cli-error.js';
2
+ import type { CliCommandHint } from '../../domain/errors/cli-command-hint.js';
3
+ export type CommandSurface = 'tui' | 'direct';
4
+ export declare function commandHint(actionId: string, tuiActionId?: string): CliCommandHint;
5
+ export declare const AUTH_LOGIN_HINT: CliCommandHint;
6
+ export declare const MODEL_SELECT_HINT: CliCommandHint;
7
+ export declare const TRUST_GRANT_HINT: CliCommandHint;
8
+ export declare function formatCommandHint(hint: CliCommandHint, surface: CommandSurface): string;
9
+ export declare function formatCliErrorMessage(error: CliError, surface: CommandSurface): string;
@@ -0,0 +1 @@
1
+ import{formatCommandUsage as r}from"./command-presentation.js";import{COMMAND_REGISTRY as i}from"./command-runtime.js";function e(t,n){return n===void 0?{actionId:t}:{actionId:t,tuiActionId:n}}const d=e("auth.login.direct","auth.login.tui"),s=e("model.use"),c=e("trust.grant");function m(t,n){const o=i.get(n==="tui"?t.tuiActionId??t.actionId:t.actionId);return o===void 0?"Try the relevant command from the command help.":`Try \`${r(o,n)}\`.`}function f(t,n){return t.hint===void 0?t.userMessage:`${t.userMessage} ${m(t.hint,n)}`}export{d as AUTH_LOGIN_HINT,s as MODEL_SELECT_HINT,c as TRUST_GRANT_HINT,e as commandHint,f as formatCliErrorMessage,m as formatCommandHint};
@@ -0,0 +1,4 @@
1
+ export interface CommandOutput {
2
+ write(value: string): unknown;
3
+ writeStructured?<T extends object>(value: T, fallbackText?: string): unknown;
4
+ }
File without changes
@@ -0,0 +1,10 @@
1
+ import type { CommandInvocation, CommandSurface } from './command-contract.js';
2
+ import type { CommandRegistry } from './command-registry.js';
3
+ export declare function tokenizeCommandInput(value: string): readonly string[];
4
+ export declare function parseCommandInvocation(tokens: readonly string[], surface: CommandSurface, registry: CommandRegistry): CommandInvocation;
5
+ /**
6
+ * Validates an already selected action. Protocol callers use this when the
7
+ * action id and parsed values are transported separately from the command
8
+ * text, while direct and TUI callers continue to use token parsing above.
9
+ */
10
+ export declare function parseCommandInvocationForAction(actionId: string, positionals: readonly string[], options: ReadonlyMap<string, string | boolean>, surface: CommandSurface, registry: CommandRegistry): CommandInvocation;
@@ -0,0 +1 @@
1
+ import{CliError as g}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as v}from"../../domain/errors/error-codes.js";function x(n){const o=[];let e="",i,t=!1;for(const r of n.trim()){if(t){e+=r,t=!1;continue}if(r==="\\"){i!==void 0?t=!0:e+=r;continue}if(i!==void 0){r===i?i=void 0:e+=r;continue}if(r==='"'||r==="'"){i=r;continue}if(/\s/u.test(r)){e.length>0&&(o.push(e),e="");continue}e+=r}return t&&(e+="\\"),e.length>0&&o.push(e),o}function A(n,o,e){const i=e.resolve(n,o),t=n.slice(i.path.length),{positionals:r,options:u}=$(t,i);return w(i,r,u,o)}function y(n,o,e,i,t){const r=t.get(n);if(r===void 0)throw f(`Unknown command action: ${n}.`);if(!r.surfaces.includes(i))throw f(`Command action ${n} is not available on the ${i} surface.`);return w(r,o,e,i)}function w(n,o,e,i){return q(n,o),M(n,e,i),{surface:i,action:n,positionals:o,options:e,handlerPositionals:[...n.handlerPath??n.path.slice(1),...o]}}function $(n,o){const e=[],i=new Map,t=new Map((o.options??[]).map(u=>[u.name,u]));let r=!0;for(let u=0;u<n.length;u+=1){const a=n[u];if(r&&a==="--"){r=!1;continue}if(!r||!a.startsWith("--")||a.length===2){e.push(a);continue}const c=a.indexOf("="),s=a.slice(2,c<0?void 0:c),p=t.get(s);if(p===void 0)throw f(`Unsupported option --${s} for ${o.path.join(" ")}.`);if(i.has(s))throw f(`Option --${s} was provided more than once.`);const d=c<0?void 0:a.slice(c+1);if(p.valueName===void 0){if(d!==void 0&&d!=="true")throw f(`Option --${s} does not accept a value.`);i.set(s,d===void 0?!0:d);continue}const l=n[u+1],h=d??(l===void 0||l==="--"||l.startsWith("--")?void 0:l);if(h===void 0||h.trim().length===0)throw m(`Missing value for --${s}.`);d===void 0&&(u+=1),i.set(s,h)}return{positionals:e,options:i}}function q(n,o){const e=n.arguments??[],i=e.filter(r=>r.required).length;if(o.length<i){const r=e[o.length];throw m(`Missing required argument: ${r?.name??"value"}.`)}if(!(e.at(-1)?.variadic===!0)&&o.length>e.length)throw f(`Too many arguments for ${n.path.join(" ")}.`)}function M(n,o,e){const i=new Map((n.options??[]).map(t=>[t.name,t]));for(const t of o.keys())if(!i.has(t))throw f(`Unsupported option --${t} for ${n.path.join(" ")}.`);for(const t of n.options??[]){const r=t.required===!0||t.requiredOn?.includes(e)===!0,u=t.requiredWhen===void 0?!1:C(t.requiredWhen,o);if((r||u)&&!o.has(t.name))throw m(`Missing required option --${t.name}.`);const a=o.get(t.name);if(t.allowedValues!==void 0&&typeof a=="string"&&!t.allowedValues.includes(a))throw f(`Invalid value for --${t.name}. Expected one of: ${t.allowedValues.join(", ")}.`)}}function C(n,o){const e=o.get(n.option),i=n.absent===!0&&e===void 0,t=n.values===void 0?e!==void 0:typeof e=="string"&&n.values.includes(e);return i||t}function m(n){return new g(v.MISSING_ARGUMENT,n,{category:"arguments",userMessage:n})}function f(n){return new g(v.INVALID_ARGUMENT,n,{category:"arguments",userMessage:n})}export{A as parseCommandInvocation,y as parseCommandInvocationForAction,x as tokenizeCommandInput};
@@ -0,0 +1,7 @@
1
+ import type { CommandActionSpec, CommandSuggestion, CommandSurface } from './command-contract.js';
2
+ import type { CommandRegistry } from './command-registry.js';
3
+ export declare function formatCommandReference(action: CommandActionSpec, surface: CommandSurface): string;
4
+ export declare function formatCommandUsage(action: CommandActionSpec, surface: CommandSurface): string;
5
+ export declare function formatCommandInvocation(action: CommandActionSpec, surface: CommandSurface, positionals?: readonly string[], options?: ReadonlyMap<string, string | boolean>): string;
6
+ export declare function formatCommandHelp(registry: CommandRegistry, surface: CommandSurface): string;
7
+ export declare function commandSuggestions(input: string, registry: CommandRegistry, surface: CommandSurface): readonly CommandSuggestion[];
@@ -0,0 +1,3 @@
1
+ import{tokenizeCommandInput as A}from"./command-parser.js";function p(n,t){return`${t==="direct"?"lotagate ":"/"}${n.path.join(" ")}`}function L(n,t){const e=w(n),a=(n.options??[]).map(s=>{const o=s.valueName===void 0?`--${s.name}`:`--${s.name} ${s.valueName}`;return b(s,t)?o:`[${o}]`});return[p(n,t),...e,...a].join(" ")}function R(n,t,e=[],a=new Map){const s=[...a.entries()].flatMap(([o,r])=>r===!0?[`--${o}`]:[`--${o}`,r]);return[p(n,t),...e,...s].join(" ")}function W(n,t){const e=n.list(t).map(o=>({usage:L(o,t),summary:o.summary})),a=Math.max(...e.map(o=>o.usage.length),0);return`${t==="direct"?"LotaGate CLI commands:":"Interactive commands:"}
2
+ ${e.map(o=>` ${o.usage.padEnd(a)} ${o.summary}`).join(`
3
+ `)}`}function q(n,t,e){const a=e==="tui"?"/":"",s=e==="tui"?n.trimStart().slice(1):n.trimStart(),o=/\s$/u.test(s),r=A(s);if(r.length===0)return S(a,t,e,"");if(r.length===1&&!o)return S(a,t,e,r[0]);const m=r[0].toLowerCase(),u=t.actionsForRoot(m,e),c=u.filter(d=>!d.hiddenFromHelp);if(u.length===0)return[];const i=o?"":r[1]??"";if(r.length<=2){const d=v(u),h=r.length===2&&c.some(f=>f.path.length===2&&f.path[1]===r[1]?.toLowerCase()),x=!o&&r.length===2&&c.some(f=>f.path.length===2&&f.path[1].startsWith(i.toLowerCase()));if(r.length===1||o&&r.length===1||h||x){if(!h)return g(a,m,i,t,e)}else return d!==void 0?C(n,d,e,r):g(a,m,i,t,e)}const l=j(r,t,e);return l===void 0?g(a,m,i,t,e):!o&&r.length===l.path.length?[$(l,e)]:C(n,l,e,r)}function S(n,t,e,a){const s=new Map;for(const o of t.list(e))s.has(o.path[0])||s.set(o.path[0],o);return[...s.entries()].filter(([o])=>o.startsWith(a.toLowerCase())).map(([o,r])=>({value:`${n}${o}`,label:`${n}${o}`,description:r.summary}))}function g(n,t,e,a,s){const o=new Map,r=a.actionsForRoot(t,s);for(const u of r){if(u.hiddenFromHelp||u.path.length<2)continue;const c=u.path[1];!c.startsWith(e.toLowerCase())||o.has(c)||o.set(c,u)}const m=v(r);return[...m===void 0||!(m.arguments?.some(u=>u.required)??!1)?[]:[$(m,s,n)],...[...o.values()].map(u=>$(u,s,n))]}function v(n){return n.find(t=>t.defaultAction===!0&&t.path.length===1)??n.find(t=>t.path.length===1&&!t.hiddenFromHelp)}function C(n,t,e,a){const s=e==="tui"?"/":"",o=new Set(a.filter(i=>i.startsWith("--")).map(i=>i.slice(2).split("=")[0])),r=e==="tui"?n.trimStart().slice(1):n.trimStart(),m=/\s$/u.test(r),u=m?"":a.at(-1)??"";if(!u.startsWith("--"))return[];const c=m?r.trimEnd():r.slice(0,Math.max(0,r.lastIndexOf(" "))).trimEnd();return(t.options??[]).filter(i=>!o.has(i.name)&&`--${i.name}`.startsWith(u)).map(i=>{const l=`--${i.name}`,d=`${s}${c}${c.length===0?"":" "}${l}`,h=i.valueName===void 0?l:`${l} ${i.valueName}`;return{value:d,label:b(i,e)?h:`[${h}]`,description:i.description}})}function j(n,t,e){try{return t.resolve(n,e)}catch{return}}function $(n,t,e){const a=e===void 0?p(n,t):`${e}${n.path.join(" ")}`,s=k(n,t);return{value:a,label:s,description:n.summary}}function k(n,t){return[p(n,t),...w(n)].join(" ")}function w(n){return(n.arguments??[]).map(t=>{const e=t.variadic?`${t.name}...`:t.name;return t.required?`<${e}>`:`[${e}]`})}function b(n,t){return n.required===!0||n.requiredOn?.includes(t)===!0}export{q as commandSuggestions,W as formatCommandHelp,R as formatCommandInvocation,p as formatCommandReference,L as formatCommandUsage};
@@ -0,0 +1,11 @@
1
+ import type { CommandActionSpec, CommandSurface } from './command-contract.js';
2
+ export declare class CommandRegistry {
3
+ private readonly actions;
4
+ private readonly byId;
5
+ constructor(actions: readonly CommandActionSpec[]);
6
+ get(id: string): CommandActionSpec | undefined;
7
+ list(surface: CommandSurface, includeHidden?: boolean): readonly CommandActionSpec[];
8
+ actionsForRoot(root: string, surface: CommandSurface): readonly CommandActionSpec[];
9
+ resolve(tokens: readonly string[], surface: CommandSurface): CommandActionSpec;
10
+ private assertNoSurfaceCollisions;
11
+ }
@@ -0,0 +1 @@
1
+ import{CliError as d}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as h}from"../../domain/errors/error-codes.js";class p{actions;byId=new Map;constructor(o){this.actions=o;for(const t of o){if(t.path.length===0)throw new Error(`Command action ${t.id} has no path.`);if(this.byId.has(t.id))throw new Error(`Command action ${t.id} is already registered.`);this.byId.set(t.id,t)}for(const t of["direct","tui"])this.assertNoSurfaceCollisions(t)}get(o){return this.byId.get(o)}list(o,t=!1){return this.actions.filter(n=>n.surfaces.includes(o)&&(t||!n.hiddenFromHelp)).sort(f)}actionsForRoot(o,t){const n=o.toLowerCase();return this.actions.filter(r=>r.surfaces.includes(t)&&r.path[0]===n)}resolve(o,t){const n=o[0]?.toLowerCase();if(n===void 0)throw s("A command is required.");const a=this.actionsForRoot(n,t).filter(i=>l(i.path,o)).sort((i,c)=>c.path.length-i.path.length)[0];if(a!==void 0)return a;throw this.actionsForRoot(n,t).length===0?s(`Unknown command: ${n}.`):s(`Unsupported ${n} command.`)}assertNoSurfaceCollisions(o){const t=new Set;for(const n of this.actions.filter(r=>r.surfaces.includes(o))){const r=n.path.join(" ");if(t.has(r))throw new Error(`Command path collision on ${o}: ${r}.`);t.add(r)}}}function l(e,o){return o.length<e.length?!1:e.every((t,n)=>o[n]?.toLowerCase()===t)}function f(e,o){return e.path.join(" ").localeCompare(o.path.join(" "))}function s(e){return new d(h.INVALID_ARGUMENT,e,{category:"arguments",userMessage:e})}export{p as CommandRegistry};
@@ -0,0 +1,2 @@
1
+ import { CommandRegistry } from './command-registry.js';
2
+ export declare const COMMAND_REGISTRY: CommandRegistry;
@@ -0,0 +1 @@
1
+ import{COMMAND_ACTIONS as o}from"./command-catalog.js";import{CommandRegistry as m}from"./command-registry.js";const C=new m(o);export{C as COMMAND_REGISTRY};
@@ -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, signal?: AbortSignal): Promise<number>;
@@ -0,0 +1,7 @@
1
+ import{isFlagEnabled as E,requirePositional as _}from"./cli-args.js";import{ProjectSessionAccess as A}from"../session/project-session-access.js";import{AuthenticationService as D}from"../auth/authentication-service.js";import{loadExecutionConfig as L}from"../config/execution-config.js";import{createLotaGateClient as P}from"../../infrastructure/sdk/lotagate-client-factory.js";import{runHeadlessAgentTurn as x}from"../orchestration/headless-agent-turn.js";import{runGoalLoop as F}from"../orchestration/goal-runner.js";import{CliAgentSessionStore as q}from"../agent/agent-session-store.js";import{formatGoalStatus as $}from"../orchestration/goal-output.js";import{parseGoalInput as k}from"../orchestration/goal-input.js";import{CliError as p}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as g}from"../../domain/errors/error-codes.js";import{MODEL_SELECT_HINT as B,TRUST_GRANT_HINT as H}from"./command-hints.js";import{createTurnId as J,recordTurnCompletion as K,recordTurnFailure as Q,recordTurnStart as W}from"../session/session-turn-lifecycle.js";import{createCommandAbortController as z,throwIfCommandAborted as v}from"./command-cancellation.js";async function de(r,t,e,l,s,c){const i=r[0]??"status";if(i==="run")return O(r.slice(1).join(" ").trim(),t,e,l,s,void 0,c);v(c);const n=_(r,1,"session id"),d=await e.projectTrust.inspect(l);if(await new A(e.sessionStore).require(n,d.fingerprint),i==="status")return G(s,await e.goalStore.get(n),E(t,"json"));if(i==="set"){const u=_([r.slice(2).join(" ")],0,"goal objective"),w=await e.goalStore.replace(n,M(u,t));return G(s,w,E(t,"json"))}if(i==="pause"){const u=await e.goalStore.pause(n);return G(s,u,E(t,"json"))}if(i==="resume"){const u=await e.goalStore.get(n);if(u===void 0)throw new p(g.GOAL_NOT_FOUND,"Goal not found.",{category:"goal",userMessage:"Goal was not found."});return O(u.objective,t,e,l,s,n,c)}if(i==="clear")return await e.goalStore.clear(n),s.write(`Goal cleared.
2
+ `),0;throw new Error(`Unsupported goal action: ${i}`)}async function O(r,t,e,l,s,c,i){if(v(i),r.length===0)throw new p(g.MISSING_ARGUMENT,"Missing goal objective.",{category:"arguments",userMessage:"A goal objective is required."});const n=await e.projectTrust.inspect(l);if(!await e.projectTrust.isTrusted(n))throw new p(g.PROJECT_TRUST_REQUIRED,"Project trust is required for goals.",{category:"project",userMessage:"Project is not trusted.",hint:H});const d=await L(e,l);if(d.config.model===null)throw new p(g.MODEL_NOT_FOUND,"No model is selected.",{category:"model",userMessage:"No model is selected.",hint:B});const u=d.config.model,w=d.config.profile??D.defaultProfileName(),y=await e.auth.requireCredential(w),a=c===void 0?await e.sessionStore.create({projectFingerprint:n.fingerprint,cwd:n.canonicalPath,model:d.config.model,profile:w,status:"active"}):await e.sessionStore.get(c);if(a===void 0)throw new p(g.SESSION_NOT_FOUND,"Goal session not found.",{category:"session",userMessage:"Goal session was not found."});c===void 0?await e.goalStore.create(a.id,M(r,t)):await e.goalStore.resume(a.id);const N=P(y.profile,y.apiKey),U=new q,h=z(i),T=h.controller,j=()=>T.abort(new Error("Goal interrupted by user."));process.once("SIGINT",j);try{const f=await F({runtime:e,sessionId:a.id,objective:r,model:u,client:N,signal:T.signal,runTurn:async(I,m,b)=>{const S=J();await W(e.sessionStore,a.id,S,I);try{const o=await e.goalStore.get(a.id),C=await x({runtime:e,cwd:l,model:u,client:N,prompt:I,output:s,sessionId:a.id,agentSessionStore:U,signal:b,turnId:S,...o===void 0?{}:{goal:{objective:o.objective,status:o.status,turns:o.turns,evaluatorRuns:o.evaluatorRuns,tokensUsed:o.usage.totalTokens,...o.tokenBudget===void 0?{}:{tokenBudget:o.tokenBudget},...o.maxTurns===void 0?{}:{maxTurns:o.maxTurns},...o.maxDurationMs===void 0?{}:{maxDurationMs:o.maxDurationMs},...o.lastError===void 0?{}:{lastError:o.lastError},...o.lastEvaluation===void 0?{}:{lastEvaluation:o.lastEvaluation.reason}}},onUsage:m.onUsage,onSubagentUsage:m.onUsage,onSnapshot:m.onSnapshot});return s.write(`
3
+ `),await K(e.sessionStore,a.id,S,C),C}catch(o){throw m.onError(o),await Q(e.sessionStore,a.id,S,o,T.signal.aborted),o}}});await e.sessionStore.updateStatus(a.id,f?.status==="completed"?"completed":f?.status==="paused"?"active":"failed"),s.write(`Goal session: ${a.id}
4
+ `);const R=f?.status==="paused"&&f.lastError?.startsWith("Goal paused by safety limit:")===!0;return f?.status==="completed"||R?0:1}finally{process.off("SIGINT",j),h.dispose()}}function M(r,t){return k(r,t)}function G(r,t,e){return e?(r.write(`${JSON.stringify(t??null)}
5
+ `),t===void 0?1:0):t===void 0?(r.write(`No active goal.
6
+ `),1):(r.write(`${$(t)}
7
+ `),0)}export{de as runGoalCommand};
@@ -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,8 @@
1
+ import{AuthenticationService as P}from"../auth/authentication-service.js";import{loadExecutionConfig as R}from"../config/execution-config.js";import{waitForVideoOperation as U}from"../media/video-operation-poller.js";import{loadModelCatalog as J}from"../model/model-catalog-service.js";import{CliError as I}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as S}from"../../domain/errors/error-codes.js";import{SDK_BINARY_MEDIA_RESPONSE_BYTES as E,validateMediaCommandOptions as K}from"../../domain/media/gateway-media-contract.js";import{resolveMediaExecutionPolicy as Y}from"../../domain/media/media-execution-policy.js";import{readGatewayAudioInput as H,readGatewayImageEditInput as W}from"../../infrastructure/filesystem/gateway-media-input-reader.js";import{WorkspaceMediaArtifactStore as Z}from"../../infrastructure/filesystem/workspace-media-artifact-store.js";import{normalizeImage as _}from"../../infrastructure/clipboard/image-normalizer.js";import{downloadPublicMedia as Q}from"../../infrastructure/network/safe-media-downloader.js";import{createLotaGateClient as X}from"../../infrastructure/sdk/lotagate-client-factory.js";import{SdkMediaGatewayClient as ee}from"../../infrastructure/sdk/sdk-media-gateway-client.js";import{MODEL_SELECT_HINT as k}from"./command-hints.js";import{writeMediaCommandResult as $}from"./media-command-output.js";import{getStringFlag as c,isFlagEnabled as D,requirePositional as G,requireStringFlag as O}from"./cli-args.js";async function _e(e,t,o,r,i,a){K(e.action.id,e.positionals,e.options);const n=a===void 0?new AbortController:void 0,m=a??n.signal,s=()=>n?.abort(new Error("Media command interrupted."));n!==void 0&&process.once("SIGINT",s);try{t.logger.info("Media command started.",{action:e.action.id});const d=await te(e,t,o,r,i,m);return t.logger.info("Media command completed.",{action:e.action.id,exitCode:d}),d}catch(d){const u=d instanceof I?{code:d.code,category:d.category,correlationId:d.correlationId}:{};throw t.logger.error("Media command failed.",{action:e.action.id,...u}),d}finally{n!==void 0&&process.off("SIGINT",s)}}async function te(e,t,o,r,i,a){const n=e.action.id;n!=="video.status"&&await t.projectTrust.requireTrusted(await t.projectTrust.inspect(o));const m=await R(t,o),s=m.config.profile??P.defaultProfileName(),d=await t.auth.requireCredential(s),u=new ee(X(d.profile,d.apiKey)),f=new Z(o,t.logger),p=Y();if(n==="video.status")return se(G(e.positionals,0,"operation id"),u,t.logger,r,i,a);if(n==="video.download")return ue(G(e.positionals,0,"operation id"),e.options,u,f,t.logger,r,i,a);const l=await oe(e.options,m.config.model,t,o);if(n==="image.generate")return ne(e.positionals,e.options,l,u,f,p.downloadTimeoutMs,r,i,a);if(n==="image.edit")return re(e.positionals,e.options,l,u,f,o,p.downloadTimeoutMs,r,i,a);if(n==="audio.speech")return ie(e.positionals,e.options,l,u,f,r,i,a);if(n==="audio.transcribe"||n==="audio.translate")return ae(n,e.options,l,u,f,o,r,i,a);if(n==="video.generate")return de(e.positionals,e.options,l,u,f,p,t,r,i,a);throw new Error(`Unsupported media command: ${n}`)}async function oe(e,t,o,r){const i=c(e,"model")??t;if(i==null)throw new I(S.MODEL_NOT_FOUND,"No model is selected.",{category:"model",userMessage:"No model is selected.",hint:k});if(!(await J(o,r)).data.some(n=>n.id===i))throw new I(S.MODEL_NOT_FOUND,`Model is not available: ${i}`,{category:"model",userMessage:`Model is not available: ${i}.`,hint:k});return i}async function ne(e,t,o,r,i,a,n,m,s){const d=v(e,"image"),u=await w(m,"image.generate","image generation",()=>r.generateImage({model:o,prompt:d,...j(t)},{signal:s})),p=(await w(m,"image.store","image download and save",()=>q(u,b("image",d,B(t),t),i,a,s))).map(l=>l.path);return $(n,{kind:"media",mediaType:"image",artifacts:p.map(l=>({path:l}))},M("Generated image",p)),0}async function re(e,t,o,r,i,a,n,m,s,d){const u=v(e,"image edit"),f=await W(O(t,"image"),c(t,"mask"),a),p=await w(s,"image.edit","image edit",()=>r.editImage({model:o,prompt:u,images:[...f.images],...f.mask===void 0?{}:{mask:f.mask},...j(t),...c(t,"input-fidelity")===void 0?{}:{inputFidelity:c(t,"input-fidelity")}},{signal:d})),g=(await w(s,"image.store","image download and save",()=>q(p,b("image",u,B(t),t),i,n,d))).map(y=>y.path);return $(m,{kind:"media",mediaType:"image",artifacts:g.map(y=>({path:y}))},M("Generated image",g)),0}async function ie(e,t,o,r,i,a,n,m){const s=v(e,"speech"),d=c(t,"response-format"),u=await w(n,"audio.speech","speech generation",()=>r.createSpeech({model:o,input:s,voice:O(t,"voice"),...c(t,"instructions")===void 0?{}:{instructions:c(t,"instructions")},...d===void 0?{}:{responseFormat:d},...N(t,"speed")===void 0?{}:{speed:N(t,"speed")}},{signal:m}));C(u.bytes);const f=d??A(u.contentType,"mp3"),l=(await w(n,"audio.store","speech save",()=>i.writeMany(b("speech",s,f,t),[u.bytes]))).map(g=>g.path);return $(a,{kind:"media",mediaType:"audio",artifacts:l.map(g=>({path:g}))},M("Generated speech",l)),0}async function ae(e,t,o,r,i,a,n,m,s){const d=await H(O(t,"file"),a),u=c(t,"response-format")??"json",f={model:o,file:d.bytes,filename:d.filename,responseFormat:u,...c(t,"prompt")===void 0?{}:{prompt:c(t,"prompt")},...N(t,"temperature")===void 0?{}:{temperature:N(t,"temperature")},...e==="audio.transcribe"&&c(t,"language")!==void 0?{language:c(t,"language")}:{},...e==="audio.transcribe"?L(t,"timestamp-granularities",["word","segment"]):{},...e==="audio.transcribe"?L(t,"include"):{}},p=await w(m,e,e==="audio.transcribe"?"audio transcription":"audio translation",()=>e==="audio.transcribe"?r.transcribe(f,{signal:s}):r.translate(f,{signal:s})),l=e==="audio.transcribe"?"transcription":"translation",g=await w(m,`${e}.store`,`${l} save`,()=>i.writeMany(b(l,d.sourceName,le(u),t),[Buffer.from(p,"utf8")]));return we(u)?n.write(`${p}
2
+ Saved ${l}: ${g[0].path}
3
+ `):n.write(M(`${ge(l)} result`,g.map(y=>y.path))),0}async function de(e,t,o,r,i,a,n,m,s,d){const u=v(e,"video"),f=pe(c(t,"parameters")),p=await w(s,"video.create","video generation request",()=>r.createVideo({model:o,prompt:u,...f===void 0?{}:{parameters:f}},{signal:d}));if(p.errorMessage!==void 0)throw V(p);if(n.logger.info("Video generation accepted.",{operationId:p.id,model:o}),m.write(`Video operation: ${p.id}
4
+ `),D(t,"no-wait"))return 0;const l=p.done?p:await w(s,`video.wait:${p.id}`,"video generation",()=>U(r,p.id,a,d));if(l.errorMessage!==void 0)throw V(l);const g=await w(s,`video.download:${p.id}`,"video download",()=>r.downloadVideo(p.id,{signal:d}));C(g.bytes);const y=await w(s,`video.store:${p.id}`,"video save",()=>i.writeMany(b("video",u,A(g.contentType,"mp4"),t),[g.bytes]));n.logger.info("Video artifact stored.",{operationId:p.id,artifactCount:y.length,artifactBytes:z(y)});const F=y.map(x=>x.path);return $(m,{kind:"media",mediaType:"video",artifacts:F.map(x=>({path:x}))},M("Generated video",F)),0}async function se(e,t,o,r,i,a){const n=await w(i,`video.status:${e}`,"video status",()=>t.getVideoOperation(e,{signal:a}),m=>m.errorMessage!==void 0);if(o.info("Video status retrieved.",{operationId:n.id,status:n.errorMessage===void 0?n.done?"completed":"pending":"failed"}),n.errorMessage!==void 0)throw V(n);return r.write(`Video operation ${n.id}: ${n.done?"COMPLETED":"PENDING"}
5
+ `),0}async function ue(e,t,o,r,i,a,n,m){const s=await w(n,`video.download:${e}`,"video download",()=>o.downloadVideo(e,{signal:m}));C(s.bytes);const d=await w(n,`video.store:${e}`,"video save",()=>r.writeMany(b("video",e,A(s.contentType,"mp4"),t),[s.bytes]));i.info("Video artifact downloaded.",{operationId:e,artifactCount:d.length,artifactBytes:z(d)});const u=d.map(f=>f.path);return $(a,{kind:"media",mediaType:"video",artifacts:u.map(f=>({path:f}))},M("Downloaded video",u)),0}function j(e){const t=c(e,"quality"),o=c(e,"background"),r=c(e,"output-format");return{...T(e,"n")===void 0?{}:{n:T(e,"n")},...c(e,"size")===void 0?{}:{size:c(e,"size")},...t===void 0?{}:{quality:t},...o===void 0?{}:{background:o},...r===void 0?{}:{outputFormat:r},...T(e,"output-compression")===void 0?{}:{outputCompression:T(e,"output-compression")},...c(e,"moderation")===void 0?{}:{moderation:c(e,"moderation")},...c(e,"user")===void 0?{}:{user:c(e,"user")}}}function b(e,t,o,r){const i=c(r,"out"),a=c(r,"out-dir");return{kind:e,source:t,extension:o,...i===void 0?{}:{out:i},...a===void 0?{}:{outDir:a},force:D(r,"force")}}async function q(e,t,o,r,i){const a=[];let n=t.extension;for(const m of e){const s=m.base64===void 0?await me(m.url,r,i):ce(m.base64);a.push(s.bytes),n=fe(s.mimeType,n)}return o.writeMany({...t,extension:n},a)}function ce(e){if(!/^[A-Za-z0-9+/]*={0,2}$/u.test(e)||e.length%4!==0)throw h("The provider returned invalid Base64 image data.");const t=Buffer.from(e,"base64");return C(t),_(t,void 0,E)}async function me(e,t,o){const r=await Q(e,{maxBytes:E,timeoutMs:t,signal:o}),i=_(r.bytes,r.contentType,E);if(!["image/png","image/jpeg","image/webp"].includes(i.mimeType))throw h(`Unsupported generated image format: ${i.mimeType}.`);return i}function v(e,t){const o=e.join(" ").trim();if(o.length===0)throw h(`A prompt is required for ${t}.`);return o}function T(e,t){const o=c(e,t);if(o!==void 0){if(!/^\d+$/u.test(o)||!Number.isSafeInteger(Number(o)))throw h(`--${t} must be an integer.`);return Number(o)}}function N(e,t){const o=c(e,t);if(o===void 0)return;const r=Number(o);if(!Number.isFinite(r))throw h(`--${t} must be a finite number.`);return r}function L(e,t,o){const r=c(e,t);if(r===void 0)return{};const i=r.split(",").map(a=>a.trim()).filter(Boolean);if(i.length===0||o!==void 0&&i.some(a=>!o.includes(a)))throw h(`--${t} contains an unsupported value.`);return t==="timestamp-granularities"?{timestampGranularities:i}:{include:i}}function pe(e){if(e!==void 0)try{const t=JSON.parse(e);if(typeof t!="object"||t===null||Array.isArray(t))throw new Error;return t}catch{throw h("--parameters must be a JSON object.")}}function B(e){return c(e,"output-format")??"png"}function fe(e,t){return e==="image/jpeg"?"jpeg":e==="image/webp"?"webp":e==="image/png"?"png":t}function A(e,t){const o=e?.toLowerCase();return o==="audio/mpeg"?"mp3":o==="audio/ogg"?"opus":o==="audio/aac"?"aac":o==="audio/flac"?"flac":o==="audio/wav"||o==="audio/x-wav"?"wav":o==="video/webm"?"webm":o==="video/quicktime"?"mov":o==="video/mp4"?"mp4":t}function le(e){return e==="text"?"txt":e==="verbose_json"||e==="diarized_json"?"json":e}function we(e){return e==="text"||e==="srt"||e==="vtt"}function C(e){if(e.byteLength===0||e.byteLength>E)throw h("Generated media exceeds the supported binary output limit.")}function M(e,t){return`${e}${t.length===1?"":"s"} saved:
6
+ ${t.map(o=>` ${o}`).join(`
7
+ `)}
8
+ `}function ge(e){return`${e[0]?.toUpperCase()??""}${e.slice(1)}`}function z(e){return e.reduce((t,o)=>t+o.bytes,0)}function h(e){return new I(S.INVALID_ARGUMENT,e,{category:"media",userMessage:e})}function V(e){return new I("MEDIA_VIDEO_FAILED",`Video operation failed: ${e.id}`,{category:"media",userMessage:e.errorMessage??`Video operation failed: ${e.id}`})}async function w(e,t,o,r,i=()=>!1){const a=e?.start(t,o);try{const n=await r();return a?.complete(i(n)),n}catch(n){throw a?.complete(!0),n}}export{_e as runMediaCommand};