@lotagate/cli 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/dist/application/agent/agent-history.d.ts +3 -0
  2. package/dist/application/agent/agent-history.js +81 -0
  3. package/dist/application/agent/agent-input-context.d.ts +9 -0
  4. package/dist/application/agent/agent-input-context.js +12 -0
  5. package/dist/application/agent/agent-limit.d.ts +3 -0
  6. package/dist/application/agent/agent-limit.js +12 -0
  7. package/dist/application/agent/agent-run-tracker.d.ts +30 -0
  8. package/dist/application/agent/agent-run-tracker.js +68 -0
  9. package/dist/application/agent/agent-session-store.d.ts +19 -0
  10. package/dist/application/agent/agent-session-store.js +74 -0
  11. package/dist/application/agent/capability-profile.d.ts +37 -0
  12. package/dist/application/agent/capability-profile.js +13 -0
  13. package/dist/application/agent/cli-agent-execution-service.d.ts +81 -0
  14. package/dist/application/agent/cli-agent-execution-service.js +279 -0
  15. package/dist/application/agent/context-compaction-persistence.d.ts +8 -0
  16. package/dist/application/agent/context-compaction-persistence.js +27 -0
  17. package/dist/application/agent/context-compaction.d.ts +20 -0
  18. package/dist/application/agent/context-compaction.js +114 -0
  19. package/dist/application/agent/prompt-data-safety.d.ts +14 -0
  20. package/dist/application/agent/prompt-data-safety.js +38 -0
  21. package/dist/application/agent/safe-system-prompt.d.ts +3 -0
  22. package/dist/application/agent/safe-system-prompt.js +19 -0
  23. package/dist/application/agent/scoped-tool-executor.d.ts +13 -0
  24. package/dist/application/agent/scoped-tool-executor.js +32 -0
  25. package/dist/application/agent/system-prompt-builder.d.ts +14 -0
  26. package/dist/application/agent/system-prompt-builder.js +199 -0
  27. package/dist/application/agent/tool-catalog.d.ts +14 -0
  28. package/dist/application/agent/tool-catalog.js +30 -0
  29. package/dist/application/agent/tool-display.d.ts +6 -0
  30. package/dist/application/agent/tool-display.js +59 -0
  31. package/dist/application/agent/tool-hook-lifecycle.d.ts +19 -0
  32. package/dist/application/agent/tool-hook-lifecycle.js +85 -0
  33. package/dist/application/auth/authentication-service.d.ts +20 -0
  34. package/dist/application/auth/authentication-service.js +44 -0
  35. package/dist/application/chat/chat-service.d.ts +12 -0
  36. package/dist/application/chat/chat-service.js +19 -0
  37. package/dist/application/chat/pending-attachment-store.d.ts +12 -0
  38. package/dist/application/chat/pending-attachment-store.js +28 -0
  39. package/dist/application/commands/application-command-executor.d.ts +20 -0
  40. package/dist/application/commands/application-command-executor.js +66 -0
  41. package/dist/application/commands/cli-args.d.ts +6 -0
  42. package/dist/application/commands/cli-args.js +43 -0
  43. package/dist/application/commands/cli-command-services.d.ts +16 -0
  44. package/dist/application/commands/cli-command-services.js +405 -0
  45. package/dist/application/commands/command-catalog.d.ts +6 -0
  46. package/dist/application/commands/command-catalog.js +159 -0
  47. package/dist/application/commands/command-contract.d.ts +58 -0
  48. package/dist/application/commands/command-contract.js +1 -0
  49. package/dist/application/commands/command-hints.d.ts +9 -0
  50. package/dist/application/commands/command-hints.js +17 -0
  51. package/dist/application/commands/command-output.d.ts +4 -0
  52. package/dist/application/commands/command-output.js +1 -0
  53. package/dist/application/commands/command-parser.d.ts +10 -0
  54. package/dist/application/commands/command-parser.js +155 -0
  55. package/dist/application/commands/command-presentation.d.ts +7 -0
  56. package/dist/application/commands/command-presentation.js +131 -0
  57. package/dist/application/commands/command-registry.d.ts +11 -0
  58. package/dist/application/commands/command-registry.js +64 -0
  59. package/dist/application/commands/command-runtime.d.ts +2 -0
  60. package/dist/application/commands/command-runtime.js +3 -0
  61. package/dist/application/commands/goal-command-handlers.d.ts +3 -0
  62. package/dist/application/commands/goal-command-handlers.js +120 -0
  63. package/dist/application/commands/media-command-handlers.d.ts +9 -0
  64. package/dist/application/commands/media-command-handlers.js +307 -0
  65. package/dist/application/commands/media-command-output.d.ts +11 -0
  66. package/dist/application/commands/media-command-output.js +8 -0
  67. package/dist/application/commands/runtime-command-handlers.d.ts +7 -0
  68. package/dist/application/commands/runtime-command-handlers.js +177 -0
  69. package/dist/application/commands/stream-output.d.ts +4 -0
  70. package/dist/application/commands/stream-output.js +10 -0
  71. package/dist/application/commands/utility-commands.d.ts +6 -0
  72. package/dist/application/commands/utility-commands.js +81 -0
  73. package/dist/application/config/execution-config.d.ts +4 -0
  74. package/dist/application/config/execution-config.js +6 -0
  75. package/dist/application/extensions/extension-list-contract.d.ts +13 -0
  76. package/dist/application/extensions/extension-list-contract.js +1 -0
  77. package/dist/application/extensions/extension-list-formatters.d.ts +31 -0
  78. package/dist/application/extensions/extension-list-formatters.js +98 -0
  79. package/dist/application/extensions/extension-list-output.d.ts +3 -0
  80. package/dist/application/extensions/extension-list-output.js +7 -0
  81. package/dist/application/extensions/plugin-contribution-registry.d.ts +15 -0
  82. package/dist/application/extensions/plugin-contribution-registry.js +80 -0
  83. package/dist/application/extensions/skill-scope-store.d.ts +23 -0
  84. package/dist/application/extensions/skill-scope-store.js +33 -0
  85. package/dist/application/formatting/compact-number.d.ts +2 -0
  86. package/dist/application/formatting/compact-number.js +18 -0
  87. package/dist/application/formatting/compact-table.d.ts +22 -0
  88. package/dist/application/formatting/compact-table.js +49 -0
  89. package/dist/application/media/video-operation-poller.d.ts +5 -0
  90. package/dist/application/media/video-operation-poller.js +42 -0
  91. package/dist/application/model/cached-model-catalog.d.ts +13 -0
  92. package/dist/application/model/cached-model-catalog.js +31 -0
  93. package/dist/application/model/initial-model-selection.d.ts +10 -0
  94. package/dist/application/model/initial-model-selection.js +11 -0
  95. package/dist/application/model/model-catalog-service.d.ts +6 -0
  96. package/dist/application/model/model-catalog-service.js +13 -0
  97. package/dist/application/model/model-context-window.d.ts +3 -0
  98. package/dist/application/model/model-context-window.js +23 -0
  99. package/dist/application/orchestration/cli-subagent-service.d.ts +70 -0
  100. package/dist/application/orchestration/cli-subagent-service.js +328 -0
  101. package/dist/application/orchestration/cli-turn-event-projector.d.ts +12 -0
  102. package/dist/application/orchestration/cli-turn-event-projector.js +81 -0
  103. package/dist/application/orchestration/cli-turn-events.d.ts +76 -0
  104. package/dist/application/orchestration/cli-turn-events.js +39 -0
  105. package/dist/application/orchestration/cli-turn-persistence.d.ts +6 -0
  106. package/dist/application/orchestration/cli-turn-persistence.js +14 -0
  107. package/dist/application/orchestration/goal-evaluator.d.ts +18 -0
  108. package/dist/application/orchestration/goal-evaluator.js +88 -0
  109. package/dist/application/orchestration/goal-input.d.ts +3 -0
  110. package/dist/application/orchestration/goal-input.js +19 -0
  111. package/dist/application/orchestration/goal-output.d.ts +2 -0
  112. package/dist/application/orchestration/goal-output.js +11 -0
  113. package/dist/application/orchestration/goal-runner.d.ts +22 -0
  114. package/dist/application/orchestration/goal-runner.js +153 -0
  115. package/dist/application/orchestration/goal-usage.d.ts +9 -0
  116. package/dist/application/orchestration/goal-usage.js +19 -0
  117. package/dist/application/orchestration/headless-agent-turn.d.ts +32 -0
  118. package/dist/application/orchestration/headless-agent-turn.js +82 -0
  119. package/dist/application/orchestration/plan-generator.d.ts +7 -0
  120. package/dist/application/orchestration/plan-generator.js +34 -0
  121. package/dist/application/orchestration/subagent-coordinator.d.ts +33 -0
  122. package/dist/application/orchestration/subagent-coordinator.js +28 -0
  123. package/dist/application/orchestration/subagent-handoff.d.ts +2 -0
  124. package/dist/application/orchestration/subagent-handoff.js +68 -0
  125. package/dist/application/orchestration/subagent-tool-executor.d.ts +12 -0
  126. package/dist/application/orchestration/subagent-tool-executor.js +93 -0
  127. package/dist/application/orchestration/task-assessment.d.ts +4 -0
  128. package/dist/application/orchestration/task-assessment.js +35 -0
  129. package/dist/application/orchestration/task-graph.d.ts +13 -0
  130. package/dist/application/orchestration/task-graph.js +56 -0
  131. package/dist/application/orchestration/task-scheduler.d.ts +18 -0
  132. package/dist/application/orchestration/task-scheduler.js +88 -0
  133. package/dist/application/project/project-trust-service.d.ts +13 -0
  134. package/dist/application/project/project-trust-service.js +74 -0
  135. package/dist/application/protocol/browser-host-tool-executor.d.ts +41 -0
  136. package/dist/application/protocol/browser-host-tool-executor.js +88 -0
  137. package/dist/application/protocol/desktop-agent-command.d.ts +9 -0
  138. package/dist/application/protocol/desktop-agent-command.js +663 -0
  139. package/dist/application/protocol/desktop-attachment-store.d.ts +16 -0
  140. package/dist/application/protocol/desktop-attachment-store.js +82 -0
  141. package/dist/application/protocol/desktop-command-catalog.d.ts +2 -0
  142. package/dist/application/protocol/desktop-command-catalog.js +19 -0
  143. package/dist/application/protocol/desktop-command-contract.d.ts +22 -0
  144. package/dist/application/protocol/desktop-command-contract.js +3 -0
  145. package/dist/application/protocol/desktop-command-executor.d.ts +16 -0
  146. package/dist/application/protocol/desktop-command-executor.js +47 -0
  147. package/dist/application/protocol/desktop-command-output.d.ts +15 -0
  148. package/dist/application/protocol/desktop-command-output.js +24 -0
  149. package/dist/application/protocol/desktop-execution-policy.d.ts +17 -0
  150. package/dist/application/protocol/desktop-execution-policy.js +49 -0
  151. package/dist/application/protocol/desktop-host-tool-executor.d.ts +57 -0
  152. package/dist/application/protocol/desktop-host-tool-executor.js +53 -0
  153. package/dist/application/protocol/desktop-orchestration-events.d.ts +5 -0
  154. package/dist/application/protocol/desktop-orchestration-events.js +37 -0
  155. package/dist/application/protocol/json-line-writer.d.ts +9 -0
  156. package/dist/application/protocol/json-line-writer.js +19 -0
  157. package/dist/application/protocol/jsonl-agent-command.d.ts +3 -0
  158. package/dist/application/protocol/jsonl-agent-command.js +97 -0
  159. package/dist/application/protocol/jsonl-protocol.d.ts +52 -0
  160. package/dist/application/protocol/jsonl-protocol.js +170 -0
  161. package/dist/application/security/desktop-tool-scope-policy.d.ts +3 -0
  162. package/dist/application/security/desktop-tool-scope-policy.js +52 -0
  163. package/dist/application/security/tool-action-risk-analyzer.d.ts +13 -0
  164. package/dist/application/security/tool-action-risk-analyzer.js +64 -0
  165. package/dist/application/security/tool-approval-service.d.ts +35 -0
  166. package/dist/application/security/tool-approval-service.js +97 -0
  167. package/dist/application/security/tool-risk-classifier.d.ts +11 -0
  168. package/dist/application/security/tool-risk-classifier.js +65 -0
  169. package/dist/application/security/workspace-permission-policy.d.ts +10 -0
  170. package/dist/application/security/workspace-permission-policy.js +50 -0
  171. package/dist/application/session/project-session-access.d.ts +8 -0
  172. package/dist/application/session/project-session-access.js +19 -0
  173. package/dist/application/session/session-compaction-service.d.ts +10 -0
  174. package/dist/application/session/session-compaction-service.js +43 -0
  175. package/dist/application/session/session-turn-lifecycle.d.ts +5 -0
  176. package/dist/application/session/session-turn-lifecycle.js +31 -0
  177. package/dist/application/workspace/workspace-file-index.d.ts +15 -0
  178. package/dist/application/workspace/workspace-file-index.js +60 -0
  179. package/dist/application/workspace/workspace-file-reference-resolver.d.ts +14 -0
  180. package/dist/application/workspace/workspace-file-reference-resolver.js +123 -0
  181. package/dist/application/workspace/workspace-instruction-loader.d.ts +8 -0
  182. package/dist/application/workspace/workspace-instruction-loader.js +55 -0
  183. package/dist/bootstrap/composition-root.d.ts +6 -0
  184. package/dist/bootstrap/composition-root.js +4 -0
  185. package/dist/bootstrap/global-cli-options.d.ts +6 -0
  186. package/dist/bootstrap/global-cli-options.js +29 -0
  187. package/dist/bootstrap/native-devtools-stub.d.ts +10 -0
  188. package/dist/bootstrap/native-devtools-stub.js +10 -0
  189. package/dist/bootstrap/native-entry.d.ts +1 -0
  190. package/dist/bootstrap/native-entry.js +6 -0
  191. package/dist/bootstrap/native-tiktoken.d.ts +4 -0
  192. package/dist/bootstrap/native-tiktoken.js +5 -0
  193. package/dist/bootstrap/runtime-factory.d.ts +35 -0
  194. package/dist/bootstrap/runtime-factory.js +44 -0
  195. package/dist/bootstrap/shutdown-manager.d.ts +10 -0
  196. package/dist/bootstrap/shutdown-manager.js +14 -0
  197. package/dist/bootstrap/startup-sequence.d.ts +5 -0
  198. package/dist/bootstrap/startup-sequence.js +10 -0
  199. package/dist/domain/auth/auth-profile.d.ts +14 -0
  200. package/dist/domain/auth/auth-profile.js +39 -0
  201. package/dist/domain/config/config-schema.d.ts +17 -0
  202. package/dist/domain/config/config-schema.js +105 -0
  203. package/dist/domain/errors/cli-command-hint.d.ts +5 -0
  204. package/dist/domain/errors/cli-command-hint.js +1 -0
  205. package/dist/domain/errors/cli-error.d.ts +35 -0
  206. package/dist/domain/errors/cli-error.js +129 -0
  207. package/dist/domain/errors/error-codes.d.ts +46 -0
  208. package/dist/domain/errors/error-codes.js +45 -0
  209. package/dist/domain/extensions/extension-scope.d.ts +3 -0
  210. package/dist/domain/extensions/extension-scope.js +23 -0
  211. package/dist/domain/extensions/extension-state.d.ts +5 -0
  212. package/dist/domain/extensions/extension-state.js +11 -0
  213. package/dist/domain/extensions/hook-manifest.d.ts +10 -0
  214. package/dist/domain/extensions/hook-manifest.js +23 -0
  215. package/dist/domain/extensions/mcp-config.d.ts +18 -0
  216. package/dist/domain/extensions/mcp-config.js +111 -0
  217. package/dist/domain/extensions/plugin-manifest.d.ts +11 -0
  218. package/dist/domain/extensions/plugin-manifest.js +43 -0
  219. package/dist/domain/extensions/skill-manifest.d.ts +10 -0
  220. package/dist/domain/extensions/skill-manifest.js +51 -0
  221. package/dist/domain/filesystem/file-change-diff.d.ts +21 -0
  222. package/dist/domain/filesystem/file-change-diff.js +60 -0
  223. package/dist/domain/media/gateway-media-contract.d.ts +23 -0
  224. package/dist/domain/media/gateway-media-contract.js +163 -0
  225. package/dist/domain/media/media-contract.d.ts +28 -0
  226. package/dist/domain/media/media-contract.js +1 -0
  227. package/dist/domain/media/media-execution-policy.d.ts +9 -0
  228. package/dist/domain/media/media-execution-policy.js +31 -0
  229. package/dist/domain/orchestration/goal.d.ts +58 -0
  230. package/dist/domain/orchestration/goal.js +113 -0
  231. package/dist/domain/orchestration/subagent-identity.d.ts +2 -0
  232. package/dist/domain/orchestration/subagent-identity.js +8 -0
  233. package/dist/domain/orchestration/subagent.d.ts +33 -0
  234. package/dist/domain/orchestration/subagent.js +1 -0
  235. package/dist/domain/orchestration/task.d.ts +31 -0
  236. package/dist/domain/orchestration/task.js +1 -0
  237. package/dist/domain/project/project-identity.d.ts +6 -0
  238. package/dist/domain/project/project-identity.js +4 -0
  239. package/dist/domain/runtime/assistant-delta-normalizer.d.ts +11 -0
  240. package/dist/domain/runtime/assistant-delta-normalizer.js +19 -0
  241. package/dist/domain/runtime/resource-limits.d.ts +60 -0
  242. package/dist/domain/runtime/resource-limits.js +60 -0
  243. package/dist/domain/session/attachment.d.ts +13 -0
  244. package/dist/domain/session/attachment.js +1 -0
  245. package/dist/domain/session/session-schema.d.ts +6 -0
  246. package/dist/domain/session/session-schema.js +28 -0
  247. package/dist/domain/session/session.d.ts +27 -0
  248. package/dist/domain/session/session.js +1 -0
  249. package/dist/domain/settings/settings-document.d.ts +8 -0
  250. package/dist/domain/settings/settings-document.js +36 -0
  251. package/dist/domain/validation/record-schema.d.ts +4 -0
  252. package/dist/domain/validation/record-schema.js +9 -0
  253. package/dist/domain/workspace/workspace-settings.d.ts +12 -0
  254. package/dist/domain/workspace/workspace-settings.js +44 -0
  255. package/dist/infrastructure/agent-sdk/agent-instance-factory.d.ts +22 -0
  256. package/dist/infrastructure/agent-sdk/agent-instance-factory.js +31 -0
  257. package/dist/infrastructure/agent-sdk/tool-calling-model-client.d.ts +11 -0
  258. package/dist/infrastructure/agent-sdk/tool-calling-model-client.js +447 -0
  259. package/dist/infrastructure/cache/cache-policy.d.ts +7 -0
  260. package/dist/infrastructure/cache/cache-policy.js +18 -0
  261. package/dist/infrastructure/cache/file-cache-store.d.ts +17 -0
  262. package/dist/infrastructure/cache/file-cache-store.js +121 -0
  263. package/dist/infrastructure/clipboard/clipboard-adapter-factory.d.ts +11 -0
  264. package/dist/infrastructure/clipboard/clipboard-adapter-factory.js +98 -0
  265. package/dist/infrastructure/clipboard/clipboard-policy.d.ts +8 -0
  266. package/dist/infrastructure/clipboard/clipboard-policy.js +19 -0
  267. package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.d.ts +10 -0
  268. package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.js +94 -0
  269. package/dist/infrastructure/clipboard/image-normalizer.d.ts +12 -0
  270. package/dist/infrastructure/clipboard/image-normalizer.js +78 -0
  271. package/dist/infrastructure/clipboard/windows-clipboard-adapter.d.ts +7 -0
  272. package/dist/infrastructure/clipboard/windows-clipboard-adapter.js +66 -0
  273. package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.d.ts +7 -0
  274. package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.js +70 -0
  275. package/dist/infrastructure/config/config-loader.d.ts +19 -0
  276. package/dist/infrastructure/config/config-loader.js +76 -0
  277. package/dist/infrastructure/config/environment-values.d.ts +2 -0
  278. package/dist/infrastructure/config/environment-values.js +7 -0
  279. package/dist/infrastructure/credentials/composite-credential-store.d.ts +11 -0
  280. package/dist/infrastructure/credentials/composite-credential-store.js +32 -0
  281. package/dist/infrastructure/credentials/encrypted-file-credential-store.d.ts +17 -0
  282. package/dist/infrastructure/credentials/encrypted-file-credential-store.js +181 -0
  283. package/dist/infrastructure/credentials/environment-credential-store.d.ts +11 -0
  284. package/dist/infrastructure/credentials/environment-credential-store.js +37 -0
  285. package/dist/infrastructure/credentials/secret-input.d.ts +7 -0
  286. package/dist/infrastructure/credentials/secret-input.js +44 -0
  287. package/dist/infrastructure/extensions/composite-mcp-config-store.d.ts +9 -0
  288. package/dist/infrastructure/extensions/composite-mcp-config-store.js +10 -0
  289. package/dist/infrastructure/extensions/extension-directory-reader.d.ts +2 -0
  290. package/dist/infrastructure/extensions/extension-directory-reader.js +15 -0
  291. package/dist/infrastructure/extensions/extension-source-resolver.d.ts +6 -0
  292. package/dist/infrastructure/extensions/extension-source-resolver.js +126 -0
  293. package/dist/infrastructure/extensions/file-mcp-config-store.d.ts +15 -0
  294. package/dist/infrastructure/extensions/file-mcp-config-store.js +66 -0
  295. package/dist/infrastructure/extensions/hook-runtime.d.ts +18 -0
  296. package/dist/infrastructure/extensions/hook-runtime.js +66 -0
  297. package/dist/infrastructure/extensions/mcp-runtime.d.ts +12 -0
  298. package/dist/infrastructure/extensions/mcp-runtime.js +52 -0
  299. package/dist/infrastructure/extensions/plugin-discovery.d.ts +5 -0
  300. package/dist/infrastructure/extensions/plugin-discovery.js +52 -0
  301. package/dist/infrastructure/extensions/plugin-manager.d.ts +26 -0
  302. package/dist/infrastructure/extensions/plugin-manager.js +139 -0
  303. package/dist/infrastructure/extensions/skill-discovery.d.ts +4 -0
  304. package/dist/infrastructure/extensions/skill-discovery.js +29 -0
  305. package/dist/infrastructure/extensions/skill-installer.d.ts +8 -0
  306. package/dist/infrastructure/extensions/skill-installer.js +88 -0
  307. package/dist/infrastructure/extensions/skill-manager.d.ts +22 -0
  308. package/dist/infrastructure/extensions/skill-manager.js +67 -0
  309. package/dist/infrastructure/extensions/skill-roots.d.ts +19 -0
  310. package/dist/infrastructure/extensions/skill-roots.js +25 -0
  311. package/dist/infrastructure/extensions/skill-tool-executor.d.ts +18 -0
  312. package/dist/infrastructure/extensions/skill-tool-executor.js +53 -0
  313. package/dist/infrastructure/filesystem/atomic-file-store.d.ts +12 -0
  314. package/dist/infrastructure/filesystem/atomic-file-store.js +106 -0
  315. package/dist/infrastructure/filesystem/bounded-file-reader.d.ts +6 -0
  316. package/dist/infrastructure/filesystem/bounded-file-reader.js +24 -0
  317. package/dist/infrastructure/filesystem/bounded-json-reader.d.ts +1 -0
  318. package/dist/infrastructure/filesystem/bounded-json-reader.js +7 -0
  319. package/dist/infrastructure/filesystem/fs-errors.d.ts +2 -0
  320. package/dist/infrastructure/filesystem/fs-errors.js +6 -0
  321. package/dist/infrastructure/filesystem/gateway-media-input-reader.d.ts +12 -0
  322. package/dist/infrastructure/filesystem/gateway-media-input-reader.js +49 -0
  323. package/dist/infrastructure/filesystem/local-filesystem-tool-executor.d.ts +21 -0
  324. package/dist/infrastructure/filesystem/local-filesystem-tool-executor.js +176 -0
  325. package/dist/infrastructure/filesystem/path-resolver.d.ts +20 -0
  326. package/dist/infrastructure/filesystem/path-resolver.js +119 -0
  327. package/dist/infrastructure/filesystem/workspace-media-artifact-store.d.ts +13 -0
  328. package/dist/infrastructure/filesystem/workspace-media-artifact-store.js +152 -0
  329. package/dist/infrastructure/logging/daily-rotating-file-writer.d.ts +20 -0
  330. package/dist/infrastructure/logging/daily-rotating-file-writer.js +75 -0
  331. package/dist/infrastructure/logging/log-redactor.d.ts +2 -0
  332. package/dist/infrastructure/logging/log-redactor.js +26 -0
  333. package/dist/infrastructure/logging/logging-policy.d.ts +6 -0
  334. package/dist/infrastructure/logging/logging-policy.js +6 -0
  335. package/dist/infrastructure/logging/structured-logger.d.ts +24 -0
  336. package/dist/infrastructure/logging/structured-logger.js +40 -0
  337. package/dist/infrastructure/network/safe-media-downloader.d.ts +23 -0
  338. package/dist/infrastructure/network/safe-media-downloader.js +239 -0
  339. package/dist/infrastructure/platform/host-platform.d.ts +14 -0
  340. package/dist/infrastructure/platform/host-platform.js +23 -0
  341. package/dist/infrastructure/platform/host-process.d.ts +17 -0
  342. package/dist/infrastructure/platform/host-process.js +116 -0
  343. package/dist/infrastructure/platform/platform-paths.d.ts +25 -0
  344. package/dist/infrastructure/platform/platform-paths.js +33 -0
  345. package/dist/infrastructure/project/file-project-trust-store.d.ts +12 -0
  346. package/dist/infrastructure/project/file-project-trust-store.js +59 -0
  347. package/dist/infrastructure/sdk/chat-completion-adapter.d.ts +8 -0
  348. package/dist/infrastructure/sdk/chat-completion-adapter.js +115 -0
  349. package/dist/infrastructure/sdk/lotagate-client-factory.d.ts +3 -0
  350. package/dist/infrastructure/sdk/lotagate-client-factory.js +8 -0
  351. package/dist/infrastructure/sdk/model-catalog-adapter.d.ts +19 -0
  352. package/dist/infrastructure/sdk/model-catalog-adapter.js +28 -0
  353. package/dist/infrastructure/sdk/sdk-media-gateway-client.d.ts +20 -0
  354. package/dist/infrastructure/sdk/sdk-media-gateway-client.js +97 -0
  355. package/dist/infrastructure/sessions/file-goal-store.d.ts +21 -0
  356. package/dist/infrastructure/sessions/file-goal-store.js +160 -0
  357. package/dist/infrastructure/sessions/file-session-store.d.ts +48 -0
  358. package/dist/infrastructure/sessions/file-session-store.js +525 -0
  359. package/dist/infrastructure/sessions/project-session-paths.d.ts +17 -0
  360. package/dist/infrastructure/sessions/project-session-paths.js +41 -0
  361. package/dist/infrastructure/sessions/session-index.d.ts +16 -0
  362. package/dist/infrastructure/sessions/session-index.js +84 -0
  363. package/dist/infrastructure/sessions/session-journal.d.ts +22 -0
  364. package/dist/infrastructure/sessions/session-journal.js +137 -0
  365. package/dist/infrastructure/sessions/subagent-journal-store.d.ts +28 -0
  366. package/dist/infrastructure/sessions/subagent-journal-store.js +30 -0
  367. package/dist/infrastructure/shell/shell-tool-executor.d.ts +17 -0
  368. package/dist/infrastructure/shell/shell-tool-executor.js +115 -0
  369. package/dist/infrastructure/tokens/tiktoken-token-estimator.d.ts +18 -0
  370. package/dist/infrastructure/tokens/tiktoken-token-estimator.js +48 -0
  371. package/dist/infrastructure/workspace/workspace-settings-store.d.ts +9 -0
  372. package/dist/infrastructure/workspace/workspace-settings-store.js +75 -0
  373. package/dist/main.d.ts +7 -0
  374. package/dist/main.js +66 -0
  375. package/dist/ports/cache-store.d.ts +10 -0
  376. package/dist/ports/cache-store.js +1 -0
  377. package/dist/ports/chat-model.d.ts +30 -0
  378. package/dist/ports/chat-model.js +1 -0
  379. package/dist/ports/clipboard-adapter.d.ts +7 -0
  380. package/dist/ports/clipboard-adapter.js +1 -0
  381. package/dist/ports/clipboard-text-adapter.d.ts +3 -0
  382. package/dist/ports/clipboard-text-adapter.js +1 -0
  383. package/dist/ports/credential-store.d.ts +7 -0
  384. package/dist/ports/credential-store.js +1 -0
  385. package/dist/ports/goal-store.d.ts +12 -0
  386. package/dist/ports/goal-store.js +1 -0
  387. package/dist/ports/logger.d.ts +8 -0
  388. package/dist/ports/logger.js +1 -0
  389. package/dist/ports/media-gateway-client.d.ts +54 -0
  390. package/dist/ports/media-gateway-client.js +1 -0
  391. package/dist/ports/model-diagnostics.d.ts +17 -0
  392. package/dist/ports/model-diagnostics.js +1 -0
  393. package/dist/ports/project-trust-store.d.ts +12 -0
  394. package/dist/ports/project-trust-store.js +1 -0
  395. package/dist/ports/session-store.d.ts +58 -0
  396. package/dist/ports/session-store.js +1 -0
  397. package/dist/ports/subagent-lifecycle.d.ts +31 -0
  398. package/dist/ports/subagent-lifecycle.js +1 -0
  399. package/dist/ports/tool-activity.d.ts +13 -0
  400. package/dist/ports/tool-activity.js +1 -0
  401. package/dist/presentation/themes/theme.d.ts +19 -0
  402. package/dist/presentation/themes/theme.js +8 -0
  403. package/dist/presentation/tui/agent-initialization-renderer.d.ts +4 -0
  404. package/dist/presentation/tui/agent-initialization-renderer.js +37 -0
  405. package/dist/presentation/tui/context-display.d.ts +21 -0
  406. package/dist/presentation/tui/context-display.js +33 -0
  407. package/dist/presentation/tui/formatters.d.ts +6 -0
  408. package/dist/presentation/tui/formatters.js +60 -0
  409. package/dist/presentation/tui/ink/choice-window.d.ts +5 -0
  410. package/dist/presentation/tui/ink/choice-window.js +5 -0
  411. package/dist/presentation/tui/ink/components/activity-entry.d.ts +6 -0
  412. package/dist/presentation/tui/ink/components/activity-entry.js +16 -0
  413. package/dist/presentation/tui/ink/components/activity-status.d.ts +10 -0
  414. package/dist/presentation/tui/ink/components/activity-status.js +21 -0
  415. package/dist/presentation/tui/ink/components/choice-modal.d.ts +11 -0
  416. package/dist/presentation/tui/ink/components/choice-modal.js +29 -0
  417. package/dist/presentation/tui/ink/components/composer.d.ts +40 -0
  418. package/dist/presentation/tui/ink/components/composer.js +271 -0
  419. package/dist/presentation/tui/ink/components/file-diff.d.ts +6 -0
  420. package/dist/presentation/tui/ink/components/file-diff.js +34 -0
  421. package/dist/presentation/tui/ink/components/modal.d.ts +8 -0
  422. package/dist/presentation/tui/ink/components/modal.js +110 -0
  423. package/dist/presentation/tui/ink/components/shimmer-text.d.ts +6 -0
  424. package/dist/presentation/tui/ink/components/shimmer-text.js +9 -0
  425. package/dist/presentation/tui/ink/components/subagent-activity.d.ts +11 -0
  426. package/dist/presentation/tui/ink/components/subagent-activity.js +61 -0
  427. package/dist/presentation/tui/ink/components/transcript.d.ts +39 -0
  428. package/dist/presentation/tui/ink/components/transcript.js +121 -0
  429. package/dist/presentation/tui/ink/components/welcome-panel.d.ts +6 -0
  430. package/dist/presentation/tui/ink/components/welcome-panel.js +20 -0
  431. package/dist/presentation/tui/ink/lotagate-tui.d.ts +6 -0
  432. package/dist/presentation/tui/ink/lotagate-tui.js +136 -0
  433. package/dist/presentation/tui/ink/markdown-inline-renderer.d.ts +4 -0
  434. package/dist/presentation/tui/ink/markdown-inline-renderer.js +20 -0
  435. package/dist/presentation/tui/ink/markdown-inline.d.ts +13 -0
  436. package/dist/presentation/tui/ink/markdown-inline.js +91 -0
  437. package/dist/presentation/tui/ink/markdown-message.d.ts +6 -0
  438. package/dist/presentation/tui/ink/markdown-message.js +66 -0
  439. package/dist/presentation/tui/ink/markdown-table.d.ts +16 -0
  440. package/dist/presentation/tui/ink/markdown-table.js +77 -0
  441. package/dist/presentation/tui/ink/tui-bridge.d.ts +195 -0
  442. package/dist/presentation/tui/ink/tui-bridge.js +289 -0
  443. package/dist/presentation/tui/terminal-capabilities.d.ts +15 -0
  444. package/dist/presentation/tui/terminal-capabilities.js +7 -0
  445. package/dist/presentation/tui/terminal-mouse.d.ts +5 -0
  446. package/dist/presentation/tui/terminal-mouse.js +19 -0
  447. package/dist/presentation/tui/terminal-screen.d.ts +10 -0
  448. package/dist/presentation/tui/terminal-screen.js +23 -0
  449. package/dist/presentation/tui/tui-agent-event-runner.d.ts +24 -0
  450. package/dist/presentation/tui/tui-agent-event-runner.js +69 -0
  451. package/dist/presentation/tui/tui-application-contract.d.ts +10 -0
  452. package/dist/presentation/tui/tui-application-contract.js +8 -0
  453. package/dist/presentation/tui/tui-application.d.ts +62 -0
  454. package/dist/presentation/tui/tui-application.js +675 -0
  455. package/dist/presentation/tui/tui-attachment-input.d.ts +2 -0
  456. package/dist/presentation/tui/tui-attachment-input.js +5 -0
  457. package/dist/presentation/tui/tui-clipboard-paste-handlers.d.ts +11 -0
  458. package/dist/presentation/tui/tui-clipboard-paste-handlers.js +25 -0
  459. package/dist/presentation/tui/tui-command-context.d.ts +3 -0
  460. package/dist/presentation/tui/tui-command-context.js +1 -0
  461. package/dist/presentation/tui/tui-command-executor.d.ts +38 -0
  462. package/dist/presentation/tui/tui-command-executor.js +214 -0
  463. package/dist/presentation/tui/tui-command-host-factory.d.ts +40 -0
  464. package/dist/presentation/tui/tui-command-host-factory.js +23 -0
  465. package/dist/presentation/tui/tui-context-compaction.d.ts +5 -0
  466. package/dist/presentation/tui/tui-context-compaction.js +22 -0
  467. package/dist/presentation/tui/tui-context-service.d.ts +34 -0
  468. package/dist/presentation/tui/tui-context-service.js +126 -0
  469. package/dist/presentation/tui/tui-file-suggestions.d.ts +3 -0
  470. package/dist/presentation/tui/tui-file-suggestions.js +8 -0
  471. package/dist/presentation/tui/tui-goal-controller.d.ts +14 -0
  472. package/dist/presentation/tui/tui-goal-controller.js +52 -0
  473. package/dist/presentation/tui/tui-initial-model.d.ts +3 -0
  474. package/dist/presentation/tui/tui-initial-model.js +28 -0
  475. package/dist/presentation/tui/tui-lifecycle-actions.d.ts +13 -0
  476. package/dist/presentation/tui/tui-lifecycle-actions.js +45 -0
  477. package/dist/presentation/tui/tui-manual-compaction.d.ts +18 -0
  478. package/dist/presentation/tui/tui-manual-compaction.js +31 -0
  479. package/dist/presentation/tui/tui-media-model-selection.d.ts +12 -0
  480. package/dist/presentation/tui/tui-media-model-selection.js +38 -0
  481. package/dist/presentation/tui/tui-prompt-dispatcher.d.ts +16 -0
  482. package/dist/presentation/tui/tui-prompt-dispatcher.js +38 -0
  483. package/dist/presentation/tui/tui-skill-controller.d.ts +11 -0
  484. package/dist/presentation/tui/tui-skill-controller.js +13 -0
  485. package/dist/presentation/tui/tui-tool-approval.d.ts +22 -0
  486. package/dist/presentation/tui/tui-tool-approval.js +73 -0
  487. package/dist/version.d.ts +1 -0
  488. package/dist/version.js +1 -0
  489. package/package.json +8 -7
  490. package/scripts/install-native.mjs +11 -11
@@ -0,0 +1,16 @@
1
+ import type { AttachmentPayload } from '../../domain/session/attachment.js';
2
+ export declare class DesktopAttachmentStore {
3
+ private readonly pending;
4
+ private readonly completed;
5
+ begin(input: {
6
+ id: string;
7
+ name: string;
8
+ mimeType: string;
9
+ sizeBytes: number;
10
+ }): void;
11
+ appendChunk(id: string, index: number, encoded: string): void;
12
+ complete(id: string): void;
13
+ take(ids: readonly string[]): AttachmentPayload[];
14
+ clear(): void;
15
+ private totalReservedBytes;
16
+ }
@@ -0,0 +1,82 @@
1
+ import { CLI_ERROR_CODES } from '../../domain/errors/error-codes.js';
2
+ import { CliError } from '../../domain/errors/cli-error.js';
3
+ import { createImageAttachment, normalizeImage } from '../../infrastructure/clipboard/image-normalizer.js';
4
+ import { RESOURCE_LIMITS } from '../../domain/runtime/resource-limits.js';
5
+ export class DesktopAttachmentStore {
6
+ pending = new Map();
7
+ completed = new Map();
8
+ begin(input) {
9
+ if (!validId(input.id) || !validName(input.name) || !validMimeType(input.mimeType))
10
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_INVALID_IMAGE, 'Invalid desktop attachment metadata.', 'The attachment metadata is invalid.');
11
+ if (!Number.isSafeInteger(input.sizeBytes) || input.sizeBytes <= 0 || input.sizeBytes > RESOURCE_LIMITS.maxAttachmentBytes)
12
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_TOO_LARGE, 'Desktop attachment size is outside the allowed range.', 'The attachment exceeds the maximum allowed size.', true);
13
+ if (this.pending.has(input.id) || this.completed.has(input.id))
14
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_INVALID_IMAGE, 'Desktop attachment id is already in use.', 'This attachment has already been uploaded.');
15
+ if (this.totalReservedBytes() + input.sizeBytes > RESOURCE_LIMITS.pendingAttachmentTotalBytes || this.pending.size + this.completed.size >= RESOURCE_LIMITS.pendingAttachments)
16
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_TOO_LARGE, 'Desktop attachment limits exceeded.', 'Too many or too-large attachments are pending.', true);
17
+ this.pending.set(input.id, { id: input.id, name: input.name, mimeType: input.mimeType, sizeBytes: input.sizeBytes, nextIndex: 0, receivedBytes: 0, chunks: [] });
18
+ }
19
+ appendChunk(id, index, encoded) {
20
+ const attachment = this.pending.get(id);
21
+ if (attachment === undefined)
22
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_INVALID_IMAGE, 'Desktop attachment upload was not started.', 'The attachment upload is not active.');
23
+ if (!Number.isSafeInteger(index) || index !== attachment.nextIndex)
24
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_INVALID_IMAGE, 'Desktop attachment chunk order is invalid.', 'The attachment upload is out of order.');
25
+ const bytes = decodeBase64(encoded);
26
+ if (bytes.byteLength === 0 || bytes.byteLength > RESOURCE_LIMITS.desktopAttachmentChunkBytes || attachment.receivedBytes + bytes.byteLength > attachment.sizeBytes)
27
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_TOO_LARGE, 'Desktop attachment chunk exceeds its declared size.', 'The attachment upload is invalid or too large.', true);
28
+ attachment.chunks.push(bytes);
29
+ attachment.receivedBytes += bytes.byteLength;
30
+ attachment.nextIndex += 1;
31
+ }
32
+ complete(id) {
33
+ const pending = this.pending.get(id);
34
+ if (pending === undefined)
35
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_INVALID_IMAGE, 'Desktop attachment upload was not started.', 'The attachment upload is not active.');
36
+ if (pending.receivedBytes !== pending.sizeBytes)
37
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_INVALID_IMAGE, 'Desktop attachment upload is incomplete.', 'The attachment upload did not finish.');
38
+ const bytes = Buffer.concat(pending.chunks);
39
+ if (pending.mimeType.startsWith('image/')) {
40
+ const normalized = normalizeImage(bytes, pending.mimeType);
41
+ const base = createImageAttachment(normalized, 'file', pending.id);
42
+ this.completed.set(id, { attachment: { ...base, name: pending.name }, bytes: normalized.bytes });
43
+ }
44
+ else {
45
+ this.completed.set(id, { attachment: { id: pending.id, name: pending.name, mimeType: pending.mimeType, sizeBytes: bytes.byteLength, source: 'file' }, bytes });
46
+ }
47
+ this.pending.delete(id);
48
+ }
49
+ take(ids) {
50
+ if (new Set(ids).size !== ids.length)
51
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_INVALID_IMAGE, 'Desktop attachment ids must be unique.', 'An attachment was referenced more than once.');
52
+ const attachments = ids.map(id => {
53
+ const attachment = this.completed.get(id);
54
+ if (attachment === undefined)
55
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_INVALID_IMAGE, 'Desktop attachment is not complete.', 'Complete the attachment upload before sending the prompt.');
56
+ return attachment;
57
+ });
58
+ ids.forEach(id => this.completed.delete(id));
59
+ return attachments;
60
+ }
61
+ clear() {
62
+ this.pending.clear();
63
+ this.completed.clear();
64
+ }
65
+ totalReservedBytes() {
66
+ let total = 0;
67
+ for (const attachment of this.pending.values())
68
+ total += attachment.sizeBytes;
69
+ for (const attachment of this.completed.values())
70
+ total += attachment.bytes.byteLength;
71
+ return total;
72
+ }
73
+ }
74
+ function decodeBase64(value) {
75
+ if (!/^[A-Za-z0-9+/]*={0,2}$/u.test(value) || value.length === 0 || value.length % 4 !== 0)
76
+ throw attachmentError(CLI_ERROR_CODES.ATTACHMENT_INVALID_IMAGE, 'Desktop attachment chunk is not valid Base64.', 'The attachment upload is invalid.');
77
+ return Buffer.from(value, 'base64');
78
+ }
79
+ function validId(value) { return /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(value); }
80
+ function validName(value) { return value.length > 0 && value.length <= 200 && !value.includes('\0'); }
81
+ function validMimeType(value) { return value.length <= RESOURCE_LIMITS.jsonlIdBytes && /^[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*\/[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*$/u.test(value); }
82
+ function attachmentError(code, message, userMessage, retryable = false) { return new CliError(code, message, { category: 'attachment', userMessage, retryable }); }
@@ -0,0 +1,2 @@
1
+ import type { DesktopCommandListResult } from './desktop-command-contract.js';
2
+ export declare function getDesktopCommandCatalog(): DesktopCommandListResult;
@@ -0,0 +1,19 @@
1
+ import { COMMAND_REGISTRY } from '../commands/command-runtime.js';
2
+ import { isDesktopCommandExposed } from './desktop-command-contract.js';
3
+ export function getDesktopCommandCatalog() {
4
+ return {
5
+ commands: COMMAND_REGISTRY
6
+ .list('direct')
7
+ .filter(isDesktopCommandExposed)
8
+ .map(toDescriptor),
9
+ };
10
+ }
11
+ function toDescriptor(action) {
12
+ return {
13
+ id: action.id,
14
+ path: action.path,
15
+ summary: action.summary,
16
+ ...(action.arguments === undefined ? {} : { arguments: action.arguments }),
17
+ ...(action.options === undefined ? {} : { options: action.options }),
18
+ };
19
+ }
@@ -0,0 +1,22 @@
1
+ import type { CommandActionSpec, CommandArgumentSpec, CommandOptionSpec } from '../commands/command-contract.js';
2
+ export interface DesktopCommandDescriptor {
3
+ readonly id: string;
4
+ readonly path: readonly string[];
5
+ readonly summary: string;
6
+ readonly arguments?: readonly CommandArgumentSpec[];
7
+ readonly options?: readonly CommandOptionSpec[];
8
+ }
9
+ export interface DesktopCommandListResult {
10
+ readonly commands: readonly DesktopCommandDescriptor[];
11
+ }
12
+ export interface DesktopCommandInvocation {
13
+ readonly actionId: string;
14
+ readonly positionals: readonly string[];
15
+ readonly options: Readonly<Record<string, string | boolean>>;
16
+ }
17
+ export interface DesktopCommandExecutionResult {
18
+ readonly accepted: true;
19
+ readonly commandId: string;
20
+ readonly actionId: string;
21
+ }
22
+ export declare function isDesktopCommandExposed(action: CommandActionSpec): boolean;
@@ -0,0 +1,3 @@
1
+ export function isDesktopCommandExposed(action) {
2
+ return action.surfaces.includes('direct') && action.desktop?.exposed !== false;
3
+ }
@@ -0,0 +1,16 @@
1
+ import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
2
+ import type { DesktopCommandInvocation } from './desktop-command-contract.js';
3
+ import { type DesktopCommandOutputSink } from './desktop-command-output.js';
4
+ export interface DesktopCommandExecutorOptions {
5
+ readonly runtime: CliRuntime;
6
+ readonly cwd: string;
7
+ readonly invocation: DesktopCommandInvocation;
8
+ readonly signal: AbortSignal;
9
+ readonly output: DesktopCommandOutputSink;
10
+ readonly activity?: DesktopCommandActivitySink;
11
+ }
12
+ export interface DesktopCommandActivitySink {
13
+ started(key: string, label: string): Promise<void>;
14
+ completed(key: string, isError: boolean): Promise<void>;
15
+ }
16
+ export declare function executeDesktopCommand(options: DesktopCommandExecutorOptions): Promise<number>;
@@ -0,0 +1,47 @@
1
+ import { executeApplicationCommand } from '../commands/application-command-executor.js';
2
+ import { COMMAND_REGISTRY } from '../commands/command-runtime.js';
3
+ import { parseCommandInvocationForAction } from '../commands/command-parser.js';
4
+ import { CliError } from '../../domain/errors/cli-error.js';
5
+ import { CLI_ERROR_CODES } from '../../domain/errors/error-codes.js';
6
+ import { isDesktopCommandExposed } from './desktop-command-contract.js';
7
+ import { DesktopCommandOutput } from './desktop-command-output.js';
8
+ export async function executeDesktopCommand(options) {
9
+ const invocation = parseDesktopInvocation(options.invocation);
10
+ const commandOutput = new DesktopCommandOutput(options.output);
11
+ const host = {
12
+ runtime: options.runtime,
13
+ cwd: options.cwd,
14
+ output: commandOutput,
15
+ writableOutput: commandOutput.writable,
16
+ signal: options.signal,
17
+ ...(options.activity === undefined ? {} : { activity: createActivityObserver(options.activity) }),
18
+ };
19
+ try {
20
+ const exitCode = await executeApplicationCommand(invocation, host);
21
+ await commandOutput.flush();
22
+ return exitCode;
23
+ }
24
+ finally {
25
+ await commandOutput.flush();
26
+ commandOutput.writable.destroy();
27
+ }
28
+ }
29
+ function parseDesktopInvocation(request) {
30
+ const action = COMMAND_REGISTRY.get(request.actionId);
31
+ if (action === undefined || !isDesktopCommandExposed(action)) {
32
+ throw new CliError(CLI_ERROR_CODES.INVALID_ARGUMENT, `Command action '${request.actionId}' is not available through the Desktop protocol.`, {
33
+ category: 'command',
34
+ userMessage: `The command '${request.actionId}' is not available in the Desktop application.`,
35
+ });
36
+ }
37
+ const options = new Map(Object.entries(request.options));
38
+ return parseCommandInvocationForAction(request.actionId, request.positionals, options, 'direct', COMMAND_REGISTRY);
39
+ }
40
+ function createActivityObserver(sink) {
41
+ return {
42
+ start(key, label) {
43
+ void sink.started(key, label);
44
+ return { complete: (isError) => void sink.completed(key, isError) };
45
+ },
46
+ };
47
+ }
@@ -0,0 +1,15 @@
1
+ import { Writable } from 'node:stream';
2
+ import type { CommandOutput } from '../commands/command-output.js';
3
+ export interface DesktopCommandOutputSink {
4
+ write(content: string, structured?: object): Promise<void>;
5
+ }
6
+ /** Adapts existing command output to ordered JSONL command.output events. */
7
+ export declare class DesktopCommandOutput implements CommandOutput {
8
+ private readonly _sink;
9
+ private _pending;
10
+ readonly writable: Writable;
11
+ constructor(_sink: DesktopCommandOutputSink);
12
+ write(value: string): void;
13
+ writeStructured<T extends object>(value: T, fallbackText?: string): void;
14
+ flush(): Promise<void>;
15
+ }
@@ -0,0 +1,24 @@
1
+ import { Writable } from 'node:stream';
2
+ /** Adapts existing command output to ordered JSONL command.output events. */
3
+ export class DesktopCommandOutput {
4
+ _sink;
5
+ _pending = Promise.resolve();
6
+ writable = new Writable({
7
+ write: (chunk, _encoding, callback) => {
8
+ this.write(String(chunk));
9
+ callback();
10
+ },
11
+ });
12
+ constructor(_sink) {
13
+ this._sink = _sink;
14
+ }
15
+ write(value) {
16
+ this._pending = this._pending.then(() => this._sink.write(value));
17
+ }
18
+ writeStructured(value, fallbackText) {
19
+ this._pending = this._pending.then(() => this._sink.write(fallbackText ?? '', value));
20
+ }
21
+ async flush() {
22
+ await this._pending;
23
+ }
24
+ }
@@ -0,0 +1,17 @@
1
+ export type DesktopPermissionPolicy = 'ask' | 'allowlist' | 'review' | 'autonomous';
2
+ export type DesktopBrowserAccess = 'disabled' | 'read-only' | 'interactive' | 'autonomous';
3
+ export interface DesktopExecutionPolicy {
4
+ readonly permissionPolicy: DesktopPermissionPolicy;
5
+ readonly allowedTools?: readonly string[];
6
+ readonly browserAccess: DesktopBrowserAccess;
7
+ readonly isolation: 'sandbox' | 'host';
8
+ readonly hostFallback: 'ask' | 'deny' | 'allow';
9
+ readonly timeoutMs: number;
10
+ readonly retryAttempt?: number;
11
+ }
12
+ /**
13
+ * Parses the required Desktop-only execution context at the CLI boundary.
14
+ * Standalone CLI commands use a separate protocol and never provide this
15
+ * object. Unknown fields are ignored so the new contract can grow additively.
16
+ */
17
+ export declare function parseDesktopExecutionPolicy(value: unknown): DesktopExecutionPolicy;
@@ -0,0 +1,49 @@
1
+ import { RESOURCE_LIMITS } from '../../domain/runtime/resource-limits.js';
2
+ /**
3
+ * Parses the required Desktop-only execution context at the CLI boundary.
4
+ * Standalone CLI commands use a separate protocol and never provide this
5
+ * object. Unknown fields are ignored so the new contract can grow additively.
6
+ */
7
+ export function parseDesktopExecutionPolicy(value) {
8
+ if (!isRecord(value))
9
+ throw new Error('Invalid Desktop execution policy.');
10
+ const permissionPolicy = requiredEnum(value['permissionPolicy'], ['ask', 'allowlist', 'review', 'autonomous'], 'permissionPolicy');
11
+ const browserAccess = requiredEnum(value['browserAccess'], ['disabled', 'read-only', 'interactive', 'autonomous'], 'browserAccess');
12
+ const isolation = requiredEnum(value['isolation'], ['sandbox', 'host'], 'isolation');
13
+ const hostFallback = requiredEnum(value['hostFallback'], ['ask', 'deny', 'allow'], 'hostFallback');
14
+ const allowedTools = value['allowedTools'] === undefined ? undefined : parseAllowedTools(value['allowedTools']);
15
+ const timeoutMs = parseInteger(value['timeoutMs'], 10_000, 2 * 60 * 60 * 1_000, 'timeoutMs');
16
+ const retryAttempt = value['retryAttempt'] === undefined ? undefined : parseInteger(value['retryAttempt'], 0, 3, 'retryAttempt');
17
+ return {
18
+ permissionPolicy,
19
+ ...(allowedTools === undefined ? {} : { allowedTools }),
20
+ browserAccess,
21
+ isolation,
22
+ hostFallback,
23
+ timeoutMs,
24
+ ...(retryAttempt === undefined ? {} : { retryAttempt }),
25
+ };
26
+ }
27
+ function parseAllowedTools(value) {
28
+ if (!Array.isArray(value) || value.length > 128)
29
+ throw new Error('Invalid Desktop allowedTools.');
30
+ const tools = value.map((tool) => {
31
+ if (typeof tool !== 'string' || tool.trim().length === 0 || Buffer.byteLength(tool, 'utf8') > RESOURCE_LIMITS.jsonlIdBytes)
32
+ throw new Error('Invalid Desktop allowedTools entry.');
33
+ return tool.trim();
34
+ });
35
+ if (new Set(tools).size !== tools.length)
36
+ throw new Error('Desktop allowedTools must not contain duplicates.');
37
+ return tools;
38
+ }
39
+ function requiredEnum(value, values, key) {
40
+ if (typeof value !== 'string' || !values.includes(value))
41
+ throw new Error(`Invalid Desktop ${key}.`);
42
+ return value;
43
+ }
44
+ function parseInteger(value, minimum, maximum, key) {
45
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < minimum || value > maximum)
46
+ throw new Error(`Invalid Desktop ${key}.`);
47
+ return value;
48
+ }
49
+ function isRecord(value) { return typeof value === 'object' && value !== null && !Array.isArray(value); }
@@ -0,0 +1,57 @@
1
+ import type { ToolDefinition } from '@lotagate/sdk';
2
+ import type { ToolExecutionContext, ToolExecutor, ToolInfo, ToolResult } from '@lotagate/agent-sdk';
3
+ import type { ToolActivityObserver } from '../../ports/tool-activity.js';
4
+ import type { ToolApprovalRequest } from '@lotagate/agent-sdk';
5
+ import type { FileChangeDiff } from '../../domain/filesystem/file-change-diff.js';
6
+ export type DesktopHostExecutionTool = 'filesystem' | 'shell' | 'git' | 'artifact';
7
+ export interface DesktopHostExecutionRequest {
8
+ version: 2;
9
+ type: 'host.request';
10
+ requestId: string;
11
+ tool: DesktopHostExecutionTool;
12
+ sessionId: string;
13
+ runId: string;
14
+ action: string;
15
+ params: Record<string, unknown>;
16
+ executionBoundary: 'sandbox' | 'host';
17
+ hostFallback: 'ask' | 'deny' | 'allow';
18
+ }
19
+ export interface DesktopHostExecutionResponse {
20
+ version: 2;
21
+ type: 'host.response';
22
+ requestId: string;
23
+ tool: DesktopHostExecutionTool;
24
+ ok: boolean;
25
+ result?: unknown;
26
+ error?: {
27
+ code: string;
28
+ category: string;
29
+ message: string;
30
+ retryable: boolean;
31
+ };
32
+ executionBoundary?: 'sandbox' | 'host';
33
+ fallbackReason?: string;
34
+ fileChange?: FileChangeDiff;
35
+ }
36
+ export type DesktopHostInvoker = (request: DesktopHostExecutionRequest, signal?: AbortSignal) => Promise<DesktopHostExecutionResponse>;
37
+ /**
38
+ * Routes Desktop-only host operations through the versioned host protocol.
39
+ * Standalone CLI callers never provide this executor and continue to use the
40
+ * local filesystem and shell executors.
41
+ */
42
+ export declare class DesktopHostToolExecutor implements ToolExecutor {
43
+ private readonly options;
44
+ private readonly definitions;
45
+ constructor(options: {
46
+ request: DesktopHostInvoker;
47
+ executionBoundary: 'sandbox' | 'host';
48
+ hostFallback: 'ask' | 'deny' | 'allow';
49
+ onWrite?: (change: FileChangeDiff) => void | Promise<void>;
50
+ onFallbackApproval?: (request: ToolApprovalRequest, reason: string) => boolean | Promise<boolean>;
51
+ onActivity?: ToolActivityObserver;
52
+ });
53
+ listTools(): readonly ToolDefinition[];
54
+ getToolInfo(toolName: string): ToolInfo | undefined;
55
+ execute(toolName: string, input: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolResult>;
56
+ private request;
57
+ }
@@ -0,0 +1,53 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { filesystemToolDefinitions } from '../../infrastructure/filesystem/local-filesystem-tool-executor.js';
3
+ import { shellToolDefinitions } from '../../infrastructure/shell/shell-tool-executor.js';
4
+ /**
5
+ * Routes Desktop-only host operations through the versioned host protocol.
6
+ * Standalone CLI callers never provide this executor and continue to use the
7
+ * local filesystem and shell executors.
8
+ */
9
+ export class DesktopHostToolExecutor {
10
+ options;
11
+ definitions = [...filesystemToolDefinitions(), ...shellToolDefinitions()];
12
+ constructor(options) {
13
+ this.options = options;
14
+ }
15
+ listTools() { return this.definitions; }
16
+ getToolInfo(toolName) {
17
+ if (!this.definitions.some(definition => toolNameOf(definition) === toolName))
18
+ return undefined;
19
+ return { toolName, source: toolName === 'shell.exec' ? 'shell' : 'filesystem', executorId: 'desktop-host-execution', metadata: { boundary: this.options.executionBoundary } };
20
+ }
21
+ async execute(toolName, input, context) {
22
+ if (!this.definitions.some(definition => toolNameOf(definition) === toolName))
23
+ return { content: `Unknown Desktop host tool: ${toolName}`, isError: true };
24
+ const tool = toolName === 'shell.exec' ? 'shell' : 'filesystem';
25
+ const activity = this.options.onActivity?.start({ key: `${context.runId}:${toolName}`, toolName, source: tool, label: `${this.options.executionBoundary === 'sandbox' ? 'Sandbox' : 'Host'} ${toolName}` });
26
+ try {
27
+ let response = await this.options.request(this.request(tool, toolName, input, context), context.signal);
28
+ if (!response.ok && response.error?.code === 'SANDBOX_FALLBACK_REQUIRED' && this.options.hostFallback === 'ask') {
29
+ const toolInfo = this.getToolInfo(toolName);
30
+ const approved = await this.options.onFallbackApproval?.({ toolName, input, context, ...(toolInfo === undefined ? {} : { toolInfo }) }, response.error.message) ?? false;
31
+ if (approved)
32
+ response = await this.options.request({ ...this.request(tool, toolName, input, context), executionBoundary: 'host', hostFallback: 'deny' }, context.signal);
33
+ }
34
+ if (!response.ok) {
35
+ activity?.complete(true);
36
+ return { content: response.error?.message ?? 'Desktop rejected the execution request.', isError: true, metadata: { code: response.error?.code ?? 'HOST_EXECUTION_ERROR', boundary: response.executionBoundary ?? this.options.executionBoundary, retryable: response.error?.retryable ?? false } };
37
+ }
38
+ activity?.complete(false);
39
+ if (response.fileChange !== undefined)
40
+ await this.options.onWrite?.(response.fileChange);
41
+ return { content: boundJson(response.result, context.maxResultBytes), isError: false, metadata: { boundary: response.executionBoundary ?? this.options.executionBoundary, ...(response.fallbackReason === undefined ? {} : { fallbackReason: response.fallbackReason }) } };
42
+ }
43
+ catch (error) {
44
+ activity?.complete(true);
45
+ return { content: error instanceof Error ? error.message : 'Desktop execution failed.', isError: true, metadata: { boundary: this.options.executionBoundary } };
46
+ }
47
+ }
48
+ request(tool, action, input, context) {
49
+ return { version: 2, type: 'host.request', requestId: randomUUID(), tool, sessionId: context.sessionId, runId: context.runId, action, params: input, executionBoundary: this.options.executionBoundary, hostFallback: this.options.hostFallback };
50
+ }
51
+ }
52
+ function toolNameOf(definition) { return 'function' in definition ? definition.function.name : undefined; }
53
+ function boundJson(value, maxBytes) { const content = typeof value === 'string' ? value : JSON.stringify(value ?? null); return Buffer.byteLength(content, 'utf8') <= maxBytes ? content : `${content.slice(0, Math.max(0, maxBytes - 12))}\n[truncated]`; }
@@ -0,0 +1,5 @@
1
+ import type { ExecutionPlan } from '../../domain/orchestration/task.js';
2
+ import type { SubagentLifecycleEvent } from '../../ports/subagent-lifecycle.js';
3
+ export declare function subagentDesktopPayload(event: SubagentLifecycleEvent, turnId: string): Record<string, unknown>;
4
+ export declare function planDesktopPayload(plan: ExecutionPlan, turnId: string): Record<string, unknown>;
5
+ export declare function planStepPayload(plan: ExecutionPlan, turnId: string, index: number, status: 'started' | 'completed'): Record<string, unknown>;
@@ -0,0 +1,37 @@
1
+ export function subagentDesktopPayload(event, turnId) {
2
+ return {
3
+ turnId,
4
+ sessionId: event.sessionId,
5
+ id: event.id,
6
+ displayName: event.displayName,
7
+ task: boundText(event.task, 16_384),
8
+ mode: event.mode,
9
+ model: event.model,
10
+ status: event.status,
11
+ background: event.background,
12
+ timestamp: event.timestamp,
13
+ ...(event.durationMs === undefined ? {} : { durationMs: event.durationMs }),
14
+ ...(event.summary === undefined ? {} : { summary: boundText(event.summary, 24_576) }),
15
+ ...(event.lastAction === undefined ? {} : { lastAction: event.lastAction }),
16
+ ...(event.handoff === undefined ? {} : { handoff: event.handoff }),
17
+ };
18
+ }
19
+ export function planDesktopPayload(plan, turnId) {
20
+ return {
21
+ turnId,
22
+ planId: plan.id,
23
+ goal: boundText(plan.goal, 16_384),
24
+ totalSteps: plan.tasks.length,
25
+ steps: plan.tasks.map((step, index) => ({ index, id: step.id, title: boundText(step.title, 512), description: boundText(step.description, 8_192), status: step.status })),
26
+ };
27
+ }
28
+ export function planStepPayload(plan, turnId, index, status) {
29
+ const step = plan.tasks[index];
30
+ if (step === undefined)
31
+ return { turnId, planId: plan.id, index, status };
32
+ return { turnId, planId: plan.id, index, stepId: step.id, status };
33
+ }
34
+ function boundText(value, maxBytes) {
35
+ const bytes = Buffer.from(value, 'utf8');
36
+ return bytes.byteLength <= maxBytes ? value : `${bytes.subarray(0, maxBytes).toString('utf8')}\n[truncated]`;
37
+ }
@@ -0,0 +1,9 @@
1
+ import type { Writable } from 'node:stream';
2
+ /** Serializes protocol messages in order and applies Writable backpressure. */
3
+ export declare class JsonLineWriter<T> {
4
+ private readonly output;
5
+ private tail;
6
+ constructor(output: Writable);
7
+ write(value: T): Promise<void>;
8
+ flush(): Promise<void>;
9
+ }
@@ -0,0 +1,19 @@
1
+ import { once } from 'node:events';
2
+ /** Serializes protocol messages in order and applies Writable backpressure. */
3
+ export class JsonLineWriter {
4
+ output;
5
+ tail = Promise.resolve();
6
+ constructor(output) {
7
+ this.output = output;
8
+ }
9
+ write(value) {
10
+ const operation = this.tail.then(async () => {
11
+ if (this.output.write(`${JSON.stringify(value)}\n`))
12
+ return;
13
+ await once(this.output, 'drain');
14
+ });
15
+ this.tail = operation.catch(() => undefined);
16
+ return operation;
17
+ }
18
+ async flush() { await this.tail; }
19
+ }
@@ -0,0 +1,3 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ import type { createCompositionRoot } from '../../bootstrap/composition-root.js';
3
+ export declare function runAgentCommand(positionals: readonly string[], runtime: ReturnType<typeof createCompositionRoot>, cwd: string, stdin: Readable, stdout: Writable): Promise<number>;
@@ -0,0 +1,97 @@
1
+ import { AuthenticationService } from '../auth/authentication-service.js';
2
+ import { JsonlProtocolRunner } from './jsonl-protocol.js';
3
+ import { createLotaGateClient } from '../../infrastructure/sdk/lotagate-client-factory.js';
4
+ import { CliError } from '../../domain/errors/cli-error.js';
5
+ import { CLI_ERROR_CODES } from '../../domain/errors/error-codes.js';
6
+ import { prepareCliAgent } from '../agent/cli-agent-execution-service.js';
7
+ import { AgentRunTracker } from '../agent/agent-run-tracker.js';
8
+ import { loadExecutionConfig } from '../config/execution-config.js';
9
+ import { agentLimitNotice, classifyAgentLimit } from '../agent/agent-limit.js';
10
+ import { runDesktopAgentCommand } from './desktop-agent-command.js';
11
+ export async function runAgentCommand(positionals, runtime, cwd, stdin, stdout) {
12
+ const action = positionals[0] ?? 'stdio';
13
+ if (action === 'desktop')
14
+ return runDesktopAgentCommand(runtime, cwd, stdin, stdout);
15
+ if (action !== 'stdio')
16
+ throw new CliError(CLI_ERROR_CODES.INVALID_ARGUMENT, 'Unsupported agent action.', { category: 'arguments', userMessage: 'Use `lotagate agent stdio` or `lotagate agent desktop`.' });
17
+ const loaded = await loadExecutionConfig(runtime, cwd);
18
+ if (loaded.config.model === null)
19
+ throw new CliError(CLI_ERROR_CODES.MODEL_NOT_FOUND, 'No model is selected.', { category: 'model', userMessage: 'Select a model before running the stdio agent.' });
20
+ const profileName = loaded.config.profile ?? AuthenticationService.defaultProfileName();
21
+ const credential = await runtime.auth.requireCredential(profileName);
22
+ const runner = new JsonlProtocolRunner(async function* (request, signal) {
23
+ const model = request.params.model ?? loaded.config.model;
24
+ runtime.logger.info('Protocol agent request started.', { model, promptLength: request.params.prompt.length });
25
+ const tracker = new AgentRunTracker();
26
+ const onModelComplete = (summary) => {
27
+ tracker.observeModel(summary);
28
+ runtime.logger.debug('Model turn completed.', {
29
+ model: summary.model,
30
+ stream: summary.stream,
31
+ contentLength: summary.contentLength,
32
+ toolCallCount: summary.toolCallCount,
33
+ toolNames: summary.toolNames,
34
+ finishReason: summary.finishReason,
35
+ });
36
+ };
37
+ const prepared = await prepareCliAgent({
38
+ runtime,
39
+ cwd,
40
+ model,
41
+ client: createLotaGateClient(credential.profile, credential.apiKey),
42
+ profile: 'protocol-safe',
43
+ approvalMode: loaded.config.approvalMode,
44
+ onModelComplete,
45
+ });
46
+ let streamedText = false;
47
+ let limitNotice;
48
+ try {
49
+ const input = await prepared.buildInput(request.params.prompt);
50
+ for await (const event of prepared.run({ input: input.input, model, signal })) {
51
+ tracker.observe(event);
52
+ if (event.type === 'tool.called')
53
+ runtime.logger.info('Agent tool called.', { toolName: event.toolName });
54
+ if (event.type === 'tool.completed')
55
+ runtime.logger.info('Agent tool completed.', { toolName: event.toolName, isError: event.isError });
56
+ if (event.type === 'model.delta' && event.content.length > 0) {
57
+ streamedText = true;
58
+ yield { type: 'delta', content: event.content };
59
+ }
60
+ else if (event.type === 'session.completed' && !streamedText && event.content.length > 0) {
61
+ streamedText = true;
62
+ yield { type: 'delta', content: event.content };
63
+ }
64
+ if (event.type === 'session.failed') {
65
+ const limitReason = classifyAgentLimit(event.error);
66
+ if (limitReason === undefined)
67
+ throw event.error;
68
+ limitNotice = agentLimitNotice(limitReason);
69
+ break;
70
+ }
71
+ }
72
+ if (limitNotice !== undefined) {
73
+ streamedText = true;
74
+ yield { type: 'delta', content: limitNotice };
75
+ }
76
+ if (!streamedText) {
77
+ const snapshot = tracker.snapshot();
78
+ if (snapshot.toolCalls > 0)
79
+ tracker.markStuck();
80
+ const code = snapshot.toolCalls > 0 ? CLI_ERROR_CODES.MODEL_EMPTY_FINAL : CLI_ERROR_CODES.MODEL_PROTOCOL_EMPTY_RESPONSE;
81
+ throw new CliError(code, 'Agent completed without a final text response.', {
82
+ category: 'model',
83
+ userMessage: 'The model completed without a final text response.',
84
+ retryable: true,
85
+ details: { toolCalls: snapshot.toolCalls, toolCompletions: snapshot.toolCompletions, toolNames: snapshot.toolNames, finishReason: snapshot.lastFinishReason },
86
+ });
87
+ }
88
+ yield { type: 'completed' };
89
+ runtime.logger.info('Protocol agent request completed.', { model });
90
+ }
91
+ finally {
92
+ await prepared.close();
93
+ }
94
+ });
95
+ const result = await runner.run(stdin, stdout);
96
+ return result.errorCount === 0 ? 0 : 1;
97
+ }