@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,4 @@
1
+ import{prepareCliAgent as m}from"../agent/cli-agent-execution-service.js";import{AgentRunTracker as h}from"../agent/agent-run-tracker.js";import{CliError as S}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as f}from"../../domain/errors/error-codes.js";import{writeStreamChunk as c}from"../commands/stream-output.js";import{CliTurnEventProjector as w}from"./cli-turn-event-projector.js";import{persistCliTurnEvent as p}from"./cli-turn-persistence.js";import{agentLimitNotice as C,classifyAgentLimit as I}from"../agent/agent-limit.js";import{buildUserMessage as y}from"../../infrastructure/clipboard/image-normalizer.js";async function k(e){const i=new h,d=await m({runtime:e.runtime,projectRoot:e.cwd,executionCwd:e.cwd,model:e.model,...e.reasoningEffort===void 0?{}:{reasoningEffort:e.reasoningEffort},client:e.client,profile:"headless-safe",approvalMode:"auto",...e.goal===void 0?{}:{goal:e.goal},...e.agentSessionStore===void 0?{}:{agentSessionStore:e.agentSessionStore},onModelComplete:n=>{n.usage!==void 0&&e.onUsage?.({usage:n.usage,modelCalls:1})},...e.onSubagentUsage===void 0?{}:{onSubagentModelComplete:n=>{n.usage!==void 0&&e.onSubagentUsage?.({usage:n.usage,modelCalls:1})}}}),r=[];let s;const g=new w;try{const n=await d.buildInput(e.prompt);if(e.agentSessionStore!==void 0&&e.sessionId!==void 0){const t=await e.runtime.sessionStore.readHistory(e.sessionId);e.agentSessionStore.hydrate(e.sessionId,t.transcript,t.events,n.input)}const u=e.attachments===void 0||e.attachments.length===0?void 0:y(n.input,e.attachments),l=u?.content===null?void 0:u?.content;for await(const t of d.run({input:n.input,userInput:n.userInput,...n.workspaceContext===void 0?{}:{workspaceContext:n.workspaceContext},...l===void 0?{}:{inputContent:l},model:e.model,...e.signal===void 0?{}:{signal:e.signal},...e.sessionId===void 0?{}:{sessionId:e.sessionId}})){i.observe(t);for(const a of g.observe(t)){if(e.sessionId!==void 0)try{await p(e.runtime.sessionStore,e.sessionId,a,{...e.turnId===void 0?{}:{turnId:e.turnId}})}catch(o){e.runtime.logger.warn("Unable to persist agent lifecycle event.",{eventType:a.type,reason:o instanceof Error?o.message:String(o)})}a.type==="assistant.delta"&&r.push(a.content),a.type==="assistant.replaced"&&r.splice(0,r.length,a.content)}if(e.output!==void 0&&e.json?await c(e.output,`${JSON.stringify(t)}
2
+ `):t.type==="session.completed"&&r.length===0&&r.push(t.content),t.type==="session.failed"){if(s=I(t.error),s===void 0)throw t.error;break}}if(s!==void 0){const t=C(s);r.push(r.length===0?t:`
3
+
4
+ ${t}`),e.sessionId!==void 0&&e.agentSessionStore?.delete(e.sessionId)}if(r.join("").trim().length===0){const a=i.snapshot().toolCalls>0?f.MODEL_EMPTY_FINAL:f.MODEL_PROTOCOL_EMPTY_RESPONSE;throw new S(a,"Agent completed without a final text response.",{category:"model",userMessage:"The model completed without a final text response.",retryable:!0})}return e.output!==void 0&&!e.json&&await c(e.output,r.join("")),r.join("")}finally{e.onSnapshot?.(i.snapshot());try{await d.close()}catch(n){e.runtime.logger.warn("Agent cleanup failed after a completed turn.",{reason:n instanceof Error?n.message:String(n)})}}}export{k as runHeadlessAgentTurn};
@@ -0,0 +1,41 @@
1
+ import type { SchedulerLimits, WorkItem } from '../../domain/orchestration/work-plan.js';
2
+ import type { SubagentLimitReason } from '../../domain/orchestration/subagent.js';
3
+ import { TaskScheduler } from './task-scheduler.js';
4
+ export interface SubagentOutput {
5
+ content: string;
6
+ tokens?: number;
7
+ tokensEstimated?: boolean;
8
+ toolsUsed?: readonly string[];
9
+ limitReason?: SubagentLimitReason;
10
+ }
11
+ export interface SubagentInstance {
12
+ run(task: WorkItem, signal: AbortSignal): Promise<SubagentOutput>;
13
+ close?(): Promise<void>;
14
+ }
15
+ export interface SubagentFactory {
16
+ create(task: WorkItem): Promise<SubagentInstance>;
17
+ }
18
+ export interface SubagentRunResult {
19
+ task: WorkItem;
20
+ output: SubagentOutput;
21
+ }
22
+ export interface SubagentCoordinatorOptions {
23
+ approvePlan?: (plan: {
24
+ tasks: readonly WorkItem[];
25
+ requiresApproval?: boolean;
26
+ maxConcurrency?: number;
27
+ }) => boolean | Promise<boolean>;
28
+ onTaskEvent?: (event: {
29
+ type: 'started' | 'completed' | 'failed';
30
+ task: WorkItem;
31
+ }) => void | Promise<void>;
32
+ }
33
+ export declare class SubagentCoordinator {
34
+ private readonly scheduler;
35
+ constructor(scheduler?: TaskScheduler);
36
+ run(plan: {
37
+ tasks: readonly WorkItem[];
38
+ requiresApproval?: boolean;
39
+ maxConcurrency?: number;
40
+ }, factory: SubagentFactory, limits: SchedulerLimits, signal?: AbortSignal, options?: SubagentCoordinatorOptions): Promise<readonly SubagentRunResult[]>;
41
+ }
@@ -0,0 +1 @@
1
+ import{CliError as m}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as d}from"../../domain/errors/error-codes.js";import{TaskGraph as p}from"./task-graph.js";import{TaskScheduler as h}from"./task-scheduler.js";class E{scheduler;constructor(r=new h){this.scheduler=r}async run(r,i,a,o,n={}){if(r.requiresApproval&&!await n.approvePlan?.(r))throw new m(d.TASK_PLAN_APPROVAL_REQUIRED,"Plan approval was not granted.",{category:"orchestration",userMessage:"Plan approval is required before execution."});const l=new p(r.tasks),s=new Map;try{return(await this.scheduler.run(l,async(e,t)=>{const u=await i.create(e);return s.set(e.id,u),u.run(e,t)},{...a,maxConcurrency:Math.min(a.maxConcurrency,r.maxConcurrency??a.maxConcurrency)},{...o===void 0?{}:{signal:o},estimateTokens:e=>e.tokens??0,...n.onTaskEvent===void 0?{}:{onTaskEvent:n.onTaskEvent}})).map(({task:e,value:t})=>({task:e,output:t}))}finally{await Promise.allSettled([...s.values()].map(c=>c.close?.()))}}}export{E as SubagentCoordinator};
@@ -0,0 +1,3 @@
1
+ import type { SubagentHandoff } from '../../domain/orchestration/subagent.js';
2
+ export declare const SUBAGENT_HANDOFF_GUIDANCE: string;
3
+ export declare function parseSubagentHandoff(output: string): SubagentHandoff;
@@ -0,0 +1,3 @@
1
+ import{RESOURCE_LIMITS as m}from"../../domain/runtime/resource-limits.js";import{findUnexpectedRecordKey as l}from"../../domain/validation/record-schema.js";const y=32,u=1024,d=["summary","filesInspected","filesChanged","commandsRun","verification","warnings"],I=["## Handoff contract","When complete, return exactly one JSON object with only these fields: summary (string), filesInspected (string[]), filesChanged (string[]), commandsRun (string[]), verification (string[]), and warnings (string[]).","Return no markdown, code fences, or explanatory text outside the JSON object."].join(`
2
+ `);function w(e){const n=x(e,m.subagentSummaryBytes),t=b(n);return t===void 0||!g(t)?h(n):p(t)}function g(e){return l(e,d)!==void 0||!d.every(n=>Object.prototype.hasOwnProperty.call(e,n))||o(e.summary)===void 0?!1:d.slice(1).every(n=>{const t=e[n];return Array.isArray(t)&&t.every(r=>typeof r=="string"&&o(r)!==void 0)})}function p(e){return{summary:o(e.summary)??"The subagent completed without a text summary.",filesInspected:s(e.filesInspected),filesChanged:s(e.filesChanged),commandsRun:s(e.commandsRun),verification:s(e.verification),warnings:s(e.warnings)}}function h(e){return{summary:e||"The subagent completed without a text summary.",filesInspected:[],filesChanged:[],commandsRun:[],verification:[],warnings:["The child returned an unstructured or invalid handoff; verify the result directly."]}}function b(e){const n=[e.trim(),...S(e)];for(const t of n)if(!(t===void 0||t.length===0))try{const r=JSON.parse(t);if(r!==null&&typeof r=="object"&&!Array.isArray(r))return r}catch{}}function S(e){const n=[];for(let t=e.indexOf("{");t>=0;t=e.indexOf("{",t+1)){let r=0,c=!1,a=!1;for(let f=t;f<e.length;f+=1){const i=e[f];if(c){a?a=!1:i==="\\"?a=!0:i==='"'&&(c=!1);continue}if(i==='"')c=!0;else if(i==="{")r+=1;else if(i==="}"&&--r===0){n.push(e.slice(t,f+1));break}}}return n}function s(e){return Array.isArray(e)?e.filter(n=>typeof n=="string").map(n=>o(n)).filter(n=>n!==void 0).slice(0,y):[]}function o(e){if(typeof e!="string")return;const n=e.trim();if(n.length!==0)return Buffer.byteLength(n,"utf8")<=u?n:`${Buffer.from(n,"utf8").subarray(0,u-3).toString("utf8")}...`}function x(e,n){const t=e.trim(),r=Buffer.from(t,"utf8");return r.byteLength<=n?t:`${r.subarray(0,n-16).toString("utf8")}
3
+ [truncated]`}export{I as SUBAGENT_HANDOFF_GUIDANCE,w as parseSubagentHandoff};
@@ -0,0 +1,12 @@
1
+ import type { ToolDefinition } from '@lotagate/sdk';
2
+ import type { ToolExecutionContext, ToolExecutor, ToolInfo, ToolResult } from '@lotagate/agent-sdk';
3
+ import type { CliSubagentService } from './cli-subagent-service.js';
4
+ /** Exposes the same orchestration capability definitions to runtime and context accounting. */
5
+ export declare function subagentToolDefinitions(): readonly ToolDefinition[];
6
+ export declare class SubagentToolExecutor implements ToolExecutor {
7
+ private readonly service;
8
+ constructor(service: CliSubagentService);
9
+ listTools(): readonly ToolDefinition[];
10
+ getToolInfo(toolName: string): ToolInfo | undefined;
11
+ execute(toolName: string, input: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolResult>;
12
+ }
@@ -0,0 +1 @@
1
+ const s=[{type:"function",function:{name:"agent.spawn",description:"Delegate one bounded side task. Research mode is read-only by default; worker mode requires an explicitly requested independent implementation task. Use background true for bounded parallel work and agent.wait for its result.",parameters:{type:"object",properties:{task:{type:"string",description:"A single, specific task for the child agent."},context:{type:"string",description:"Optional bounded parent-provided evidence needed to complete the task. Do not include secrets."},model:{type:"string",description:"Optional model id from the allowlist; omit to inherit the parent model."},mode:{type:"string",enum:["research","worker"],description:"research (default) or worker for an explicitly requested implementation task."},background:{type:"boolean",description:"Run without blocking the current turn. Call agent.wait with the returned id when needed."},writeScope:{type:"array",items:{type:"string"},description:"Required for worker mode: workspace-relative files or directories the child may write."}},required:["task"],additionalProperties:!1}}},d("agent.wait","Wait for a background subagent owned by this session and return its structured handoff."),d("agent.cancel","Cancel a running background subagent owned by this session.")];function u(){return s}class g{service;constructor(t){this.service=t}listTools(){return u()}getToolInfo(t){if(s.some(n=>l(n)===t))return{toolName:t,source:"custom",executorId:"cli-subagent",metadata:{category:"orchestration"}}}async execute(t,n,o){try{const r=t==="agent.spawn"?await this.service.spawn(f(n),o):t==="agent.wait"?await this.service.wait(a(n),o):t==="agent.cancel"?await this.service.cancel(a(n),o):void 0;return r===void 0?{content:`Unknown orchestration tool: ${t}`,isError:!0}:{content:JSON.stringify(r),isError:r.status==="failed"||r.status==="cancelled"}}catch(r){return{content:r instanceof Error?r.message:String(r),isError:!0}}}}function f(e){if(typeof e.task!="string")throw new Error("agent.spawn requires a task string.");const t=e.mode;if(t!==void 0&&t!=="research"&&t!=="worker")throw new Error("agent.spawn mode must be research or worker.");const n=e.context;if(n!==void 0&&typeof n!="string")throw new Error("agent.spawn context must be a string.");const o=e.model;if(o!==void 0&&typeof o!="string")throw new Error("agent.spawn model must be a string.");const r=e.background;if(r!==void 0&&typeof r!="boolean")throw new Error("agent.spawn background must be a boolean.");const i=e.writeScope;if(i!==void 0&&(!Array.isArray(i)||i.some(c=>typeof c!="string")))throw new Error("agent.spawn writeScope must be an array of strings.");return{task:e.task,...n===void 0?{}:{context:n},...o===void 0?{}:{model:o},...t===void 0?{}:{mode:t},...r===void 0?{}:{background:r},...i===void 0?{}:{writeScope:i}}}function a(e){if(typeof e.id!="string"||e.id.trim().length===0)throw new Error("The subagent id is required.");return e.id.trim()}function d(e,t){return{type:"function",function:{name:e,description:t,parameters:{type:"object",properties:{id:{type:"string",description:"Subagent id returned by agent.spawn."}},required:["id"],additionalProperties:!1}}}}function l(e){return"function"in e?e.function.name:void 0}export{g as SubagentToolExecutor,u as subagentToolDefinitions};
@@ -0,0 +1,13 @@
1
+ import type { WorkItem, WorkItemStatus } from '../../domain/orchestration/work-plan.js';
2
+ export declare class TaskGraph {
3
+ private readonly tasks;
4
+ constructor(tasks: readonly WorkItem[]);
5
+ list(): readonly WorkItem[];
6
+ get(taskId: string): WorkItem | undefined;
7
+ setStatus(taskId: string, status: WorkItemStatus): WorkItem;
8
+ ready(): readonly WorkItem[];
9
+ hasPending(): boolean;
10
+ private validateDependencies;
11
+ private assertAcyclic;
12
+ private require;
13
+ }
@@ -0,0 +1 @@
1
+ import{CliError as n}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as i}from"../../domain/errors/error-codes.js";class h{tasks=new Map;constructor(e){for(const s of e){if(this.tasks.has(s.id))throw new n(i.TASK_DEPENDENCY_CYCLE,`Duplicate task id: ${s.id}`,{category:"orchestration",userMessage:"The plan contains a duplicate task id."});this.tasks.set(s.id,{...s,dependencies:[...s.dependencies]})}this.validateDependencies(),this.assertAcyclic()}list(){return[...this.tasks.values()]}get(e){return this.tasks.get(e)}setStatus(e,s){const t={...this.require(e),status:s};return this.tasks.set(e,t),t}ready(){return this.list().filter(e=>e.status==="queued"&&e.dependencies.every(s=>this.tasks.get(s)?.status==="completed"))}hasPending(){return this.list().some(e=>e.status==="queued"||e.status==="active")}validateDependencies(){for(const e of this.tasks.values())for(const s of e.dependencies)if(!this.tasks.has(s))throw new n(i.TASK_DEPENDENCY_CYCLE,`Missing task dependency: ${s}`,{category:"orchestration",userMessage:`The plan references a missing dependency: ${s}.`})}assertAcyclic(){const e=new Set,s=new Set,a=t=>{if(e.has(t))throw new n(i.TASK_DEPENDENCY_CYCLE,"Task dependency cycle detected.",{category:"orchestration",userMessage:"The plan contains a task dependency cycle."});if(!s.has(t)){e.add(t);for(const r of this.require(t).dependencies)a(r);e.delete(t),s.add(t)}};for(const t of this.tasks.keys())a(t)}require(e){const s=this.tasks.get(e);if(s===void 0)throw new n(i.TASK_SCHEDULER_OVERLOADED,`Task not found: ${e}`,{category:"orchestration",userMessage:`Task not found: ${e}.`});return s}}export{h as TaskGraph};
@@ -0,0 +1,18 @@
1
+ import type { SchedulerLimits, WorkItem } from '../../domain/orchestration/work-plan.js';
2
+ import type { TaskGraph } from './task-graph.js';
3
+ export interface TaskExecutionResult<T> {
4
+ task: WorkItem;
5
+ value: T;
6
+ tokens?: number;
7
+ }
8
+ export interface TaskSchedulerOptions<T> {
9
+ signal?: AbortSignal;
10
+ estimateTokens?: (value: T) => number;
11
+ onTaskEvent?: (event: {
12
+ type: 'started' | 'completed' | 'failed';
13
+ task: WorkItem;
14
+ }) => void | Promise<void>;
15
+ }
16
+ export declare class TaskScheduler {
17
+ run<T>(graph: TaskGraph, execute: (task: WorkItem, signal: AbortSignal) => Promise<T>, limits: SchedulerLimits, options?: TaskSchedulerOptions<T>): Promise<readonly TaskExecutionResult<T>[]>;
18
+ }
@@ -0,0 +1 @@
1
+ import{CliError as o}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as i}from"../../domain/errors/error-codes.js";class S{async run(a,f,t,n={}){if(!Number.isInteger(t.maxConcurrency)||t.maxConcurrency<1||t.maxConcurrency>32||t.maxTasks<1||t.maxDurationMs<1)throw new o(i.TASK_SCHEDULER_OVERLOADED,"Scheduler limits are invalid.",{category:"orchestration",userMessage:"Scheduler limits are invalid."});if(a.list().length>t.maxTasks)throw new o(i.TASK_SCHEDULER_OVERLOADED,"Plan exceeds the task limit.",{category:"orchestration",userMessage:"The plan exceeds the task limit."});const E=[],s=new Map,T=Date.now(),r=new AbortController,u=()=>r.abort(n.signal?.reason);n.signal?.aborted?u():n.signal?.addEventListener("abort",u,{once:!0});const h=setTimeout(()=>r.abort(new Error("Task plan duration limit exceeded.")),t.maxDurationMs);let m=0;try{for(;a.hasPending();){if(r.signal.aborted)throw w(r.signal)?k():D();if(Date.now()-T>t.maxDurationMs)throw r.abort(),new o(i.TASK_SCHEDULER_OVERLOADED,"Plan exceeded its duration limit.",{category:"orchestration",userMessage:"The plan exceeded its maximum duration."});for(const e of a.ready()){if(s.size>=t.maxConcurrency)break;a.setStatus(e.id,"active"),await n.onTaskEvent?.({type:"started",task:e});const x=f(e,r.signal).then(async c=>{a.setStatus(e.id,"completed");const d=n.estimateTokens?.(c);if(d!==void 0&&(m+=Math.max(0,d)),t.maxTokens!==void 0&&m>t.maxTokens)throw new o(i.TASK_SCHEDULER_OVERLOADED,"Plan exceeded its token budget.",{category:"orchestration",userMessage:"The plan exceeded its token budget."});E.push({task:a.get(e.id)??e,value:c,...d===void 0?{}:{tokens:d}}),await n.onTaskEvent?.({type:"completed",task:a.get(e.id)??e})}).catch(async c=>{throw a.setStatus(e.id,"failed"),await n.onTaskEvent?.({type:"failed",task:a.get(e.id)??e}),c}).finally(()=>{s.delete(e.id)});s.set(e.id,x)}if(s.size===0){if(a.hasPending())throw new o(i.TASK_SCHEDULER_OVERLOADED,"No runnable task remains.",{category:"orchestration",userMessage:"No runnable task remains; check dependencies or task failures."});break}try{await Promise.race(s.values())}catch(e){throw r.abort(e),await Promise.allSettled(s.values()),w(r.signal)?k():e}}return E}finally{r.abort(),clearTimeout(h),await Promise.allSettled(s.values()),n.signal?.removeEventListener("abort",u)}}}function w(l){return l.reason instanceof Error&&l.reason.message==="Task plan duration limit exceeded."}function k(){return new o(i.TASK_SCHEDULER_OVERLOADED,"Plan exceeded its duration limit.",{category:"orchestration",userMessage:"The plan exceeded its maximum duration."})}function D(){return new o(i.INTERRUPTED,"Task plan was cancelled.",{category:"orchestration",userMessage:"Task plan execution was cancelled."})}export{S as TaskScheduler};
@@ -0,0 +1,13 @@
1
+ import { type ProjectIdentity } from '../../domain/project/project-identity.js';
2
+ import type { ProjectTrustStore, TrustedProject } from '../../ports/project-trust-store.js';
3
+ export declare class ProjectTrustService {
4
+ private readonly store;
5
+ constructor(store: ProjectTrustStore);
6
+ inspect(inputPath: string): Promise<ProjectIdentity>;
7
+ isTrusted(identity: ProjectIdentity): Promise<boolean>;
8
+ grant(identity: ProjectIdentity): Promise<TrustedProject>;
9
+ revoke(identity: ProjectIdentity): Promise<boolean>;
10
+ requireTrusted(identity: ProjectIdentity): Promise<void>;
11
+ list(): Promise<readonly TrustedProject[]>;
12
+ private canonicalize;
13
+ }
@@ -0,0 +1 @@
1
+ import o from"node:fs/promises";import n from"node:path";import{CliError as a}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as s}from"../../domain/errors/error-codes.js";import{createProjectFingerprint as c}from"../../domain/project/project-identity.js";import{TRUST_GRANT_HINT as u}from"../commands/command-hints.js";class m{store;constructor(t){this.store=t}async inspect(t){const r=await this.canonicalize(t),e=await f(r);return{canonicalPath:r,...e!==void 0?{gitRoot:e}:{},fingerprint:c(r,e)}}async isTrusted(t){return await this.store.get(t.fingerprint)!==void 0}async grant(t){const r={fingerprint:t.fingerprint,canonicalPath:t.canonicalPath,grantedAt:new Date().toISOString(),grantedBy:"user"};return await this.store.grant(r),r}async revoke(t){return this.store.revoke(t.fingerprint)}async requireTrusted(t){if(!await this.isTrusted(t))throw new a(s.PROJECT_TRUST_REQUIRED,"Project trust is required.",{category:"project",userMessage:`Project is not trusted: ${t.canonicalPath}.`,hint:u})}async list(){return this.store.list()}async canonicalize(t){const r=n.resolve(t);try{return await o.realpath(r)}catch(e){throw new a(s.PROJECT_PATH_INVALID,`Project path does not exist: ${r}`,{category:"project",userMessage:`Project path was not found: ${r}.`,cause:e})}}}async function f(i){let t=i;for(;;){try{const e=await o.stat(n.join(t,".git"));if(e.isDirectory()||e.isFile())return t}catch{}const r=n.dirname(t);if(r===t)return;t=r}}export{m as ProjectTrustService};
@@ -0,0 +1,14 @@
1
+ export interface ProjectIntelligence {
2
+ packageManager?: string;
3
+ runtime?: string;
4
+ languages: readonly string[];
5
+ frameworks: readonly string[];
6
+ scripts: Readonly<Record<string, string>>;
7
+ testRunners: readonly string[];
8
+ sourceRoots: readonly string[];
9
+ configFiles: readonly string[];
10
+ }
11
+ /** Reads bounded repository metadata so the model can choose project-native verification commands. */
12
+ export declare class ProjectIntelligenceService {
13
+ discover(root: string): Promise<ProjectIntelligence>;
14
+ }
@@ -0,0 +1 @@
1
+ import f from"node:fs/promises";import a from"node:path";const g=["package.json","tsconfig.json","vitest.config.ts","vitest.config.js","jest.config.ts","jest.config.js","playwright.config.ts","playwright.config.js","eslint.config.mjs","vite.config.ts","electron.vite.config.ts","pnpm-workspace.yaml","turbo.json"],j={react:"React",electron:"Electron",vite:"Vite",next:"Next.js",express:"Express","@angular/core":"Angular",vue:"Vue",svelte:"Svelte"};class b{async discover(e){const n=await y(a.join(e,"package.json")),s={...r(n?.dependencies),...r(n?.devDependencies)},c=r(n?.scripts),u=await v(e,n),p=(await Promise.all(g.map(async i=>await o(a.join(e,i))?i:void 0))).filter(i=>i!==void 0),d=await w(e),l=[...new Set([...c.test===void 0?[]:[c.test.includes("vitest")?"Vitest":c.test.includes("jest")?"Jest":c.test.includes("playwright")?"Playwright":"package test script"],...s.vitest===void 0?[]:["Vitest"],...s.jest===void 0?[]:["Jest"],...s["@playwright/test"]===void 0?[]:["Playwright"]])];return{...d===void 0?{}:{packageManager:d},...typeof n?.engines=="object"&&n.engines!==null&&typeof n.engines.node=="string"?{runtime:`Node ${n.engines.node}`}:{},languages:u,frameworks:Object.entries(j).filter(([i])=>s[i]!==void 0).map(([,i])=>i),scripts:c,testRunners:l,sourceRoots:await m(e),configFiles:p}}}async function y(t){try{const e=JSON.parse(await f.readFile(t,"utf8"));return typeof e=="object"&&e!==null?e:void 0}catch{return}}async function o(t){try{return await f.access(t),!0}catch{return!1}}async function w(t){for(const[e,n]of[["package-lock.json","npm"],["pnpm-lock.yaml","pnpm"],["yarn.lock","Yarn"],["bun.lockb","Bun"]])if(await o(a.join(t,e)))return n}async function m(t){return(await Promise.all(["src","app","lib","test","tests"].map(async e=>await o(a.join(t,e))?e:void 0))).filter(e=>e!==void 0)}async function v(t,e){const n={...r(e?.dependencies),...r(e?.devDependencies)},s=new Set;return(n.typescript!==void 0||await o(a.join(t,"tsconfig.json")))&&s.add("TypeScript"),Object.keys(n).some(c=>["react","react-dom","vue","svelte"].includes(c))&&s.add("JavaScript/JSX"),s.size===0&&s.add("JavaScript"),[...s]}function r(t){return typeof t!="object"||t===null?{}:Object.fromEntries(Object.entries(t).filter(e=>typeof e[1]=="string"))}export{b as ProjectIntelligenceService};
@@ -0,0 +1,41 @@
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
+ export interface BrowserHostRequest {
5
+ version: 1;
6
+ type: 'host.request';
7
+ requestId: string;
8
+ tool: 'browser';
9
+ sessionId: string;
10
+ runId: string;
11
+ action: string;
12
+ params: Record<string, unknown>;
13
+ executionBoundary: 'host';
14
+ hostFallback: 'deny';
15
+ }
16
+ export interface BrowserHostResponse {
17
+ version: 1;
18
+ type: 'host.response';
19
+ requestId: string;
20
+ tool: 'browser';
21
+ ok: boolean;
22
+ result?: unknown;
23
+ error?: {
24
+ code: string;
25
+ category: string;
26
+ message: string;
27
+ retryable: boolean;
28
+ };
29
+ }
30
+ export type BrowserHostInvoker = (request: BrowserHostRequest, signal?: AbortSignal) => Promise<BrowserHostResponse>;
31
+ export declare function browserToolDefinitions(): readonly ToolDefinition[];
32
+ export declare class BrowserHostToolExecutor implements ToolExecutor {
33
+ private readonly options;
34
+ constructor(options: {
35
+ request: BrowserHostInvoker;
36
+ onActivity?: ToolActivityObserver;
37
+ });
38
+ listTools(): readonly ToolDefinition[];
39
+ getToolInfo(toolName: string): ToolInfo | undefined;
40
+ execute(toolName: string, input: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolResult>;
41
+ }
@@ -0,0 +1,2 @@
1
+ import{randomUUID as y}from"node:crypto";import{imageContentBlockFromDataUrl as v,omitImageData as k}from"./tool-image-content.js";const p=[e("browser.navigate","Open an HTTP(S) URL in the agent browser.",{url:t("Destination URL."),tabId:t("Optional browser tab id.")},["url"]),e("browser.newTab","Open a new blank tab in the agent browser.",{},[]),e("browser.closeTab","Close the active browser tab.",{tabId:t("Optional browser tab id.")},[]),e("browser.selectTab","Make a browser tab active.",{tabId:t("Browser tab id.")},["tabId"]),e("browser.inspect","Inspect the current page DOM summary, text, headings, links, and visible interactive elements.",{tabId:t("Optional browser tab id.")},[]),e("browser.inspectElement","Inspect a page element including its DOM, attributes, bounds, and computed CSS.",{target:s(),tabId:t("Optional browser tab id.")},["target"]),e("browser.extractTable","Extract a bounded HTML table from the current page.",{target:s(),maxRows:b("Maximum number of data rows to return.")},["target"]),e("browser.drag","Drag one visible page target onto another.",{from:s(),to:s()},["from","to"]),e("browser.listFrames","List frames embedded in the current browser page.",{tabId:t("Optional browser tab id.")},[]),e("browser.console","Read recent browser console messages and page errors.",{tabId:t("Optional browser tab id."),limit:b("Maximum number of entries to return.")},[]),e("browser.network","Read recent browser network requests, HTTP failures, and request errors.",{tabId:t("Optional browser tab id."),limit:b("Maximum number of entries to return.")},[]),e("browser.accessibility","Inspect the page accessibility tree without exposing control values.",{tabId:t("Optional browser tab id.")},[]),e("browser.setViewport","Emulate a responsive browser viewport for the current tab.",{width:b("Viewport width in CSS pixels."),height:b("Viewport height in CSS pixels."),mobile:l("Whether to emulate a mobile layout."),deviceScaleFactor:b("Optional device scale factor.")},["width","height"]),e("browser.resetViewport","Reset the browser tab to its normal viewport.",{tabId:t("Optional browser tab id.")},[]),e("browser.screenshot","Capture the current browser tab as evidence.",{tabId:t("Optional browser tab id.")},[]),e("browser.click","Click a visible page element using an accessibility target, text, CSS selector, or coordinates.",{target:s()},["target"]),e("browser.focus","Focus a visible page field or control.",{target:s()},["target"]),e("browser.clear","Clear a visible editable page field.",{target:s()},["target"]),e("browser.hover","Move the browser pointer over a visible page element.",{target:s()},["target"]),e("browser.check","Check or uncheck a checkbox or radio input.",{target:s(),checked:l("Whether the control should be checked.")},["target","checked"]),e("browser.select","Select an option in a native HTML select control.",{target:s(),value:t("Option value or visible label.")},["target","value"]),e("browser.readField","Read a visible non-password form field value.",{target:s()},["target"]),e("browser.type","Enter text into a visible page field.",{target:s(),value:t("Text to enter.")},["target","value"]),e("browser.upload","Upload a workspace file through a visible file input.",{target:s(),path:t("Workspace-relative or absolute file path.")},["target","path"]),e("browser.download","Download an HTTP(S) resource to the Desktop downloads folder.",{url:t("HTTP(S) resource URL."),tabId:t("Optional browser tab id.")},["url"]),e("browser.exportPdf","Export the current browser page to a workspace PDF file.",{outputPath:t("Workspace-relative or absolute output path."),overwrite:l("Whether an existing output file may be replaced."),printBackground:l("Whether CSS backgrounds should be printed."),landscape:l("Whether to use landscape orientation."),pageSize:w(["A4","Letter"],"PDF paper size.")},["outputPath"]),e("browser.dialog","Read or respond to the active alert, confirm, or prompt dialog.",{action:w(["read","accept","dismiss"],"Dialog operation."),promptText:t("Optional text for a prompt dialog."),tabId:t("Optional browser tab id.")},["action"]),e("browser.press","Press a keyboard key in the current browser tab.",{key:t("Key name, for example Enter or Tab."),modifiers:I("Optional modifiers: Alt, Control, Shift, or Meta."),tabId:t("Optional browser tab id.")},["key"]),e("browser.scroll","Scroll the current browser tab.",{deltaX:b("Horizontal scroll amount."),deltaY:b("Vertical scroll amount."),tabId:t("Optional browser tab id.")},[]),e("browser.back","Navigate the current browser tab back.",{tabId:t("Optional browser tab id.")},[]),e("browser.forward","Navigate the current browser tab forward.",{tabId:t("Optional browser tab id.")},[]),e("browser.reload","Reload the current browser tab.",{tabId:t("Optional browser tab id.")},[]),e("browser.waitFor","Wait until a URL, text fragment, or CSS selector appears.",{condition:x(),timeoutMs:b("Maximum wait time in milliseconds.")},["condition"]),e("browser.tabs","List tabs in the agent browser session.",{},[])];function O(){return p}class C{options;constructor(o){this.options=o}listTools(){return O()}getToolInfo(o){if(!p.some(i=>g(i)===o))return;const n=["browser.inspect","browser.inspectElement","browser.extractTable","browser.listFrames","browser.console","browser.network","browser.accessibility","browser.setViewport","browser.resetViewport","browser.screenshot","browser.tabs","browser.scroll","browser.focus","browser.hover","browser.waitFor"].includes(o);return{toolName:o,source:"custom",executorId:"desktop-browser-host",metadata:{risk:n?"read":"unknown"}}}async execute(o,n,i){if(!p.some(a=>g(a)===o))return{content:`Unknown browser tool: ${o}`,isError:!0};const u=this.options.onActivity?.start({key:`${i.runId}:${o}`,toolName:o,source:"browser",label:T(o,n)});try{const a=await this.options.request({version:1,type:"host.request",requestId:y(),tool:"browser",sessionId:i.sessionId,runId:i.runId,action:o,params:n,executionBoundary:"host",hostFallback:"deny"},i.signal);if(!a.ok){const m=a.error?.message??"Desktop rejected the browser action.";return u?.complete(!0),{content:m,isError:!0,metadata:{code:a.error?.code??"BROWSER_HOST_ERROR",retryable:a.error?.retryable??!1}}}const c=o==="browser.screenshot"&&R(a.result)?a.result:void 0,d=c===void 0?void 0:v(c.dataUrl);if(c!==void 0&&c.dataUrl!==void 0&&d===void 0)throw new Error("Desktop returned an invalid browser screenshot payload.");const f=o==="browser.screenshot"?k(a.result,"dataUrl"):a.result,h=S(f,i.maxResultBytes);return u?.complete(!1),{content:h,isError:!1,...d===void 0?{}:{contentBlocks:[d]},metadata:{browser:!0}}}catch(a){return u?.complete(!0),{content:a instanceof Error?a.message:"Browser host request failed.",isError:!0}}}}function e(r,o,n,i){return{type:"function",function:{name:r,description:o,parameters:{type:"object",properties:n,required:i,additionalProperties:!1}}}}function t(r){return{type:"string",description:r}}function b(r){return{type:"number",description:r}}function l(r){return{type:"boolean",description:r}}function w(r,o){return{type:"string",enum:[...r],description:o}}function I(r){return{type:"array",items:{type:"string"},description:r}}function s(){return{type:"object",properties:{type:{type:"string",enum:["accessibility","text","css","coordinates"]},role:{type:"string"},name:{type:"string"},value:{type:"string"},selector:{type:"string"},x:{type:"number"},y:{type:"number"}},required:["type"],additionalProperties:!1}}function x(){return{type:"object",properties:{type:{type:"string",enum:["selector","text","url"]},value:{type:"string"}},required:["type","value"],additionalProperties:!1}}function g(r){return"function"in r?r.function.name:void 0}function S(r,o){const n=JSON.stringify(r??null);return Buffer.byteLength(n,"utf8")<=o?n:`${n.slice(0,Math.max(0,o-12))}
2
+ [truncated]`}function T(r,o){return r==="browser.navigate"?`Open ${typeof o.url=="string"?o.url:"URL"}`:r==="browser.type"?"Enter text in browser":r==="browser.click"?"Click page element":r.replace(/^browser\./u,"Browser ")}function R(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}export{C as BrowserHostToolExecutor,O as browserToolDefinitions};
@@ -0,0 +1,42 @@
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
+ export type ComputerHostTool = 'computer';
5
+ export interface ComputerHostRequest {
6
+ version: 1;
7
+ type: 'host.request';
8
+ requestId: string;
9
+ tool: ComputerHostTool;
10
+ sessionId: string;
11
+ runId: string;
12
+ action: string;
13
+ params: Record<string, unknown>;
14
+ executionBoundary: 'host';
15
+ hostFallback: 'deny';
16
+ }
17
+ export interface ComputerHostResponse {
18
+ version: 1;
19
+ type: 'host.response';
20
+ requestId: string;
21
+ tool: ComputerHostTool;
22
+ ok: boolean;
23
+ result?: unknown;
24
+ error?: {
25
+ code: string;
26
+ category: string;
27
+ message: string;
28
+ retryable: boolean;
29
+ };
30
+ }
31
+ export type ComputerHostInvoker = (request: ComputerHostRequest, signal?: AbortSignal) => Promise<ComputerHostResponse>;
32
+ export declare function computerToolDefinitions(): readonly ToolDefinition[];
33
+ export declare class ComputerHostToolExecutor implements ToolExecutor {
34
+ private readonly options;
35
+ constructor(options: {
36
+ request: ComputerHostInvoker;
37
+ onActivity?: ToolActivityObserver;
38
+ });
39
+ listTools(): readonly ToolDefinition[];
40
+ getToolInfo(toolName: string): ToolInfo | undefined;
41
+ execute(toolName: string, input: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolResult>;
42
+ }
@@ -0,0 +1,2 @@
1
+ import{randomUUID as g}from"node:crypto";import{imageContentBlockFromResult as h,omitImageData as y}from"./tool-image-content.js";const p=[t("computer.listWindows","List visible Windows application windows that can be targeted.",{includeMinimized:u("Whether minimized windows should be included.")},[]),t("computer.inspect","Inspect the accessible UI elements of a target Windows application window.",{windowId:e("Target window id."),query:T(),maxDepth:i("Maximum UI tree depth.")},["windowId"]),t("computer.screenshot","Capture the target Windows application window for visual verification.",{windowId:e("Target window id."),region:w()},["windowId"]),t("computer.readText","Read text or the current value from an inspected Windows UI element.",{windowId:e("Target window id."),elementId:e("Element id from computer.inspect."),scope:c(["value","document","selection"],"Text source to read.")},["windowId","elementId"]),t("computer.readSelection","Read selected items from a Windows selection control.",{windowId:e("Target window id."),elementId:e("Selection control element id.")},["windowId","elementId"]),t("computer.readGrid","Read a bounded rectangular region from a Windows grid control.",{windowId:e("Target window id."),elementId:e("Grid control element id."),rowStart:i("Zero-based first row."),rowCount:i("Maximum rows to read."),columnStart:i("Zero-based first column."),columnCount:i("Maximum columns to read.")},["windowId","elementId"]),t("computer.recognizeText","Recognize visible text in a Windows application screenshot.",{windowId:e("Target window id."),region:w(),language:e("Optional BCP-47 OCR language tag.")},["windowId"]),t("computer.focus","Bring a Windows application window or one of its inspected elements to the foreground.",{windowId:e("Target window id."),elementId:e("Optional element id from computer.inspect.")},["windowId"]),t("computer.click","Click a visible target window element or validated point.",{windowId:e("Target window id."),elementId:e("Optional element id from computer.inspect."),point:m(),button:c(["left","right","middle"],"Mouse button."),clickCount:i("Number of clicks, one or two.")},["windowId"]),t("computer.type","Type text into the focused Windows control.",{windowId:e("Target window id."),text:e("Text to type."),elementId:e("Optional editable element id from computer.inspect.")},["windowId","text"]),t("computer.keypress","Press a keyboard key with optional modifiers in the target window.",{windowId:e("Target window id."),key:e("Key name, for example Enter or Tab."),modifiers:b("Optional modifiers: Alt, Control, Shift, or Meta.")},["windowId","key"]),t("computer.scroll","Scroll the target Windows application.",{windowId:e("Target window id."),deltaX:i("Horizontal scroll amount."),deltaY:i("Vertical scroll amount."),point:m()},["windowId"]),t("computer.drag","Drag from one validated point or element to another within a target window.",{windowId:e("Target window id."),from:f(),to:f(),durationMs:i("Drag duration in milliseconds.")},["windowId","from","to"]),t("computer.selectText","Select an occurrence of text in an inspected Windows text control.",{windowId:e("Target window id."),elementId:e("Text control element id."),text:e("Text to select."),occurrence:i("One-based occurrence to select.")},["windowId","elementId","text"]),t("computer.listDisplays","List connected Windows displays and their work areas.",{},[]),t("computer.launch","Launch an allowlisted Windows application by app id.",{appId:e("Registered application id.")},["appId"]),t("computer.wait","Wait for a target window, UI element, text, or idle state.",{windowId:e("Optional target window id."),condition:c(["window","element","text","idle"],"Condition to wait for."),elementId:e("Optional element id."),text:e("Optional text to find."),timeoutMs:i("Maximum wait time in milliseconds."),idleMs:i("Minimum system idle time for the idle condition.")},["condition","timeoutMs"]),t("computer.move","Move the pointer to a target point or element, including hover interactions.",{windowId:e("Target window id."),elementId:e("Optional element id from computer.inspect."),point:m(),durationMs:i("Movement duration in milliseconds.")},["windowId"]),t("computer.setValue","Set the value of an editable or range UI Automation control.",{windowId:e("Target window id."),elementId:e("Element id from computer.inspect."),value:e("New control value.")},["windowId","elementId","value"]),t("computer.invoke","Invoke the default action of an inspected button or menu item.",{windowId:e("Target window id."),elementId:e("Element id from computer.inspect.")},["windowId","elementId"]),t("computer.select","Set the selection state of an inspected selectable UI element.",{windowId:e("Target window id."),elementId:e("Element id from computer.inspect."),mode:c(["replace","add","remove"],"Selection operation.")},["windowId","elementId"]),t("computer.setToggleState","Set an inspected toggle or checkbox to a specific state.",{windowId:e("Target window id."),elementId:e("Element id from computer.inspect."),state:c(["on","off","indeterminate"],"Desired toggle state.")},["windowId","elementId","state"]),t("computer.setExpandedState","Expand or collapse an inspected tree, menu, or group control.",{windowId:e("Target window id."),elementId:e("Element id from computer.inspect."),expanded:u("Whether the element should be expanded.")},["windowId","elementId","expanded"]),t("computer.scrollIntoView","Scroll an inspected element into the visible area of its container.",{windowId:e("Target window id."),elementId:e("Element id from computer.inspect.")},["windowId","elementId"]),t("computer.setWindowState","Set the target window visual state and optionally its screen bounds.",{windowId:e("Target window id."),state:c(["normal","minimized","maximized"],"Desired window state."),bounds:v()},["windowId","state"]),t("computer.closeWindow","Request a normal close of the target Windows application window.",{windowId:e("Target window id.")},["windowId"]),t("computer.readClipboard","Read the current Windows text clipboard contents.",{},[]),t("computer.writeClipboard","Replace the Windows text clipboard contents.",{text:e("Text to place on the clipboard.")},["text"]),t("computer.waitForState","Wait until an inspected Windows UI element exposes the requested property value.",{windowId:e("Target window id."),elementId:e("Element id from computer.inspect."),property:c(["name","value","isEnabled","isOffscreen","toggleState","expandCollapseState","selectionState"],"UI Automation property to observe."),expected:e("Expected property value."),timeoutMs:i("Maximum wait time in milliseconds."),intervalMs:i("Polling interval in milliseconds.")},["windowId","elementId","property","expected","timeoutMs"]),t("computer.manageFileDialog","Set, confirm, or cancel a standard Windows file dialog.",{windowId:e("File dialog window id."),action:c(["setPath","confirm","cancel"],"File dialog operation."),path:e("File path to enter when using setPath or confirm.")},["windowId","action"])];function x(){return p}class C{options;constructor(o){this.options=o}listTools(){return x()}getToolInfo(o){if(!p.some(a=>I(a)===o))return;const d=["computer.listWindows","computer.inspect","computer.screenshot","computer.readText","computer.readSelection","computer.readGrid","computer.recognizeText","computer.listDisplays","computer.wait","computer.readClipboard","computer.waitForState"].includes(o);return{toolName:o,source:"custom",executorId:"desktop-computer-host",metadata:{risk:d?"read":"unknown"}}}async execute(o,d,a){if(!p.some(r=>I(r)===o))return{content:`Unknown computer tool: ${o}`,isError:!0};const s=this.options.onActivity?.start({key:`${a.runId}:${o}`,toolName:o,source:"computer",label:W(o)});try{const r=await this.options.request({version:1,type:"host.request",requestId:g(),tool:"computer",sessionId:a.sessionId,runId:a.runId,action:o,params:d,executionBoundary:"host",hostFallback:"deny"},a.signal);if(!r.ok)return s?.complete(!0),{content:r.error?.message??"Desktop rejected the computer action.",isError:!0,metadata:{code:r.error?.code??"COMPUTER_HOST_ERROR",retryable:r.error?.retryable??!1}};s?.complete(!1);const l=o==="computer.screenshot"?h(r.result):void 0;return{content:S(l===void 0?r.result:y(r.result,"dataBase64"),a.maxResultBytes),isError:!1,...l===void 0?{}:{contentBlocks:[l]},metadata:{computer:!0}}}catch(r){return s?.complete(!0),{content:r instanceof Error?r.message:"Computer host request failed.",isError:!0}}}}function t(n,o,d,a){return{type:"function",function:{name:n,description:o,parameters:{type:"object",properties:d,required:a,additionalProperties:!1}}}}function e(n){return{type:"string",description:n}}function i(n){return{type:"number",description:n}}function u(n){return{type:"boolean",description:n}}function c(n,o){return{type:"string",enum:[...n],description:o}}function b(n){return{type:"array",items:{type:"string"},description:n}}function T(){return{type:"object",properties:{role:e("Exact UI Automation control type."),name:e("Case-insensitive text contained in the element name."),text:e("Case-insensitive text contained in the element name or help text.")},additionalProperties:!1,description:"Optional role, name, or text filter."}}function w(){return{type:"object",properties:{x:{type:"number",description:"Left offset within the window."},y:{type:"number",description:"Top offset within the window."},width:{type:"number",description:"Region width."},height:{type:"number",description:"Region height."}},required:["x","y","width","height"],additionalProperties:!1,description:"Optional region within the target window."}}function v(){return{type:"object",properties:{x:i("Screen left coordinate."),y:i("Screen top coordinate."),width:i("Window width."),height:i("Window height.")},required:["x","y","width","height"],additionalProperties:!1,description:"Optional screen bounds."}}function m(){return{type:"object",properties:{x:{type:"number"},y:{type:"number"}},required:["x","y"],additionalProperties:!1}}function f(){return{type:"object",properties:{elementId:{type:"string"},x:{type:"number"},y:{type:"number"}},additionalProperties:!1}}function I(n){return"function"in n?n.function.name:void 0}function S(n,o){const d=JSON.stringify(n??null);return Buffer.byteLength(d,"utf8")<=o?d:`${d.slice(0,Math.max(0,o-12))}
2
+ [truncated]`}function W(n){return n.replace(/^computer\./u,"Computer ")}export{C as ComputerHostToolExecutor,x as computerToolDefinitions};
@@ -0,0 +1,9 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
3
+ export declare const DESKTOP_PROTOCOL_VERSION: 1;
4
+ /**
5
+ * Local JSONL bridge for the Desktop application. It is deliberately kept in
6
+ * the CLI application layer: Desktop reuses CLI policy and runtime, while the
7
+ * public SDK packages remain independent libraries.
8
+ */
9
+ export declare function runDesktopAgentCommand(runtime: CliRuntime, cwd: string, input: Readable, output: Writable): Promise<number>;
@@ -0,0 +1,3 @@
1
+ import{randomUUID as U}from"node:crypto";import{AuthenticationService as k}from"../auth/authentication-service.js";import{createLotaGateClient as N}from"../../infrastructure/sdk/lotagate-client-factory.js";import{ModelCatalogAdapter as q}from"../../infrastructure/sdk/model-catalog-adapter.js";import{loadExecutionConfig as T}from"../config/execution-config.js";import{prepareCliAgent as F,warmMcpRuntime as z}from"../agent/cli-agent-execution-service.js";import{createContextManagement as Q}from"../agent/context-compaction.js";import{persistContextCompaction as X}from"../agent/context-compaction-persistence.js";import{CliAgentSessionStore as Z}from"../agent/agent-session-store.js";import{CliTurnEventProjector as tt}from"../orchestration/cli-turn-event-projector.js";import{persistCliTurnEvent as et}from"../orchestration/cli-turn-persistence.js";import{createTurnId as ot,recordTurnCompletion as st,recordTurnFailure as it,recordTurnStart as nt}from"../session/session-turn-lifecycle.js";import{ProjectSessionAccess as G}from"../session/project-session-access.js";import{permissionRuleForRequest as at}from"../security/workspace-permission-policy.js";import{agentLimitNotice as rt,classifyAgentLimit as ct}from"../agent/agent-limit.js";import{CliError as f}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as g}from"../../domain/errors/error-codes.js";import{readLinesBounded as dt}from"./jsonl-protocol.js";import{RESOURCE_LIMITS as lt}from"../../domain/runtime/resource-limits.js";import{getDesktopCommandCatalog as mt}from"./desktop-command-catalog.js";import{COMMAND_REGISTRY as pt}from"../commands/command-runtime.js";import{executeDesktopCommand as ut}from"./desktop-command-executor.js";import{DesktopAttachmentStore as ht}from"./desktop-attachment-store.js";import{SubagentJobRegistry as wt}from"../orchestration/cli-subagent-service.js";import{subagentDesktopPayload as ft}from"./desktop-orchestration-events.js";import{DesktopIntentEventWriter as gt}from"./desktop-intent-event-writer.js";import{resolveModelContextWindow as bt}from"../model/model-context-window.js";import{JsonLineWriter as Et}from"./json-line-writer.js";import{desktopApprovalMode as vt,sessionResult as J,toDesktopError as E}from"./desktop-protocol-helpers.js";import{DesktopApprovalBroker as yt}from"./desktop-approval-broker.js";import{SessionExecutionWorkspaceService as It}from"../workspace/session-execution-workspace.js";import{buildUserMessage as kt}from"../../infrastructure/clipboard/image-normalizer.js";import{isBrowserHostResponse as Rt,isComputerHostResponse as xt,isDesktopHostResponse as Tt,isDocumentHostResponse as St,parseDesktopRequest as Ct}from"./desktop-agent-request-parser.js";import{desktopMcpEvent as K}from"./desktop-mcp-events.js";import{DesktopExtensionService as At}from"./desktop-extension-service.js";import{DesktopExtensionRequestHandler as Dt}from"./desktop-extension-request-handler.js";const S=1,Mt=25e3;async function we(P,t,e,o){return new Nt(P,t,o).run(e)}class Nt{runtime;cwd;writer;turns=new Map;activeTurnBySession=new Map;subagentJobs=new wt;sessionStores=new Map;turnContexts=new Map;attachments=new ht;approvalBroker=new yt((t,e)=>this.writeEvent(t,e));commands=new Map;browserRequests=new Map;hostRequests=new Map;computerRequests=new Map;documentRequests=new Map;extensions=new At;extensionRequests;intentEvents;fallbackExecutionWorkspaces;browserHostEnabled=!1;computerHostEnabled=!1;documentHostEnabled=!1;stopping=!1;constructor(t,e,o){this.runtime=t,this.cwd=e,this.writer=new Et(o),this.extensionRequests=new Dt(this.extensions,(s,i)=>this.respond(s,i),this.cwd),this.intentEvents=new gt({writeEvent:(s,i)=>this.writeEvent(s,i),log:(s,i)=>this.logInfo(s,i)})}async run(t){let e=0;try{for await(const o of dt(t,lt.jsonlLineBytes)){if(o.trim().length===0)continue;let s;try{s=JSON.parse(o)}catch(a){e+=1,await this.writeError("unknown","protocol",E(a));continue}if(Rt(s)){this.resolveBrowserRequest(s);continue}if(Tt(s)){this.resolveDesktopHostRequest(s);continue}if(xt(s)){this.resolveComputerHostRequest(s);continue}if(St(s)){this.resolveDocumentHostRequest(s);continue}let i;try{i=Ct(s)}catch(a){e+=1,await this.writeError("unknown","protocol",E(a));continue}try{await this.handle(i)}catch(a){e+=1,await this.writeError(i.id,i.method,E(a))}if(this.stopping)break}}catch(o){e+=1,await this.writeError("unknown","protocol",E(o))}finally{for(const o of this.turns.values())o.controller.abort();await Promise.allSettled([...this.turns.values()].map(o=>o.operation));for(const o of this.commands.values())o.controller.abort();await Promise.allSettled([...this.commands.values()].map(o=>o.operation)),await this.subagentJobs.close(),this.approvalBroker.close();for(const o of this.browserRequests.values())o.onAbort!==void 0&&o.signal?.removeEventListener("abort",o.onAbort),o.reject(new Error("The Desktop browser bridge was closed."));this.browserRequests.clear();for(const o of this.hostRequests.values())o.onAbort!==void 0&&o.signal?.removeEventListener("abort",o.onAbort),o.reject(new Error("The Desktop execution bridge was closed."));this.hostRequests.clear();for(const o of this.computerRequests.values())o.onAbort!==void 0&&o.signal?.removeEventListener("abort",o.onAbort),o.reject(new Error("The Desktop computer bridge was closed."));this.computerRequests.clear();for(const o of this.documentRequests.values())o.onAbort!==void 0&&o.signal?.removeEventListener("abort",o.onAbort),o.reject(new Error("The Desktop document bridge was closed."));this.documentRequests.clear(),this.attachments.clear(),await this.writer.flush()}return e===0?0:1}async handle(t){switch(t.method){case"initialize":return this.browserHostEnabled=t.params.browserHost===!0,this.computerHostEnabled=t.params.computerHost===!0,this.documentHostEnabled=t.params.documentHost===!0,this.respond(t,{protocol:"lotagate.desktop",version:S,capabilities:["sessions","streaming","tool-approval","project-trust","models","auth","commands","image-attachments","file-attachments","execution-context","tool-allowlist","approval-reviews","lifecycle-controls","execution-broker","intent-runtime","host-evidence","conversational-progress","local-memory-commands","extensions",...this.browserHostEnabled?["browser-host"]:[],...this.computerHostEnabled?["computer-host"]:[],...this.documentHostEnabled?["document-host"]:[]]});case"session.create":return this.createSession(t);case"title.generate":return this.generateTitle(t);case"session.list":return this.listSessions(t);case"session.resume":return this.resumeSession(t);case"extension.listPublicPlugins":case"extension.resolvePublicPluginSource":case"extension.readPublicPluginContribution":case"extension.readDetail":case"extension.readPluginIcon":return this.extensionRequests.handle(t);case"attachment.begin":return this.attachments.begin({id:t.params.attachmentId,name:t.params.name,mimeType:t.params.mimeType,sizeBytes:t.params.sizeBytes}),this.respond(t,{accepted:!0,attachmentId:t.params.attachmentId});case"attachment.chunk":return this.attachments.appendChunk(t.params.attachmentId,t.params.index,t.params.dataBase64),this.respond(t,{accepted:!0,attachmentId:t.params.attachmentId,index:t.params.index});case"attachment.complete":return this.attachments.complete(t.params.attachmentId),this.respond(t,{accepted:!0,attachmentId:t.params.attachmentId});case"turn.start":return this.startTurn(t);case"turn.cancel":return this.cancelTurn(t);case"approval.respond":return this.respondApproval(t);case"trust.respond":return this.respondTrust(t);case"model.list":return this.listModels(t);case"auth.status":return this.authStatus(t);case"command.list":return this.listCommands(t);case"command.execute":return this.startCommand(t);case"command.cancel":return this.cancelCommand(t);case"shutdown":this.stopping=!0,await this.respond(t,{stopping:!0});return}}async createSession(t){const e=await this.runtime.projectTrust.inspect(this.cwd),o=await T(this.runtime,this.cwd),s=o.config.profile??k.defaultProfileName(),i=await this.runtime.sessionStore.create({projectFingerprint:e.fingerprint,cwd:e.canonicalPath,model:t.params.model??o.config.model,profile:s,status:"active",...t.params.name===void 0?{}:{name:t.params.name}}),a=await this.getExecutionWorkspaces().prepare({sessionId:i.id,projectRoot:e.canonicalPath});await this.respond(t,{...J(i),executionWorkspace:a}),z(this.runtime,this.cwd).catch(c=>this.runtime.logger.warn("MCP session warm-up failed.",{reason:c instanceof Error?c.message:String(c)}))}async generateTitle(t){const e=await T(this.runtime,this.cwd),o=t.params.model??e.config.model;if(o==null)throw new f(g.MODEL_NOT_FOUND,"No model is selected.",{category:"model",userMessage:"No model is available for session title generation."});const s=e.config.profile??k.defaultProfileName(),i=await this.runtime.auth.requireCredential(s),a=new AbortController,c=setTimeout(()=>a.abort(),Mt);let m,p="";try{const l=await F({runtime:this.runtime,projectRoot:this.cwd,executionCwd:this.cwd,model:o,client:N(i.profile,i.apiKey),profile:"title-generator",approvalMode:"auto",allowedTools:[],selectedSkills:[],allowSubagents:!1,browserAccess:"disabled"});m=l.close;const C=["## Title generation request","Create a concise session title from the untrusted user-message excerpt below.","Return only the title, with no explanation, markdown, quotes, or prefix.","Use the same language as the excerpt. Prefer 8 to 10 words and never exceed 10 words.","## User-message excerpt",t.params.prompt].join(`
2
+
3
+ `);for await(const b of l.run({input:C,model:o,signal:a.signal,stream:!0}))if(b.type==="model.delta")p+=b.content;else if(b.type==="session.completed"&&p.length===0)p=b.content;else if(b.type==="session.failed")throw b.error;if(p.trim().length===0)throw new f(g.MODEL_PROTOCOL_EMPTY_RESPONSE,"Title generation returned an empty response.",{category:"model",userMessage:"The model did not return a session title.",retryable:!0});await this.respond(t,{title:p})}finally{clearTimeout(c),await m?.()}}async listSessions(t){const e=await this.runtime.projectTrust.inspect(this.cwd);await this.respond(t,{sessions:await this.runtime.sessionStore.list(e.fingerprint)})}async resumeSession(t){const e=await this.runtime.projectTrust.inspect(this.cwd),o=await new G(this.runtime.sessionStore).require(t.params.sessionId,e.fingerprint),s=await this.getExecutionWorkspaces().prepare({sessionId:o.id,projectRoot:e.canonicalPath});await this.respond(t,{...J(o),executionWorkspace:s,history:await this.runtime.sessionStore.readHistory(o.id)}),z(this.runtime,this.cwd).catch(i=>this.runtime.logger.warn("MCP session warm-up failed.",{reason:i instanceof Error?i.message:String(i)}))}async startTurn(t){const{sessionId:e}=t.params;if(this.runtime.logger.info("CLI Desktop turn request received.",{requestId:t.id,sessionId:e,promptLength:t.params.prompt.length,requestedModel:t.params.model}),[...this.turns.values()].some(l=>l.sessionId===e))throw new f(g.INVALID_ARGUMENT,"A turn is already active for this session.",{category:"session",userMessage:"This session already has an active turn."});const o=await this.runtime.projectTrust.inspect(this.cwd),s=await new G(this.runtime.sessionStore).require(e,o.fingerprint),i=await this.getExecutionWorkspaces().prepare({sessionId:e,projectRoot:o.canonicalPath}),a=this.attachments.take(t.params.attachmentIds??[]),c=ot(),m=new AbortController;this.turnContexts.set(c,{...i,...t.params.taskId===void 0?{}:{taskId:t.params.taskId}}),this.activeTurnBySession.set(e,c);const p=this.executeTurn(t,s,o,i,c,m,a).catch(async l=>{await this.writeEvent(m.signal.aborted?"turn.cancelled":"turn.failed",{turnId:c,sessionId:e,...m.signal.aborted?{}:{error:E(l)}})}).finally(()=>{this.turns.delete(c),this.turnContexts.delete(c),this.activeTurnBySession.get(e)===c&&this.activeTurnBySession.delete(e)});this.turns.set(c,{sessionId:e,controller:m,operation:p}),await this.respond(t,{accepted:!0,turnId:c,sessionId:e})}async executeTurn(t,e,o,s,i,a,c){const m=await T(this.runtime,this.cwd);if(!await this.runtime.projectTrust.isTrusted(o)){const r=U();if(await this.writeEvent("trust.requested",{trustRequestId:r,sessionId:e.id,path:o.canonicalPath}),!await this.approvalBroker.waitForTrust(r,a.signal))throw new f(g.PROJECT_TRUST_REQUIRED,"Project trust was not granted.",{category:"project",userMessage:"Trust this project in the Desktop application before running tools."});await this.runtime.projectTrust.grant(o),await this.runtime.workspaceSettings.ensureInitialized(o.canonicalPath)}const l=t.params.model??e.model??m.config.model;if(l==null)throw new f(g.MODEL_NOT_FOUND,"No model is selected.",{category:"model",userMessage:"Select a model before starting a turn."});const C=t.params.reasoningEffort??m.config.effort;this.runtime.logger.info("CLI Desktop turn model resolved.",{sessionId:e.id,turnId:i,requestedModel:t.params.model,sessionModel:e.model,resolvedModel:l});const b=e.profile??m.config.profile??k.defaultProfileName(),L=await this.runtime.auth.requireCredential(b),H=N(L.profile,L.apiKey),O=await bt(this.runtime,l,b),A=this.sessionStores.get(e.id)??new Z;this.sessionStores.set(e.id,A);const I=[],R=[];for(const r of c)R.push({...r,attachment:await this.runtime.sessionStore.saveAttachment(e.id,r.attachment,r.bytes)});await nt(this.runtime.sessionStore,e.id,i,t.params.prompt,R.map(r=>r.attachment.id)),await this.runtime.sessionStore.updateStatus(e.id,"active"),await this.writeEvent("turn.started",{turnId:i,sessionId:e.id,model:l});const V={onSubagentLifecycle:r=>this.writeEvent(`subagent.${r.type}`,ft(r,this.activeTurnBySession.get(r.sessionId)))},Y={start:r=>{if(r.source!=="shell"&&r.source!=="computer"&&r.source!=="custom"&&r.toolName!=="filesystem.read"&&r.toolName!=="filesystem.write"&&r.toolName!=="filesystem.exists")return;const h={turnId:i,sessionId:e.id,actionId:r.key,toolName:r.toolName,displayName:r.label,...r.source==="shell"?{command:r.label}:{},kind:r.source??"tool",source:r.source},w=(u,v)=>{this.writeEvent(u,v).catch(y=>this.runtime.logger.warn("Desktop tool activity event failed.",{event:u,reason:y instanceof Error?y.message:String(y)}))};return w("tool.activity.started",{...h,status:"running"}),{complete:(u,v)=>w("tool.activity.completed",{...h,...v??{},status:u?"failed":"completed",isError:u})}}};let D,M=!1;const j=setTimeout(()=>a.abort(),t.params.execution.timeoutMs);try{const r=t.params.execution,h=await F({runtime:this.runtime,projectRoot:o.canonicalPath,executionCwd:s.executionCwd,model:l,client:H,reasoningEffort:C,profile:"interactive-trusted",approvalMode:vt(r.permissionPolicy),...r.allowedTools===void 0?{}:{allowedTools:r.allowedTools},...t.params.skills===void 0?{}:{selectedSkills:t.params.skills},browserAccess:r.browserAccess,subagentLifecycle:V,subagentJobs:this.subagentJobs,...this.browserHostEnabled?{browserHost:(n,d)=>this.requestBrowserHost(n,d)}:{},...this.browserHostEnabled?{desktopHost:((n,d)=>this.requestDesktopHost(n,d))}:{},...this.computerHostEnabled?{computerHost:((n,d)=>this.requestComputerHost(n,d))}:{},...this.documentHostEnabled?{documentHost:((n,d)=>this.requestDocumentHost(n,d))}:{},executionBoundary:r.isolation,hostFallback:r.hostFallback,...this.browserHostEnabled?{onExecutionFallbackApproval:(n,d)=>this.approvalBroker.waitForApproval(n,e.id,i,a.signal,"host",d)}:{},toolActivity:Y,onIntentLifecycle:n=>this.intentEvents.write(n,e.id,i),contextManagement:Q({client:H,model:l,...O===void 0?{}:{contextWindow:O},onCompactionStart:()=>this.writeEvent("context.compacting",{turnId:i,sessionId:e.id}),onSummaryFailure:n=>this.runtime.logger.warn("Context summarization failed; using fallback summary.",{reason:n instanceof Error?n.message:String(n)})}),agentSessionStore:A,prompt:n=>this.approvalBroker.waitForApproval(n,e.id,i,a.signal,r.isolation),rememberApproval:n=>this.runtime.workspaceSettings.rememberAllow(o.canonicalPath,at(n.toolName,n.input)),audit:async n=>{this.runtime.logger.info("Tool authorization decision.",{toolName:n.toolName,decision:n.decision,reason:n.reason}),await this.runtime.sessionStore.appendEvent({type:"tool.approval",timestamp:new Date().toISOString(),sessionId:e.id,turnId:i,data:{toolName:n.toolName,decision:n.decision,reason:n.reason}})},onModelComplete:n=>{n.usage!==void 0&&this.writeEvent("usage.updated",{turnId:i,sessionId:e.id,usage:n.usage}).catch(d=>this.runtime.logger.warn("Desktop usage event failed.",{reason:d instanceof Error?d.message:String(d)}))},onWrite:n=>{this.writeEvent("file.changed",{turnId:i,sessionId:e.id,change:n}).catch(d=>this.runtime.logger.warn("Desktop file event failed.",{reason:d instanceof Error?d.message:String(d)}))},mcpLifecycle:n=>this.writeMcpRuntimeEvent(n,e.id,i)});D=h.close;const w=new tt,u=await h.buildInput(t.params.prompt),v=await this.runtime.sessionStore.readHistory(e.id);A.hydrate(e.id,v.transcript,v.events,u.input);const y=R.length===0?void 0:kt(u.input,R),_=y?.content===null?void 0:y?.content,$=await h.agent.initialize();for(const n of $)(n.type==="mcp.server.status"||n.type==="mcp.tool.catalog.updated")&&await this.writeMcpEvent(n,e.id,i);for await(const n of h.run({input:u.input,userInput:u.userInput,...u.workspaceContext===void 0?{}:{workspaceContext:u.workspaceContext},..._===void 0?{}:{inputContent:_},model:l,sessionId:e.id,stream:!0,signal:a.signal})){(n.type==="mcp.server.status"||n.type==="mcp.tool.catalog.updated")&&await this.writeMcpEvent(n,e.id,i),n.type==="context.compacted"&&await X(this.runtime,h,e.id,n.metrics,i);const d=w.observe(n);for(const x of d)await this.emitProjected(x,e.id,i,I);if(n.type==="session.failed"){const x=ct(n.error);if(x===void 0)throw n.error;const B=rt(x);I.push(B);const W=`${i}:final`;await this.writeEvent("assistant.delta",{turnId:i,sessionId:e.id,segmentId:W,iteration:0,content:B}),await this.writeEvent("assistant.segment.completed",{turnId:i,sessionId:e.id,segmentId:W,iteration:0,phase:"final"});break}}if(I.join("").trim().length===0)throw new f(g.MODEL_PROTOCOL_EMPTY_RESPONSE,"Agent completed without a final text response.",{category:"model",userMessage:"The model completed without a final text response.",retryable:!0});await this.getExecutionWorkspaces().apply(e.id),M=!0,await st(this.runtime.sessionStore,e.id,i,I.join("")),await this.runtime.sessionStore.updateStatus(e.id,"completed"),await this.writeEvent("turn.completed",{turnId:i,sessionId:e.id,content:I.join("")})}catch(r){if(!M)try{const w=await this.getExecutionWorkspaces().apply(e.id);M=!0,w.appliedPaths.length>0&&this.runtime.logger.info("Applied session workspace changes after turn failure.",{sessionId:e.id,turnId:i,appliedPaths:w.appliedPaths})}catch(w){this.runtime.logger.error("Failed to apply session workspace changes after turn failure.",{sessionId:e.id,turnId:i,reason:w instanceof Error?w.message:String(w)})}const h=a.signal.aborted;throw await it(this.runtime.sessionStore,e.id,i,r,h),await this.runtime.sessionStore.updateStatus(e.id,h?"cancelled":"failed"),r}finally{if(this.intentEvents.clear(i),j!==void 0&&clearTimeout(j),D!==void 0)try{await D()}catch(r){this.runtime.logger.warn("Desktop agent cleanup failed.",{reason:r instanceof Error?r.message:String(r)})}await this.getExecutionWorkspaces().markReady(e.id)}}async emitProjected(t,e,o,s){t.type==="assistant.delta"?(s.push(t.content),await this.writeEvent("assistant.delta",{turnId:o,sessionId:e,segmentId:t.segmentId,iteration:t.iteration,content:t.content})):t.type==="assistant.replaced"?(s.splice(0,s.length,t.content),await this.writeEvent("assistant.replaced",{turnId:o,sessionId:e,segmentId:t.segmentId,iteration:t.iteration,content:t.content})):t.type==="assistant.segment.completed"?await this.writeEvent("assistant.segment.completed",{turnId:o,sessionId:e,segmentId:t.segmentId,iteration:t.iteration,phase:t.phase}):t.type==="action.started"?await this.writeEvent("tool.started",{turnId:o,sessionId:e,actionId:t.actionId,toolName:t.toolName,displayName:t.displayName,kind:t.kind,...t.source===void 0?{}:{source:t.source}}):t.type==="action.completed"?await this.writeEvent("tool.completed",{turnId:o,sessionId:e,actionId:t.actionId,toolName:t.toolName,displayName:t.displayName,kind:t.kind,status:t.status,isError:t.isError}):t.type==="context.compacted"&&await this.writeEvent("context.compacted",{turnId:o,sessionId:e}),await et(this.runtime.sessionStore,e,t,{turnId:o})}async writeMcpEvent(t,e,o){const s=K(t,e,o);await this.writeEvent(s.name,s.data)}async writeMcpRuntimeEvent(t,e,o){const s=K(t,e,o);await this.writeEvent(s.name,s.data)}async cancelTurn(t){const e=this.turns.get(t.params.turnId);if(e===void 0)throw new f(g.INVALID_ARGUMENT,"Turn is not active.",{category:"session",userMessage:"The requested turn is not active."});e.controller.abort(),await this.respond(t,{cancelled:!0,turnId:t.params.turnId}),await e.operation.catch(o=>this.runtime.logger.warn("Cancelled Desktop turn cleanup reported an error.",{turnId:t.params.turnId,reason:o instanceof Error?o.message:String(o)}))}async respondApproval(t){if(!this.approvalBroker.respondApproval(t.params.approvalId,t.params.approved))throw new f(g.INVALID_ARGUMENT,"Approval request is no longer active.",{category:"arguments",userMessage:"This approval request is no longer active."});await this.respond(t,{accepted:!0})}async respondTrust(t){if(!this.approvalBroker.respondTrust(t.params.trustRequestId,t.params.trusted))throw new f(g.INVALID_ARGUMENT,"Trust request is no longer active.",{category:"arguments",userMessage:"This trust request is no longer active."});await this.respond(t,{accepted:!0})}async listModels(t){const o=(await T(this.runtime,this.cwd)).config.profile??k.defaultProfileName(),s=await this.runtime.auth.requireCredential(o),i=await new q(N(s.profile,s.apiKey)).listModels();await this.respond(t,{models:i.data})}async authStatus(t){const o=(await this.runtime.configLoader.load(this.cwd,{includeProject:!1})).config.profile??k.defaultProfileName(),s=await this.runtime.credentialStore.get(o);await this.respond(t,{authenticated:s!==void 0,profile:o,...s===void 0?{}:{baseUrl:s.profile.baseUrl,credentialRef:s.profile.credentialRef}})}async listCommands(t){await this.respond(t,mt())}async startCommand(t){const o=pt.get(t.params.actionId)?.desktop?.mutationKey;if(o!==void 0&&(this.turns.size>0||[...this.commands.values()].some(p=>p.mutationKey===o)))throw new f(g.INVALID_ARGUMENT,`Desktop command conflicts with an active ${o} operation.`,{category:"command",userMessage:"Wait for the active operation to finish before changing this resource."});const s=U(),i=new AbortController,a=typeof t.params.options.scope=="string"?t.params.options.scope:void 0;this.logInfo("CLI Desktop command started.",{commandId:s,actionId:t.params.actionId,...a===void 0?{}:{scope:a}});const c=Promise.resolve().then(()=>this.executeCommand(t,s,i)).catch(async p=>{if(i.signal.aborted){this.logWarn("CLI Desktop command cancelled.",{commandId:s,actionId:t.params.actionId}),await this.writeEvent("command.cancelled",{commandId:s,actionId:t.params.actionId});return}this.logError("CLI Desktop command failed.",{commandId:s,actionId:t.params.actionId,code:E(p).code}),await this.writeEvent("command.failed",{commandId:s,actionId:t.params.actionId,error:E(p)})}).finally(()=>this.commands.delete(s));this.commands.set(s,{controller:i,operation:c,...o===void 0?{}:{mutationKey:o}});const m={accepted:!0,commandId:s,actionId:t.params.actionId};await this.respond(t,m)}async executeCommand(t,e,o){await this.writeEvent("command.started",{commandId:e,actionId:t.params.actionId});const s=await ut({runtime:this.runtime,cwd:this.cwd,invocation:t.params,signal:o.signal,output:{write:(i,a)=>this.writeEvent("command.output",{commandId:e,actionId:t.params.actionId,content:i,...a===void 0?{}:{structured:a}})},activity:{started:(i,a)=>this.writeEvent("command.activity.started",{commandId:e,actionId:t.params.actionId,key:i,label:a}),completed:(i,a)=>this.writeEvent("command.activity.completed",{commandId:e,actionId:t.params.actionId,key:i,isError:a})},onActivityError:i=>this.runtime.logger.warn("Desktop command activity event failed.",{commandId:e,reason:i instanceof Error?i.message:String(i)})});await this.writeEvent("command.completed",{commandId:e,actionId:t.params.actionId,exitCode:s,success:s===0}),this.logInfo("CLI Desktop command completed.",{commandId:e,actionId:t.params.actionId,exitCode:s,success:s===0})}logInfo(t,e){this.runtime.logger?.info(t,e)}logWarn(t,e){this.runtime.logger?.warn(t,e)}logError(t,e){this.runtime.logger?.error(t,e)}async cancelCommand(t){const e=this.commands.get(t.params.commandId);if(e===void 0)throw new f(g.INVALID_ARGUMENT,"Command is not active.",{category:"command",userMessage:"The requested command is not active."});e.controller.abort(),await this.respond(t,{accepted:!0,commandId:t.params.commandId})}async requestBrowserHost(t,e){if(this.stopping)throw new Error("The Desktop browser bridge is stopping.");const o=new Promise((s,i)=>{const a={resolve:s,reject:i,...e===void 0?{}:{signal:e}};if(e!==void 0){if(e.aborted){i(new Error("Browser action was cancelled."));return}a.onAbort=()=>{this.browserRequests.delete(t.requestId),this.sendHostCancel(t),i(new Error("Browser action was cancelled."))},e.addEventListener("abort",a.onAbort,{once:!0})}this.browserRequests.set(t.requestId,a)});try{return await this.writer.write(t),await o}finally{const s=this.browserRequests.get(t.requestId);s!==void 0&&(s.onAbort!==void 0&&s.signal?.removeEventListener("abort",s.onAbort),this.browserRequests.delete(t.requestId))}}async requestDesktopHost(t,e){if(this.stopping)throw new Error("The Desktop execution bridge is stopping.");const o=new Promise((s,i)=>{const a={resolve:s,reject:i,...e===void 0?{}:{signal:e}};if(e!==void 0){if(e.aborted){i(new Error("Host execution was cancelled."));return}a.onAbort=()=>{this.hostRequests.delete(t.requestId),this.sendHostCancel(t),i(new Error("Host execution was cancelled."))},e.addEventListener("abort",a.onAbort,{once:!0})}this.hostRequests.set(t.requestId,a)});try{return await this.writer.write(t),await o}finally{const s=this.hostRequests.get(t.requestId);s!==void 0&&(s.onAbort!==void 0&&s.signal?.removeEventListener("abort",s.onAbort),this.hostRequests.delete(t.requestId))}}resolveBrowserRequest(t){const e=this.browserRequests.get(t.requestId);e!==void 0&&(e.onAbort!==void 0&&e.signal?.removeEventListener("abort",e.onAbort),this.browserRequests.delete(t.requestId),e.resolve(t))}resolveDesktopHostRequest(t){const e=this.hostRequests.get(t.requestId);e!==void 0&&(e.onAbort!==void 0&&e.signal?.removeEventListener("abort",e.onAbort),this.hostRequests.delete(t.requestId),e.resolve(t))}async requestComputerHost(t,e){if(this.stopping)throw new Error("The Desktop computer bridge is stopping.");const o=new Promise((s,i)=>{const a={resolve:s,reject:i,...e===void 0?{}:{signal:e}};if(e!==void 0){if(e.aborted){i(new Error("Computer action was cancelled."));return}a.onAbort=()=>{this.computerRequests.delete(t.requestId),this.sendHostCancel(t),i(new Error("Computer action was cancelled."))},e.addEventListener("abort",a.onAbort,{once:!0})}this.computerRequests.set(t.requestId,a)});try{return await this.writer.write(t),await o}finally{const s=this.computerRequests.get(t.requestId);s!==void 0&&(s.onAbort!==void 0&&s.signal?.removeEventListener("abort",s.onAbort),this.computerRequests.delete(t.requestId))}}resolveComputerHostRequest(t){const e=this.computerRequests.get(t.requestId);e!==void 0&&(e.onAbort!==void 0&&e.signal?.removeEventListener("abort",e.onAbort),this.computerRequests.delete(t.requestId),e.resolve(t))}async requestDocumentHost(t,e){if(this.stopping)throw new Error("The Desktop document bridge is stopping.");const o=new Promise((s,i)=>{const a={resolve:s,reject:i,...e===void 0?{}:{signal:e}};if(e!==void 0){if(e.aborted){i(new Error("Document action was cancelled."));return}a.onAbort=()=>{this.documentRequests.delete(t.requestId),this.sendHostCancel(t),i(new Error("Document action was cancelled."))},e.addEventListener("abort",a.onAbort,{once:!0})}this.documentRequests.set(t.requestId,a)});try{return await this.writer.write(t),await o}finally{const s=this.documentRequests.get(t.requestId);s!==void 0&&(s.onAbort!==void 0&&s.signal?.removeEventListener("abort",s.onAbort),this.documentRequests.delete(t.requestId))}}resolveDocumentHostRequest(t){const e=this.documentRequests.get(t.requestId);e!==void 0&&(e.onAbort!==void 0&&e.signal?.removeEventListener("abort",e.onAbort),this.documentRequests.delete(t.requestId),e.resolve(t))}async sendHostCancel(t){this.stopping||await this.writer.write({version:1,type:"host.cancel",requestId:t.requestId,tool:t.tool,sessionId:t.sessionId})}async respond(t,e){await this.writer.write({version:S,id:t.id,type:"response",method:t.method,ok:!0,result:e})}async writeError(t,e,o){await this.writer.write({version:S,id:t,type:"response",method:e,ok:!1,error:o})}async writeEvent(t,e){const o=typeof e.turnId=="string"?e.turnId:void 0,s=o===void 0?void 0:this.turnContexts.get(o),i=s===void 0?{}:{projectRoot:s.projectRoot,executionCwd:s.executionCwd,executionWorkspaceId:s.id,...s.taskId===void 0?{}:{taskId:s.taskId}};await this.writer.write({version:S,type:"event",scope:typeof e.sessionId=="string"?"session":"control",event:t,data:{...i,...e}})}getExecutionWorkspaces(){return this.fallbackExecutionWorkspaces??=this.runtime.executionWorkspaces??new It(this.runtime.paths.globalConfigDir,this.runtime.platform),this.fallbackExecutionWorkspaces}}export{S as DESKTOP_PROTOCOL_VERSION,we as runDesktopAgentCommand};
@@ -0,0 +1,186 @@
1
+ import type { DesktopCommandInvocation } from './desktop-command-contract.js';
2
+ import { type DesktopExecutionPolicy } from './desktop-execution-policy.js';
3
+ import type { BrowserHostResponse } from './browser-host-tool-executor.js';
4
+ import type { DesktopHostExecutionResponse } from './desktop-host-tool-executor.js';
5
+ import type { ComputerHostResponse } from './computer-host-tool-executor.js';
6
+ import type { DocumentHostResponse } from './document-host-tool-executor.js';
7
+ export type DesktopRequest = {
8
+ version: 1;
9
+ id: string;
10
+ method: 'initialize';
11
+ params: Record<string, unknown>;
12
+ } | {
13
+ version: 1;
14
+ id: string;
15
+ method: 'session.create';
16
+ params: {
17
+ model?: string;
18
+ name?: string;
19
+ };
20
+ } | {
21
+ version: 1;
22
+ id: string;
23
+ method: 'session.list';
24
+ params: Record<string, unknown>;
25
+ } | {
26
+ version: 1;
27
+ id: string;
28
+ method: 'session.resume';
29
+ params: {
30
+ sessionId: string;
31
+ };
32
+ } | {
33
+ version: 1;
34
+ id: string;
35
+ method: 'extension.listPublicPlugins';
36
+ params: {
37
+ root: string;
38
+ };
39
+ } | {
40
+ version: 1;
41
+ id: string;
42
+ method: 'extension.resolvePublicPluginSource';
43
+ params: {
44
+ root: string;
45
+ name: string;
46
+ };
47
+ } | {
48
+ version: 1;
49
+ id: string;
50
+ method: 'extension.readPublicPluginContribution';
51
+ params: {
52
+ root: string;
53
+ pluginName: string;
54
+ kind: 'skill' | 'mcp' | 'hook';
55
+ sourceName: string;
56
+ };
57
+ } | {
58
+ version: 1;
59
+ id: string;
60
+ method: 'extension.readDetail';
61
+ params: {
62
+ kind: 'hook' | 'skill' | 'plugin' | 'mcp';
63
+ name: string;
64
+ scope?: 'user' | 'project' | 'plugin' | 'builtin';
65
+ pluginName?: string;
66
+ pluginScope?: 'user' | 'project';
67
+ sourceName?: string;
68
+ };
69
+ } | {
70
+ version: 1;
71
+ id: string;
72
+ method: 'extension.readPluginIcon';
73
+ params: {
74
+ name: string;
75
+ scope: 'user' | 'project';
76
+ };
77
+ } | {
78
+ version: 1;
79
+ id: string;
80
+ method: 'title.generate';
81
+ params: {
82
+ prompt: string;
83
+ model?: string;
84
+ };
85
+ } | {
86
+ version: 1;
87
+ id: string;
88
+ method: 'attachment.begin';
89
+ params: {
90
+ attachmentId: string;
91
+ name: string;
92
+ mimeType: string;
93
+ sizeBytes: number;
94
+ };
95
+ } | {
96
+ version: 1;
97
+ id: string;
98
+ method: 'attachment.chunk';
99
+ params: {
100
+ attachmentId: string;
101
+ index: number;
102
+ dataBase64: string;
103
+ };
104
+ } | {
105
+ version: 1;
106
+ id: string;
107
+ method: 'attachment.complete';
108
+ params: {
109
+ attachmentId: string;
110
+ };
111
+ } | {
112
+ version: 1;
113
+ id: string;
114
+ method: 'turn.start';
115
+ params: {
116
+ sessionId: string;
117
+ prompt: string;
118
+ model?: string;
119
+ reasoningEffort?: string;
120
+ runId?: string;
121
+ taskId?: string;
122
+ attachmentIds?: string[];
123
+ skills?: string[];
124
+ execution: DesktopExecutionPolicy;
125
+ };
126
+ } | {
127
+ version: 1;
128
+ id: string;
129
+ method: 'turn.cancel';
130
+ params: {
131
+ turnId: string;
132
+ };
133
+ } | {
134
+ version: 1;
135
+ id: string;
136
+ method: 'approval.respond';
137
+ params: {
138
+ approvalId: string;
139
+ approved: boolean;
140
+ };
141
+ } | {
142
+ version: 1;
143
+ id: string;
144
+ method: 'trust.respond';
145
+ params: {
146
+ trustRequestId: string;
147
+ trusted: boolean;
148
+ };
149
+ } | {
150
+ version: 1;
151
+ id: string;
152
+ method: 'model.list';
153
+ params: Record<string, unknown>;
154
+ } | {
155
+ version: 1;
156
+ id: string;
157
+ method: 'auth.status';
158
+ params: Record<string, unknown>;
159
+ } | {
160
+ version: 1;
161
+ id: string;
162
+ method: 'command.list';
163
+ params: Record<string, unknown>;
164
+ } | {
165
+ version: 1;
166
+ id: string;
167
+ method: 'command.execute';
168
+ params: DesktopCommandInvocation;
169
+ } | {
170
+ version: 1;
171
+ id: string;
172
+ method: 'command.cancel';
173
+ params: {
174
+ commandId: string;
175
+ };
176
+ } | {
177
+ version: 1;
178
+ id: string;
179
+ method: 'shutdown';
180
+ params: Record<string, unknown>;
181
+ };
182
+ export declare function parseDesktopRequest(value: unknown): DesktopRequest;
183
+ export declare function isBrowserHostResponse(value: unknown): value is BrowserHostResponse;
184
+ export declare function isDesktopHostResponse(value: unknown): value is DesktopHostExecutionResponse;
185
+ export declare function isComputerHostResponse(value: unknown): value is ComputerHostResponse;
186
+ export declare function isDocumentHostResponse(value: unknown): value is DocumentHostResponse;