@lotagate/cli 0.1.24 → 0.1.26

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 (671) hide show
  1. package/README.md +75 -7
  2. package/SECURITY.md +2 -0
  3. package/bin/lotagate.mjs +50 -8
  4. package/dist/application/agent/agent-constants.d.ts +6 -0
  5. package/dist/application/agent/agent-constants.js +1 -0
  6. package/dist/application/agent/agent-history.d.ts +3 -0
  7. package/dist/application/agent/agent-history.js +5 -0
  8. package/dist/application/agent/agent-input-context.d.ts +12 -0
  9. package/dist/application/agent/agent-input-context.js +5 -0
  10. package/dist/application/agent/agent-limit.d.ts +3 -0
  11. package/dist/application/agent/agent-limit.js +1 -0
  12. package/dist/application/agent/agent-run-tracker.d.ts +30 -0
  13. package/dist/application/agent/agent-run-tracker.js +1 -0
  14. package/dist/application/agent/agent-runtime-context.d.ts +22 -0
  15. package/dist/application/agent/agent-runtime-context.js +1 -0
  16. package/dist/application/agent/agent-session-store-registry.d.ts +16 -0
  17. package/dist/application/agent/agent-session-store-registry.js +1 -0
  18. package/dist/application/agent/agent-session-store.d.ts +23 -0
  19. package/dist/application/agent/agent-session-store.js +6 -0
  20. package/dist/application/agent/capability-profile.d.ts +17 -0
  21. package/dist/application/agent/capability-profile.js +0 -0
  22. package/dist/application/agent/cli-agent-execution-service.d.ts +120 -0
  23. package/dist/application/agent/cli-agent-execution-service.js +1 -0
  24. package/dist/application/agent/cli-agent-preparation-cache.d.ts +39 -0
  25. package/dist/application/agent/cli-agent-preparation-cache.js +1 -0
  26. package/dist/application/agent/cli-agent-run-request.d.ts +12 -0
  27. package/dist/application/agent/cli-agent-run-request.js +0 -0
  28. package/dist/application/agent/context-compaction-persistence.d.ts +8 -0
  29. package/dist/application/agent/context-compaction-persistence.js +1 -0
  30. package/dist/application/agent/context-compaction.d.ts +22 -0
  31. package/dist/application/agent/context-compaction.js +8 -0
  32. package/dist/application/agent/context-token-cache.d.ts +21 -0
  33. package/dist/application/agent/context-token-cache.js +4 -0
  34. package/dist/application/agent/context-usage-service.d.ts +52 -0
  35. package/dist/application/agent/context-usage-service.js +1 -0
  36. package/dist/application/agent/continuation-checkpoint.d.ts +15 -0
  37. package/dist/application/agent/continuation-checkpoint.js +2 -0
  38. package/dist/application/agent/interactive-agent-guidance.d.ts +5 -0
  39. package/dist/application/agent/interactive-agent-guidance.js +2 -0
  40. package/dist/application/agent/prompt-data-safety.d.ts +14 -0
  41. package/dist/application/agent/prompt-data-safety.js +4 -0
  42. package/dist/application/agent/scoped-tool-executor.d.ts +13 -0
  43. package/dist/application/agent/scoped-tool-executor.js +1 -0
  44. package/dist/application/agent/tool-catalog.d.ts +14 -0
  45. package/dist/application/agent/tool-catalog.js +1 -0
  46. package/dist/application/agent/tool-display.d.ts +7 -0
  47. package/dist/application/agent/tool-display.js +1 -0
  48. package/dist/application/agent/tool-hook-lifecycle.d.ts +19 -0
  49. package/dist/application/agent/tool-hook-lifecycle.js +1 -0
  50. package/dist/application/auth/authentication-service.d.ts +20 -0
  51. package/dist/application/auth/authentication-service.js +1 -0
  52. package/dist/application/chat/chat-service.d.ts +12 -0
  53. package/dist/application/chat/chat-service.js +1 -0
  54. package/dist/application/chat/pending-attachment-store.d.ts +15 -0
  55. package/dist/application/chat/pending-attachment-store.js +1 -0
  56. package/dist/application/commands/application-command-executor.d.ts +23 -0
  57. package/dist/application/commands/application-command-executor.js +3 -0
  58. package/dist/application/commands/cli-args.d.ts +6 -0
  59. package/dist/application/commands/cli-args.js +1 -0
  60. package/dist/application/commands/cli-command-services.d.ts +17 -0
  61. package/dist/application/commands/cli-command-services.js +33 -0
  62. package/dist/application/commands/command-cancellation.d.ts +6 -0
  63. package/dist/application/commands/command-cancellation.js +1 -0
  64. package/dist/application/commands/command-catalog.d.ts +6 -0
  65. package/dist/application/commands/command-catalog.js +1 -0
  66. package/dist/application/commands/command-contract.d.ts +60 -0
  67. package/dist/application/commands/command-contract.js +0 -0
  68. package/dist/application/commands/command-hints.d.ts +9 -0
  69. package/dist/application/commands/command-hints.js +1 -0
  70. package/dist/application/commands/command-output.d.ts +4 -0
  71. package/dist/application/commands/command-output.js +0 -0
  72. package/dist/application/commands/command-parser.d.ts +10 -0
  73. package/dist/application/commands/command-parser.js +1 -0
  74. package/dist/application/commands/command-presentation.d.ts +7 -0
  75. package/dist/application/commands/command-presentation.js +3 -0
  76. package/dist/application/commands/command-registry.d.ts +11 -0
  77. package/dist/application/commands/command-registry.js +1 -0
  78. package/dist/application/commands/command-runtime.d.ts +2 -0
  79. package/dist/application/commands/command-runtime.js +1 -0
  80. package/dist/application/commands/goal-command-handlers.d.ts +3 -0
  81. package/dist/application/commands/goal-command-handlers.js +7 -0
  82. package/dist/application/commands/media-command-handlers.d.ts +9 -0
  83. package/dist/application/commands/media-command-handlers.js +9 -0
  84. package/dist/application/commands/media-command-output.d.ts +11 -0
  85. package/dist/application/commands/media-command-output.js +1 -0
  86. package/dist/application/commands/memory-command-handler.d.ts +29 -0
  87. package/dist/application/commands/memory-command-handler.js +12 -0
  88. package/dist/application/commands/runtime-command-handlers.d.ts +7 -0
  89. package/dist/application/commands/runtime-command-handlers.js +14 -0
  90. package/dist/application/commands/stream-output.d.ts +4 -0
  91. package/dist/application/commands/stream-output.js +1 -0
  92. package/dist/application/commands/utility-commands.d.ts +6 -0
  93. package/dist/application/commands/utility-commands.js +10 -0
  94. package/dist/application/config/execution-config.d.ts +4 -0
  95. package/dist/application/config/execution-config.js +1 -0
  96. package/dist/application/extensions/extension-list-contract.d.ts +18 -0
  97. package/dist/application/extensions/extension-list-contract.js +0 -0
  98. package/dist/application/extensions/extension-list-formatters.d.ts +38 -0
  99. package/dist/application/extensions/extension-list-formatters.js +1 -0
  100. package/dist/application/extensions/extension-list-output.d.ts +3 -0
  101. package/dist/application/extensions/extension-list-output.js +3 -0
  102. package/dist/application/extensions/plugin-contribution-registry.d.ts +31 -0
  103. package/dist/application/extensions/plugin-contribution-registry.js +1 -0
  104. package/dist/application/extensions/plugin-detail-contract.d.ts +25 -0
  105. package/dist/application/extensions/plugin-detail-contract.js +0 -0
  106. package/dist/application/extensions/plugin-detail-service.d.ts +3 -0
  107. package/dist/application/extensions/plugin-detail-service.js +1 -0
  108. package/dist/application/extensions/skill-scope-store.d.ts +23 -0
  109. package/dist/application/extensions/skill-scope-store.js +1 -0
  110. package/dist/application/formatting/compact-number.d.ts +2 -0
  111. package/dist/application/formatting/compact-number.js +1 -0
  112. package/dist/application/formatting/compact-table.d.ts +22 -0
  113. package/dist/application/formatting/compact-table.js +2 -0
  114. package/dist/application/intent/completion-gate.d.ts +3 -0
  115. package/dist/application/intent/completion-gate.js +1 -0
  116. package/dist/application/intent/evidence-ledger.d.ts +22 -0
  117. package/dist/application/intent/evidence-ledger.js +1 -0
  118. package/dist/application/intent/evidence-recording-tool-executor.d.ts +16 -0
  119. package/dist/application/intent/evidence-recording-tool-executor.js +1 -0
  120. package/dist/application/intent/intent-compiler.d.ts +11 -0
  121. package/dist/application/intent/intent-compiler.js +2 -0
  122. package/dist/application/intent/intent-execution-gate.d.ts +11 -0
  123. package/dist/application/intent/intent-execution-gate.js +1 -0
  124. package/dist/application/intent/intent-host-context.d.ts +6 -0
  125. package/dist/application/intent/intent-host-context.js +1 -0
  126. package/dist/application/intent/intent-run-controller.d.ts +56 -0
  127. package/dist/application/intent/intent-run-controller.js +3 -0
  128. package/dist/application/intent/project-policy.d.ts +16 -0
  129. package/dist/application/intent/project-policy.js +1 -0
  130. package/dist/application/media/video-operation-poller.d.ts +5 -0
  131. package/dist/application/media/video-operation-poller.js +1 -0
  132. package/dist/application/memory/memory-capture-policy.d.ts +10 -0
  133. package/dist/application/memory/memory-capture-policy.js +1 -0
  134. package/dist/application/memory/memory-consolidation-service.d.ts +12 -0
  135. package/dist/application/memory/memory-consolidation-service.js +1 -0
  136. package/dist/application/memory/memory-context-assembler.d.ts +24 -0
  137. package/dist/application/memory/memory-context-assembler.js +1 -0
  138. package/dist/application/memory/memory-extractor.d.ts +21 -0
  139. package/dist/application/memory/memory-extractor.js +2 -0
  140. package/dist/application/memory/memory-service.d.ts +34 -0
  141. package/dist/application/memory/memory-service.js +1 -0
  142. package/dist/application/model/cached-model-catalog.d.ts +19 -0
  143. package/dist/application/model/cached-model-catalog.js +1 -0
  144. package/dist/application/model/initial-model-selection.d.ts +10 -0
  145. package/dist/application/model/initial-model-selection.js +1 -0
  146. package/dist/application/model/model-catalog-service.d.ts +6 -0
  147. package/dist/application/model/model-catalog-service.js +1 -0
  148. package/dist/application/model/model-context-window.d.ts +3 -0
  149. package/dist/application/model/model-context-window.js +1 -0
  150. package/dist/application/model/model-response-retry.d.ts +15 -0
  151. package/dist/application/model/model-response-retry.js +1 -0
  152. package/dist/application/orchestration/abortable-wait.d.ts +2 -0
  153. package/dist/application/orchestration/abortable-wait.js +1 -0
  154. package/dist/application/orchestration/cli-subagent-service.d.ts +77 -0
  155. package/dist/application/orchestration/cli-subagent-service.js +13 -0
  156. package/dist/application/orchestration/cli-turn-event-projector.d.ts +15 -0
  157. package/dist/application/orchestration/cli-turn-event-projector.js +1 -0
  158. package/dist/application/orchestration/cli-turn-events.d.ts +76 -0
  159. package/dist/application/orchestration/cli-turn-events.js +1 -0
  160. package/dist/application/orchestration/cli-turn-persistence.d.ts +6 -0
  161. package/dist/application/orchestration/cli-turn-persistence.js +1 -0
  162. package/dist/application/orchestration/goal-evaluator.d.ts +18 -0
  163. package/dist/application/orchestration/goal-evaluator.js +3 -0
  164. package/dist/application/orchestration/goal-input.d.ts +3 -0
  165. package/dist/application/orchestration/goal-input.js +1 -0
  166. package/dist/application/orchestration/goal-output.d.ts +2 -0
  167. package/dist/application/orchestration/goal-output.js +2 -0
  168. package/dist/application/orchestration/goal-runner.d.ts +22 -0
  169. package/dist/application/orchestration/goal-runner.js +10 -0
  170. package/dist/application/orchestration/goal-usage.d.ts +9 -0
  171. package/dist/application/orchestration/goal-usage.js +1 -0
  172. package/dist/application/orchestration/headless-agent-turn.d.ts +36 -0
  173. package/dist/application/orchestration/headless-agent-turn.js +4 -0
  174. package/dist/application/orchestration/orchestration-constants.d.ts +3 -0
  175. package/dist/application/orchestration/orchestration-constants.js +1 -0
  176. package/dist/application/orchestration/subagent-coordinator.d.ts +41 -0
  177. package/dist/application/orchestration/subagent-coordinator.js +1 -0
  178. package/dist/application/orchestration/subagent-handoff.d.ts +3 -0
  179. package/dist/application/orchestration/subagent-handoff.js +3 -0
  180. package/dist/application/orchestration/subagent-tool-executor.d.ts +12 -0
  181. package/dist/application/orchestration/subagent-tool-executor.js +1 -0
  182. package/dist/application/orchestration/task-graph.d.ts +13 -0
  183. package/dist/application/orchestration/task-graph.js +1 -0
  184. package/dist/application/orchestration/task-scheduler.d.ts +18 -0
  185. package/dist/application/orchestration/task-scheduler.js +1 -0
  186. package/dist/application/project/project-trust-service.d.ts +13 -0
  187. package/dist/application/project/project-trust-service.js +1 -0
  188. package/dist/application/project-intelligence/project-intelligence-constants.d.ts +56 -0
  189. package/dist/application/project-intelligence/project-intelligence-constants.js +1 -0
  190. package/dist/application/project-intelligence/project-intelligence-service.d.ts +14 -0
  191. package/dist/application/project-intelligence/project-intelligence-service.js +1 -0
  192. package/dist/application/protocol/browser-host-tool-executor.d.ts +51 -0
  193. package/dist/application/protocol/browser-host-tool-executor.js +2 -0
  194. package/dist/application/protocol/computer-host-tool-executor.d.ts +45 -0
  195. package/dist/application/protocol/computer-host-tool-executor.js +2 -0
  196. package/dist/application/protocol/desktop-agent-command.d.ts +9 -0
  197. package/dist/application/protocol/desktop-agent-command.js +3 -0
  198. package/dist/application/protocol/desktop-agent-contracts.d.ts +34 -0
  199. package/dist/application/protocol/desktop-agent-contracts.js +1 -0
  200. package/dist/application/protocol/desktop-agent-helpers.d.ts +5 -0
  201. package/dist/application/protocol/desktop-agent-helpers.js +1 -0
  202. package/dist/application/protocol/desktop-agent-request-parser.d.ts +211 -0
  203. package/dist/application/protocol/desktop-agent-request-parser.js +1 -0
  204. package/dist/application/protocol/desktop-approval-broker.d.ts +26 -0
  205. package/dist/application/protocol/desktop-approval-broker.js +1 -0
  206. package/dist/application/protocol/desktop-attachment-store.d.ts +33 -0
  207. package/dist/application/protocol/desktop-attachment-store.js +1 -0
  208. package/dist/application/protocol/desktop-command-catalog.d.ts +2 -0
  209. package/dist/application/protocol/desktop-command-catalog.js +1 -0
  210. package/dist/application/protocol/desktop-command-contract.d.ts +26 -0
  211. package/dist/application/protocol/desktop-command-contract.js +1 -0
  212. package/dist/application/protocol/desktop-command-executor.d.ts +17 -0
  213. package/dist/application/protocol/desktop-command-executor.js +1 -0
  214. package/dist/application/protocol/desktop-command-output.d.ts +15 -0
  215. package/dist/application/protocol/desktop-command-output.js +1 -0
  216. package/dist/application/protocol/desktop-execution-policy.d.ts +19 -0
  217. package/dist/application/protocol/desktop-execution-policy.js +1 -0
  218. package/dist/application/protocol/desktop-extension-request-handler.d.ts +14 -0
  219. package/dist/application/protocol/desktop-extension-request-handler.js +1 -0
  220. package/dist/application/protocol/desktop-extension-service.d.ts +44 -0
  221. package/dist/application/protocol/desktop-extension-service.js +3 -0
  222. package/dist/application/protocol/desktop-host-bridge.d.ts +33 -0
  223. package/dist/application/protocol/desktop-host-bridge.js +1 -0
  224. package/dist/application/protocol/desktop-host-capabilities.d.ts +12 -0
  225. package/dist/application/protocol/desktop-host-capabilities.js +1 -0
  226. package/dist/application/protocol/desktop-host-tool-executor.d.ts +76 -0
  227. package/dist/application/protocol/desktop-host-tool-executor.js +2 -0
  228. package/dist/application/protocol/desktop-intent-event-writer.d.ts +20 -0
  229. package/dist/application/protocol/desktop-intent-event-writer.js +1 -0
  230. package/dist/application/protocol/desktop-mcp-events.d.ts +10 -0
  231. package/dist/application/protocol/desktop-mcp-events.js +1 -0
  232. package/dist/application/protocol/desktop-orchestration-events.d.ts +2 -0
  233. package/dist/application/protocol/desktop-orchestration-events.js +2 -0
  234. package/dist/application/protocol/desktop-protocol-helpers.d.ts +13 -0
  235. package/dist/application/protocol/desktop-protocol-helpers.js +1 -0
  236. package/dist/application/protocol/json-line-writer.d.ts +31 -0
  237. package/dist/application/protocol/json-line-writer.js +2 -0
  238. package/dist/application/protocol/jsonl-agent-command.d.ts +3 -0
  239. package/dist/application/protocol/jsonl-agent-command.js +3 -0
  240. package/dist/application/protocol/jsonl-protocol.d.ts +82 -0
  241. package/dist/application/protocol/jsonl-protocol.js +2 -0
  242. package/dist/application/protocol/tool-image-content.d.ts +4 -0
  243. package/dist/application/protocol/tool-image-content.js +1 -0
  244. package/dist/application/security/delegated-worker-policy.d.ts +3 -0
  245. package/dist/application/security/delegated-worker-policy.js +1 -0
  246. package/dist/application/security/desktop-tool-scope-policy.d.ts +4 -0
  247. package/dist/application/security/desktop-tool-scope-policy.js +1 -0
  248. package/dist/application/security/tool-action-risk-analyzer.d.ts +13 -0
  249. package/dist/application/security/tool-action-risk-analyzer.js +1 -0
  250. package/dist/application/security/tool-approval-service.d.ts +43 -0
  251. package/dist/application/security/tool-approval-service.js +1 -0
  252. package/dist/application/security/tool-policy-registry.d.ts +20 -0
  253. package/dist/application/security/tool-policy-registry.js +1 -0
  254. package/dist/application/security/tool-risk-classifier.d.ts +19 -0
  255. package/dist/application/security/tool-risk-classifier.js +1 -0
  256. package/dist/application/security/workspace-permission-policy.d.ts +10 -0
  257. package/dist/application/security/workspace-permission-policy.js +1 -0
  258. package/dist/application/session/project-session-access.d.ts +8 -0
  259. package/dist/application/session/project-session-access.js +1 -0
  260. package/dist/application/session/session-compaction-service.d.ts +10 -0
  261. package/dist/application/session/session-compaction-service.js +1 -0
  262. package/dist/application/session/session-turn-lifecycle.d.ts +5 -0
  263. package/dist/application/session/session-turn-lifecycle.js +1 -0
  264. package/dist/application/workspace/session-execution-workspace.d.ts +59 -0
  265. package/dist/application/workspace/session-execution-workspace.js +3 -0
  266. package/dist/application/workspace/workspace-constants.d.ts +17 -0
  267. package/dist/application/workspace/workspace-constants.js +1 -0
  268. package/dist/application/workspace/workspace-file-index.d.ts +14 -0
  269. package/dist/application/workspace/workspace-file-index.js +1 -0
  270. package/dist/application/workspace/workspace-file-reference-resolver.d.ts +20 -0
  271. package/dist/application/workspace/workspace-file-reference-resolver.js +17 -0
  272. package/dist/application/workspace/workspace-instruction-loader.d.ts +8 -0
  273. package/dist/application/workspace/workspace-instruction-loader.js +1 -0
  274. package/dist/bootstrap/composition-root.d.ts +7 -0
  275. package/dist/bootstrap/composition-root.js +1 -0
  276. package/dist/bootstrap/global-cli-options.d.ts +6 -0
  277. package/dist/bootstrap/global-cli-options.js +1 -0
  278. package/dist/bootstrap/native-devtools-stub.d.ts +10 -0
  279. package/dist/bootstrap/native-devtools-stub.js +1 -0
  280. package/dist/bootstrap/native-entry.d.ts +1 -0
  281. package/dist/bootstrap/native-entry.js +2 -0
  282. package/dist/bootstrap/native-tiktoken.d.ts +4 -0
  283. package/dist/bootstrap/native-tiktoken.js +1 -0
  284. package/dist/bootstrap/runtime-factory.d.ts +46 -0
  285. package/dist/bootstrap/runtime-factory.js +1 -0
  286. package/dist/bootstrap/shutdown-manager.d.ts +11 -0
  287. package/dist/bootstrap/shutdown-manager.js +1 -0
  288. package/dist/bootstrap/startup-sequence.d.ts +5 -0
  289. package/dist/bootstrap/startup-sequence.js +1 -0
  290. package/dist/domain/auth/auth-profile.d.ts +14 -0
  291. package/dist/domain/auth/auth-profile.js +1 -0
  292. package/dist/domain/config/config-schema.d.ts +24 -0
  293. package/dist/domain/config/config-schema.js +1 -0
  294. package/dist/domain/errors/cli-command-hint.d.ts +5 -0
  295. package/dist/domain/errors/cli-command-hint.js +0 -0
  296. package/dist/domain/errors/cli-error.d.ts +35 -0
  297. package/dist/domain/errors/cli-error.js +1 -0
  298. package/dist/domain/errors/error-codes.d.ts +51 -0
  299. package/dist/domain/errors/error-codes.js +1 -0
  300. package/dist/domain/extensions/extension-constants.d.ts +1 -0
  301. package/dist/domain/extensions/extension-constants.js +1 -0
  302. package/dist/domain/extensions/extension-scope.d.ts +3 -0
  303. package/dist/domain/extensions/extension-scope.js +1 -0
  304. package/dist/domain/extensions/extension-state.d.ts +5 -0
  305. package/dist/domain/extensions/extension-state.js +1 -0
  306. package/dist/domain/extensions/hook-manifest.d.ts +13 -0
  307. package/dist/domain/extensions/hook-manifest.js +1 -0
  308. package/dist/domain/extensions/host-tool-plugin-ids.d.ts +5 -0
  309. package/dist/domain/extensions/host-tool-plugin-ids.js +1 -0
  310. package/dist/domain/extensions/mcp-config.d.ts +35 -0
  311. package/dist/domain/extensions/mcp-config.js +1 -0
  312. package/dist/domain/extensions/plugin-agent-manifest.d.ts +8 -0
  313. package/dist/domain/extensions/plugin-agent-manifest.js +1 -0
  314. package/dist/domain/extensions/plugin-manifest.d.ts +23 -0
  315. package/dist/domain/extensions/plugin-manifest.js +1 -0
  316. package/dist/domain/extensions/skill-manifest.d.ts +10 -0
  317. package/dist/domain/extensions/skill-manifest.js +3 -0
  318. package/dist/domain/extensions/yaml-subset.d.ts +9 -0
  319. package/dist/domain/extensions/yaml-subset.js +2 -0
  320. package/dist/domain/filesystem/file-change-diff.d.ts +21 -0
  321. package/dist/domain/filesystem/file-change-diff.js +3 -0
  322. package/dist/domain/intent/intent-contract.d.ts +33 -0
  323. package/dist/domain/intent/intent-contract.js +1 -0
  324. package/dist/domain/media/gateway-media-contract.d.ts +23 -0
  325. package/dist/domain/media/gateway-media-contract.js +1 -0
  326. package/dist/domain/media/media-constants.d.ts +3 -0
  327. package/dist/domain/media/media-constants.js +1 -0
  328. package/dist/domain/media/media-contract.d.ts +28 -0
  329. package/dist/domain/media/media-contract.js +0 -0
  330. package/dist/domain/media/media-execution-policy.d.ts +9 -0
  331. package/dist/domain/media/media-execution-policy.js +1 -0
  332. package/dist/domain/memory/memory-constants.d.ts +3 -0
  333. package/dist/domain/memory/memory-constants.js +1 -0
  334. package/dist/domain/memory/memory-kinds.d.ts +15 -0
  335. package/dist/domain/memory/memory-kinds.js +1 -0
  336. package/dist/domain/memory/memory-retrieval-policy.d.ts +3 -0
  337. package/dist/domain/memory/memory-retrieval-policy.js +1 -0
  338. package/dist/domain/memory/memory-search.d.ts +33 -0
  339. package/dist/domain/memory/memory-search.js +2 -0
  340. package/dist/domain/memory/memory.d.ts +48 -0
  341. package/dist/domain/memory/memory.js +1 -0
  342. package/dist/domain/orchestration/goal.d.ts +57 -0
  343. package/dist/domain/orchestration/goal.js +1 -0
  344. package/dist/domain/orchestration/subagent-identity.d.ts +2 -0
  345. package/dist/domain/orchestration/subagent-identity.js +1 -0
  346. package/dist/domain/orchestration/subagent.d.ts +33 -0
  347. package/dist/domain/orchestration/subagent.js +0 -0
  348. package/dist/domain/orchestration/work-plan.d.ts +15 -0
  349. package/dist/domain/orchestration/work-plan.js +0 -0
  350. package/dist/domain/project/project-identity.d.ts +6 -0
  351. package/dist/domain/project/project-identity.js +1 -0
  352. package/dist/domain/runtime/assistant-delta-normalizer.d.ts +11 -0
  353. package/dist/domain/runtime/assistant-delta-normalizer.js +1 -0
  354. package/dist/domain/runtime/assistant-stream-text.d.ts +11 -0
  355. package/dist/domain/runtime/assistant-stream-text.js +1 -0
  356. package/dist/domain/runtime/gateway-request-budget.d.ts +19 -0
  357. package/dist/domain/runtime/gateway-request-budget.js +1 -0
  358. package/dist/domain/runtime/resource-limits.d.ts +92 -0
  359. package/dist/domain/runtime/resource-limits.js +1 -0
  360. package/dist/domain/session/attachment.d.ts +15 -0
  361. package/dist/domain/session/attachment.js +0 -0
  362. package/dist/domain/session/session-schema.d.ts +6 -0
  363. package/dist/domain/session/session-schema.js +1 -0
  364. package/dist/domain/session/session.d.ts +27 -0
  365. package/dist/domain/session/session.js +0 -0
  366. package/dist/domain/settings/settings-document.d.ts +8 -0
  367. package/dist/domain/settings/settings-document.js +1 -0
  368. package/dist/domain/validation/record-schema.d.ts +4 -0
  369. package/dist/domain/validation/record-schema.js +1 -0
  370. package/dist/domain/workspace/workspace-settings.d.ts +14 -0
  371. package/dist/domain/workspace/workspace-settings.js +1 -0
  372. package/dist/infrastructure/agent-sdk/agent-instance-factory.d.ts +22 -0
  373. package/dist/infrastructure/agent-sdk/agent-instance-factory.js +1 -0
  374. package/dist/infrastructure/agent-sdk/model-response-metrics.d.ts +7 -0
  375. package/dist/infrastructure/agent-sdk/model-response-metrics.js +1 -0
  376. package/dist/infrastructure/agent-sdk/model-tool-name-mapper.d.ts +13 -0
  377. package/dist/infrastructure/agent-sdk/model-tool-name-mapper.js +1 -0
  378. package/dist/infrastructure/agent-sdk/sdk-constants.d.ts +2 -0
  379. package/dist/infrastructure/agent-sdk/sdk-constants.js +1 -0
  380. package/dist/infrastructure/agent-sdk/tool-calling-completion-client.d.ts +4 -0
  381. package/dist/infrastructure/agent-sdk/tool-calling-completion-client.js +1 -0
  382. package/dist/infrastructure/agent-sdk/tool-calling-model-client.d.ts +11 -0
  383. package/dist/infrastructure/agent-sdk/tool-calling-model-client.js +1 -0
  384. package/dist/infrastructure/cache/cache-policy.d.ts +9 -0
  385. package/dist/infrastructure/cache/cache-policy.js +1 -0
  386. package/dist/infrastructure/cache/file-cache-store.d.ts +25 -0
  387. package/dist/infrastructure/cache/file-cache-store.js +2 -0
  388. package/dist/infrastructure/clipboard/clipboard-adapter-factory.d.ts +11 -0
  389. package/dist/infrastructure/clipboard/clipboard-adapter-factory.js +1 -0
  390. package/dist/infrastructure/clipboard/clipboard-constants.d.ts +1 -0
  391. package/dist/infrastructure/clipboard/clipboard-constants.js +1 -0
  392. package/dist/infrastructure/clipboard/clipboard-policy.d.ts +8 -0
  393. package/dist/infrastructure/clipboard/clipboard-policy.js +1 -0
  394. package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.d.ts +10 -0
  395. package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.js +1 -0
  396. package/dist/infrastructure/clipboard/image-normalizer.d.ts +12 -0
  397. package/dist/infrastructure/clipboard/image-normalizer.js +1 -0
  398. package/dist/infrastructure/clipboard/windows-clipboard-adapter.d.ts +7 -0
  399. package/dist/infrastructure/clipboard/windows-clipboard-adapter.js +1 -0
  400. package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.d.ts +7 -0
  401. package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.js +1 -0
  402. package/dist/infrastructure/config/config-loader.d.ts +19 -0
  403. package/dist/infrastructure/config/config-loader.js +2 -0
  404. package/dist/infrastructure/config/environment-values.d.ts +2 -0
  405. package/dist/infrastructure/config/environment-values.js +1 -0
  406. package/dist/infrastructure/credentials/composite-credential-store.d.ts +11 -0
  407. package/dist/infrastructure/credentials/composite-credential-store.js +1 -0
  408. package/dist/infrastructure/credentials/encrypted-file-credential-store.d.ts +17 -0
  409. package/dist/infrastructure/credentials/encrypted-file-credential-store.js +3 -0
  410. package/dist/infrastructure/credentials/environment-credential-store.d.ts +11 -0
  411. package/dist/infrastructure/credentials/environment-credential-store.js +1 -0
  412. package/dist/infrastructure/credentials/secret-input.d.ts +7 -0
  413. package/dist/infrastructure/credentials/secret-input.js +3 -0
  414. package/dist/infrastructure/extensions/composite-mcp-config-store.d.ts +9 -0
  415. package/dist/infrastructure/extensions/composite-mcp-config-store.js +1 -0
  416. package/dist/infrastructure/extensions/extension-directory-reader.d.ts +2 -0
  417. package/dist/infrastructure/extensions/extension-directory-reader.js +1 -0
  418. package/dist/infrastructure/extensions/extension-integrity.d.ts +7 -0
  419. package/dist/infrastructure/extensions/extension-integrity.js +1 -0
  420. package/dist/infrastructure/extensions/extension-source-resolver.d.ts +6 -0
  421. package/dist/infrastructure/extensions/extension-source-resolver.js +1 -0
  422. package/dist/infrastructure/extensions/extensions-constants.d.ts +6 -0
  423. package/dist/infrastructure/extensions/extensions-constants.js +1 -0
  424. package/dist/infrastructure/extensions/file-mcp-config-store.d.ts +15 -0
  425. package/dist/infrastructure/extensions/file-mcp-config-store.js +2 -0
  426. package/dist/infrastructure/extensions/hook-runtime.d.ts +18 -0
  427. package/dist/infrastructure/extensions/hook-runtime.js +1 -0
  428. package/dist/infrastructure/extensions/mcp-runtime.d.ts +58 -0
  429. package/dist/infrastructure/extensions/mcp-runtime.js +1 -0
  430. package/dist/infrastructure/extensions/plugin-agent-discovery.d.ts +4 -0
  431. package/dist/infrastructure/extensions/plugin-agent-discovery.js +1 -0
  432. package/dist/infrastructure/extensions/plugin-discovery.d.ts +5 -0
  433. package/dist/infrastructure/extensions/plugin-discovery.js +1 -0
  434. package/dist/infrastructure/extensions/plugin-manager.d.ts +23 -0
  435. package/dist/infrastructure/extensions/plugin-manager.js +2 -0
  436. package/dist/infrastructure/extensions/skill-discovery.d.ts +4 -0
  437. package/dist/infrastructure/extensions/skill-discovery.js +1 -0
  438. package/dist/infrastructure/extensions/skill-installer.d.ts +9 -0
  439. package/dist/infrastructure/extensions/skill-installer.js +1 -0
  440. package/dist/infrastructure/extensions/skill-manager.d.ts +22 -0
  441. package/dist/infrastructure/extensions/skill-manager.js +2 -0
  442. package/dist/infrastructure/extensions/skill-roots.d.ts +19 -0
  443. package/dist/infrastructure/extensions/skill-roots.js +1 -0
  444. package/dist/infrastructure/extensions/skill-tool-executor.d.ts +20 -0
  445. package/dist/infrastructure/extensions/skill-tool-executor.js +2 -0
  446. package/dist/infrastructure/filesystem/atomic-file-store.d.ts +28 -0
  447. package/dist/infrastructure/filesystem/atomic-file-store.js +1 -0
  448. package/dist/infrastructure/filesystem/bounded-file-reader.d.ts +6 -0
  449. package/dist/infrastructure/filesystem/bounded-file-reader.js +1 -0
  450. package/dist/infrastructure/filesystem/bounded-json-reader.d.ts +1 -0
  451. package/dist/infrastructure/filesystem/bounded-json-reader.js +1 -0
  452. package/dist/infrastructure/filesystem/filesystem-constants.d.ts +8 -0
  453. package/dist/infrastructure/filesystem/filesystem-constants.js +1 -0
  454. package/dist/infrastructure/filesystem/fs-errors.d.ts +2 -0
  455. package/dist/infrastructure/filesystem/fs-errors.js +1 -0
  456. package/dist/infrastructure/filesystem/gateway-media-input-reader.d.ts +12 -0
  457. package/dist/infrastructure/filesystem/gateway-media-input-reader.js +1 -0
  458. package/dist/infrastructure/filesystem/local-filesystem-tool-executor.d.ts +25 -0
  459. package/dist/infrastructure/filesystem/local-filesystem-tool-executor.js +3 -0
  460. package/dist/infrastructure/filesystem/path-resolver.d.ts +20 -0
  461. package/dist/infrastructure/filesystem/path-resolver.js +1 -0
  462. package/dist/infrastructure/filesystem/workspace-media-artifact-store.d.ts +13 -0
  463. package/dist/infrastructure/filesystem/workspace-media-artifact-store.js +1 -0
  464. package/dist/infrastructure/logging/daily-rotating-file-writer.d.ts +26 -0
  465. package/dist/infrastructure/logging/daily-rotating-file-writer.js +2 -0
  466. package/dist/infrastructure/logging/log-redactor.d.ts +2 -0
  467. package/dist/infrastructure/logging/log-redactor.js +1 -0
  468. package/dist/infrastructure/logging/logging-constants.d.ts +3 -0
  469. package/dist/infrastructure/logging/logging-constants.js +1 -0
  470. package/dist/infrastructure/logging/logging-policy.d.ts +6 -0
  471. package/dist/infrastructure/logging/logging-policy.js +1 -0
  472. package/dist/infrastructure/logging/structured-logger.d.ts +24 -0
  473. package/dist/infrastructure/logging/structured-logger.js +4 -0
  474. package/dist/infrastructure/memory/file-memory-store.d.ts +37 -0
  475. package/dist/infrastructure/memory/file-memory-store.js +11 -0
  476. package/dist/infrastructure/network/safe-media-downloader.d.ts +23 -0
  477. package/dist/infrastructure/network/safe-media-downloader.js +1 -0
  478. package/dist/infrastructure/observability/tool-execution-logger.d.ts +11 -0
  479. package/dist/infrastructure/observability/tool-execution-logger.js +1 -0
  480. package/dist/infrastructure/platform/host-platform.d.ts +16 -0
  481. package/dist/infrastructure/platform/host-platform.js +1 -0
  482. package/dist/infrastructure/platform/host-process.d.ts +31 -0
  483. package/dist/infrastructure/platform/host-process.js +1 -0
  484. package/dist/infrastructure/platform/platform-constants.d.ts +4 -0
  485. package/dist/infrastructure/platform/platform-constants.js +1 -0
  486. package/dist/infrastructure/platform/platform-paths.d.ts +25 -0
  487. package/dist/infrastructure/platform/platform-paths.js +1 -0
  488. package/dist/infrastructure/platform/process-identity.d.ts +8 -0
  489. package/dist/infrastructure/platform/process-identity.js +1 -0
  490. package/dist/infrastructure/platform/process-termination.d.ts +4 -0
  491. package/dist/infrastructure/platform/process-termination.js +1 -0
  492. package/dist/infrastructure/platform/read-only-executable.d.ts +4 -0
  493. package/dist/infrastructure/platform/read-only-executable.js +1 -0
  494. package/dist/infrastructure/project/file-project-trust-store.d.ts +12 -0
  495. package/dist/infrastructure/project/file-project-trust-store.js +2 -0
  496. package/dist/infrastructure/sdk/chat-completion-adapter.d.ts +8 -0
  497. package/dist/infrastructure/sdk/chat-completion-adapter.js +1 -0
  498. package/dist/infrastructure/sdk/lotagate-client-factory.d.ts +3 -0
  499. package/dist/infrastructure/sdk/lotagate-client-factory.js +1 -0
  500. package/dist/infrastructure/sdk/model-catalog-adapter.d.ts +19 -0
  501. package/dist/infrastructure/sdk/model-catalog-adapter.js +1 -0
  502. package/dist/infrastructure/sdk/sdk-media-gateway-client.d.ts +24 -0
  503. package/dist/infrastructure/sdk/sdk-media-gateway-client.js +1 -0
  504. package/dist/infrastructure/sessions/file-goal-store.d.ts +21 -0
  505. package/dist/infrastructure/sessions/file-goal-store.js +1 -0
  506. package/dist/infrastructure/sessions/file-session-store.d.ts +50 -0
  507. package/dist/infrastructure/sessions/file-session-store.js +4 -0
  508. package/dist/infrastructure/sessions/project-session-paths.d.ts +17 -0
  509. package/dist/infrastructure/sessions/project-session-paths.js +1 -0
  510. package/dist/infrastructure/sessions/session-constants.d.ts +3 -0
  511. package/dist/infrastructure/sessions/session-constants.js +1 -0
  512. package/dist/infrastructure/sessions/session-index.d.ts +16 -0
  513. package/dist/infrastructure/sessions/session-index.js +3 -0
  514. package/dist/infrastructure/sessions/session-journal-health.d.ts +7 -0
  515. package/dist/infrastructure/sessions/session-journal-health.js +1 -0
  516. package/dist/infrastructure/sessions/session-journal.d.ts +22 -0
  517. package/dist/infrastructure/sessions/session-journal.js +6 -0
  518. package/dist/infrastructure/sessions/subagent-journal-store.d.ts +28 -0
  519. package/dist/infrastructure/sessions/subagent-journal-store.js +2 -0
  520. package/dist/infrastructure/shell/shell-tool-executor.d.ts +21 -0
  521. package/dist/infrastructure/shell/shell-tool-executor.js +2 -0
  522. package/dist/infrastructure/tokens/tiktoken-token-estimator.d.ts +18 -0
  523. package/dist/infrastructure/tokens/tiktoken-token-estimator.js +1 -0
  524. package/dist/infrastructure/tokens/token-constants.d.ts +1 -0
  525. package/dist/infrastructure/tokens/token-constants.js +1 -0
  526. package/dist/infrastructure/workspace/workspace-settings-store.d.ts +10 -0
  527. package/dist/infrastructure/workspace/workspace-settings-store.js +4 -0
  528. package/dist/main.d.ts +7 -0
  529. package/dist/main.js +3 -0
  530. package/dist/ports/cache-store.d.ts +10 -0
  531. package/dist/ports/cache-store.js +0 -0
  532. package/dist/ports/chat-model.d.ts +30 -0
  533. package/dist/ports/chat-model.js +0 -0
  534. package/dist/ports/clipboard-adapter.d.ts +7 -0
  535. package/dist/ports/clipboard-adapter.js +0 -0
  536. package/dist/ports/clipboard-text-adapter.d.ts +3 -0
  537. package/dist/ports/clipboard-text-adapter.js +0 -0
  538. package/dist/ports/credential-store.d.ts +7 -0
  539. package/dist/ports/credential-store.js +0 -0
  540. package/dist/ports/goal-store.d.ts +12 -0
  541. package/dist/ports/goal-store.js +0 -0
  542. package/dist/ports/logger.d.ts +8 -0
  543. package/dist/ports/logger.js +0 -0
  544. package/dist/ports/media-gateway-client.d.ts +60 -0
  545. package/dist/ports/media-gateway-client.js +0 -0
  546. package/dist/ports/memory-store.d.ts +26 -0
  547. package/dist/ports/memory-store.js +0 -0
  548. package/dist/ports/model-completion-client.d.ts +8 -0
  549. package/dist/ports/model-completion-client.js +0 -0
  550. package/dist/ports/model-diagnostics.d.ts +17 -0
  551. package/dist/ports/model-diagnostics.js +0 -0
  552. package/dist/ports/project-trust-store.d.ts +12 -0
  553. package/dist/ports/project-trust-store.js +0 -0
  554. package/dist/ports/session-store.d.ts +59 -0
  555. package/dist/ports/session-store.js +0 -0
  556. package/dist/ports/subagent-lifecycle.d.ts +31 -0
  557. package/dist/ports/subagent-lifecycle.js +0 -0
  558. package/dist/ports/tool-activity.d.ts +13 -0
  559. package/dist/ports/tool-activity.js +0 -0
  560. package/dist/presentation/themes/theme.d.ts +19 -0
  561. package/dist/presentation/themes/theme.js +1 -0
  562. package/dist/presentation/tui/agent-initialization-renderer.d.ts +4 -0
  563. package/dist/presentation/tui/agent-initialization-renderer.js +1 -0
  564. package/dist/presentation/tui/context-display.d.ts +21 -0
  565. package/dist/presentation/tui/context-display.js +2 -0
  566. package/dist/presentation/tui/formatters.d.ts +6 -0
  567. package/dist/presentation/tui/formatters.js +1 -0
  568. package/dist/presentation/tui/ink/choice-window.d.ts +5 -0
  569. package/dist/presentation/tui/ink/choice-window.js +1 -0
  570. package/dist/presentation/tui/ink/components/activity-animation.d.ts +3 -0
  571. package/dist/presentation/tui/ink/components/activity-animation.js +1 -0
  572. package/dist/presentation/tui/ink/components/activity-entry.d.ts +6 -0
  573. package/dist/presentation/tui/ink/components/activity-entry.js +1 -0
  574. package/dist/presentation/tui/ink/components/activity-status.d.ts +10 -0
  575. package/dist/presentation/tui/ink/components/activity-status.js +1 -0
  576. package/dist/presentation/tui/ink/components/choice-modal.d.ts +11 -0
  577. package/dist/presentation/tui/ink/components/choice-modal.js +1 -0
  578. package/dist/presentation/tui/ink/components/composer.d.ts +40 -0
  579. package/dist/presentation/tui/ink/components/composer.js +8 -0
  580. package/dist/presentation/tui/ink/components/file-diff.d.ts +6 -0
  581. package/dist/presentation/tui/ink/components/file-diff.js +1 -0
  582. package/dist/presentation/tui/ink/components/modal.d.ts +8 -0
  583. package/dist/presentation/tui/ink/components/modal.js +2 -0
  584. package/dist/presentation/tui/ink/components/shimmer-text.d.ts +8 -0
  585. package/dist/presentation/tui/ink/components/shimmer-text.js +1 -0
  586. package/dist/presentation/tui/ink/components/subagent-activity.d.ts +11 -0
  587. package/dist/presentation/tui/ink/components/subagent-activity.js +1 -0
  588. package/dist/presentation/tui/ink/components/transcript.d.ts +40 -0
  589. package/dist/presentation/tui/ink/components/transcript.js +5 -0
  590. package/dist/presentation/tui/ink/components/welcome-panel.d.ts +6 -0
  591. package/dist/presentation/tui/ink/components/welcome-panel.js +1 -0
  592. package/dist/presentation/tui/ink/lotagate-tui.d.ts +6 -0
  593. package/dist/presentation/tui/ink/lotagate-tui.js +2 -0
  594. package/dist/presentation/tui/ink/markdown-inline-renderer.d.ts +4 -0
  595. package/dist/presentation/tui/ink/markdown-inline-renderer.js +1 -0
  596. package/dist/presentation/tui/ink/markdown-inline.d.ts +13 -0
  597. package/dist/presentation/tui/ink/markdown-inline.js +1 -0
  598. package/dist/presentation/tui/ink/markdown-message.d.ts +6 -0
  599. package/dist/presentation/tui/ink/markdown-message.js +2 -0
  600. package/dist/presentation/tui/ink/markdown-table.d.ts +16 -0
  601. package/dist/presentation/tui/ink/markdown-table.js +1 -0
  602. package/dist/presentation/tui/ink/tui-bridge.d.ts +193 -0
  603. package/dist/presentation/tui/ink/tui-bridge.js +1 -0
  604. package/dist/presentation/tui/terminal-capabilities.d.ts +15 -0
  605. package/dist/presentation/tui/terminal-capabilities.js +1 -0
  606. package/dist/presentation/tui/terminal-mouse.d.ts +5 -0
  607. package/dist/presentation/tui/terminal-mouse.js +1 -0
  608. package/dist/presentation/tui/terminal-screen.d.ts +10 -0
  609. package/dist/presentation/tui/terminal-screen.js +1 -0
  610. package/dist/presentation/tui/tui-agent-event-runner.d.ts +29 -0
  611. package/dist/presentation/tui/tui-agent-event-runner.js +1 -0
  612. package/dist/presentation/tui/tui-agent-turn-controller.d.ts +45 -0
  613. package/dist/presentation/tui/tui-agent-turn-controller.js +1 -0
  614. package/dist/presentation/tui/tui-application-contract.d.ts +11 -0
  615. package/dist/presentation/tui/tui-application-contract.js +1 -0
  616. package/dist/presentation/tui/tui-application.d.ts +61 -0
  617. package/dist/presentation/tui/tui-application.js +3 -0
  618. package/dist/presentation/tui/tui-clipboard-paste-handlers.d.ts +11 -0
  619. package/dist/presentation/tui/tui-clipboard-paste-handlers.js +1 -0
  620. package/dist/presentation/tui/tui-command-context.d.ts +3 -0
  621. package/dist/presentation/tui/tui-command-context.js +0 -0
  622. package/dist/presentation/tui/tui-command-executor.d.ts +38 -0
  623. package/dist/presentation/tui/tui-command-executor.js +4 -0
  624. package/dist/presentation/tui/tui-command-host-factory.d.ts +40 -0
  625. package/dist/presentation/tui/tui-command-host-factory.js +1 -0
  626. package/dist/presentation/tui/tui-context-compaction.d.ts +8 -0
  627. package/dist/presentation/tui/tui-context-compaction.js +1 -0
  628. package/dist/presentation/tui/tui-context-service.d.ts +2 -0
  629. package/dist/presentation/tui/tui-context-service.js +1 -0
  630. package/dist/presentation/tui/tui-extension-loader.d.ts +21 -0
  631. package/dist/presentation/tui/tui-extension-loader.js +1 -0
  632. package/dist/presentation/tui/tui-file-suggestions.d.ts +3 -0
  633. package/dist/presentation/tui/tui-file-suggestions.js +1 -0
  634. package/dist/presentation/tui/tui-goal-controller.d.ts +14 -0
  635. package/dist/presentation/tui/tui-goal-controller.js +1 -0
  636. package/dist/presentation/tui/tui-initial-model.d.ts +3 -0
  637. package/dist/presentation/tui/tui-initial-model.js +1 -0
  638. package/dist/presentation/tui/tui-lifecycle-actions.d.ts +13 -0
  639. package/dist/presentation/tui/tui-lifecycle-actions.js +1 -0
  640. package/dist/presentation/tui/tui-manual-compaction.d.ts +18 -0
  641. package/dist/presentation/tui/tui-manual-compaction.js +1 -0
  642. package/dist/presentation/tui/tui-media-model-selection.d.ts +12 -0
  643. package/dist/presentation/tui/tui-media-model-selection.js +1 -0
  644. package/dist/presentation/tui/tui-prompt-dispatcher.d.ts +16 -0
  645. package/dist/presentation/tui/tui-prompt-dispatcher.js +1 -0
  646. package/dist/presentation/tui/tui-skill-controller.d.ts +11 -0
  647. package/dist/presentation/tui/tui-skill-controller.js +3 -0
  648. package/dist/presentation/tui/tui-tool-approval.d.ts +22 -0
  649. package/dist/presentation/tui/tui-tool-approval.js +1 -0
  650. package/dist/version.d.ts +1 -0
  651. package/dist/version.js +1 -0
  652. package/native-targets.mjs +1 -1
  653. package/package.json +13 -12
  654. package/scripts/install-native.mjs +5 -13
  655. package/skills/architecture-review/SKILL.md +41 -14
  656. package/skills/code-review/SKILL.md +41 -12
  657. package/skills/debugging/SKILL.md +49 -12
  658. package/skills/documentation/SKILL.md +43 -9
  659. package/skills/feature-implementation/SKILL.md +58 -19
  660. package/bin/lotagate.exe +0 -1
  661. package/skills/api-contract-review/SKILL.md +0 -17
  662. package/skills/database-review/SKILL.md +0 -17
  663. package/skills/dependency-review/SKILL.md +0 -16
  664. package/skills/frontend-review/SKILL.md +0 -18
  665. package/skills/incident-response/SKILL.md +0 -18
  666. package/skills/performance-review/SKILL.md +0 -17
  667. package/skills/refactor/SKILL.md +0 -23
  668. package/skills/release-readiness/SKILL.md +0 -16
  669. package/skills/security-review/SKILL.md +0 -16
  670. package/skills/test-plan/SKILL.md +0 -22
  671. package/skills/verify/SKILL.md +0 -13
@@ -0,0 +1,13 @@
1
+ import type { ChatCompletionChunk, ChatCompletionRequest, ChatCompletionResponse, ToolDefinition } from '@lotagate/sdk';
2
+ export interface ModelToolNameMap {
3
+ toProviderName(name: string): string;
4
+ toInternalName(name: string): string;
5
+ }
6
+ /**
7
+ * Creates a stable, provider-safe alias map while keeping the CLI's canonical
8
+ * names available to executors, policies, and UI events.
9
+ */
10
+ export declare function createModelToolNameMap(tools: readonly ToolDefinition[] | undefined): ModelToolNameMap;
11
+ export declare function mapRequestToolNames<T extends ChatCompletionRequest>(request: T, nameMap: ModelToolNameMap): T;
12
+ export declare function mapResponseToolNames(response: ChatCompletionResponse, nameMap: ModelToolNameMap): ChatCompletionResponse;
13
+ export declare function mapChunkToolNames(chunk: ChatCompletionChunk, nameMap: ModelToolNameMap): ChatCompletionChunk;
@@ -0,0 +1 @@
1
+ import{PROVIDER_TOOL_NAME_MAX_LENGTH as l,PROVIDER_TOOL_NAME_PATTERN as s}from"./sdk-constants.js";function g(n){const t=new Map,e=new Map;for(const o of[...new Set((n??[]).flatMap(c))]){const i=u(o),a=e.get(i);if(a!==void 0&&a!==o)throw new Error(`Tool names "${a}" and "${o}" normalize to the same provider name "${i}".`);t.set(o,i),e.set(i,o)}return{toProviderName:o=>t.get(o)??u(o),toInternalName:o=>e.get(o)??o}}function _(n,t){const e={...n,messages:n.messages.map(o=>!("tool_calls"in o)||o.tool_calls===void 0?o:{...o,tool_calls:o.tool_calls.map(i=>r(i,t.toProviderName))}),...n.tools===void 0?{}:{tools:n.tools.map(o=>d(o,t.toProviderName))}};return n.tool_choice!==void 0&&(e.tool_choice=f(n.tool_choice,t.toProviderName)),n.toolChoice!==void 0&&(e.toolChoice=f(n.toolChoice,t.toProviderName)),n.toolConfig!==void 0&&(e.toolConfig=f(n.toolConfig,t.toProviderName)),e}function N(n,t){return{...n,choices:n.choices.map(e=>({...e,message:e.message.tool_calls===void 0?e.message:{...e.message,tool_calls:e.message.tool_calls.map(o=>r(o,t.toInternalName))}}))}}function C(n,t){return{...n,choices:n.choices.map(e=>({...e,delta:e.delta.tool_calls===void 0?e.delta:{...e.delta,tool_calls:e.delta.tool_calls.map(o=>r(o,t.toInternalName))}}))}}function u(n){const t=n.replace(/[^A-Za-z0-9_-]+/gu,"_");if(t.length<=l&&s.test(t))return t;const e=m(n).slice(0,8);return`${t.slice(0,l-e.length-1)}_${e}`}function m(n){let t=2166136261;for(const e of n)t^=e.codePointAt(0)??0,t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function d(n,t){return"function"in n&&n.function!==void 0?{...n,function:{...n.function,name:t(n.function.name)}}:"functionDeclarations"in n?{...n,functionDeclarations:n.functionDeclarations.map(e=>({...e,name:t(e.name)}))}:"name"in n?{...n,name:t(n.name)}:n}function r(n,t){return{...n,function:{...n.function,name:t(n.function.name)}}}function f(n,t){return typeof n=="string"?n:"function"in n&&n.function!==void 0?{...n,function:{...n.function,name:t(n.function.name)}}:"name"in n&&typeof n.name=="string"?{...n,name:t(n.name)}:"functionCallingConfig"in n&&n.functionCallingConfig.allowedFunctionNames!==void 0?{...n,functionCallingConfig:{...n.functionCallingConfig,allowedFunctionNames:n.functionCallingConfig.allowedFunctionNames.map(t)}}:n}function c(n){return"function"in n&&n.function!==void 0?[n.function.name]:"name"in n&&typeof n.name=="string"?[n.name]:"functionDeclarations"in n?n.functionDeclarations.map(t=>t.name):[]}export{g as createModelToolNameMap,C as mapChunkToolNames,_ as mapRequestToolNames,N as mapResponseToolNames};
@@ -0,0 +1,2 @@
1
+ export declare const PROVIDER_TOOL_NAME_PATTERN: RegExp;
2
+ export declare const PROVIDER_TOOL_NAME_MAX_LENGTH = 64;
@@ -0,0 +1 @@
1
+ const _=/^[A-Za-z0-9_-]+$/u,E=64;export{E as PROVIDER_TOOL_NAME_MAX_LENGTH,_ as PROVIDER_TOOL_NAME_PATTERN};
@@ -0,0 +1,4 @@
1
+ import type { LotaGate } from '@lotagate/sdk';
2
+ import type { ModelCompletionClient } from '../../ports/model-completion-client.js';
3
+ /** Reuses the agent model boundary for non-streaming host-owned completions. */
4
+ export declare function createToolCallingCompletionClient(client: LotaGate): ModelCompletionClient;
@@ -0,0 +1 @@
1
+ import{createToolCallingModelClient as l}from"./tool-calling-model-client.js";function i(e){const n=l(e);return{chat:{completions:{create:async(o,r)=>{const t=await n.chat.completions.create({...o,stream:!1},r);if(a(t))throw new Error("The completion adapter returned a streaming response unexpectedly.");return t}}}}}function a(e){return typeof e=="object"&&e!==null&&Symbol.asyncIterator in e}export{i as createToolCallingCompletionClient};
@@ -0,0 +1,11 @@
1
+ import { type LotaGate } from '@lotagate/sdk';
2
+ import type { LotaGateAgentOptions } from '@lotagate/agent-sdk';
3
+ import type { ModelCallObserver } from '../../ports/model-diagnostics.js';
4
+ type AgentModelClient = LotaGateAgentOptions['modelClient'];
5
+ /**
6
+ * Adapts the published SDK client to the Agent SDK model port and makes the
7
+ * intended tool-calling mode explicit for gateways that do not infer it from
8
+ * the presence of `tools` alone.
9
+ */
10
+ export declare function createToolCallingModelClient(client: LotaGate, diagnostics?: ModelCallObserver): AgentModelClient;
11
+ export {};
@@ -0,0 +1 @@
1
+ import"@lotagate/sdk";import{AssistantDeltaNormalizer as q}from"../../domain/runtime/assistant-delta-normalizer.js";import{createModelToolNameMap as nn,mapChunkToolNames as tn,mapRequestToolNames as U,mapResponseToolNames as N}from"./model-tool-name-mapper.js";import{isRetryableModelResponseError as en,isRetryableToolResultFollowUpError as on,MODEL_RESPONSE_MAX_RETRIES as rn,retryModelStream as sn}from"../../application/model/model-response-retry.js";import{mapUsage as S,textLength as k}from"./model-response-metrics.js";const W=rn;function En(n,t={}){return{chat:{completions:{create:((e,i)=>{const r=nn(e.tools),a=e.tools!==void 0&&e.tools.length>0?1:void 0;if(e.stream===!0){const l=U(v({...e,stream:!0}),r),f=fn(e)?cn(n,l,i,a):sn({create:async()=>await n.chat.completions.create(l,i),isObservable:dn,...i?.signal===void 0?{}:{signal:i.signal}});return ln(n,l,e.tools,i,f,e.model,t,r,a)}const s=U(v({...e,stream:!1}),r);return an(n.chat.completions.create(s,i),e.model,t,r,a)})}}}}async function an(n,t,o,e,i){const r=O(N(b(await n),e),i),a=r.choices[0]?.message;return o.onComplete?.({model:t,stream:!1,contentLength:k(a?.content),toolCallCount:a?.tool_calls?.length??0,toolNames:(a?.tool_calls??[]).map(s=>s.function.name),...r.usage===void 0?{}:{usage:S(r.usage)},...r.choices[0]?.finish_reason===void 0?{}:{finishReason:r.choices[0].finish_reason}}),r}async function*ln(n,t,o,e,i,r,a,s,l){let f=0,c;const d=new Set,h=new Set,_=new mn(o);let z=!1,w,x,R=!1;const Z=new q;try{for await(const C of i){const g=tn(hn(C,Z),s),p=_.consume(g).chunk,y=p.choices[0];p.usage!==void 0&&(w=S(p.usage));const I=k(y?.delta.content);if(f+=I,c=y?.finish_reason??c,I>0&&(z=!0),y?.finish_reason==="tool_calls"&&!R){const J=_.flush(p);if(!z&&D(J)){const M=N(b(await T(n,t,e,l)),s);M.usage!==void 0&&(w=S(M.usage)),G(M,h,d),c=M.choices[0]?.finish_reason??c,yield E(M);return}const L=P(J,l);K(L,h,d),R=!0,yield p,yield L}else yield p;x=p}if(!R&&x!==void 0&&_.hasCalls()){const C=_.flush(x);if(!z&&D(C)){const m=N(b(await T(n,t,e,l)),s);m.usage!==void 0&&(w=S(m.usage)),G(m,h,d),c=m.choices[0]?.finish_reason??c,yield E(m);return}const g=P(C,l);K(g,h,d),R=!0,yield g}}catch(C){if(!z&&!R&&Y(C)&&e?.signal?.aborted!==!0){const g=N(b(await T(n,t,e,l)),s);g.usage!==void 0&&(w=S(g.usage));const m=g.choices[0]?.message,p=k(m?.content);f+=p;for(const y of m?.tool_calls??[])y.id.length>0&&h.add(y.id),y.function.name.length>0&&d.add(y.function.name);c=g.choices[0]?.finish_reason??c,yield E(g);return}throw C}finally{a.onComplete?.({model:r,stream:!0,contentLength:f,toolCallCount:h.size||d.size,toolNames:[...d],...c===void 0?{}:{finishReason:c},...w===void 0?{}:{usage:w}})}}async function T(n,t,o,e,i=!1){const r=v({...t,stream:!1});for(let a=0;;a+=1)try{const s=b(await n.chat.completions.create(r,o));if(a<W&&D(s))continue;return O(s,e)}catch(s){const l=i?on(s):Y(s);if(a>=W||!l||o?.signal?.aborted===!0)throw s}}async function*cn(n,t,o,e){yield E(await T(n,t,o,e,!0))}function v(n){return n.tools===void 0||n.tools.length===0||un(n)?n:{...n,tool_choice:"auto"}}function un(n){return n.tool_choice!==void 0||n.toolChoice!==void 0||n.toolConfig!==void 0}function fn(n){const t=n.messages.at(-1);return t!==void 0&&"role"in t&&t.role==="tool"}function dn(n){return n.choices.some(t=>{const o=t.delta.content,e=t.delta.tool_calls,i=t.delta;return typeof o=="string"&&o.length>0||Array.isArray(o)&&o.length>0||Array.isArray(e)&&e.length>0||typeof i.reasoning_content=="string"&&i.reasoning_content.length>0||u(i.function_call)})}function O(n,t){return t===void 0?n:{...n,choices:n.choices.map(o=>{const e=o.message.tool_calls;return e===void 0||e.length<=t?o:{...o,message:{...o.message,tool_calls:e.slice(0,t)}}})}}function P(n,t){return t===void 0?n:{...n,choices:n.choices.map(o=>{const e=o.delta.tool_calls;return e===void 0||e.length<=t?o:{...o,delta:{...o.delta,tool_calls:e.slice(0,t)}}})}}function E(n){const t=b(n),o=t.choices[0],e=o?.message,i=gn(e);return{id:t.id,object:"chat.completion.chunk",created:t.created,model:t.model,choices:[{index:o?.index??0,delta:{role:"assistant",content:j(e?.content),...i===void 0?{}:{reasoning_content:i},...e?.tool_calls===void 0?{}:{tool_calls:e.tool_calls.map((r,a)=>({...r,index:a}))}},...o?.finish_reason===void 0?{}:{finish_reason:o.finish_reason}}],...t.usage===void 0?{}:{usage:t.usage}}}function gn(n){if(!u(n))return;const t=n.reasoning_content;return typeof t=="string"&&t.length>0?t:void 0}function hn(n,t){return{...n,choices:n.choices.map(o=>{const e=o.delta.content,r=Array.isArray(e)?t.normalize(j(e)):typeof e=="string"?t.normalize(e):e,a=o.delta,s=[...Array.isArray(e)?H(e):[],...Q(a.function_call,0)];return r===e&&s.length===0?o:{...o,delta:{...o.delta,...r===e?{}:{content:r},...s.length===0?{}:{tool_calls:[...o.delta.tool_calls??[],...s]}}}})}}class mn{knownNames;calls=new Map;order=[];keysByPosition=new Map;constructor(t){this.knownNames=new Set((t??[]).flatMap(o=>bn(o)))}consume(t){let o=!1;const e=t.choices.map(i=>{const r=i.delta.tool_calls;if(r===void 0||r.length===0)return i;o=!0,r.forEach((s,l)=>{u(s)&&this.append(s,l)});const a={...i.delta};return delete a.tool_calls,{...i,delta:a}});return{chunk:{...t,choices:e},hadToolCalls:o}}hasCalls(){return this.order.length>0}flush(t){const o=this.order.map((a,s)=>{const l=this.calls.get(a);return{id:l.id||`tool-call-${s}`,type:l.type,function:{name:l.name,arguments:l.arguments},...l.providerMetadata===void 0?{}:{provider_metadata:l.providerMetadata}}}),e=new Set,i=o.filter(a=>{const s=`${a.function.name}\0${a.function.arguments}`;return e.has(s)?!1:(e.add(s),!0)}),r=t.choices.map((a,s)=>s===0?{...a,delta:{...a.delta,tool_calls:i}}:a);return{...t,choices:r}}append(t,o){const e=F(t),i=_n(t),r=B(t),a=X(t),s=A(t),l=pn(t,o),f=this.keysByPosition.get(l)??yn(e,l);this.keysByPosition.set(l,f);const c=this.calls.get(f),d=Cn(c?.name??"",r,this.knownNames),h=An(c?.arguments??"",a);if(c===void 0){this.calls.set(f,{id:e,type:i,name:d,arguments:h,...s===void 0?{}:{providerMetadata:s}}),this.order.push(f);return}const _=c.providerMetadata??s;this.calls.set(f,{id:c.id.length===0&&e.length>0?e:c.id,type:i||c.type,name:c.name+d,arguments:h,..._===void 0?{}:{providerMetadata:_}})}}function A(n){if(!u(n))return;const t=n.provider_metadata??n.providerMetadata;if(u(t))return t;const o=n.thoughtSignature??n.thought_signature;return typeof o=="string"&&o.length>0?{google:{thought_signature:o}}:void 0}function pn(n,t){const o=n.index;return typeof o=="number"&&Number.isInteger(o)?o:t}function yn(n,t){return n.length>0?`id:${n}`:`index:${t}`}function F(n){const t=n;return u(t)&&typeof t.id=="string"?t.id:""}function _n(n){const t=n;return u(t)&&typeof t.type=="string"&&t.type.length>0?t.type:"function"}function B(n){const t=n;return u(t)&&u(t.function)&&typeof t.function.name=="string"?t.function.name:""}function X(n){const t=n;return u(t)&&u(t.function)&&typeof t.function.arguments=="string"?t.function.arguments:""}function Cn(n,t,o){return t.length===0||t===n?"":o!==void 0&&o.has(t)&&t.startsWith(n)||t.startsWith(n)&&n.length>0?t.slice(n.length):t}function An(n,t){if(t.length===0)return n;if(n.length===0||t===n)return n.length===0?t:n;if(t.startsWith(n))return t;const o=wn(n,t);return o!==void 0?o:n+t}function D(n){const t=n.choices[0];return((t!==void 0&&"message"in t?t.message.tool_calls:t?.delta.tool_calls)??[]).some(e=>$(X(e))===void 0)}function wn(n,t){if(n.length===0||t.length===0)return;const o=$(n),e=$(t);if(!(o===void 0||e===void 0))return JSON.stringify({...o,...e})}function $(n){try{const t=JSON.parse(n);return u(t)?t:void 0}catch{return}}function K(n,t,o){for(const e of n.choices[0]?.delta.tool_calls??[]){const i=F(e),r=B(e);i.length>0&&t.add(i),r.length>0&&o.add(r)}}function G(n,t,o){for(const e of n.choices[0]?.message?.tool_calls??[]){const i=F(e),r=B(e);i.length>0&&t.add(i),r.length>0&&o.add(r)}}function bn(n){return"function"in n&&typeof n.function.name=="string"?[n.function.name]:"name"in n&&typeof n.name=="string"?[n.name]:"functionDeclarations"in n?n.functionDeclarations.flatMap(t=>typeof t.name=="string"?[t.name]:[]):[]}function b(n){return{...n,choices:n.choices.map(t=>({...t,message:Rn(t.message)}))}}function Rn(n){const t=n,o=[...Array.isArray(n.content)?H(n.content):[],...Q(t.function_call,0)],e=Array.isArray(n.content)?j(n.content):typeof n.content=="string"?n.content:void 0,i=e??null,r=Array.isArray(n.content)||typeof n.content=="string"&&e!==n.content;return!r&&o.length===0?n:{...n,...r?{content:i}:{},...o.length===0?{}:{tool_calls:[...n.tool_calls??[],...o]}}}function H(n){const t=[];for(const[o,e]of n.entries())if(!(typeof e!="object"||e===null)){if("functionCall"in e&&u(e.functionCall)&&typeof e.functionCall.name=="string"){const i=e.functionCall.args;t.push({id:typeof e.functionCall.id=="string"&&e.functionCall.id.length>0?e.functionCall.id:`provider-call-${o}`,type:"function",function:{name:e.functionCall.name,arguments:V(i)},...A(e)===void 0?{}:{provider_metadata:A(e)}});continue}if("tool_use"in e&&u(e.tool_use)&&typeof e.tool_use.name=="string"){const i=e.tool_use.input;t.push({id:typeof e.tool_use.id=="string"&&e.tool_use.id.length>0?e.tool_use.id:`provider-call-${o}`,type:"function",function:{name:e.tool_use.name,arguments:JSON.stringify(i??{})},...A(e)===void 0?{}:{provider_metadata:A(e)}})}}return t}function Q(n,t){if(!u(n)||typeof n.name!="string")return[];const o=n.arguments;return[{id:typeof n.id=="string"&&n.id.length>0?n.id:`provider-call-${t}`,type:"function",function:{name:n.name,arguments:V(o)},...A(n)===void 0?{}:{provider_metadata:A(n)}}]}function V(n){if(n===void 0)return"";if(typeof n=="string")return n;try{return JSON.stringify(n)}catch{return""}}function u(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Y(n){return en(n)}function j(n){return typeof n=="string"?n:Array.isArray(n)?n.reduce((t,o)=>{if(typeof o!="object"||o===null||!("text"in o))return t;const e=o.text;return t+(typeof e=="string"?e:"")},""):""}export{En as createToolCallingModelClient};
@@ -0,0 +1,9 @@
1
+ export interface CachePolicy {
2
+ enabled: boolean;
3
+ modelCatalogTtlMs: number;
4
+ maxEntryBytes: number;
5
+ maxTotalBytes: number;
6
+ maxMemoryEntries: number;
7
+ maxMemoryBytes: number;
8
+ }
9
+ export declare function resolveCachePolicy(env?: Readonly<Record<string, string | undefined>>): CachePolicy;
@@ -0,0 +1 @@
1
+ function _(e=process.env){return{enabled:t(e.LOTAGATE_CACHE_ENABLED,!0),modelCatalogTtlMs:r(e.LOTAGATE_MODEL_CACHE_TTL_SECONDS,300,1,86400)*1e3,maxEntryBytes:r(e.LOTAGATE_CACHE_MAX_ENTRY_BYTES,5*1024*1024,1024,50*1024*1024),maxTotalBytes:r(e.LOTAGATE_CACHE_MAX_BYTES,50*1024*1024,1*1024*1024,500*1024*1024),maxMemoryEntries:r(e.LOTAGATE_CACHE_MAX_MEMORY_ENTRIES,64,1,1e4),maxMemoryBytes:r(e.LOTAGATE_CACHE_MAX_MEMORY_BYTES,8*1024*1024,1*1024*1024,500*1024*1024)}}function t(e,E){return e===void 0?E:e.trim().toLowerCase()==="true"?!0:e.trim().toLowerCase()==="false"?!1:E}import{readBoundedEnvironmentInteger as r}from"../config/environment-values.js";export{_ as resolveCachePolicy};
@@ -0,0 +1,25 @@
1
+ import type { CacheStore, CacheWriteOptions } from '../../ports/cache-store.js';
2
+ import type { CachePolicy } from './cache-policy.js';
3
+ export declare class FileCacheStore implements CacheStore {
4
+ private readonly root;
5
+ private readonly policy;
6
+ private readonly now;
7
+ private prunePromise;
8
+ private readonly memoryCache;
9
+ private memoryBytes;
10
+ private lastPruneAt;
11
+ constructor(root: string, policy: CachePolicy, now?: () => number);
12
+ get<T>(namespace: string, key: string): Promise<T | undefined>;
13
+ set<T>(namespace: string, key: string, value: T, options: CacheWriteOptions): Promise<void>;
14
+ delete(namespace: string, key: string): Promise<void>;
15
+ clear(namespace?: string): Promise<void>;
16
+ prune(): Promise<void>;
17
+ private schedulePrune;
18
+ private namespacePath;
19
+ private filePath;
20
+ private setMemoryEntry;
21
+ private removeMemoryEntry;
22
+ private touchMemoryEntry;
23
+ private clearMemory;
24
+ private pruneMemory;
25
+ }
@@ -0,0 +1,2 @@
1
+ import p from"node:crypto";import w from"node:fs";import h from"node:fs/promises";import y from"node:path";import{atomicWriteFile as M,withFileLock as E}from"../filesystem/atomic-file-store.js";import{isFileNotFound as u}from"../filesystem/fs-errors.js";import{readJsonFileBounded as l}from"../filesystem/bounded-json-reader.js";const P=600*1e3;class F{root;policy;now;prunePromise;memoryCache=new Map;memoryBytes=0;lastPruneAt=0;constructor(e,t,r=Date.now){this.root=e,this.policy=t,this.now=r;try{w.mkdirSync(e,{recursive:!0,mode:448})}catch{}}async get(e,t){if(!this.policy.enabled)return;const r=`${e}\0${t}`,i=this.memoryCache.get(r);if(i!==void 0){if(i.expiresAtMs>this.now())return this.touchMemoryEntry(r,i),i.value;this.removeMemoryEntry(r)}const o=this.filePath(e,t);try{const s=await l(o,this.policy.maxEntryBytes);if(s.schemaVersion!==1||s.namespace!==e||s.keyHash!==m(e,t)||typeof s.expiresAt!="string")return;const a=Date.parse(s.expiresAt);if(a<=this.now()){await this.delete(e,t);return}return this.setMemoryEntry(r,a,s.value),s.value}catch(s){u(s)||await this.delete(e,t).catch(()=>{});return}}async set(e,t,r,i){if(!this.policy.enabled||i.ttlMs<=0)return;const o=this.now()+i.ttlMs,s=`${e}\0${t}`,a={schemaVersion:1,namespace:e,keyHash:m(e,t),createdAt:new Date(this.now()).toISOString(),expiresAt:new Date(o).toISOString(),value:r},c=`${JSON.stringify(a)}
2
+ `;if(Buffer.byteLength(c,"utf8")>this.policy.maxEntryBytes)return;const f=this.filePath(e,t);await E(f,()=>M(f,c)),this.setMemoryEntry(s,o,r),this.schedulePrune()}async delete(e,t){this.removeMemoryEntry(`${e}\0${t}`),await h.rm(this.filePath(e,t),{force:!0})}async clear(e){if(e===void 0)this.clearMemory();else{const t=`${e}\0`;for(const r of[...this.memoryCache.keys()])r.startsWith(t)&&this.removeMemoryEntry(r)}await h.rm(e===void 0?this.root:this.namespacePath(e),{recursive:!0,force:!0})}async prune(){if(!this.policy.enabled)return;this.pruneMemory();const e=await d(this.root),t=[];for(const i of e)try{const o=await h.stat(i),s=await l(i,this.policy.maxEntryBytes);if(s.schemaVersion!==1||typeof s.expiresAt!="string"||Date.parse(s.expiresAt)<=this.now()){await h.rm(i,{force:!0});continue}t.push({filePath:i,size:o.size,modifiedAt:o.mtimeMs})}catch{await h.rm(i,{force:!0})}let r=t.reduce((i,o)=>i+o.size,0);for(const i of t.sort((o,s)=>o.modifiedAt-s.modifiedAt)){if(r<=this.policy.maxTotalBytes)break;await h.rm(i.filePath,{force:!0}),r-=i.size}this.pruneMemory()}schedulePrune(){this.prunePromise===void 0&&(this.now()-this.lastPruneAt<P||(this.lastPruneAt=this.now(),this.prunePromise=this.prune().catch(()=>{}).finally(()=>{this.prunePromise=void 0})))}namespacePath(e){return y.join(this.root,x(e))}filePath(e,t){return y.join(this.namespacePath(e),`${m(e,t)}.json`)}setMemoryEntry(e,t,r){const i=A(r);this.removeMemoryEntry(e),!(i>this.policy.maxMemoryBytes)&&(this.memoryCache.set(e,{expiresAtMs:t,value:r,sizeBytes:i}),this.memoryBytes+=i,this.pruneMemory())}removeMemoryEntry(e){const t=this.memoryCache.get(e);t!==void 0&&(this.memoryCache.delete(e),this.memoryBytes-=t.sizeBytes)}touchMemoryEntry(e,t){this.memoryCache.delete(e),this.memoryCache.set(e,t)}clearMemory(){this.memoryCache.clear(),this.memoryBytes=0}pruneMemory(){const e=this.now();for(const[t,r]of[...this.memoryCache])r.expiresAtMs<=e&&this.removeMemoryEntry(t);for(;this.memoryCache.size>this.policy.maxMemoryEntries||this.memoryBytes>this.policy.maxMemoryBytes;){const t=this.memoryCache.keys().next().value;if(typeof t!="string")break;this.removeMemoryEntry(t)}}}function m(n,e){return p.createHash("sha256").update(`${n}\0${e}`).digest("hex")}function x(n){return Buffer.from(n,"utf8").toString("base64url")}function A(n){try{const e=JSON.stringify(n);return Buffer.byteLength(e??"","utf8")}catch{return Number.MAX_SAFE_INTEGER}}async function d(n){try{const e=await h.readdir(n,{withFileTypes:!0}),t=[];for(const r of e){const i=y.join(n,r.name);r.isDirectory()?t.push(...await d(i)):r.isFile()&&r.name.endsWith(".json")&&t.push(i)}return t}catch(e){if(u(e))return[];throw e}}export{F as FileCacheStore};
@@ -0,0 +1,11 @@
1
+ import type { ClipboardAdapter, ClipboardImage } from '../../ports/clipboard-adapter.js';
2
+ import { type HostPlatformContext } from '../platform/host-platform.js';
3
+ export declare function createClipboardAdapter(platform?: HostPlatformContext): ClipboardAdapter;
4
+ export declare class ProcessClipboardAdapter implements ClipboardAdapter {
5
+ private readonly command;
6
+ private readonly args;
7
+ private readonly mimeType;
8
+ private readonly platform;
9
+ constructor(command: string, args: readonly string[], mimeType: string, platform?: HostPlatformContext);
10
+ readImage(): Promise<ClipboardImage | undefined>;
11
+ }
@@ -0,0 +1 @@
1
+ import{CliError as f}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as b}from"../../domain/errors/error-codes.js";import{WindowsClipboardAdapter as h}from"./windows-clipboard-adapter.js";import{detectHostPlatform as c}from"../platform/host-platform.js";import{spawnPlatformProcess as w}from"../platform/host-process.js";import{CLIPBOARD_POLICY as d,clipboardUnavailableError as m,isClipboardUnavailableError as C}from"./clipboard-policy.js";function O(r=c()){return r.id==="windows"?new h(r):r.id==="macos"?new u([new p("pbpaste",["-Prefer","png"],"image/png",r)]):r.id==="linux"||r.id==="bsd"?new u([new p("wl-paste",["--no-newline","--type","image/png"],"image/png",r),new p("xclip",["-selection","clipboard","-target","image/png","-out"],"image/png",r)]):new y}class p{command;args;mimeType;platform;constructor(t,i,e,o=c()){this.command=t,this.args=i,this.mimeType=e,this.platform=o}async readImage(){return new Promise((t,i)=>{const e=w(this.command,this.args,this.platform,{stdio:["ignore","pipe","pipe"]}),o=[];let l=0,n=!1;const s=a=>{n||(n=!0,clearTimeout(g),a())},g=setTimeout(()=>{e.kill(),s(()=>i(m(`Clipboard image read timed out after ${d.timeoutMs}ms.`)))},d.timeoutMs);e.stdout?.on("data",a=>{if(!n){if(l+=a.byteLength,l>d.maxImageBytes){e.kill(),s(()=>i(new f(b.ATTACHMENT_TOO_LARGE,"Clipboard image is too large.",{category:"attachment",userMessage:"Clipboard image exceeds the maximum allowed size."})));return}o.push(a)}}),e.once("error",()=>s(()=>t(void 0))),e.once("close",a=>{s(()=>{a!==0||o.length===0?t(void 0):t({bytes:Buffer.concat(o),mimeType:this.mimeType})})})})}}class u{adapters;constructor(t){this.adapters=t}async readImage(){let t;for(const i of this.adapters)try{const e=await i.readImage();if(e!==void 0)return e}catch(e){if(!C(e))throw e;t=e}throw t??m("No supported clipboard image provider was found.")}}class y{async readImage(){throw m("Clipboard image support is unavailable on this platform.")}}export{p as ProcessClipboardAdapter,O as createClipboardAdapter};
@@ -0,0 +1 @@
1
+ export declare const IMAGE_MIME_SIGNATURES: Map<string, string>;
@@ -0,0 +1 @@
1
+ const a=new Map([["89504e470d0a1a0a","image/png"],["ffd8ff","image/jpeg"],["47494638","image/gif"],["424d","image/bmp"]]);export{a as IMAGE_MIME_SIGNATURES};
@@ -0,0 +1,8 @@
1
+ import { CliError } from '../../domain/errors/cli-error.js';
2
+ export declare const CLIPBOARD_POLICY: {
3
+ readonly maxImageBytes: number;
4
+ readonly maxTextBytes: number;
5
+ readonly timeoutMs: 15000;
6
+ };
7
+ export declare function clipboardUnavailableError(message: string, cause?: unknown): CliError;
8
+ export declare function isClipboardUnavailableError(error: unknown): error is CliError;
@@ -0,0 +1 @@
1
+ import{CliError as o}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as a}from"../../domain/errors/error-codes.js";import{RESOURCE_LIMITS as e}from"../../domain/runtime/resource-limits.js";const A={maxImageBytes:e.maxAttachmentBytes,maxTextBytes:e.clipboardTextBytes,timeoutMs:e.clipboardTimeoutMs};function c(t,r){return new o(a.ATTACHMENT_CLIPBOARD_UNAVAILABLE,t,{category:"attachment",userMessage:"Unable to read from the clipboard. Copy the content again and retry.",retryable:!0,...r===void 0?{}:{cause:r}})}function l(t){return t instanceof o&&t.code===a.ATTACHMENT_CLIPBOARD_UNAVAILABLE}export{A as CLIPBOARD_POLICY,c as clipboardUnavailableError,l as isClipboardUnavailableError};
@@ -0,0 +1,10 @@
1
+ import type { ClipboardTextAdapter } from '../../ports/clipboard-text-adapter.js';
2
+ import { type HostPlatformContext } from '../platform/host-platform.js';
3
+ export declare function createClipboardTextAdapter(platform?: HostPlatformContext): ClipboardTextAdapter;
4
+ export declare class ProcessClipboardTextAdapter implements ClipboardTextAdapter {
5
+ private readonly command;
6
+ private readonly args;
7
+ private readonly platform;
8
+ constructor(command: string, args: readonly string[], platform?: HostPlatformContext);
9
+ readText(): Promise<string | undefined>;
10
+ }
@@ -0,0 +1 @@
1
+ import{CliError as f}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as x}from"../../domain/errors/error-codes.js";import{WindowsClipboardTextAdapter as b}from"./windows-clipboard-text-adapter.js";import{detectHostPlatform as u}from"../platform/host-platform.js";import{spawnPlatformProcess as h}from"../platform/host-process.js";import{CLIPBOARD_POLICY as d,clipboardUnavailableError as l,isClipboardUnavailableError as w}from"./clipboard-policy.js";function L(e=u()){return e.id==="windows"?new b(e):e.id==="macos"?new p("pbpaste",[],e):e.id==="linux"||e.id==="bsd"?new C([new p("wl-paste",["--no-newline"],e),new p("xclip",["-selection","clipboard","-out"],e)]):new T}class p{command;args;platform;constructor(r,o,t=u()){this.command=r,this.args=o,this.platform=t}async readText(){return new Promise((r,o)=>{const t=h(this.command,this.args,this.platform,{stdio:["ignore","pipe","pipe"]}),s=[];let c=0,n=!1;const a=i=>{n||(n=!0,clearTimeout(m),i())},m=setTimeout(()=>{t.kill(),a(()=>o(l(`Clipboard text read timed out after ${d.timeoutMs}ms.`)))},d.timeoutMs);t.stdout?.on("data",i=>{if(!n){if(c+=i.byteLength,c>d.maxTextBytes){t.kill(),a(()=>o(new f(x.ATTACHMENT_TOO_LARGE,"Clipboard text is too large.",{category:"attachment",userMessage:"Clipboard text exceeds the maximum allowed size."})));return}s.push(i)}}),t.once("error",()=>a(()=>r(void 0))),t.once("close",i=>a(()=>{i!==0||s.length===0?r(void 0):r(Buffer.concat(s).toString("utf8"))}))})}}class C{adapters;constructor(r){this.adapters=r}async readText(){let r;for(const o of this.adapters)try{const t=await o.readText();if(t!==void 0)return t}catch(t){if(!w(t))throw t;r=t}throw r??l("No supported clipboard text provider was found.")}}class T{async readText(){throw l("Clipboard text support is unavailable on this platform.")}}export{p as ProcessClipboardTextAdapter,L as createClipboardTextAdapter};
@@ -0,0 +1,12 @@
1
+ import type { Attachment, AttachmentPayload, AttachmentSource } from '../../domain/session/attachment.js';
2
+ import type { TextFileContentPart, TextImageContentPart, TextMessage } from '@lotagate/sdk';
3
+ export declare const DEFAULT_MAX_IMAGE_BYTES: number;
4
+ export interface NormalizedImage {
5
+ bytes: Buffer;
6
+ mimeType: string;
7
+ }
8
+ export declare function normalizeImage(bytes: Uint8Array, declaredMimeType?: string, maxBytes?: number): NormalizedImage;
9
+ export declare function createImageAttachment(image: NormalizedImage, source: AttachmentSource, id: string, storagePath?: string): Attachment;
10
+ export declare function toImageContentPart(payload: AttachmentPayload): TextImageContentPart;
11
+ export declare function toAttachmentContentPart(payload: AttachmentPayload): TextImageContentPart | TextFileContentPart;
12
+ export declare function buildUserMessage(prompt: string, attachments?: readonly AttachmentPayload[]): TextMessage;
@@ -0,0 +1 @@
1
+ import{CliError as a}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as o}from"../../domain/errors/error-codes.js";import{RESOURCE_LIMITS as m}from"../../domain/runtime/resource-limits.js";import{IMAGE_MIME_SIGNATURES as s}from"./clipboard-constants.js";const c=m.maxAttachmentBytes,f=s;function E(t,e,n=c){if(t.byteLength===0||t.byteLength>n)throw new a(o.ATTACHMENT_TOO_LARGE,"Image size is outside the allowed range.",{category:"attachment",userMessage:`Image size must be between 1 byte and ${n} bytes.`});const r=h(t),i=r??e;if(i===void 0||!i.startsWith("image/"))throw new a(o.ATTACHMENT_FORMAT_UNSUPPORTED,"Clipboard content is not a supported image.",{category:"attachment",userMessage:"The clipboard does not contain a supported image format."});if(r!==void 0&&e!==void 0&&e!==r)throw new a(o.ATTACHMENT_INVALID_IMAGE,"Declared image type does not match its bytes.",{category:"attachment",userMessage:"The image format does not match its actual content."});return{bytes:Buffer.from(t),mimeType:i}}function _(t,e,n,r){const i=n.trim();if(i.length===0)throw new a(o.ATTACHMENT_INVALID_IMAGE,"Attachment id is required.",{category:"attachment"});return{id:i,name:i,mimeType:t.mimeType,sizeBytes:t.bytes.byteLength,source:e,...r===void 0?{}:{storagePath:r}}}function u(t){const e=Buffer.from(t.bytes).toString("base64");return{type:"image_url",image_url:{url:`data:${t.attachment.mimeType};base64,${e}`,detail:"auto"}}}function g(t){if(t.attachment.mimeType.startsWith("image/"))return u(t);const e=Buffer.from(t.bytes).toString("base64");return{type:"input_file",file_data:`data:${t.attachment.mimeType};base64,${e}`,filename:t.attachment.name,media_type:t.attachment.mimeType}}function I(t,e=[]){return e.length===0?{role:"user",content:t}:{role:"user",content:[{type:"text",text:t},...e.map(g)]}}function h(t){const e=[...t.slice(0,8)].map(n=>n.toString(16).padStart(2,"0")).join("");for(const[n,r]of f)if(e.startsWith(n))return r;if(t.length>=12&&Buffer.from(t.slice(0,12)).toString("ascii",0,4)==="RIFF"&&Buffer.from(t.slice(8,12)).toString("ascii")==="WEBP")return"image/webp"}export{c as DEFAULT_MAX_IMAGE_BYTES,I as buildUserMessage,_ as createImageAttachment,E as normalizeImage,g as toAttachmentContentPart,u as toImageContentPart};
@@ -0,0 +1,7 @@
1
+ import type { ClipboardAdapter, ClipboardImage } from '../../ports/clipboard-adapter.js';
2
+ import { type HostPlatformContext } from '../platform/host-platform.js';
3
+ export declare class WindowsClipboardAdapter implements ClipboardAdapter {
4
+ private readonly platform;
5
+ constructor(platform?: HostPlatformContext);
6
+ readImage(): Promise<ClipboardImage | undefined>;
7
+ }
@@ -0,0 +1 @@
1
+ import g from"node:crypto";import u from"node:fs/promises";import h from"node:os";import w from"node:path";import{CliError as l}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as T}from"../../domain/errors/error-codes.js";import{DEFAULT_MAX_IMAGE_BYTES as P}from"./image-normalizer.js";import{readFileBounded as A}from"../filesystem/bounded-file-reader.js";import{detectHostPlatform as b}from"../platform/host-platform.js";import{spawnPlatformProcess as C}from"../platform/host-process.js";import{CLIPBOARD_POLICY as c,clipboardUnavailableError as m}from"./clipboard-policy.js";class B{platform;constructor(o=b()){this.platform=o}async readImage(){if(!this.platform.isWindows)throw m("Windows clipboard image adapter cannot run on this platform.");const o=w.join(h.tmpdir(),`lotagate-clipboard-${process.pid}-${g.randomUUID()}.png`);try{await E(o,this.platform);const r=await A(o,P);if(r.truncated)throw new l(T.ATTACHMENT_TOO_LARGE,"Clipboard image exceeds the configured size limit.",{category:"attachment",userMessage:"The clipboard image is too large to attach."});return{bytes:r.bytes,mimeType:"image/png"}}catch(r){throw r instanceof l?r:m("Unable to read an image from the clipboard.",r)}finally{await u.rm(o,{force:!0})}}}function E(n,o){const r="$ErrorActionPreference='Stop'; $image=Get-Clipboard -Format Image; if ($null -eq $image) { exit 3 }; $image.Save($env:LOTAGATE_CLIPBOARD_OUTPUT, [System.Drawing.Imaging.ImageFormat]::Png)";return new Promise((f,i)=>{const e=C("powershell.exe",["-NoProfile","-NonInteractive","-Command",r],o,{env:{...process.env,LOTAGATE_CLIPBOARD_OUTPUT:n},stdio:["ignore","ignore","pipe"]}),s=[];let p=!1;const a=t=>{p||(p=!0,clearTimeout(d),t())},d=setTimeout(()=>{e.kill(),a(()=>i(m(`Clipboard image read timed out after ${c.timeoutMs}ms.`)))},c.timeoutMs);e.stderr?.on("data",t=>s.push(t)),e.once("error",t=>a(()=>i(t))),e.once("close",t=>a(()=>t===0?f():i(new Error(Buffer.concat(s).toString("utf8").trim()||`PowerShell exited with code ${String(t)}.`))))})}export{B as WindowsClipboardAdapter};
@@ -0,0 +1,7 @@
1
+ import type { ClipboardTextAdapter } from '../../ports/clipboard-text-adapter.js';
2
+ import { type HostPlatformContext } from '../platform/host-platform.js';
3
+ export declare class WindowsClipboardTextAdapter implements ClipboardTextAdapter {
4
+ private readonly platform;
5
+ constructor(platform?: HostPlatformContext);
6
+ readText(): Promise<string | undefined>;
7
+ }
@@ -0,0 +1 @@
1
+ import{CliError as p}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as h}from"../../domain/errors/error-codes.js";import{detectHostPlatform as x}from"../platform/host-platform.js";import{spawnPlatformProcess as w}from"../platform/host-process.js";import{CLIPBOARD_POLICY as a,clipboardUnavailableError as s}from"./clipboard-policy.js";class O{platform;constructor(e=x()){this.platform=e}async readText(){if(!this.platform.isWindows)throw s("Windows clipboard text adapter cannot run on this platform.");try{return await C(this.platform)}catch(e){throw e instanceof p?e:s("Unable to read text from the clipboard.",e)}}}function C(l){const e="$ErrorActionPreference='Stop'; [Console]::OutputEncoding = [System.Text.Encoding]::UTF8; $text=Get-Clipboard -Raw; if ($null -eq $text) { exit 3 }; [Console]::Out.Write($text)";return new Promise((f,o)=>{const r=w("powershell.exe",["-NoProfile","-NonInteractive","-Command",e],l,{stdio:["ignore","pipe","pipe"]}),m=[];let c=0,n=!1;const i=t=>{n||(n=!0,clearTimeout(u),t())},u=setTimeout(()=>{r.kill(),i(()=>o(s(`Clipboard text read timed out after ${a.timeoutMs}ms.`)))},a.timeoutMs);r.stdout?.on("data",t=>{if(!n){if(c+=t.byteLength,c>a.maxTextBytes){r.kill(),i(()=>o(new p(h.ATTACHMENT_TOO_LARGE,"Clipboard text is too large.",{category:"attachment",userMessage:"Clipboard text exceeds the maximum allowed size."})));return}m.push(t)}});const d=[];r.stderr?.on("data",t=>d.push(t)),r.once("error",t=>i(()=>o(t))),r.once("close",t=>i(()=>{t===3?f(void 0):t!==0?o(new Error(Buffer.concat(d).toString("utf8").trim()||`PowerShell exited with code ${String(t)}.`)):f(Buffer.concat(m).toString("utf8"))}))})}export{O as WindowsClipboardTextAdapter};
@@ -0,0 +1,19 @@
1
+ import { type CliConfig, type ConfigurableKey } from '../../domain/config/config-schema.js';
2
+ import type { Logger } from '../../ports/logger.js';
3
+ import { type PlatformPaths } from '../platform/platform-paths.js';
4
+ export interface ConfigLoadResult {
5
+ config: CliConfig;
6
+ sources: readonly string[];
7
+ }
8
+ export declare class ConfigLoader {
9
+ private readonly logger;
10
+ private readonly paths;
11
+ constructor(logger: Logger, paths?: PlatformPaths);
12
+ get platformPaths(): PlatformPaths;
13
+ load(cwd: string, options?: {
14
+ includeProject?: boolean;
15
+ }): Promise<ConfigLoadResult>;
16
+ setGlobal(key: ConfigurableKey, value: unknown): Promise<void>;
17
+ private readOptional;
18
+ private readDocumentOptional;
19
+ }
@@ -0,0 +1,2 @@
1
+ import{CliError as n}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as s}from"../../domain/errors/error-codes.js";import{DEFAULT_CONFIG as g,mergeConfig as h}from"../../domain/config/config-schema.js";import{resolvePlatformPaths as m,resolveProjectConfigPaths as c}from"../platform/platform-paths.js";import{atomicWriteFile as p,withFileLock as d}from"../filesystem/atomic-file-store.js";import{isFileNotFound as u}from"../filesystem/fs-errors.js";import{readJsonFileBounded as O}from"../filesystem/bounded-json-reader.js";import{RESOURCE_LIMITS as F}from"../../domain/runtime/resource-limits.js";import{validateSettingsDocument as l}from"../../domain/settings/settings-document.js";class L{logger;paths;constructor(o,t=m()){this.logger=o,this.paths=t}get platformPaths(){return this.paths}async load(o,t={}){const i=[],e=[],f=t.includeProject===!1?[this.paths.globalConfigFile]:[this.paths.globalConfigFile,c(o).settings,c(o).localSettings];for(const a of f){const r=await this.readOptional(a);r!==void 0&&(i.push(r),e.push(a))}return{config:h(g,...i),sources:e}}async setGlobal(o,t){await d(this.paths.globalConfigFile,async()=>{const i=await this.readDocumentOptional(this.paths.globalConfigFile),e={...i?.config??{},...i?.permissions===void 0?{}:{permissions:i.permissions},[o]:t,schemaVersion:1};l(e),await p(this.paths.globalConfigFile,`${JSON.stringify(e,null,2)}
2
+ `)}),this.logger.info("Global configuration updated.",{key:o})}async readOptional(o){return(await this.readDocumentOptional(o))?.config}async readDocumentOptional(o){try{try{return l(await O(o,F.configFileBytes))}catch(t){if(u(t))return;throw t instanceof n?t:new n(s.CONFIG_INVALID_JSON,`Invalid JSON in ${o}.`,{category:"config",userMessage:`Unable to parse JSON in ${o}.`,cause:t})}}catch(t){throw t instanceof n?t:new n(s.CONFIG_NOT_FOUND,`Unable to read config ${o}.`,{category:"config",userMessage:`Unable to read configuration file ${o}.`,cause:t})}}}export{L as ConfigLoader};
@@ -0,0 +1,2 @@
1
+ /** Reads an integer environment value without allowing invalid settings to disable a safe default. */
2
+ export declare function readBoundedEnvironmentInteger(value: string | undefined, fallback: number, minimum: number, maximum: number): number;
@@ -0,0 +1 @@
1
+ function u(n,r,t,d){if(n===void 0)return r;const e=Number(n);return Number.isSafeInteger(e)&&e>=t&&e<=d?e:r}export{u as readBoundedEnvironmentInteger};
@@ -0,0 +1,11 @@
1
+ import type { AuthProfile, StoredCredential } from '../../domain/auth/auth-profile.js';
2
+ import type { CredentialStore } from '../../ports/credential-store.js';
3
+ export declare class CompositeCredentialStore implements CredentialStore {
4
+ private readonly stores;
5
+ private readonly writableStore;
6
+ constructor(stores: readonly CredentialStore[], writableStore: CredentialStore);
7
+ list(): Promise<readonly AuthProfile[]>;
8
+ get(profileName: string): Promise<StoredCredential | undefined>;
9
+ set(credential: StoredCredential): Promise<void>;
10
+ delete(profileName: string): Promise<boolean>;
11
+ }
@@ -0,0 +1 @@
1
+ class r{stores;writableStore;constructor(t,e){this.stores=t,this.writableStore=e}async list(){const t=new Map;for(const e of this.stores)for(const s of await e.list())t.set(s.name,s);return[...t.values()].sort((e,s)=>e.name.localeCompare(s.name))}async get(t){for(const e of this.stores){const s=await e.get(t);if(s!==void 0)return s}}async set(t){await this.writableStore.set(t)}async delete(t){let e=!1;for(const s of this.stores)e=await s.delete(t)||e;return e}}export{r as CompositeCredentialStore};
@@ -0,0 +1,17 @@
1
+ import { type AuthProfile, type StoredCredential } from '../../domain/auth/auth-profile.js';
2
+ import type { CredentialStore } from '../../ports/credential-store.js';
3
+ import type { PlatformPaths } from '../platform/platform-paths.js';
4
+ export declare class EncryptedFileCredentialStore implements CredentialStore {
5
+ private readonly paths;
6
+ private readonly secret;
7
+ constructor(paths: PlatformPaths, secret?: string | undefined);
8
+ list(): Promise<readonly AuthProfile[]>;
9
+ get(profileName: string): Promise<StoredCredential | undefined>;
10
+ set(credential: StoredCredential): Promise<void>;
11
+ delete(profileName: string): Promise<boolean>;
12
+ private readPayload;
13
+ private writePayload;
14
+ private readFile;
15
+ private deriveKey;
16
+ private resolveSecret;
17
+ }
@@ -0,0 +1,3 @@
1
+ import o from"node:crypto";import n from"node:fs/promises";import g from"node:path";import{CliError as s}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as l}from"../../domain/errors/error-codes.js";import{validateApiKey as w,validateBaseUrl as E,validateProfileName as d}from"../../domain/auth/auth-profile.js";import{withFileLock as f}from"../filesystem/atomic-file-store.js";import{isAlreadyExists as m,isFileNotFound as y}from"../filesystem/fs-errors.js";class R{paths;secret;constructor(e,t=process.env.LOTAGATE_CREDENTIAL_SECRET){this.paths=e,this.secret=t}async list(){return(await this.readPayload()).credentials.map(({profile:t})=>t)}async get(e){const t=d(e);return(await this.readPayload()).credentials.find(a=>a.profile.name===t)}async set(e){const t={profile:{...e.profile,name:d(e.profile.name),baseUrl:E(e.profile.baseUrl),credentialRef:`file:${d(e.profile.name)}`},apiKey:w(e.apiKey)};await f(this.paths.credentialsFile,async()=>{const a=(await this.readPayload()).credentials.filter(({profile:i})=>i.name!==t.profile.name);a.push(t),await this.writePayload({version:1,credentials:a})})}async delete(e){const t=d(e);return f(this.paths.credentialsFile,async()=>{const r=await this.readPayload(),a=r.credentials.filter(({profile:i})=>i.name!==t);return a.length===r.credentials.length?!1:(await this.writePayload({version:1,credentials:a}),!0)})}async readPayload(){const e=await this.readFile();if(e===void 0)return{version:1,credentials:[]};const t=await this.deriveKey(e.salt);try{const r=o.createDecipheriv("aes-256-gcm",t,Buffer.from(e.iv,"base64"));r.setAuthTag(Buffer.from(e.authTag,"base64"));const a=Buffer.concat([r.update(Buffer.from(e.ciphertext,"base64")),r.final()]).toString("utf8"),i=JSON.parse(a);if(!T(i))throw new Error("Invalid credential payload.");return i}catch(r){throw new s(l.AUTH_CREDENTIAL_STORE_UNAVAILABLE,"Credential file cannot be decrypted.",{category:"auth",userMessage:"Unable to decrypt the credential store. Check LOTAGATE_CREDENTIAL_SECRET.",cause:r})}}async writePayload(e){const t=o.randomBytes(16),r=o.randomBytes(12),a=await this.deriveKey(t.toString("base64")),i=o.createCipheriv("aes-256-gcm",a,r),u=Buffer.concat([i.update(JSON.stringify(e),"utf8"),i.final()]),p={version:1,salt:t.toString("base64"),iv:r.toString("base64"),authTag:i.getAuthTag().toString("base64"),ciphertext:u.toString("base64")};await n.mkdir(this.paths.globalConfigDir,{recursive:!0});const h=g.join(this.paths.globalConfigDir,`.credentials.${process.pid}.${o.randomUUID()}.tmp`);try{await n.writeFile(h,`${JSON.stringify(p,null,2)}
2
+ `,{encoding:"utf8",mode:384}),await n.rename(h,this.paths.credentialsFile)}finally{await n.rm(h,{force:!0})}}async readFile(){try{return A(await n.readFile(this.paths.credentialsFile,"utf8"))}catch(e){if(y(e))return;throw e instanceof s?e:new s(l.AUTH_CREDENTIAL_STORE_UNAVAILABLE,"Credential file cannot be read.",{category:"auth",userMessage:"Unable to read the credential store.",cause:e})}}async deriveKey(e){return o.scryptSync(await this.resolveSecret(),e,32)}async resolveSecret(){if(this.secret!==void 0&&this.secret.length>=16)return this.secret;await n.mkdir(this.paths.globalConfigDir,{recursive:!0});try{const t=(await n.readFile(this.paths.credentialKeyFile,"utf8")).trim();if(t.length>=16)return t;throw new Error("Credential key file is invalid.")}catch(t){if(!y(t))throw new s(l.AUTH_CREDENTIAL_STORE_UNAVAILABLE,"Credential key cannot be read.",{category:"auth",userMessage:"Unable to read the local credential key.",cause:t})}const e=o.randomBytes(32).toString("base64url");try{return await n.writeFile(this.paths.credentialKeyFile,`${e}
3
+ `,{encoding:"utf8",mode:384,flag:"wx"}),e}catch(t){if(!m(t))throw new s(l.AUTH_CREDENTIAL_STORE_UNAVAILABLE,"Credential key cannot be created.",{category:"auth",userMessage:"Unable to initialize secure local credential storage.",cause:t});try{const r=(await n.readFile(this.paths.credentialKeyFile,"utf8")).trim();if(r.length>=16)return r}catch(r){throw new s(l.AUTH_CREDENTIAL_STORE_UNAVAILABLE,"Credential key cannot be read after initialization.",{category:"auth",userMessage:"Unable to initialize secure local credential storage.",cause:r})}throw new s(l.AUTH_CREDENTIAL_STORE_UNAVAILABLE,"Credential key file is invalid.",{category:"auth",userMessage:"Unable to initialize secure local credential storage."})}}}function A(c){try{const e=JSON.parse(c);if(typeof e!="object"||e===null)throw new Error("Expected object.");const t=e;if(t.version!==1||typeof t.salt!="string"||typeof t.iv!="string"||typeof t.authTag!="string"||typeof t.ciphertext!="string")throw new Error("Invalid encrypted credential file.");return{version:1,salt:t.salt,iv:t.iv,authTag:t.authTag,ciphertext:t.ciphertext}}catch(e){throw e instanceof s?e:new s(l.AUTH_CREDENTIAL_STORE_UNAVAILABLE,"Credential file is invalid.",{category:"auth",userMessage:"Credential store is corrupted or has an invalid format.",cause:e})}}function T(c){if(typeof c!="object"||c===null)return!1;const e=c;return e.version===1&&Array.isArray(e.credentials)}export{R as EncryptedFileCredentialStore};
@@ -0,0 +1,11 @@
1
+ import { type AuthProfile, type StoredCredential } from '../../domain/auth/auth-profile.js';
2
+ import type { CredentialStore } from '../../ports/credential-store.js';
3
+ export declare class EnvironmentCredentialStore implements CredentialStore {
4
+ private readonly env;
5
+ constructor(env?: Readonly<Record<string, string | undefined>>);
6
+ list(): Promise<readonly AuthProfile[]>;
7
+ get(profileName: string): Promise<StoredCredential | undefined>;
8
+ set(): Promise<void>;
9
+ delete(): Promise<boolean>;
10
+ private read;
11
+ }
@@ -0,0 +1 @@
1
+ import{DEFAULT_CONFIG as a}from"../../domain/config/config-schema.js";import{validateApiKey as i,validateBaseUrl as s,validateProfileName as r}from"../../domain/auth/auth-profile.js";class c{env;constructor(e=process.env){this.env=e}async list(){const e=this.read();return e===void 0?[]:[e.profile]}async get(e){const n=this.read();return n?.profile.name===r(e)?n:void 0}async set(){throw new Error("Environment credentials are read-only.")}async delete(){return!1}read(){const e=this.env.LOTAGATE_API_KEY;if(e===void 0||e.trim().length===0)return;const n=r(this.env.LOTAGATE_PROFILE??"default"),t=new Date().toISOString();return{apiKey:i(e),profile:{name:n,baseUrl:s(this.env.LOTAGATE_BASE_URL??a.baseUrl),credentialRef:"env:LOTAGATE_API_KEY",createdAt:t,updatedAt:t}}}}export{c as EnvironmentCredentialStore};
@@ -0,0 +1,7 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ interface RawInput extends Readable {
3
+ isTTY?: boolean;
4
+ setRawMode?: (mode: boolean) => void;
5
+ }
6
+ export declare function readSecret(prompt: string, input?: RawInput, output?: Writable): Promise<string>;
7
+ export {};
@@ -0,0 +1,3 @@
1
+ async function l(o,e=process.stdin,r=process.stderr){if(e.isTTY!==!0||e.setRawMode===void 0)return w(e);const s=e.setRawMode;return new Promise((c,u)=>{let n="";const f=i=>{const d=i.toString("utf8");for(const t of d){if(t===""){a(),u(new Error("Input interrupted."));return}if(t==="\r"||t===`
2
+ `){a(),r.write(`
3
+ `),c(n);return}if(t==="\b"||t==="\x7F"){n=n.slice(0,-1);continue}n+=t}},a=()=>{s(!1),e.pause(),e.off("data",f)};r.write(o),s(!0),e.resume(),e.on("data",f)})}async function w(o){const e=[];for await(const r of o)e.push(Buffer.isBuffer(r)?r:Buffer.from(String(r)));return Buffer.concat(e).toString("utf8").trim()}export{l as readSecret};
@@ -0,0 +1,9 @@
1
+ import type { CliMcpConfig } from '../../domain/extensions/mcp-config.js';
2
+ export interface McpConfigReader {
3
+ list(): Promise<CliMcpConfig>;
4
+ }
5
+ export declare class CompositeMcpConfigStore implements McpConfigReader {
6
+ private readonly stores;
7
+ constructor(stores: readonly McpConfigReader[]);
8
+ list(): Promise<CliMcpConfig>;
9
+ }
@@ -0,0 +1 @@
1
+ import{mergeMcpConfigsWithOverride as t}from"../../domain/extensions/mcp-config.js";class e{stores;constructor(s){this.stores=s}async list(){return t(...await Promise.all(this.stores.map(s=>s.list())))}}export{e as CompositeMcpConfigStore};
@@ -0,0 +1,2 @@
1
+ /** Lists direct extension directories while keeping missing optional roots harmless. */
2
+ export declare function listExtensionDirectories(root: string): Promise<readonly string[]>;
@@ -0,0 +1 @@
1
+ import e from"node:fs/promises";import o from"node:path";import{isFileNotFound as n}from"../filesystem/fs-errors.js";async function c(i){try{return(await e.readdir(i,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>o.join(i,t.name))}catch(r){if(n(r))return[];throw r}}export{c as listExtensionDirectories};
@@ -0,0 +1,7 @@
1
+ export interface ExtensionIntegrityOptions {
2
+ sha256?: string;
3
+ signature?: string;
4
+ publicKeyPem?: string;
5
+ }
6
+ /** Verifies the caller's authenticity constraints before installing any extension. */
7
+ export declare function verifyExtensionIntegrity(integrity: string, options: ExtensionIntegrityOptions, invalid: (message: string) => Error): void;
@@ -0,0 +1 @@
1
+ import f from"node:crypto";function n(u,e,r){if(e.sha256!==void 0&&e.sha256.trim().toLowerCase().replace(/^sha256[:-]/u,"")!==u)throw r("Extension checksum does not match --sha256.");if(!(e.signature===void 0&&e.publicKeyPem===void 0)){if(e.signature===void 0||e.publicKeyPem===void 0)throw r("Signature verification requires both --signature and --public-key.");if(!f.verify(null,Buffer.from(u,"utf8"),e.publicKeyPem,Buffer.from(e.signature,"base64")))throw r("Extension signature verification failed.")}}export{n as verifyExtensionIntegrity};
@@ -0,0 +1,6 @@
1
+ import { type HostPlatformContext } from '../platform/host-platform.js';
2
+ export interface ResolvedExtensionSource {
3
+ directory: string;
4
+ cleanup(): Promise<void>;
5
+ }
6
+ export declare function resolveExtensionSource(source: string, platform?: HostPlatformContext, signal?: AbortSignal): Promise<ResolvedExtensionSource>;
@@ -0,0 +1 @@
1
+ import n from"node:fs/promises";import p from"node:os";import a from"node:path";import{fileURLToPath as w}from"node:url";import{CliError as l}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as g}from"../../domain/errors/error-codes.js";import{isFileNotFound as f}from"../filesystem/fs-errors.js";import{detectHostPlatform as S}from"../platform/host-platform.js";import{execPlatformCommand as d}from"../platform/host-process.js";import{RESOURCE_LIMITS as m}from"../../domain/runtime/resource-limits.js";async function G(t,r=S(),o){const e=await v(t);if(e!==void 0)return{directory:e,cleanup:async()=>{}};if(j(t))return x(t,r,o);if(z(t))return k(t,r,o);throw c("Source must be a local directory, HTTPS Git repository, or npm package.")}async function v(t){const r=t.startsWith("file://")?w(t):a.resolve(t);try{if(!(await n.stat(r)).isDirectory())throw c("Extension source must be a directory.");return r}catch(o){if(o instanceof l||!f(o))throw o;return}}async function x(t,r,o){const e=await n.mkdtemp(a.join(p.tmpdir(),"lotagate-extension-git-")),i=a.join(e,"source");try{return await d("git",["clone","--depth","1",t,i],r,{maxBufferBytes:m.internalProcessOutputBytes,timeoutMs:m.internalProcessTimeoutMs,...o===void 0?{}:{signal:o}}),await n.rm(a.join(i,".git"),{recursive:!0,force:!0}),{directory:i,cleanup:()=>n.rm(e,{recursive:!0,force:!0})}}catch(s){throw await n.rm(e,{recursive:!0,force:!0}),c(`Unable to clone Git source: ${s instanceof Error?s.message:String(s)}`)}}async function k(t,r,o){const e=await n.mkdtemp(a.join(p.tmpdir(),"lotagate-extension-npm-"));try{await d("npm",["install","--ignore-scripts","--no-package-lock","--no-save","--prefix",e,t],r,{maxBufferBytes:m.internalProcessOutputBytes,timeoutMs:m.internalProcessTimeoutMs,...o===void 0?{}:{signal:o}});const i=await E(a.join(e,"node_modules"));if(i===void 0)throw c("npm package does not contain a LotaGate plugin or skill.");return{directory:i,cleanup:()=>n.rm(e,{recursive:!0,force:!0})}}catch(i){throw await n.rm(e,{recursive:!0,force:!0}),i instanceof l?i:c(`Unable to install npm source: ${i instanceof Error?i.message:String(i)}`)}}async function E(t){let r;try{r=await n.readdir(t,{withFileTypes:!0})}catch(e){if(f(e))return;throw e}const o=[];for(const e of r){if(!e.isDirectory()||e.name.startsWith("."))continue;const i=a.join(t,e.name);if(await h(i)&&o.push(i),e.name.startsWith("@")){let s;try{s=await n.readdir(i,{withFileTypes:!0})}catch{s=[]}for(const y of s.filter(u=>u.isDirectory())){const u=a.join(i,y.name);await h(u)&&o.push(u)}}}if(o.length>1)throw c("npm package contains multiple extension roots.");return o[0]}async function h(t){try{return await n.stat(a.join(t,".lotagate-plugin","plugin.json")),!0}catch(r){if(!f(r))throw r}try{return await n.stat(a.join(t,"SKILL.md")),!0}catch(r){if(!f(r))throw r;return!1}}function j(t){return/^https:\/\//u.test(t)&&(t.endsWith(".git")||/^https:\/\/github\.com\/[^/]+\/[^/]+\/?$/u.test(t))}function z(t){return/^@?[a-z0-9][a-z0-9._/-]*(?:@[a-z0-9][a-z0-9._-]*)?$/iu.test(t)&&!t.includes("/")||/^@[a-z0-9][a-z0-9-]*\/[a-z0-9][a-z0-9._-]*(?:@[a-z0-9][a-z0-9._-]*)?$/iu.test(t)}function c(t){return new l(g.PLUGIN_MANIFEST_INVALID,t,{category:"extension",userMessage:`Unable to resolve extension source: ${t}`})}export{G as resolveExtensionSource};
@@ -0,0 +1,6 @@
1
+ export declare const DEFAULT_MCP_CONNECT_TIMEOUT_MS = 30000;
2
+ export declare const DEFAULT_MCP_DISCONNECT_TIMEOUT_MS = 5000;
3
+ export declare const MAX_PLUGIN_FILES = 5000;
4
+ export declare const MAX_PLUGIN_FILE_BYTES: number;
5
+ export declare const MAX_PLUGIN_TOTAL_BYTES: number;
6
+ export declare const MAX_PLUGIN_DEPTH = 32;
@@ -0,0 +1 @@
1
+ const _=3e4,T=5e3,o=5e3,t=10485760,E=52428800,M=32;export{_ as DEFAULT_MCP_CONNECT_TIMEOUT_MS,T as DEFAULT_MCP_DISCONNECT_TIMEOUT_MS,M as MAX_PLUGIN_DEPTH,o as MAX_PLUGIN_FILES,t as MAX_PLUGIN_FILE_BYTES,E as MAX_PLUGIN_TOTAL_BYTES};
@@ -0,0 +1,15 @@
1
+ import { type CliMcpConfig, type CliMcpServerConfig } from '../../domain/extensions/mcp-config.js';
2
+ import type { ExtensionScope } from '../../domain/extensions/extension-scope.js';
3
+ export declare class FileMcpConfigStore {
4
+ private readonly filePath;
5
+ constructor(location: string, scope?: ExtensionScope);
6
+ static forScope(cwd: string, globalConfigDir: string, scope: ExtensionScope): FileMcpConfigStore;
7
+ get path(): string;
8
+ list(): Promise<CliMcpConfig>;
9
+ get(name: string): Promise<import("../../domain/extensions/mcp-config.js").CliMcpServerEntry | undefined>;
10
+ add(name: string, config: CliMcpServerConfig): Promise<void>;
11
+ remove(name: string): Promise<boolean>;
12
+ setEnabled(name: string, enabled: boolean): Promise<void>;
13
+ private readRaw;
14
+ private write;
15
+ }
@@ -0,0 +1,2 @@
1
+ import a from"node:path";import{validateMcpConfig as c,validateMcpName as n}from"../../domain/extensions/mcp-config.js";import{CliError as h}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as f}from"../../domain/errors/error-codes.js";import{atomicWriteFile as m,withFileLock as s}from"../filesystem/atomic-file-store.js";import{isFileNotFound as u}from"../filesystem/fs-errors.js";import{readJsonFileBounded as d}from"../filesystem/bounded-json-reader.js";import{RESOURCE_LIMITS as w}from"../../domain/runtime/resource-limits.js";class l{filePath;constructor(t,e="project"){this.filePath=e==="user"?a.join(a.resolve(t),"mcp.json"):a.join(a.resolve(t),".lotagate","mcp.json")}static forScope(t,e,r){return new l(r==="user"?e:t,r)}get path(){return this.filePath}async list(){return c(await this.readRaw())}async get(t){return(await this.list())[n(t)]}async add(t,e){const r=n(t);await s(this.filePath,async()=>{const i=await this.list();i[r]={enabled:!0,config:e},await this.write(i)})}async remove(t){const e=n(t);return s(this.filePath,async()=>{const r=await this.list();return r[e]===void 0?!1:(delete r[e],await this.write(r),!0)})}async setEnabled(t,e){const r=n(t);await s(this.filePath,async()=>{const i=await this.list(),o=i[r];if(o===void 0)throw new h(f.MCP_SERVER_NOT_FOUND,`MCP server not found: ${r}`,{category:"mcp",userMessage:`MCP server not found: ${r}.`});i[r]={...o,enabled:e},await this.write(i)})}async readRaw(){try{return await d(this.filePath,w.mcpConfigBytes)}catch(t){if(u(t))return{};throw t}}async write(t){const e=c(t);await m(this.filePath,`${JSON.stringify(e,null,2)}
2
+ `)}}export{l as FileMcpConfigStore};
@@ -0,0 +1,18 @@
1
+ import type { ToolExecutionContext, ToolExecutor, ToolPolicy } from '@lotagate/agent-sdk';
2
+ import { type HookDefinition, type HookEvent } from '../../domain/extensions/hook-manifest.js';
3
+ import { type PluginManifest } from '../../domain/extensions/plugin-manifest.js';
4
+ export interface HookRuntimePolicy {
5
+ trustedProject: boolean;
6
+ enabled: boolean;
7
+ toolPolicy: ToolPolicy;
8
+ }
9
+ export declare class HookRuntime {
10
+ private readonly executor;
11
+ private readonly policy;
12
+ constructor(executor: ToolExecutor, policy: HookRuntimePolicy);
13
+ load(plugin: PluginManifest): Promise<readonly HookDefinition[]>;
14
+ loadProject(cwd: string): Promise<readonly HookDefinition[]>;
15
+ run(hook: HookDefinition, context: ToolExecutionContext): Promise<boolean>;
16
+ runEvent(hooks: readonly HookDefinition[], event: HookEvent, context: ToolExecutionContext): Promise<number>;
17
+ }
18
+ export declare function discoverHooks(root: string): Promise<readonly HookDefinition[]>;
@@ -0,0 +1 @@
1
+ import l from"node:fs/promises";import i from"node:path";import{ToolExecutionError as m}from"@lotagate/agent-sdk";import{parseHookDefinition as u}from"../../domain/extensions/hook-manifest.js";import{PLUGIN_LAYOUT as f}from"../../domain/extensions/plugin-manifest.js";import{isFileNotFound as d}from"../filesystem/fs-errors.js";import{readJsonFileBounded as p}from"../filesystem/bounded-json-reader.js";import{RESOURCE_LIMITS as h}from"../../domain/runtime/resource-limits.js";class v{executor;policy;constructor(o,t){this.executor=o,this.policy=t}async load(o){const t=i.resolve(o.directory,f.hooksDirectory);return(await c(t)).map(e=>({...e,id:`${o.name}:${e.id}`,scope:"plugin",pluginName:o.name,sourceName:e.id}))}async loadProject(o){return(await c(i.join(i.resolve(o),".lotagate","hooks"))).map(t=>({...t,scope:"project",sourceName:t.id}))}async run(o,t){if(!this.policy.enabled||!this.policy.trustedProject)return!1;const e={command:o.command,args:[...o.args],cwd:".",timeoutMs:o.timeoutMs},r=this.executor.getToolInfo?.("shell.exec");try{await this.policy.toolPolicy.assertAllowed({toolName:"shell.exec",input:e,context:t,...r===void 0?{}:{toolInfo:r}})}catch(a){if(a instanceof m)return!1;throw a}if((await this.executor.execute("shell.exec",e,t)).isError)throw new Error(`Hook failed: ${o.id}`);return!0}async runEvent(o,t,e){let r=0;for(const n of o)n.event===t&&await this.run(n,e)&&(r+=1);return r}}async function c(s){let o;try{o=(await l.readdir(s,{withFileTypes:!0})).filter(e=>e.isFile()&&e.name.endsWith(".json")).map(e=>i.join(s,e.name))}catch(e){if(d(e))return[];throw e}const t=[];for(const e of o.sort())t.push(u(await p(e,h.configFileBytes),s,i.basename(e,".json")));return t}export{v as HookRuntime,c as discoverHooks};
@@ -0,0 +1,58 @@
1
+ import { McpToolExecutor, type McpConnectionSummary, type McpServerConfigMap } from '@lotagate/agent-sdk';
2
+ import type { CliMcpConfig } from '../../domain/extensions/mcp-config.js';
3
+ import type { McpConfigReader } from './composite-mcp-config-store.js';
4
+ import type { Logger } from '../../ports/logger.js';
5
+ export interface McpRuntimePolicy {
6
+ readonly connectTimeoutMs: number;
7
+ readonly disconnectTimeoutMs?: number;
8
+ readonly idleTtlMs: number;
9
+ readonly startupConcurrency?: number;
10
+ readonly probeTimeoutMs?: number;
11
+ readonly probeMaxRetries?: number;
12
+ readonly reconnectMaxAttempts?: number;
13
+ readonly healthCheckIntervalMs?: number;
14
+ readonly healthCheckTimeoutMs?: number;
15
+ }
16
+ export type McpRuntimeEvent = {
17
+ type: 'mcp.server.status';
18
+ summary: McpConnectionSummary & {
19
+ latencyMs?: number;
20
+ };
21
+ } | {
22
+ type: 'mcp.tool.catalog.updated';
23
+ serverId: string;
24
+ toolCount: number;
25
+ error?: Error;
26
+ };
27
+ export type McpRuntimeEventListener = (event: McpRuntimeEvent) => void | Promise<void>;
28
+ export interface McpRuntimeLease {
29
+ readonly executor: McpToolExecutor;
30
+ release(): void;
31
+ }
32
+ export declare function resolveMcpRuntimePolicy(env?: Readonly<Record<string, string | undefined>>): McpRuntimePolicy;
33
+ export declare class McpRuntime {
34
+ private readonly storeFactory;
35
+ private readonly policy;
36
+ private readonly logger?;
37
+ private readonly now;
38
+ private readonly environment;
39
+ private readonly runtimes;
40
+ private readonly retiring;
41
+ private readonly keyLocks;
42
+ private closed;
43
+ constructor(storeFactory?: (cwd: string) => McpConfigReader, policy?: McpRuntimePolicy, logger?: Logger | undefined, now?: () => number, environment?: Readonly<Record<string, string | undefined>>);
44
+ ensure(cwd: string, config: CliMcpConfig, trusted: boolean, options?: {
45
+ onEvent?: McpRuntimeEventListener;
46
+ reconnect?: boolean;
47
+ }): Promise<McpRuntimeLease>;
48
+ connectConfigured(cwd: string, trusted: boolean): Promise<readonly McpConnectionSummary[]>;
49
+ invalidate(cwd: string): Promise<void>;
50
+ close(): Promise<void>;
51
+ private ensureUnlocked;
52
+ private invalidateUnlocked;
53
+ private waitForRetiring;
54
+ private withKeyLock;
55
+ private scheduleIdleInvalidation;
56
+ private connectAndDiscover;
57
+ }
58
+ export declare function toAgentMcpConfig(config: CliMcpConfig, environment?: Readonly<Record<string, string | undefined>>): McpServerConfigMap;
@@ -0,0 +1 @@
1
+ import k from"node:crypto";import T from"node:path";import{AgentSdkError as _,AgentSdkErrorCode as D,DEFAULT_MCP_STARTUP_CONCURRENCY as C,mapWithMcpConcurrency as j,McpClientManager as F,McpToolExecutor as G}from"@lotagate/agent-sdk";import{CliError as A}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as P}from"../../domain/errors/error-codes.js";import{FileMcpConfigStore as $}from"./file-mcp-config-store.js";import{readBoundedEnvironmentInteger as h}from"../config/environment-values.js";import{redactLogText as v}from"../logging/log-redactor.js";import{DEFAULT_MCP_CONNECT_TIMEOUT_MS as H,DEFAULT_MCP_DISCONNECT_TIMEOUT_MS as M}from"./extensions-constants.js";function K(t=process.env){return{connectTimeoutMs:h(t.LOTAGATE_MCP_CONNECT_TIMEOUT_MS,H,500,12e4),disconnectTimeoutMs:h(t.LOTAGATE_MCP_DISCONNECT_TIMEOUT_MS,M,500,12e4),idleTtlMs:h(t.LOTAGATE_MCP_RUNTIME_TTL_SECONDS,300,1,86400)*1e3,startupConcurrency:h(t.LOTAGATE_MCP_STARTUP_CONCURRENCY,C,1,32),probeTimeoutMs:h(t.LOTAGATE_MCP_PROBE_TIMEOUT_MS,5e3,500,12e4),probeMaxRetries:h(t.LOTAGATE_MCP_PROBE_MAX_RETRIES,1,0,5),reconnectMaxAttempts:h(t.LOTAGATE_MCP_RECONNECT_MAX_ATTEMPTS,3,0,10),healthCheckIntervalMs:h(t.LOTAGATE_MCP_HEALTH_CHECK_INTERVAL_SECONDS,30,5,3600)*1e3,healthCheckTimeoutMs:h(t.LOTAGATE_MCP_HEALTH_CHECK_TIMEOUT_MS,5e3,500,12e4)}}class re{storeFactory;policy;logger;now;environment;runtimes=new Map;retiring=new Map;keyLocks=new Map;closed=!1;constructor(e=a=>new $(a),n=K(),o,s=Date.now,r=process.env){this.storeFactory=e,this.policy=n,this.logger=o,this.now=s,this.environment=r}async ensure(e,n,o,s={}){if(!o)throw new A(P.PROJECT_TRUST_REQUIRED,"MCP connections require project trust.",{category:"project",userMessage:"Trust the project before connecting to MCP servers."});const r=T.resolve(e);return this.withKeyLock(r,async()=>this.ensureUnlocked(r,n,s))}async connectConfigured(e,n){if(!n)throw new A(P.PROJECT_TRUST_REQUIRED,"MCP connections require project trust.",{category:"project",userMessage:"Trust the project before connecting to MCP servers."});const o=await this.storeFactory(e).list(),s=S(I(o,this.environment),this.policy,new Set);try{return await this.connectAndDiscover(T.resolve(e),s.manager,s.executor,new Set)}finally{await R(s.manager,this.policy.disconnectTimeoutMs??M,this.logger,T.resolve(e))}}async invalidate(e){const n=T.resolve(e);await this.withKeyLock(n,()=>this.invalidateUnlocked(n))}async close(){this.closed=!0,await Promise.all([...this.keyLocks.values()]);const e=[...this.runtimes.values()];this.runtimes.clear();for(const n of e)p(n);await Promise.allSettled(e.map(n=>R(n.manager,this.policy.disconnectTimeoutMs??M,this.logger,n.cwd)))}async ensureUnlocked(e,n,o){if(this.closed)throw new Error("MCP runtime is closed.");await this.waitForRetiring(e);const s=B(n),r=this.runtimes.get(e);if(r?.failed&&r.fingerprint===s&&r.leases>0)return p(r),r.lastUsedAt=this.now(),r.leases+=1,E(r,o.onEvent),await r.ready,w(r,this.now,o.onEvent,()=>this.scheduleIdleInvalidation(e,r));if(r!==void 0&&!r.failed&&r.fingerprint===s&&(r.leases>0||this.now()-r.lastUsedAt<=this.policy.idleTtlMs)){p(r);const u=r.leases===0;r.lastUsedAt=this.now(),r.leases+=1,E(r,o.onEvent),await r.ready;const d=w(r,this.now,o.onEvent,()=>this.scheduleIdleInvalidation(e,r));return u&&!r.failed&&z(r.manager)?(d.release(),await this.invalidateUnlocked(e),this.ensureUnlocked(e,n,o)):d}r!==void 0&&await this.invalidateUnlocked(e),await this.waitForRetiring(e);const a=new Set;E(a,o.onEvent);const i=S(I(n,this.environment),this.policy,a,o.reconnect??!0),c={cwd:e,fingerprint:s,manager:i.manager,executor:i.executor,ready:this.connectAndDiscover(e,i.manager,i.executor,a),listeners:a,failed:!1,lastUsedAt:this.now(),leases:1,idleTimer:void 0};this.runtimes.set(e,c);const l=await c.ready;return c.failed=l.some(u=>u.status==="failed"),w(c,this.now,o.onEvent,()=>this.scheduleIdleInvalidation(e,c))}async invalidateUnlocked(e){const n=this.runtimes.get(e);if(n===void 0)return;this.runtimes.delete(e),p(n),n.listeners.clear();const o=O(n.manager,this.policy.disconnectTimeoutMs??M,this.logger,e),s=o.settled.finally(()=>{this.retiring.get(e)===s&&this.retiring.delete(e)});this.retiring.set(e,s),await o.withinTimeout,this.logger?.info("MCP runtime invalidated.",{cwd:e})}async waitForRetiring(e){await this.retiring.get(e)}async withKeyLock(e,n){const o=this.keyLocks.get(e);let s;const r=new Promise(i=>{s=i}),a=(o??Promise.resolve()).then(()=>r);this.keyLocks.set(e,a),await o;try{return await n()}finally{s(),this.keyLocks.get(e)===a&&this.keyLocks.delete(e)}}scheduleIdleInvalidation(e,n){p(n),n.idleTimer=setTimeout(()=>{if(n.idleTimer=void 0,!(this.runtimes.get(e)!==n||n.leases>0)){if(this.now()-n.lastUsedAt<this.policy.idleTtlMs){this.scheduleIdleInvalidation(e,n);return}this.invalidate(e)}},this.policy.idleTtlMs),n.idleTimer.unref?.()}async connectAndDiscover(e,n,o,s){const r=performance.now();this.logger?.debug("MCP runtime startup started.",{cwd:e,serverCount:n.configuredServerIds.length,startupConcurrency:this.policy.startupConcurrency??C});const a=await j(n.configuredServerIds,async i=>{const c=performance.now();try{m(s,{type:"mcp.server.status",summary:{serverId:i,status:"connecting"}});const l=await b(n.connect(i),this.policy.connectTimeoutMs,()=>n.disconnect(i),"connection");if(m(s,{type:"mcp.server.status",summary:{...l,latencyMs:f(c)}}),this.logger?.debug("MCP server connected.",{cwd:e,serverId:i,durationMs:f(c),protocolEra:l.protocolEra,protocolVersion:l.protocolVersion}),l.status!=="connected")return l;try{const u=performance.now(),d=await b(n.listTools(i),this.policy.connectTimeoutMs,()=>n.disconnect(i),"tool discovery");o.replaceServerTools(i,d.tools),m(s,{type:"mcp.tool.catalog.updated",serverId:i,toolCount:d.tools.length}),this.logger?.debug("MCP tools discovered.",{cwd:e,serverId:i,toolCount:d.tools.length,durationMs:f(u),totalDurationMs:f(c)})}catch(u){const d=U(u,i);return m(s,{type:"mcp.server.status",summary:{...l,status:"failed",error:d,latencyMs:f(c)}}),m(s,{type:"mcp.tool.catalog.updated",serverId:i,toolCount:0,error:d}),this.logger?.warn("MCP tool discovery failed.",{cwd:e,serverId:i,durationMs:f(c),reason:d.message,...L(u)}),{...l,status:"failed",error:d}}return l}catch(l){const u=U(l,i);return m(s,{type:"mcp.server.status",summary:{serverId:i,status:"failed",error:u,latencyMs:f(c)}}),this.logger?.warn("MCP server connection failed.",{cwd:e,serverId:i,durationMs:f(c),reason:u.message,...L(l)}),{serverId:i,status:"failed",error:u}}},this.policy.startupConcurrency??C);return this.logger?.info("MCP runtime startup completed.",{cwd:e,serverCount:a.length,connectedCount:a.filter(i=>i.status==="connected").length,failedCount:a.filter(i=>i.status==="failed").length,durationMs:f(r)}),a}}function S(t,e,n,o=!0){let s;const r=new F(t,{protocol:{mode:"auto",...e.probeTimeoutMs===void 0?{}:{probeTimeoutMs:e.probeTimeoutMs},...e.probeMaxRetries===void 0?{}:{probeMaxRetries:e.probeMaxRetries}},reconnect:{enabled:o,...e.reconnectMaxAttempts===void 0?{}:{maxAttempts:e.reconnectMaxAttempts},...e.healthCheckIntervalMs===void 0?{}:{healthCheckIntervalMs:e.healthCheckIntervalMs},...e.healthCheckTimeoutMs===void 0?{}:{healthCheckTimeoutMs:e.healthCheckTimeoutMs}},onToolsChanged:a=>{s!==void 0&&(a.tools===null||a.error!==null?s.removeServerTools(a.serverId):s.replaceServerTools(a.serverId,a.tools),m(n,{type:"mcp.tool.catalog.updated",serverId:a.serverId,toolCount:a.tools?.length??0,...a.error===null?{}:{error:a.error}}))},onServerChanged:a=>{a.type==="removed"&&s?.removeServerTools(a.serverId)}});return s=new G(r),{manager:r,executor:s}}function O(t,e,n,o){let s,r=!1;const a=Promise.resolve().then(()=>t.disconnectAll()),i=new Promise(u=>{s=setTimeout(()=>{r=!0,u()},e)}),c=a.then(()=>{},u=>{r||n?.warn("MCP runtime disconnect failed.",{cwd:o,reason:u instanceof Error?u.message:String(u)})});return{withinTimeout:Promise.race([c,i]).finally(()=>{s!==void 0&&clearTimeout(s),r&&n?.warn("MCP runtime disconnect timed out.",{cwd:o,timeoutMs:e})}),settled:c}}async function R(t,e,n,o){await O(t,e,n,o).withinTimeout}function w(t,e,n,o){let s=!1;return{executor:t.executor,release:()=>{s||(s=!0,t.leases=Math.max(0,t.leases-1),t.lastUsedAt=e(),J(t,n),t.leases===0&&o?.())}}}function p(t){t.idleTimer!==void 0&&clearTimeout(t.idleTimer),t.idleTimer=void 0}function E(t,e){if(e!==void 0){if(t instanceof Set){t.add(e);return}t.listeners.add(e)}}function J(t,e){e!==void 0&&t.listeners.delete(e)}function m(t,e){for(const n of t)Promise.resolve(n(e)).catch(()=>{})}function z(t){const e=t.connectionSummaries;return e.length>0&&e.some(n=>n.status!=="connected")}function B(t){return k.createHash("sha256").update(y(t)).digest("hex")}function y(t){return Array.isArray(t)?`[${t.map(y).join(",")}]`:typeof t!="object"||t===null?JSON.stringify(t):`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${y(t[e])}`).join(",")}}`}async function b(t,e,n,o){let s,r=!1;const a=new Promise((i,c)=>{s=setTimeout(()=>{r||(r=!0,c(new Error(`MCP ${o} timed out after ${e}ms.`)),Promise.resolve(n()).catch(()=>{}))},e)});try{return await Promise.race([t.then(c=>(r=!0,c)),a])}finally{s!==void 0&&clearTimeout(s),t.catch(()=>{})}}function f(t){return Math.max(0,Math.round(performance.now()-t))}function U(t,e){return t instanceof _?t:new _(D.McpConnectionFailed,"MCP server connection failed.",{cause:t,details:{serverId:e}})}function L(t){const e=[],n=[],o=[],s=[];let r=t;for(let a=0;a<4&&r!==void 0&&r!==null;a+=1){if(r instanceof Error){e.push(v(r.message)),n.push(r.name),r=r.cause;continue}if(typeof r!="object")break;const i=r,c=i.message;typeof c=="string"&&e.push(v(c));const l=i.name;typeof l=="string"&&n.push(l);const u=i.code;typeof u=="string"&&o.push(u);for(const d of["status","statusCode","httpStatus"]){const g=i[d];typeof g=="number"&&Number.isInteger(g)&&s.push(g)}r=i.cause}return{...e.length===0?{}:{errorMessages:e},...n.length===0?{}:{errorTypes:n},...o.length===0?{}:{errorCodes:o},...s.length===0?{}:{httpStatuses:s}}}function I(t,e=process.env){const n={};for(const[o,s]of Object.entries(t))s.enabled&&(n[o]=V(s.config,e));return n}function V(t,e){if(t.type==="stdio"){const{env:r,...a}=t;return{...a,...t.args===void 0?{}:{args:[...t.args]},...r===void 0?{}:{env:x(r,e)}}}const{headers:n,auth:o,...s}=t;return{...s,...n===void 0?{}:{headers:x(n,e)},...o?.type==="bearer"?{auth:{type:"bearer",token:N(o.token,e,"MCP bearer token")}}:{}}}function x(t,e){return Object.fromEntries(Object.entries(t).map(([n,o])=>[n,N(o,e,`MCP secret ${n}`)]))}function N(t,e,n){if(typeof t=="string")return t;const o=e[t.name];if(o===void 0||o.length===0)throw new Error(`${n} environment variable is not set.`);return o}export{re as McpRuntime,K as resolveMcpRuntimePolicy,I as toAgentMcpConfig};
@@ -0,0 +1,4 @@
1
+ import { type PluginAgentDefinition } from '../../domain/extensions/plugin-agent-manifest.js';
2
+ export declare class PluginAgentDiscovery {
3
+ discover(root: string): Promise<readonly PluginAgentDefinition[]>;
4
+ }