@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 @@
1
+ import c from"node:fs/promises";import u from"node:path";import{parsePluginAgentDocument as f}from"../../domain/extensions/plugin-agent-manifest.js";import{CliError as p}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as g}from"../../domain/errors/error-codes.js";import{isFileNotFound as d}from"../filesystem/fs-errors.js";import{readFileBounded as h}from"../filesystem/bounded-file-reader.js";import{RESOURCE_LIMITS as y}from"../../domain/runtime/resource-limits.js";class C{async discover(r){let a;try{a=await c.readdir(r,{withFileTypes:!0})}catch(t){if(d(t))return[];throw t}const s=[];for(const t of a.filter(e=>e.isFile()&&e.name.endsWith(".yaml")).sort((e,n)=>e.name.localeCompare(n.name))){const e=t.name.slice(0,-5);if(!/^[a-z0-9][a-z0-9-]{0,63}$/u.test(e))throw i(`Invalid plugin agent file name: ${t.name}`);const n=u.join(r,t.name);if((await c.lstat(n)).isSymbolicLink())throw i(`Plugin agent must not be a symbolic link: ${t.name}`);const m=await h(n,y.skillDocumentBytes);if(m.truncated)throw i(`Plugin agent exceeds the supported size: ${t.name}`);const l=f(m.bytes.toString("utf8"),r);if(l.name!==e)throw i(`Plugin agent name must match its file name: ${t.name}`);s.push(l)}return s}}function i(o){return new p(g.PLUGIN_MANIFEST_INVALID,o,{category:"extension",userMessage:`Invalid plugin agent: ${o}`})}export{C as PluginAgentDiscovery};
@@ -0,0 +1,5 @@
1
+ import { type PluginManifest } from '../../domain/extensions/plugin-manifest.js';
2
+ export declare class PluginDiscovery {
3
+ discover(roots: readonly string[]): Promise<readonly PluginManifest[]>;
4
+ }
5
+ export declare function validatePluginManifest(manifest: PluginManifest): Promise<void>;
@@ -0,0 +1 @@
1
+ import s from"node:fs/promises";import a from"node:path";import{parsePluginManifest as y,PLUGIN_LAYOUT as o}from"../../domain/extensions/plugin-manifest.js";import{CliError as c}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as l}from"../../domain/errors/error-codes.js";import{isFileNotFound as p}from"../filesystem/fs-errors.js";import{readJsonFileBounded as h}from"../filesystem/bounded-json-reader.js";import{RESOURCE_LIMITS as w}from"../../domain/runtime/resource-limits.js";import{listExtensionDirectories as d}from"./extension-directory-reader.js";class k{async discover(t){const i=[];for(const e of t)for(const r of await d(e)){const f=a.join(r,o.markerDirectory,o.manifestFile);try{const u=y(await h(f,w.pluginManifestBytes),r);await L(u),i.push(u)}catch(u){if(!p(u))throw u;if(await I(r))throw P()}}return i.sort((e,r)=>e.name.localeCompare(r.name))}}async function I(n){try{return await s.stat(a.join(n,".codex-plugin","plugin.json")),!0}catch(t){if(p(t))return!1;throw t}}function P(){return new c(l.PLUGIN_MANIFEST_INVALID,"Only the .lotagate-plugin/plugin.json plugin format is supported.",{category:"extension",userMessage:"This plugin uses an unsupported format. Reinstall it using the LotaGate plugin structure."})}async function L(n){const t=await s.realpath(n.directory);await D(t,o.skillsDirectory),await m(t,o.readmeFile),await m(t,o.licenseFile);for(const i of[o.markerDirectory,o.skillsDirectory,o.agentsDirectory,o.hooksDirectory,o.mcpDirectory]){const e=a.resolve(t,i);if(e!==t&&!e.startsWith(`${t}${a.sep}`))throw g(i);try{if((await s.lstat(e)).isSymbolicLink())throw g(i);const f=await s.realpath(e);if(f!==t&&!f.startsWith(`${t}${a.sep}`))throw g(i)}catch(r){if(r instanceof c)throw r;if(p(r))continue;throw new c(l.PLUGIN_MANIFEST_INVALID,`Plugin path is not contained in the plugin directory: ${i}`,{category:"extension",userMessage:"Plugin contains an unsafe path.",cause:r})}}}async function D(n,t){try{const i=await s.lstat(a.join(n,t));if(!i.isDirectory()||i.isSymbolicLink())throw new Error("invalid-directory")}catch(i){throw new c(l.PLUGIN_MANIFEST_INVALID,`Plugin directory is missing or invalid: ${t}`,{category:"extension",userMessage:`Plugin must contain the ${t}/ directory.`,cause:i})}}async function m(n,t){try{const i=await s.lstat(a.join(n,t));if(!i.isFile()||i.isSymbolicLink())throw new Error("invalid-file")}catch(i){throw new c(l.PLUGIN_MANIFEST_INVALID,`Plugin file is missing or invalid: ${t}`,{category:"extension",userMessage:`Plugin must contain ${t}.`,cause:i})}}function g(n){return new c(l.PLUGIN_MANIFEST_INVALID,`Plugin path is not contained in the plugin directory: ${n}`,{category:"extension",userMessage:"Plugin contains an unsafe path."})}export{k as PluginDiscovery,L as validatePluginManifest};
@@ -0,0 +1,23 @@
1
+ import { type ExtensionIntegrityOptions } from './extension-integrity.js';
2
+ import { type PluginManifest } from '../../domain/extensions/plugin-manifest.js';
3
+ export interface InstalledPlugin {
4
+ manifest: PluginManifest;
5
+ enabled: boolean;
6
+ integrity?: string;
7
+ }
8
+ export type PluginInstallOptions = ExtensionIntegrityOptions;
9
+ export interface PluginListOptions {
10
+ verifyIntegrity?: boolean;
11
+ }
12
+ export declare class PluginManager {
13
+ private readonly root;
14
+ private readonly statePath;
15
+ constructor(root: string);
16
+ list(roots?: readonly string[], options?: PluginListOptions): Promise<readonly InstalledPlugin[]>;
17
+ install(source: string, options?: PluginInstallOptions): Promise<InstalledPlugin>;
18
+ uninstall(name: string): Promise<boolean>;
19
+ setEnabled(name: string, enabled: boolean): Promise<void>;
20
+ private readState;
21
+ private writeState;
22
+ }
23
+ export declare function hashDirectory(directory: string): Promise<string>;
@@ -0,0 +1,2 @@
1
+ import g from"node:crypto";import{verifyExtensionIntegrity as M}from"./extension-integrity.js";import c from"node:fs/promises";import o from"node:path";import{parsePluginManifest as b,PLUGIN_LAYOUT as d}from"../../domain/extensions/plugin-manifest.js";import{CliError as P}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as j}from"../../domain/errors/error-codes.js";import{PluginDiscovery as x,validatePluginManifest as I}from"./plugin-discovery.js";import{atomicWriteFile as D,replaceDirectoryWithRollback as N,withFileLock as y}from"../filesystem/atomic-file-store.js";import{isFileNotFound as S}from"../filesystem/fs-errors.js";import{readJsonFileBounded as E}from"../filesystem/bounded-json-reader.js";import{RESOURCE_LIMITS as v}from"../../domain/runtime/resource-limits.js";import{parseExtensionState as U}from"../../domain/extensions/extension-state.js";import{MAX_PLUGIN_DEPTH as T,MAX_PLUGIN_FILE_BYTES as k,MAX_PLUGIN_FILES as A,MAX_PLUGIN_TOTAL_BYTES as O}from"./extensions-constants.js";class Q{root;statePath;constructor(t){this.root=t,this.statePath=o.join(t,"state.json")}async list(t=[this.root],a={}){const i=await this.readState(),e=await new x().discover(t),r=[];for(const s of e){const f=a.verifyIntegrity===!1?void 0:await p(s.directory);r.push({manifest:s,enabled:i[s.name]?.enabled!==!1,...f===void 0?{}:{integrity:f}})}return r}async install(t,a={}){const i=o.resolve(t),e=o.join(i,d.markerDirectory,d.manifestFile);let r;try{r=await E(e,v.pluginManifestBytes)}catch(h){if(S(h)){const F=o.join(i,".codex-plugin","plugin.json");try{throw await c.stat(F),l("Only the .lotagate-plugin/plugin.json format is supported.")}catch(w){if(w instanceof P)throw w}}throw l("Plugin source must contain .lotagate-plugin/plugin.json.")}const s=b(r,i);await I(s);const f=await p(i);M(f,a,l),await c.mkdir(this.root,{recursive:!0});const m=o.join(this.root,L(s.name)),u=`${m}.tmp-${g.randomUUID()}`;return y(`${m}.install`,async()=>{try{await c.cp(i,u,{recursive:!0,force:!1,errorOnExist:!0}),await I({...s,directory:u});const h=await p(u);if(h!==f)throw l("Plugin changed while it was being installed.");return await N(u,m),await this.setEnabled(s.name,!0),{manifest:{...s,directory:m},enabled:!0,integrity:h}}finally{await c.rm(u,{recursive:!0,force:!0})}})}async uninstall(t){const a=o.join(this.root,L(t));return y(`${a}.install`,async()=>{const i=(await this.list([this.root],{verifyIntegrity:!1})).find(e=>e.manifest.name===t);return i===void 0?!1:(await c.rm(i.manifest.directory,{recursive:!0,force:!0}),await y(this.statePath,async()=>{const e=await this.readState();delete e[t],await this.writeState(e)}),!0)})}async setEnabled(t,a){await y(this.statePath,async()=>{const i=await this.readState();i[t]={enabled:a},await this.writeState(i)})}async readState(){try{return U(await E(this.statePath,v.workspaceSettingsBytes))}catch(t){if(S(t))return{};throw t}}async writeState(t){await D(this.statePath,`${JSON.stringify(t,null,2)}
2
+ `)}}async function p(n){const t=g.createHash("sha256");let a=0;for(const i of await _(n)){const e=o.relative(n,i).split(o.sep).join("/"),r=await c.stat(i);if(r.size>k)throw l("Plugin file exceeds the integrity scan limit.");if(a+=r.size,a>O)throw l("Plugin exceeds the total integrity scan limit.");t.update(e),t.update("\0"),t.update(await c.readFile(i)),t.update("\0")}return t.digest("hex")}async function _(n,t=0,a={files:0}){if(t>T)throw l("Plugin directory nesting exceeds the integrity scan limit.");const i=[];for(const e of(await c.readdir(n,{withFileTypes:!0})).sort((r,s)=>r.name.localeCompare(s.name))){const r=o.join(n,e.name);if(e.isSymbolicLink())throw l("Plugin packages must not contain symbolic links.");if(e.isDirectory())i.push(...await _(r,t+1,a));else if(e.isFile()&&(i.push(r),a.files+=1,a.files>A))throw l("Plugin contains too many files for the integrity scan.")}return i}function L(n){return`plugin-${Buffer.from(n,"utf8").toString("base64url")}`}function l(n){return new P(j.PLUGIN_MANIFEST_INVALID,n,{category:"extension",userMessage:`Unable to install plugin: ${n}`})}export{Q as PluginManager,p as hashDirectory};
@@ -0,0 +1,4 @@
1
+ import { type SkillManifest } from '../../domain/extensions/skill-manifest.js';
2
+ export declare class SkillDiscovery {
3
+ discover(roots: readonly string[]): Promise<readonly SkillManifest[]>;
4
+ }
@@ -0,0 +1 @@
1
+ import m from"node:path";import{parseSkillDocument as c}from"../../domain/extensions/skill-manifest.js";import{CliError as a}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as f}from"../../domain/errors/error-codes.js";import{isFileNotFound as p}from"../filesystem/fs-errors.js";import{readFileBounded as u}from"../filesystem/bounded-file-reader.js";import{RESOURCE_LIMITS as d}from"../../domain/runtime/resource-limits.js";import{listExtensionDirectories as S}from"./extension-directory-reader.js";class _{async discover(s){const i=new Map;for(const e of s)for(const t of await S(e)){const l=m.join(t,"SKILL.md");try{const o=await u(l,d.skillDocumentBytes);if(o.truncated)continue;const n=c(o.bytes.toString("utf8"),t);i.has(n.name)||i.set(n.name,n)}catch(o){if(!p(o)&&!I(o))throw o}}return[...i.values()].sort((e,t)=>e.name.localeCompare(t.name))}}function I(r){return r instanceof a&&r.code===f.SKILL_FRONTMATTER_INVALID}export{_ as SkillDiscovery};
@@ -0,0 +1,9 @@
1
+ import { type ExtensionIntegrityOptions } from './extension-integrity.js';
2
+ import { type SkillManifest } from '../../domain/extensions/skill-manifest.js';
3
+ export interface InstalledSkill {
4
+ manifest: SkillManifest;
5
+ integrity: string;
6
+ }
7
+ export declare class SkillInstaller {
8
+ install(source: string, root: string, options?: ExtensionIntegrityOptions): Promise<InstalledSkill | undefined>;
9
+ }
@@ -0,0 +1 @@
1
+ import n from"node:fs/promises";import{verifyExtensionIntegrity as w}from"./extension-integrity.js";import h from"node:crypto";import o from"node:path";import{parseSkillDocument as S}from"../../domain/extensions/skill-manifest.js";import{CliError as k}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as I}from"../../domain/errors/error-codes.js";import{hashDirectory as p}from"./plugin-manager.js";import{isFileNotFound as c}from"../filesystem/fs-errors.js";import{readFileBounded as g}from"../filesystem/bounded-file-reader.js";import{RESOURCE_LIMITS as L}from"../../domain/runtime/resource-limits.js";import{replaceDirectoryWithRollback as D,withFileLock as F}from"../filesystem/atomic-file-store.js";class N{async install(e,a,r={}){if(await E(e))return;const i=await v(o.resolve(e));if(i===void 0)return;const m=await g(o.join(i,"SKILL.md"),L.skillDocumentBytes);if(m.truncated)throw f("Skill document exceeds the supported size.");const u=S(m.bytes.toString("utf8"),i),d=await p(i);w(d,r,f),await n.mkdir(a,{recursive:!0});const s=o.join(a,u.name),l=`${s}.tmp-${h.randomUUID()}`;return F(`${s}.install`,async()=>{try{await n.cp(i,l,{recursive:!0,force:!1,errorOnExist:!0});const y=await p(l);if(y!==d)throw new Error("Skill changed while it was being installed.");return await D(l,s),{manifest:{...u,directory:s},integrity:y}}finally{await n.rm(l,{recursive:!0,force:!0})}})}}async function E(t){try{return(await n.stat(o.join(t,".lotagate-plugin","plugin.json"))).isFile()}catch(e){if(!c(e))throw e;return!1}}async function v(t){try{if((await n.stat(o.join(t,"SKILL.md"))).isFile())return t}catch(r){if(!c(r))throw r}let e;try{e=await n.readdir(t,{withFileTypes:!0})}catch(r){if(c(r))return;throw r}const a=[];for(const r of e.filter(i=>i.isDirectory()))try{(await n.stat(o.join(t,r.name,"SKILL.md"))).isFile()&&a.push(o.join(t,r.name))}catch(i){if(!c(i))throw i}if(a.length>1)throw f("Source contains multiple skills. Pass the individual skill directory.");return a[0]}function f(t){return new k(I.SKILL_FRONTMATTER_INVALID,t,{category:"extension",userMessage:`Unable to install skill: ${t}`})}export{N as SkillInstaller};
@@ -0,0 +1,22 @@
1
+ import type { SkillManifest } from '../../domain/extensions/skill-manifest.js';
2
+ import type { SkillRootScope } from './skill-roots.js';
3
+ export type ScopedSkill = SkillManifest & {
4
+ skillKey: string;
5
+ enabled: boolean;
6
+ scope: SkillRootScope['scope'];
7
+ root: string;
8
+ statePath: string;
9
+ pluginName?: string;
10
+ };
11
+ export interface ScopedSkillListOptions {
12
+ includeShadowed?: boolean;
13
+ }
14
+ export declare class SkillManager {
15
+ private readonly statePath;
16
+ constructor(statePath: string);
17
+ listScoped(scopes: readonly SkillRootScope[], options?: ScopedSkillListOptions): Promise<readonly ScopedSkill[]>;
18
+ setEnabled(name: string, enabled: boolean, statePath?: string): Promise<void>;
19
+ remove(name: string, root: string, statePath?: string): Promise<boolean>;
20
+ private readState;
21
+ private writeState;
22
+ }
@@ -0,0 +1,2 @@
1
+ import p from"node:fs/promises";import{SkillDiscovery as d}from"./skill-discovery.js";import{atomicWriteFile as f,withFileLock as u}from"../filesystem/atomic-file-store.js";import{isFileNotFound as w}from"../filesystem/fs-errors.js";import{readJsonFileBounded as S}from"../filesystem/bounded-json-reader.js";import{RESOURCE_LIMITS as y}from"../../domain/runtime/resource-limits.js";import{parseExtensionState as g}from"../../domain/extensions/extension-state.js";class M{statePath;constructor(e){this.statePath=e}async listScoped(e,s={}){const a=new Map,i=[],n=new Set,c=new Set;for(const t of e){a.has(t.statePath)||a.set(t.statePath,await this.readState(t.statePath));const m=a.get(t.statePath);for(const o of await new d().discover([t.root])){const r=t.scope==="plugin",h=n.has(o.name)||!r&&t.scope==="builtin"&&c.has(o.name);if(s.includeShadowed!==!0&&h)continue;r?c.add(o.name):t.scope!=="builtin"&&n.add(o.name);const l=r?`${t.pluginName??"plugin"}:${o.name}`:o.name;i.push({...o,skillKey:l,enabled:m[l]?.enabled!==!1,scope:t.scope,root:t.root,statePath:t.statePath,...t.pluginName===void 0?{}:{pluginName:t.pluginName}})}}return i}async setEnabled(e,s,a=this.statePath){await u(a,async()=>{const i=await this.readState(a);i[e]={enabled:s},await this.writeState(i,a)})}async remove(e,s,a=this.statePath){const i=(await new d().discover([s])).find(n=>n.name===e||`${n.name}`===e);return i===void 0?!1:(await p.rm(i.directory,{recursive:!0,force:!0}),await u(a,async()=>{const n=await this.readState(a);delete n[e],await this.writeState(n,a)}),!0)}async readState(e=this.statePath){try{return g(await S(e,y.workspaceSettingsBytes))}catch(s){if(w(s))return{};throw s}}async writeState(e,s=this.statePath){await f(s,`${JSON.stringify(e,null,2)}
2
+ `)}}export{M as SkillManager};
@@ -0,0 +1,19 @@
1
+ import type { ExtensionScope } from '../../domain/extensions/extension-scope.js';
2
+ export interface SkillRootScope {
3
+ scope: ExtensionScope | 'plugin' | 'builtin';
4
+ root: string;
5
+ statePath: string;
6
+ pluginName?: string;
7
+ }
8
+ export interface PluginSkillRoot {
9
+ root: string;
10
+ pluginName: string;
11
+ }
12
+ /**
13
+ * Returns skill roots in precedence order: project, user, enabled plugins,
14
+ * then immutable package-provided skills. SkillManager keeps project/user
15
+ * definitions authoritative while qualifying plugin identities so independent
16
+ * plugins can expose the same raw skill name safely.
17
+ */
18
+ export declare function resolveSkillRootScopes(cwd: string, globalConfigDir: string, pluginSkillRoots?: readonly PluginSkillRoot[]): readonly SkillRootScope[];
19
+ export declare function builtinSkillsDirectory(executablePath?: string): string;
@@ -0,0 +1 @@
1
+ import t from"node:path";import{existsSync as a}from"node:fs";import{fileURLToPath as p}from"node:url";function h(s,o,i=[]){const r=t.join(s,".lotagate","skills"),e=t.join(o,"skills-state.json");return[{scope:"project",root:r,statePath:t.join(s,".lotagate","skills-state.json")},{scope:"user",root:t.join(o,"skills"),statePath:e},...i.map(({root:l,pluginName:n})=>({scope:"plugin",root:l,pluginName:n,statePath:e})),{scope:"builtin",root:c(),statePath:e}]}function c(s=process.execPath){const o=t.resolve(t.dirname(s),"..","skills");return a(o)?o:p(new URL("../../../skills/",import.meta.url))}export{c as builtinSkillsDirectory,h as resolveSkillRootScopes};
@@ -0,0 +1,20 @@
1
+ import type { ToolDefinition } from '@lotagate/sdk';
2
+ import type { ToolExecutionContext, ToolExecutor, ToolInfo, ToolResult } from '@lotagate/agent-sdk';
3
+ import type { SkillManifest } from '../../domain/extensions/skill-manifest.js';
4
+ import type { SkillScopeStore } from '../../application/extensions/skill-scope-store.js';
5
+ import type { Logger } from '../../ports/logger.js';
6
+ /** Exposes the same skill capability definitions to runtime and context accounting. */
7
+ export declare function skillToolDefinitions(): readonly ToolDefinition[];
8
+ /** Presents validated, model-invocable skills as lazy agent tools. */
9
+ export declare class SkillToolExecutor implements ToolExecutor {
10
+ private readonly scopes;
11
+ private readonly logger?;
12
+ private readonly skills;
13
+ constructor(skills: readonly (SkillManifest & {
14
+ enabled: boolean;
15
+ skillKey?: string;
16
+ })[], scopes: SkillScopeStore, logger?: Logger | undefined);
17
+ listTools(): readonly ToolDefinition[];
18
+ getToolInfo(toolName: string): ToolInfo | undefined;
19
+ execute(toolName: string, input: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolResult>;
20
+ }
@@ -0,0 +1,2 @@
1
+ import{withToolExecutionLogging as f}from"../observability/tool-execution-logger.js";const a=[u("skill.list","List enabled skills available to the agent.",{type:"object",properties:{},additionalProperties:!1}),u("skill.load","Load instructions for one enabled skill by name when its description matches the task.",{type:"object",properties:{name:{type:"string",description:"Enabled skill name."}},required:["name"],additionalProperties:!1})];function d(){return a}class g{scopes;logger;skills;constructor(e,i,r){this.scopes=i,this.logger=r,this.skills=e.filter(n=>n.enabled&&n.modelInvocable)}listTools(){return d()}getToolInfo(e){return a.some(i=>k(i)===e)?{toolName:e,source:"custom",executorId:"skill-catalog",metadata:{category:"skill",risk:"read"}}:void 0}async execute(e,i,r){return f(this.logger,{toolName:e,source:"custom",context:r,details:{skillName:typeof i.name=="string"?i.name:void 0}},async()=>{if(e==="skill.list")return c(JSON.stringify(this.skills.map(s=>({name:s.skillKey??s.name,description:s.description}))));if(e!=="skill.load")return l(`Unknown skill tool: ${e}`);const n=i.name;if(typeof n!="string")return l("skill.load requires a skill name.");const o=this.skills.find(s=>(s.skillKey??s.name)===n);return o===void 0?l(`Skill is unavailable: ${n}`):(this.scopes.activate(r.runId,o),c(m(o.body,r.maxResultBytes)))})}}function u(t,e,i){return{type:"function",function:{name:t,description:e,parameters:i}}}function k(t){return"function"in t?t.function.name:void 0}function c(t){return{content:t,isError:!1}}function l(t){return{content:t,isError:!0}}function m(t,e){const i=Buffer.from(t,"utf8");return i.byteLength<=e?t:`${i.subarray(0,e).toString("utf8")}
2
+ [truncated]`}export{g as SkillToolExecutor,d as skillToolDefinitions};
@@ -0,0 +1,28 @@
1
+ import fs from 'node:fs/promises';
2
+ export type AdvisoryLockProcessStartCache = Map<number, {
3
+ checkedAt: number;
4
+ startTimeMs?: number;
5
+ }>;
6
+ /** Writes a file through a same-directory temporary file and rename. */
7
+ export declare function atomicWriteFile(filePath: string, data: string | Uint8Array, mode?: number): Promise<void>;
8
+ /** Replaces a directory under an advisory lock with rollback if the commit fails. */
9
+ export declare function replaceDirectoryWithRollback(temporary: string, destination: string): Promise<void>;
10
+ /** Creates an advisory lock and removes it again when lock metadata cannot be persisted. */
11
+ export declare function acquireAdvisoryFileLock(lockPath: string): Promise<fs.FileHandle>;
12
+ /** Handles Windows reporting an existing, exclusively opened lock as EPERM/EACCES. */
13
+ export declare function isAdvisoryLockContention(error: unknown, lockPath: string): Promise<boolean>;
14
+ /** Closes an advisory lock handle and removes its lock file even when close fails. */
15
+ export declare function releaseAdvisoryFileLock(handle: fs.FileHandle, lockPath: string): Promise<void>;
16
+ /** Serializes mutations across CLI processes using an advisory lock file. */
17
+ export declare function withFileLock<T>(filePath: string, operation: () => Promise<T>, options?: {
18
+ timeoutMs?: number;
19
+ staleMs?: number;
20
+ userMessage?: string;
21
+ }): Promise<T>;
22
+ /** Acquires a cross-process advisory lock and returns its async release function. */
23
+ export declare function acquireFileLock(filePath: string, options?: {
24
+ timeoutMs?: number;
25
+ staleMs?: number;
26
+ userMessage?: string;
27
+ }): Promise<() => Promise<void>>;
28
+ export declare function recoverStaleAdvisoryLock(lockPath: string, staleMs: number, processStartTimes?: AdvisoryLockProcessStartCache): Promise<boolean>;
@@ -0,0 +1 @@
1
+ import m from"node:crypto";import a from"node:fs/promises";import p from"node:path";import{CliError as M}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as S}from"../../domain/errors/error-codes.js";import{isAlreadyExists as T,isFileNotFound as u}from"./fs-errors.js";import{currentProcessStartTimeMs as E,readProcessStartTimeMs as h}from"../platform/process-identity.js";import{DEFAULT_LOCK_STALE_MS as A,DEFAULT_LOCK_TIMEOUT_MS as _,LOCK_RETRY_MS as C,PROCESS_START_TIME_CACHE_MS as L,PROCESS_START_TIME_TOLERANCE_MS as g}from"./filesystem-constants.js";async function J(e,r,t=384){await a.mkdir(p.dirname(e),{recursive:!0});const i=`${e}.tmp-${process.pid}-${m.randomUUID()}`;try{await a.writeFile(i,r,{mode:t}),await a.rename(i,e)}finally{await a.rm(i,{force:!0})}}async function W(e,r){const t=`${r}.backup-${process.pid}-${m.randomUUID()}`;let i=!1,o=!1;try{try{await a.rename(r,t),i=!0}catch(n){if(!u(n))throw n}try{await a.rename(e,r)}catch(n){if(i)try{await a.rename(t,r)}catch(s){throw o=!0,new AggregateError([n,s],`Installation and recovery failed. Previous contents are preserved at ${t}.`)}throw n}}finally{o||await a.rm(t,{recursive:!0,force:!0})}}async function k(e){const r=await a.open(e,"wx",384);try{return await r.writeFile(JSON.stringify({pid:process.pid,processStartTimeMs:E(),createdAt:new Date().toISOString()})),r}catch(t){throw await l(r,e),t}}async function v(e,r){if(T(e))return!0;if(!w(e))return!1;try{return await a.stat(r),!0}catch(t){return u(t)||w(t)}}async function l(e,r){try{await e.close()}finally{await a.rm(r,{force:!0})}}async function B(e,r,t={}){const i=await O(e,t);try{return await r()}finally{await i()}}async function O(e,r={}){const t=`${e}.lock`,i=r.timeoutMs??_,o=r.staleMs??A;await a.mkdir(p.dirname(e),{recursive:!0});const n=Date.now()+i,s=new Map;let c;for(;c===void 0;)try{c=await k(t)}catch(d){if(!await v(d,t))throw d;if(await F(t,o,s))continue;if(Date.now()>=n)throw new M(S.CONFIG_LOCKED,`Configuration file is locked: ${e}`,{category:"config",userMessage:r.userMessage??"A configuration update is already in progress. Try again shortly.",retryable:!0});await new Promise(y=>setTimeout(y,C))}let f=!1;return async()=>{f||(f=!0,await l(c,t))}}function w(e){return typeof e=="object"&&e!==null&&"code"in e&&(e.code==="EPERM"||e.code==="EACCES")}async function F(e,r,t=new Map){let i;try{i=await a.stat(e)}catch(n){if(u(n))return!1;throw n}if(Date.now()-i.mtimeMs<r)return!1;let o={};try{o=R(JSON.parse(await a.readFile(e,"utf8")))}catch{}return o.pid!==void 0&&await b(o,t)?!1:(await a.rm(e,{force:!0}),!0)}function R(e){if(typeof e!="object"||e===null)return{};const r=e;return{...typeof r.pid=="number"&&Number.isSafeInteger(r.pid)&&r.pid>0?{pid:r.pid}:{},...typeof r.processStartTimeMs=="number"&&Number.isFinite(r.processStartTimeMs)?{processStartTimeMs:r.processStartTimeMs}:{}}}async function b(e,r){const t=e.pid;if(t===void 0||!x(t))return!1;if(e.processStartTimeMs===void 0)return!0;const i=await D(t,r);return i===void 0?!0:Math.abs(i-e.processStartTimeMs)<=g}async function D(e,r){const t=Date.now(),i=r.get(e);if(i!==void 0&&t-i.checkedAt<L)return i.startTimeMs;const o=await h(e);return r.set(e,{checkedAt:t,...o===void 0?{}:{startTimeMs:o}}),o}function x(e){if(e===process.pid)return!0;try{return process.kill(e,0),!0}catch(r){return r instanceof Error&&"code"in r&&r.code==="EPERM"}}export{k as acquireAdvisoryFileLock,O as acquireFileLock,J as atomicWriteFile,v as isAdvisoryLockContention,F as recoverStaleAdvisoryLock,l as releaseAdvisoryFileLock,W as replaceDirectoryWithRollback,B as withFileLock};
@@ -0,0 +1,6 @@
1
+ export interface BoundedFileRead {
2
+ bytes: Buffer;
3
+ truncated: boolean;
4
+ }
5
+ /** Reads at most maxBytes and never loads an entire untrusted file into memory. */
6
+ export declare function readFileBounded(filePath: string, maxBytes: number): Promise<BoundedFileRead>;
@@ -0,0 +1 @@
1
+ import i from"node:fs/promises";async function y(l,f){const t=Math.max(0,Math.floor(f)),r=await i.open(l,"r");try{const o=[];let a=0;const s=t+1;for(;a<s;){const e=Buffer.alloc(Math.min(65536,s-a)),{bytesRead:n}=await r.read(e,0,e.byteLength,null);if(n===0)break;o.push(e.subarray(0,n)),a+=n}const c=Buffer.concat(o);return{bytes:c.subarray(0,t),truncated:c.byteLength>t}}finally{await r.close()}}export{y as readFileBounded};
@@ -0,0 +1 @@
1
+ export declare function readJsonFileBounded(filePath: string, maxBytes: number): Promise<unknown>;
@@ -0,0 +1 @@
1
+ import{readFileBounded as o}from"./bounded-file-reader.js";async function d(e,t){const r=await o(e,t);if(r.truncated)throw new Error(`File exceeds the maximum supported size: ${e}`);return JSON.parse(r.bytes.toString("utf8"))}export{d as readJsonFileBounded};
@@ -0,0 +1,8 @@
1
+ export declare const DEFAULT_LOCK_TIMEOUT_MS = 5000;
2
+ export declare const DEFAULT_LOCK_STALE_MS: number;
3
+ export declare const LOCK_RETRY_MS = 25;
4
+ export declare const PROCESS_START_TIME_TOLERANCE_MS = 2000;
5
+ export declare const PROCESS_START_TIME_CACHE_MS = 1000;
6
+ export declare const FILE_DIFF_MAX_BYTES: number;
7
+ export declare const FILE_DIFF_MAX_INPUT_LINES = 400;
8
+ export declare const FILE_DIFF_MAX_LINES = 240;
@@ -0,0 +1 @@
1
+ const _=5e3,E=9e5,o=25,t=2e3,S=1e3,T=65536,I=400,L=240;export{E as DEFAULT_LOCK_STALE_MS,_ as DEFAULT_LOCK_TIMEOUT_MS,T as FILE_DIFF_MAX_BYTES,I as FILE_DIFF_MAX_INPUT_LINES,L as FILE_DIFF_MAX_LINES,o as LOCK_RETRY_MS,S as PROCESS_START_TIME_CACHE_MS,t as PROCESS_START_TIME_TOLERANCE_MS};
@@ -0,0 +1,2 @@
1
+ export declare function isFileNotFound(error: unknown): boolean;
2
+ export declare function isAlreadyExists(error: unknown): boolean;
@@ -0,0 +1 @@
1
+ function n(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="ENOENT"}function c(t){return typeof t=="object"&&t!==null&&"code"in t&&t.code==="EEXIST"}export{c as isAlreadyExists,n as isFileNotFound};
@@ -0,0 +1,12 @@
1
+ export interface GatewayImageEditInput {
2
+ readonly images: readonly Uint8Array[];
3
+ readonly mask: Uint8Array | undefined;
4
+ }
5
+ export interface GatewayAudioInput {
6
+ readonly bytes: Uint8Array;
7
+ readonly filename: string;
8
+ readonly sourceName: string;
9
+ }
10
+ /** Reads local upload inputs sequentially and enforces the gateway's published limits. */
11
+ export declare function readGatewayImageEditInput(imageValue: string, maskValue: string | undefined, cwd: string): Promise<GatewayImageEditInput>;
12
+ export declare function readGatewayAudioInput(source: string, cwd: string): Promise<GatewayAudioInput>;
@@ -0,0 +1 @@
1
+ import p from"node:path";import{GATEWAY_MEDIA_LIMITS as n,validateImageEditInputCount as l,validateImageEditTotalSize as u,validateUploadSize as m}from"../../domain/media/gateway-media-contract.js";import{CliError as E}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as I}from"../../domain/errors/error-codes.js";import{normalizeImage as b}from"../clipboard/image-normalizer.js";import{readFileBounded as g}from"./bounded-file-reader.js";import{resolveExternalPath as y}from"./path-resolver.js";async function v(r,o,e){const t=r.split(",").map(a=>a.trim()).filter(Boolean);l(t);const s=[];let d=0;for(const a of t){const f=await c(a,e,n.imageEditFileBytes,"Image",["image/png","image/jpeg","image/webp"]);d+=f.byteLength,u(d),s.push(f)}const i=o===void 0?void 0:await c(o,e,n.imageEditMaskBytes,"Mask",["image/png"]);return i!==void 0&&u(d+i.byteLength),{images:s,mask:i}}async function M(r,o){const e=await y(r,{cwd:o}),t=await g(e,n.audioUploadBytes);return t.truncated&&m(n.audioUploadBytes+1,n.audioUploadBytes,"Audio file"),m(t.bytes.byteLength,n.audioUploadBytes,"Audio file"),{bytes:t.bytes,filename:p.basename(e),sourceName:p.parse(p.basename(e)).name}}async function c(r,o,e,t,s){const d=await y(r,{cwd:o}),i=await g(d,e);i.truncated&&m(e+1,e,t);const a=b(i.bytes,void 0,e);if(!s.includes(a.mimeType))throw new E(I.ATTACHMENT_FORMAT_UNSUPPORTED,`${t} format is not accepted by the gateway.`,{category:"media",userMessage:`${t} must use one of: ${s.join(", ")}.`});return m(a.bytes.byteLength,e,t),a.bytes}export{M as readGatewayAudioInput,v as readGatewayImageEditInput};
@@ -0,0 +1,25 @@
1
+ import type { ToolDefinition } from '@lotagate/sdk';
2
+ import type { ToolExecutionContext, ToolExecutor, ToolInfo, ToolResult } from '@lotagate/agent-sdk';
3
+ import { type FileChangeDiff } from '../../domain/filesystem/file-change-diff.js';
4
+ import type { ToolActivityObserver } from '../../ports/tool-activity.js';
5
+ import type { Logger } from '../../ports/logger.js';
6
+ /** Exposes the same filesystem capability definitions to runtime and context accounting. */
7
+ export declare function filesystemToolDefinitions(): readonly ToolDefinition[];
8
+ export declare function filesystemToolRisk(toolName: string): 'read' | 'write' | undefined;
9
+ export declare class LocalFilesystemToolExecutor implements ToolExecutor {
10
+ private readonly options;
11
+ constructor(options?: {
12
+ onWrite?: (change: FileChangeDiff) => void | Promise<void>;
13
+ onActivity?: ToolActivityObserver;
14
+ writeScope?: readonly string[];
15
+ logger?: Logger;
16
+ });
17
+ listTools(): readonly ToolDefinition[];
18
+ getToolInfo(toolName: string): ToolInfo | undefined;
19
+ execute(toolName: string, input: Record<string, unknown>, context: ToolExecutionContext): Promise<ToolResult>;
20
+ private read;
21
+ private list;
22
+ private write;
23
+ private exists;
24
+ }
25
+ export declare function isWithinWriteScope(filePath: string, context: ToolExecutionContext, scopes: readonly string[]): Promise<boolean>;
@@ -0,0 +1,3 @@
1
+ import d from"node:fs/promises";import o from"node:path";import{createFileChangeDiff as g}from"../../domain/filesystem/file-change-diff.js";import{assertWorkspaceWriteTarget as h,resolveWorkspacePath as u}from"./path-resolver.js";import{readFileBounded as y}from"./bounded-file-reader.js";import{isFileNotFound as m}from"./fs-errors.js";import{atomicWriteFile as k}from"./atomic-file-store.js";import{formatFilesystemActivityName as F}from"../../application/agent/tool-display.js";import{FILE_DIFF_MAX_BYTES as T,FILE_DIFF_MAX_INPUT_LINES as b,FILE_DIFF_MAX_LINES as v}from"./filesystem-constants.js";import{withToolExecutionLogging as S}from"../observability/tool-execution-logger.js";const w=[p("filesystem.read","Read a UTF-8 text file inside the trusted workspace for inspection. Never reproduce detailed file contents in the final response unless the user explicitly requests them.",{path:{type:"string",description:"Workspace-relative file path."}},["path"]),p("filesystem.list","List entries inside a trusted workspace directory. Do not pass a file path to this tool. For inspecting or reading files, use filesystem.read instead.",{path:{type:"string",description:"Optional workspace-relative directory path. Defaults to the workspace root."}},[]),p("filesystem.write","Write UTF-8 text to a file inside the trusted workspace.",{path:{type:"string",description:"Workspace-relative file path."},content:{type:"string",description:"UTF-8 file content."}},["path","content"]),p("filesystem.exists","Check whether a workspace-relative path exists.",{path:{type:"string",description:"Workspace-relative path."}},["path"])];function E(){return w}function L(i){if(w.some(t=>W(t)===i))return i==="filesystem.write"?"write":"read"}class q{options;constructor(t={}){this.options=t}listTools(){return E()}getToolInfo(t){const e=L(t);return e===void 0?void 0:{toolName:t,source:"filesystem",executorId:"local-filesystem",metadata:{risk:e}}}async execute(t,e,r){return S(this.options.logger,{toolName:t,source:"filesystem",context:r,details:{path:typeof e.path=="string"?e.path:void 0}},async()=>{const s=this.options.onActivity?.start({key:`${r.runId}:${t}`,toolName:t,source:"filesystem",label:R(t,e.path)});let a;try{switch(t){case"filesystem.read":a=await this.read(e,r);break;case"filesystem.list":a=await this.list(e,r);break;case"filesystem.write":a=await this.write(e,r);break;case"filesystem.exists":a=await this.exists(e,r);break;default:a=l(`Unknown filesystem tool: ${t}`);break}}catch(n){a=l(n instanceof Error?n.message:String(n))}return s?.complete(a.isError===!0,a.metadata),a})}async read(t,e){const r=await u(t.path,e),s=await y(r,e.maxResultBytes);return c(`${s.bytes.toString("utf8")}${s.truncated?`
2
+ [truncated]`:""}`)}async list(t,e){const r=await u(t.path===void 0||typeof t.path=="string"&&t.path.trim().length===0?".":t.path,e),s=[],a=Math.max(1,Math.floor(e.maxResultBytes/64)),n=await d.opendir(r);try{for(let f=await n.read();f!==null&&(s.push({name:f.name,kind:f.isDirectory()?"directory":"file"}),!(s.length>=a));f=await n.read());}finally{await n.close()}return c(_(Buffer.from(JSON.stringify(s)),e.maxResultBytes))}async write(t,e){if(typeof t.content!="string")return l("filesystem.write requires string content.");const r=await u(t.path,e,!0);if(this.options.writeScope!==void 0&&!await x(r,e,this.options.writeScope))return l("filesystem.write path is outside the delegated worker write scope.");const s=Buffer.from(t.content,"utf8");if(s.byteLength>e.maxResultBytes)return l("filesystem.write content exceeds the configured limit.");const a=await I(r);await d.mkdir(o.dirname(r),{recursive:!0}),await h(r,e),await k(r,s),await h(r,e);const n=g(String(t.path),a.content,t.content,{maxInputLines:b,maxLines:v,truncated:a.truncated});try{await this.options.onWrite?.(n)}catch{}return{...c(`Wrote ${s.byteLength} bytes.`),metadata:{fileChange:{path:n.path,additions:n.additions,deletions:n.deletions}}}}async exists(t,e){try{return await u(t.path,e),c("true")}catch(r){if(m(r))return c("false");throw r}}}async function x(i,t,e){const r=await d.realpath(o.resolve(t.workspaceRoot??t.cwd??process.cwd())),s=o.relative(r,o.resolve(i));return s.startsWith("..")||o.isAbsolute(s)?!1:e.some(a=>{const n=o.normalize(a).replace(/[\\/]$/u,"");return n==="."?!0:s===n||s.startsWith(`${n}${o.sep}`)})}async function I(i){try{const t=await y(i,T);return{content:t.bytes.toString("utf8"),truncated:t.truncated}}catch(t){return m(t)?{content:"",truncated:!1}:{content:"",truncated:!0}}}function p(i,t,e,r){return{type:"function",function:{name:i,description:t,parameters:{type:"object",properties:e,required:r,additionalProperties:!1}}}}function W(i){return"function"in i?i.function.name:void 0}function c(i){return{content:i,isError:!1}}function l(i){return{content:i,isError:!0}}function _(i,t){return i.byteLength<=t?i.toString("utf8"):`${i.subarray(0,t).toString("utf8")}
3
+ [truncated]`}function R(i,t){return F(i,t)}export{q as LocalFilesystemToolExecutor,E as filesystemToolDefinitions,L as filesystemToolRisk,x as isWithinWriteScope};
@@ -0,0 +1,20 @@
1
+ export declare function resolveWorkspacePath(input: unknown, context: {
2
+ cwd?: string;
3
+ workspaceRoot?: string;
4
+ }, allowMissing?: boolean): Promise<string>;
5
+ /** Resolves an explicitly supplied local path without applying workspace containment. */
6
+ export declare function resolveExternalPath(input: unknown, context: {
7
+ cwd?: string;
8
+ }, allowMissing?: boolean): Promise<string>;
9
+ /** Resolves an output path while refusing a final symlink target. */
10
+ export declare function resolveExternalOutputPath(input: unknown, context: {
11
+ cwd?: string;
12
+ }): Promise<string>;
13
+ /** Revalidates a write target immediately at the filesystem mutation boundary. */
14
+ export declare function assertWorkspaceWriteTarget(filePath: string, context: {
15
+ cwd?: string;
16
+ workspaceRoot?: string;
17
+ }): Promise<void>;
18
+ /** Revalidates an explicitly selected external output without following the final path component. */
19
+ export declare function assertExternalWriteTarget(filePath: string): Promise<void>;
20
+ export declare function assertInside(root: string, candidate: string): void;
@@ -0,0 +1 @@
1
+ import n from"node:fs/promises";import s from"node:path";import{CliError as h}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as w}from"../../domain/errors/error-codes.js";import{isFileNotFound as l}from"./fs-errors.js";async function A(t,e,o=!1){if(typeof t!="string"||t.trim().length===0)throw new h(w.TOOL_ARGUMENT_INVALID,"A relative workspace path is required.",{category:"tool",userMessage:"The filesystem tool requires a non-empty path."});const a=await n.realpath(s.resolve(e.workspaceRoot??e.cwd??process.cwd())),r=await n.realpath(s.resolve(e.cwd??a));p(a,r);const i=s.resolve(r,t);try{const c=await n.realpath(i);return p(a,c),c}catch(c){if(!o||!l(c))throw c;return y(i,a)}}async function m(t,e,o=!1){const a=d(t,e.cwd);try{return await n.realpath(a)}catch(r){if(!o||!l(r))throw r;return u(a)}}async function M(t,e){const o=d(t,e.cwd),a=await m(s.dirname(o),e,!0),r=s.join(a,s.basename(o));return await f(r),r}async function y(t,e){return u(t,e)}async function u(t,e){const o=[];let a=t;for(;;)try{const r=await n.realpath(a);return e!==void 0&&p(e,r),s.join(r,...o)}catch(r){if(!l(r))throw r;const i=s.dirname(a);if(i===a)throw r;o.unshift(s.basename(a)),a=i}}function d(t,e=process.cwd()){if(typeof t!="string"||t.trim().length===0)throw new h(w.INVALID_ARGUMENT,"A non-empty local path is required.",{category:"path",userMessage:"A non-empty local path is required."});return s.resolve(e,t)}async function f(t){try{if((await n.lstat(t)).isSymbolicLink())throw new h(w.INVALID_ARGUMENT,"Output paths cannot be symbolic links.",{category:"path",userMessage:"The output path cannot be a symbolic link."})}catch(e){if(!l(e))throw e}}async function T(t,e){const o=await n.realpath(s.resolve(e.workspaceRoot??e.cwd??process.cwd())),a=await n.realpath(s.dirname(t));p(o,a);try{const r=await n.realpath(t);p(o,r)}catch(r){if(!l(r))throw r}}async function I(t){await n.realpath(s.dirname(t)),await f(t)}function p(t,e){const o=s.relative(t,e);if(o===".."||o.startsWith(`..${s.sep}`)||s.isAbsolute(o))throw new h(w.PROJECT_SYMLINK_ESCAPE,"Path escapes the trusted workspace.",{category:"project",userMessage:"Tool access was denied because the path is outside the trusted workspace."})}export{I as assertExternalWriteTarget,p as assertInside,T as assertWorkspaceWriteTarget,M as resolveExternalOutputPath,m as resolveExternalPath,A as resolveWorkspacePath};
@@ -0,0 +1,13 @@
1
+ import type { MediaArtifactRequest, StoredMediaArtifact } from '../../domain/media/media-contract.js';
2
+ import type { Logger } from '../../ports/logger.js';
3
+ /** Persists generated media below the workspace by default or in an explicitly supplied local directory. */
4
+ export declare class WorkspaceMediaArtifactStore {
5
+ private readonly cwd;
6
+ private readonly logger?;
7
+ constructor(cwd: string, logger?: Logger | undefined);
8
+ writeMany(request: MediaArtifactRequest, artifacts: readonly Uint8Array[]): Promise<readonly StoredMediaArtifact[]>;
9
+ private resolveDirectory;
10
+ private resolveTarget;
11
+ private resolveOutputPath;
12
+ private context;
13
+ }
@@ -0,0 +1 @@
1
+ import h from"node:fs/promises";import a from"node:path";import{CliError as T}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as v}from"../../domain/errors/error-codes.js";import{atomicWriteFile as x}from"./atomic-file-store.js";import{assertExternalWriteTarget as E,assertWorkspaceWriteTarget as D,resolveExternalOutputPath as $,resolveExternalPath as A,resolveWorkspacePath as m}from"./path-resolver.js";const P=1e4,k={image:a.join("tmp","images"),speech:a.join("tmp","speechs"),transcription:a.join("tmp","transcribes"),translation:a.join("tmp","translates"),video:a.join("tmp","videos")};class L{cwd;logger;constructor(t,r){this.cwd=t,this.logger=r}async writeMany(t,r){if(r.length===0)throw l("The provider returned no media artifacts.");if(t.out!==void 0&&r.length!==1)throw l("--out can only be used when exactly one artifact is returned. Use --out-dir instead.");const o=await this.resolveDirectory(t),i=t.outDir!==void 0,n=[];for(const[s,d]of r.entries()){const w=await this.resolveTarget(t,o,s,r.length),p=t.out===void 0,c=p?await _(w,this.context(),i):w;let f=p;try{await h.mkdir(a.dirname(c),{recursive:!0}),await u(c,this.context(),i),f||(f=await O(c,t.force,this.context(),i)),await x(c,d),await u(c,this.context(),i)}catch(y){throw f&&await b(c,this.context(),i),y}n.push({path:c,bytes:d.byteLength})}return this.logger?.info("Media artifacts stored.",{kind:t.kind,artifactCount:n.length,artifactBytes:n.reduce((s,d)=>s+d.bytes,0)}),n}async resolveDirectory(t){const r=t.outDir??k[t.kind];return t.outDir===void 0?m(r,this.context(),!0):A(r,{cwd:this.cwd},!0)}async resolveTarget(t,r,o,i){if(t.out!==void 0){R(t.out);const d=i>1?`-${o+1}`:"";return this.resolveOutputPath(a.join(r,`${t.out}${d}.${t.extension}`),t.outDir!==void 0)}const n=i>1?`-${o+1}`:"",s=a.join(r,`${j(t.source)}${n}.${t.extension}`);return this.resolveOutputPath(s,t.outDir!==void 0)}resolveOutputPath(t,r){return r?$(t,{cwd:this.cwd}):m(t,this.context(),!0)}context(){return{cwd:this.cwd,workspaceRoot:this.cwd}}}async function u(e,t,r){r?await E(e):await D(e,t)}async function O(e,t,r,o){if(t)return!1;try{return await h.mkdir(a.dirname(e),{recursive:!0}),await u(e,r,o),await(await h.open(e,"wx",384)).close(),await u(e,r,o),!0}catch(i){throw g(i)?l(`Refusing to overwrite an existing file: ${e}. Use --force with --out to replace it.`):i}}async function _(e,t,r){const o=a.parse(e);for(let i=0;i<P;i+=1){const n=i===0?e:a.join(o.dir,`${o.name}-${i+1}${o.ext}`);try{return await h.mkdir(o.dir,{recursive:!0}),await u(n,t,r),await(await h.open(n,"wx",384)).close(),await u(n,t,r),n}catch(s){if(!g(s))throw s}}throw l(`Unable to allocate a unique output path near: ${e}.`)}async function b(e,t,r){try{await u(e,t,r),await h.rm(e,{force:!0})}catch{}}function j(e){const t=e.normalize("NFKD").replace(/[^a-zA-Z0-9]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,72);return t.length===0?"media":t}function R(e){const t=[...e].some(r=>{const o=r.codePointAt(0)??0;return o<32||o===127});if(e.length===0||e==="."||e===".."||e.includes("/")||e.includes("\\")||t)throw l("--out must be a filename without path separators or control characters.")}function g(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EEXIST"}function l(e){return new T(v.INVALID_ARGUMENT,e,{category:"media",userMessage:e})}export{L as WorkspaceMediaArtifactStore};
@@ -0,0 +1,26 @@
1
+ export interface DailyRotatingFileWriterOptions {
2
+ retentionDays: number;
3
+ now?: () => number;
4
+ }
5
+ export declare class DailyRotatingFileWriter {
6
+ private readonly directory;
7
+ private readonly options;
8
+ private readonly now;
9
+ private queue;
10
+ private queueBytes;
11
+ private dropped;
12
+ private drainPromise;
13
+ private closed;
14
+ private lastPrunedDate;
15
+ private lastError;
16
+ constructor(directory: string, options: DailyRotatingFileWriterOptions);
17
+ get health(): Readonly<{
18
+ dropped: number;
19
+ lastError?: Error;
20
+ }>;
21
+ write(line: string): void;
22
+ flush(): Promise<void>;
23
+ close(): Promise<void>;
24
+ private drain;
25
+ private pruneAsync;
26
+ }
@@ -0,0 +1,2 @@
1
+ import f from"node:fs";import a from"node:fs/promises";import u from"node:path";import{RESOURCE_LIMITS as c}from"../../domain/runtime/resource-limits.js";class g{directory;options;now;queue=[];queueBytes=0;dropped=0;drainPromise=Promise.resolve();closed=!1;lastPrunedDate;lastError;constructor(t,r){this.directory=t,this.options=r,this.now=r.now??Date.now;try{f.mkdirSync(t,{recursive:!0,mode:448})}catch{}this.lastPrunedDate=""}get health(){return{dropped:this.dropped,...this.lastError===void 0?{}:{lastError:this.lastError}}}write(t){if(this.closed)return;const r=Buffer.byteLength(t,"utf8");if(this.queue.length>=c.logQueueEntries||this.queueBytes+r>c.logQueueBytes){this.dropped+=1;return}this.queue.push({filePath:u.join(this.directory,`lotagate-${h(this.now())}.jsonl`),line:t}),this.queueBytes+=r,this.drainPromise=this.drainPromise.then(()=>this.drain()).catch(i=>{this.lastError=i instanceof Error?i:new Error(String(i))})}async flush(){await this.drainPromise,this.queue.length>0&&(this.drainPromise=this.drainPromise.then(()=>this.drain()).catch(t=>{this.lastError=t instanceof Error?t:new Error(String(t))}),await this.drainPromise)}async close(){this.closed=!0,await this.flush()}async drain(){const t=h(this.now());if(t!==this.lastPrunedDate&&await this.pruneAsync()&&(this.lastPrunedDate=t),this.queue.length===0)return;const r=this.queue.splice(0,this.queue.length);this.queueBytes=0;const i=this.dropped;i>0&&r.push({filePath:u.join(this.directory,`lotagate-${h(this.now())}.jsonl`),line:`${JSON.stringify({timestamp:new Date(this.now()).toISOString(),level:"warn",message:"Log entries dropped because the file writer queue was full.",dropped:i})}
2
+ `});const s=new Map;for(const e of r)s.set(e.filePath,[...s.get(e.filePath)??[],e.line]);try{for(const[e,n]of s)await a.appendFile(e,n.join(""),{encoding:"utf8",mode:384});this.dropped=0,this.lastError=void 0}catch(e){const n=[...r.filter(o=>!o.line.includes("Log entries dropped because the file writer queue was full.")),...this.queue];throw this.queue=n,this.queueBytes=n.reduce((o,d)=>o+Buffer.byteLength(d.line,"utf8"),0),this.lastError=e instanceof Error?e:new Error(String(e)),e}}async pruneAsync(){const t=this.now()-this.options.retentionDays*24*60*60*1e3;let r=!0;try{const i=await a.readdir(this.directory,{withFileTypes:!0});for(const s of i){if(!s.isFile())continue;const e=/^lotagate-(\d{4}-\d{2}-\d{2})\.jsonl$/u.exec(s.name);if(e===null||e[1]===void 0)continue;const n=Date.parse(`${e[1]}T00:00:00.000Z`);if(Number.isFinite(n)&&n<t)try{await a.rm(u.join(this.directory,s.name),{force:!0})}catch(o){r=!1,this.lastError=o instanceof Error?o:new Error(String(o))}}}catch(i){r=!1,this.lastError=i instanceof Error?i:new Error(String(i))}return r}}function h(l){return new Date(l).toISOString().slice(0,10)}export{g as DailyRotatingFileWriter};
@@ -0,0 +1,2 @@
1
+ export declare function redactLogDetails(details: Record<string, unknown> | undefined): Record<string, unknown> | undefined;
2
+ export declare function redactLogText(value: string): string;
@@ -0,0 +1 @@
1
+ import{SENSITIVE_KEY as f}from"./logging-constants.js";const E=32,u=4.2,a=/[A-Za-z0-9+/_=-]{32,}/gu;function d(t){if(t!==void 0)return s(t)}function s(t){return Object.fromEntries(Object.entries(t).map(([r,e])=>[r,f.test(r)?"[REDACTED]":p(e)]))}function p(t){return typeof t=="string"?o(t):Array.isArray(t)?t.map(r=>r!==null&&typeof r=="object"?s(r):typeof r=="string"?o(r):r):t!==null&&typeof t=="object"?s(t):t}function A(t){return o(t)}function o(t){return t.replace(/Bearer\s+[^\s]+/giu,"Bearer [REDACTED]").replace(/sk-[A-Za-z0-9_-]{8,}/gu,"[REDACTED]").replace(/((?:api[_-]?key|password|secret|token|authorization)\s*[:=]\s*)[^\s,]+/giu,"$1[REDACTED]").replace(/([?&][^=&#\s]*(?:key|token|secret|password|auth)[^=&#\s]*=)[^&#\s]+/giu,"$1[REDACTED]").replace(a,e=>T(e)?"[REDACTED]":e)}function T(t){return t.length<E||/\s/u.test(t)?!1:/^[0-9a-f]+$/iu.test(t)?i(t)>=3.5:i(t)>=u&&D(t)}function D(t){let r=0;return/[a-z]/u.test(t)&&(r+=1),/[A-Z]/u.test(t)&&(r+=1),/[0-9]/u.test(t)&&(r+=1),/[+/_=-]/u.test(t)&&(r+=1),r>=2}function i(t){const r=new Map;for(const n of t)r.set(n,(r.get(n)??0)+1);let e=0;for(const n of r.values()){const c=n/t.length;e-=c*Math.log2(c)}return e}export{d as redactLogDetails,A as redactLogText};
@@ -0,0 +1,3 @@
1
+ import type { LogLevel } from '../../ports/logger.js';
2
+ export declare const SENSITIVE_KEY: RegExp;
3
+ export declare const LEVEL_PRIORITY: Record<LogLevel, number>;
@@ -0,0 +1 @@
1
+ const e=/(api.?key|authorization|credential|password|private.?key|secret|token)/iu,r={error:0,warn:1,info:2,debug:3,trace:4};export{r as LEVEL_PRIORITY,e as SENSITIVE_KEY};
@@ -0,0 +1,6 @@
1
+ import type { LogLevel } from '../../ports/logger.js';
2
+ export interface LoggingPolicy {
3
+ level: LogLevel;
4
+ retentionDays: number;
5
+ }
6
+ export declare function resolveLoggingPolicy(env?: Readonly<Record<string, string | undefined>>): LoggingPolicy;
@@ -0,0 +1 @@
1
+ import{readBoundedEnvironmentInteger as o}from"../config/environment-values.js";function L(r=process.env){const e=r.LOTAGATE_LOG_LEVEL?.trim().toLowerCase();return{level:e==="error"||e==="warn"||e==="debug"||e==="trace"?e:"info",retentionDays:o(r.LOTAGATE_LOG_RETENTION_DAYS,14,1,365)}}export{L as resolveLoggingPolicy};
@@ -0,0 +1,24 @@
1
+ import type { Logger, LogLevel } from '../../ports/logger.js';
2
+ import type { Writable } from 'node:stream';
3
+ import type { DailyRotatingFileWriter } from './daily-rotating-file-writer.js';
4
+ export interface StructuredLoggerOptions {
5
+ level?: LogLevel;
6
+ consoleLevel?: LogLevel | 'none';
7
+ json?: boolean;
8
+ output?: Writable;
9
+ file?: DailyRotatingFileWriter;
10
+ }
11
+ export declare class StructuredLogger implements Logger {
12
+ private readonly minimumPriority;
13
+ private readonly consoleMinimumPriority;
14
+ private readonly output;
15
+ private readonly json;
16
+ private readonly file;
17
+ constructor(options?: StructuredLoggerOptions);
18
+ error(message: string, details?: Record<string, unknown>): void;
19
+ warn(message: string, details?: Record<string, unknown>): void;
20
+ info(message: string, details?: Record<string, unknown>): void;
21
+ debug(message: string, details?: Record<string, unknown>): void;
22
+ trace(message: string, details?: Record<string, unknown>): void;
23
+ private write;
24
+ }
@@ -0,0 +1,4 @@
1
+ import{redactLogDetails as m,redactLogText as u}from"./log-redactor.js";import{LEVEL_PRIORITY as r}from"./logging-constants.js";class h{minimumPriority;consoleMinimumPriority;output;json;file;constructor(i={}){this.minimumPriority=r[i.level??"info"],this.consoleMinimumPriority=i.consoleLevel==="none"?-1:r[i.consoleLevel??i.level??"info"],this.output=i.output??process.stderr,this.json=i.json??!1,this.file=i.file}error(i,t){this.write("error",i,t)}warn(i,t){this.write("warn",i,t)}info(i,t){this.write("info",i,t)}debug(i,t){this.write("debug",i,t)}trace(i,t){this.write("trace",i,t)}write(i,t,o){if(r[i]>this.minimumPriority)return;const n=m(o),e=u(t),s={timestamp:new Date().toISOString(),level:i,message:e,...n??{}};r[i]<=this.consoleMinimumPriority&&this.output.write(this.json?`${JSON.stringify(s)}
2
+ `:`[${i}] ${e}
3
+ `);try{this.file?.write(`${JSON.stringify(s)}
4
+ `)}catch{}}}export{h as StructuredLogger};
@@ -0,0 +1,37 @@
1
+ import type { MemoryBundle, MemoryDraft, MemoryRecord } from '../../domain/memory/memory.js';
2
+ import { type MemorySearchHit, type MemorySearchQuery, type MemorySemanticHit } from '../../domain/memory/memory-search.js';
3
+ import type { MemoryListOptions, MemoryStore } from '../../ports/memory-store.js';
4
+ import type { PlatformPaths } from '../platform/platform-paths.js';
5
+ import type { Logger } from '../../ports/logger.js';
6
+ /** Local project memory. Journal writes are authoritative; index reads are the fast path. */
7
+ export declare class FileMemoryStore implements MemoryStore {
8
+ private readonly paths;
9
+ private readonly logger?;
10
+ constructor(paths: PlatformPaths, logger?: Logger | undefined);
11
+ list(cwd: string, options?: MemoryListOptions): Promise<readonly MemoryRecord[]>;
12
+ search(cwd: string, query: MemorySearchQuery): Promise<readonly MemorySearchHit[]>;
13
+ ensureSemanticIndex(cwd: string, model: string, embed: (texts: readonly string[], signal?: AbortSignal) => Promise<readonly number[][]>, signal?: AbortSignal): Promise<void>;
14
+ semanticSearch(cwd: string, model: string, vector: readonly number[], maximum: number): Promise<readonly MemorySemanticHit[]>;
15
+ get(cwd: string, id: string): Promise<MemoryRecord | undefined>;
16
+ consolidate(cwd: string, draft: MemoryDraft): Promise<{
17
+ record: MemoryRecord;
18
+ action: 'insert' | 'merge' | 'supersede' | 'ignore';
19
+ }>;
20
+ forget(cwd: string, id: string): Promise<boolean>;
21
+ clear(cwd: string): Promise<number>;
22
+ markRetrieved(cwd: string, ids: readonly string[]): Promise<void>;
23
+ export(cwd: string): Promise<MemoryBundle>;
24
+ import(cwd: string, bundle: MemoryBundle): Promise<{
25
+ imported: number;
26
+ skipped: number;
27
+ }>;
28
+ private resolvePaths;
29
+ private readRecords;
30
+ private readSearchIndex;
31
+ private readIndex;
32
+ private readJournal;
33
+ private append;
34
+ private replaceJournal;
35
+ private writeIndex;
36
+ private pruneSemanticIndex;
37
+ }
@@ -0,0 +1,11 @@
1
+ import V from"node:crypto";import j from"node:fs/promises";import S from"node:path";import{effectiveMemoryRecord as M,MEMORY_SCHEMA_VERSION as m,memoryRecordFromDraft as L,normalizeMemoryBundle as D,normalizeMemoryRecord as B}from"../../domain/memory/memory.js";import{buildMemorySearchIndex as z,isMemoryRetrievable as K,searchMemoryIndex as _}from"../../domain/memory/memory-search.js";import{memoryKindDefinition as U,MEMORY_KINDS as T}from"../../domain/memory/memory-kinds.js";import{RESOURCE_LIMITS as h}from"../../domain/runtime/resource-limits.js";import{atomicWriteFile as E,withFileLock as y}from"../filesystem/atomic-file-store.js";import{readJsonFileBounded as k}from"../filesystem/bounded-json-reader.js";import{isFileNotFound as O}from"../filesystem/fs-errors.js";import{createProjectKey as W}from"../sessions/project-session-paths.js";class pe{paths;logger;constructor(e,t){this.paths=e,this.logger=t}async list(e,t={}){return(await this.readRecords(this.resolvePaths(e))).map(i=>M(i)).filter(i=>t.kind===void 0||i.kind===t.kind).filter(i=>t.state===void 0||i.state===t.state).sort((i,n)=>n.updatedAt.localeCompare(i.updatedAt)||i.id.localeCompare(n.id))}async search(e,t){const r=this.resolvePaths(e),i=await this.readRecords(r),n=Object.fromEntries(i.map(a=>[a.id,M(a)])),o=await this.readSearchIndex(r,i);return _(n,o,t)}async ensureSemanticIndex(e,t,r,i){const n=this.resolvePaths(e),o=await this.readRecords(n),a=await J(n.semanticIndexFile),p=a?.model===t?a.entries:{},c=o.filter(d=>p[d.id]?.contentHash!==f(d));if(c.length===0)return;const l=await r(c.map(d=>`${d.statement}
2
+ ${d.rationale??""}
3
+ ${d.topics.join(" ")}`),i);if(l.length!==c.length)throw new Error("Embedding provider returned an unexpected number of vectors.");await y(n.journalFile,async()=>{const d=await this.readRecords(n,!0),g=await J(n.semanticIndexFile),v=g?.model===t?{...g.entries}:{};for(const[u,x]of c.entries()){const R=d.find(H=>H.id===x.id),F=l[u];R===void 0||F===void 0||f(R)!==f(x)||(P(F),v[x.id]={contentHash:f(x),vector:[...F]})}const A={schemaVersion:m,model:t,entries:v,updatedAt:I()},b=`${JSON.stringify(A)}
4
+ `;if(Buffer.byteLength(b,"utf8")>h.memoryIndexBytes)throw new Error("Memory semantic index exceeds the supported size limit.");await E(n.semanticIndexFile,b)},w())}async semanticSearch(e,t,r,i){if(i<=0)return[];P(r);const n=this.resolvePaths(e);return y(n.journalFile,async()=>{const o=await this.readRecords(n,!0),a=await J(n.semanticIndexFile);if(a?.model!==t)return[];const p=new Map(o.map(c=>[c.id,M(c)]));return Object.keys(a.entries).flatMap(c=>{const l=a.entries[c];if(l===void 0)return[];const d=p.get(c);return d===void 0||!K(d)?[]:[{record:d,similarity:G(r,l.vector),rank:0}]}).sort((c,l)=>l.similarity-c.similarity||c.record.id.localeCompare(l.record.id)).slice(0,i).map((c,l)=>({...c,rank:l+1}))},w())}async get(e,t){const r=this.resolvePaths(e);return(await this.readRecords(r)).map(n=>M(n)).find(n=>n.id===t)}async consolidate(e,t){const r=this.resolvePaths(e);return y(r.journalFile,async()=>{const i=I(),n=L(V.randomUUID(),t,i),o=await this.readRecords(r,!0),a=o.find(u=>f(u)===f(n));if(a!==void 0){const u={...a,...n.rationale===void 0&&a.rationale===void 0?{}:{rationale:n.rationale??a.rationale},topics:[...new Set([...a.topics,...n.topics])].sort(),evidenceRefs:[...new Set([...a.evidenceRefs,...n.evidenceRefs])],updatedAt:i};if(!(JSON.stringify(u)!==JSON.stringify(a)))return{record:a,action:"ignore"};const R=o.map(F=>F.id===a.id?u:F);return await this.append(r,[{schemaVersion:m,type:"upsert",record:u}]),await this.writeIndex(r,R),{record:u,action:"merge"}}const p=new Set(n.supersedes),c=o.filter(u=>u.state==="active"&&p.has(u.id)),l=o.find(u=>u.state==="active"&&u.kind===n.kind&&ee(n.kind)&&te(u,n));if(l!==void 0&&c.length===0)return{record:l,action:"ignore"};const d=n,g=c.map(u=>u.id),v=o.map(u=>g.includes(u.id)?{...u,state:"superseded",updatedAt:i}:u),A=[...v,d],b=[...v.filter((u,x)=>u!==o[x]).map(u=>({schemaVersion:m,type:"upsert",record:u})),{schemaVersion:m,type:"upsert",record:d}];if(A.length>h.memoryRecords)throw new Error("Memory capacity reached. Forget or clear memories before adding more.");return await this.append(r,b),await this.writeIndex(r,A),{record:d,action:g.length>0?"supersede":"insert"}},w())}async forget(e,t){const r=this.resolvePaths(e);return y(r.journalFile,async()=>{const i=await this.readRecords(r,!0),n=i.filter(o=>o.id!==t);return n.length===i.length?!1:(await this.replaceJournal(r,n),await this.writeIndex(r,n),await this.pruneSemanticIndex(r,n),!0)},w())}async clear(e){const t=this.resolvePaths(e);return y(t.journalFile,async()=>{const r=await this.readRecords(t,!0);return r.length===0?0:(await this.replaceJournal(t,[]),await this.writeIndex(t,[]),await this.pruneSemanticIndex(t,[]),r.length)},w())}async markRetrieved(e,t){if(t.length===0)return;const r=this.resolvePaths(e);await y(r.journalFile,async()=>{const i=new Set(t),n=I(),o=await this.readRecords(r,!0),a=o.map(c=>i.has(c.id)?{...c,retrievalCount:c.retrievalCount+1,lastRetrievedAt:n,updatedAt:n}:c),p=a.filter((c,l)=>c!==o[l]).map(c=>({schemaVersion:m,type:"upsert",record:c}));p.length!==0&&(await this.append(r,p),await this.writeIndex(r,a))},w())}async export(e){return{schemaVersion:m,exportedAt:I(),records:await this.list(e)}}async import(e,t){const r=D(t),i=this.resolvePaths(e);return y(i.journalFile,async()=>{const n=await this.readRecords(i,!0),o=new Set(n.map(d=>d.id)),a=new Set(n.map(f)),p=r.records.filter(d=>!o.has(d.id)&&!a.has(f(d)));if(n.length+p.length>h.memoryRecords)throw new Error("Import exceeds the local memory capacity.");const c=I(),l=p.map(d=>({...d,source:"imported",state:"active",updatedAt:c}));if(l.length>0){const d=[...n,...l];await this.append(i,l.map(g=>({schemaVersion:m,type:"upsert",record:g}))),await this.writeIndex(i,d)}return{imported:l.length,skipped:r.records.length-l.length}},w())}resolvePaths(e){const t=S.join(this.paths.projectsDir,W(e,this.paths.platform),"memory");return{directory:t,journalFile:S.join(t,"journal.jsonl"),indexFile:S.join(t,"index.json"),semanticIndexFile:S.join(t,"semantic-index.json")}}async readRecords(e,t=!1){if(!t)return y(e.journalFile,()=>this.readRecords(e,!0),w());const r=await C(e.journalFile),i=await this.readIndex(e.indexFile);if(i?.journalFingerprint===r)return i.records;const n=Q(await this.readJournal(e.journalFile));return await this.writeIndex(e,n),this.logger?.info("memory.index.rebuilt",{projectKey:Z(e.directory),count:n.length}),n}async readSearchIndex(e,t){const r=await this.readIndex(e.indexFile);return r!==void 0&&r.records.length===t.length&&r.records.every((n,o)=>n.id===t[o]?.id&&n.updatedAt===t[o]?.updatedAt)?r.search:z(t)}async readIndex(e){try{const t=await k(e,h.memoryIndexBytes);return q(t)}catch(t){return O(t),void 0}}async readJournal(e){let t;try{if((await j.stat(e)).size>h.memoryJournalBytes)throw new Error("Memory journal exceeds the supported size limit. Export and clear memory before continuing.");t=await j.readFile(e,"utf8")}catch(r){if(O(r))return[];throw r}try{return N(t)}catch(r){if(!t.endsWith(`
5
+ `))return await new Promise(i=>setImmediate(i)),N(await j.readFile(e,"utf8"));throw r}}async append(e,t){if(t.length===0)return;await j.mkdir(e.directory,{recursive:!0});const r=t.map(n=>JSON.stringify(n)).join(`
6
+ `).concat(`
7
+ `);if(await X(e.journalFile)+Buffer.byteLength(r,"utf8")>h.memoryJournalBytes)throw new Error("Memory journal exceeds the supported size limit. Export and clear memory before continuing.");await j.appendFile(e.journalFile,r,{encoding:"utf8",mode:384})}async replaceJournal(e,t){const r=t.map(n=>({schemaVersion:m,type:"upsert",record:n})),i=r.length===0?"":`${r.map(n=>JSON.stringify(n)).join(`
8
+ `)}
9
+ `;if(Buffer.byteLength(i,"utf8")>h.memoryJournalBytes)throw new Error("Memory journal exceeds the supported size limit.");await E(e.journalFile,i)}async writeIndex(e,t,r=z(t)){const i={schemaVersion:m,journalFingerprint:await C(e.journalFile),records:t,search:r,...$(t),updatedAt:I()},n=`${JSON.stringify(i,null,2)}
10
+ `;if(Buffer.byteLength(n,"utf8")>h.memoryIndexBytes)throw new Error("Memory index exceeds the supported size limit.");await E(e.indexFile,n)}async pruneSemanticIndex(e,t){const r=await J(e.semanticIndexFile);if(r===void 0)return;const i=new Map(t.map(o=>[o.id,o])),n=Object.fromEntries(Object.entries(r.entries).filter(([o,a])=>i.get(o)!==void 0&&f(i.get(o))===a.contentHash));await E(e.semanticIndexFile,`${JSON.stringify({...r,entries:n,updatedAt:I()})}
11
+ `)}}function N(s){return s.split(/\r?\n/u).filter(Boolean).map(e=>Y(JSON.parse(e)))}function Y(s){if(typeof s!="object"||s===null||Array.isArray(s))throw new Error("Invalid memory journal entry.");const e=s;if(e.schemaVersion!==m||e.type!=="upsert")throw new Error("Unsupported memory journal entry.");return{schemaVersion:m,type:"upsert",record:B(e.record)}}function q(s){if(typeof s!="object"||s===null||Array.isArray(s))return;const e=s;if(!(e.schemaVersion!==m||typeof e.journalFingerprint!="string"||typeof e.updatedAt!="string"||!Array.isArray(e.records)))try{const t=e.records.map(i=>B(i)),r=z(t);return{schemaVersion:m,journalFingerprint:e.journalFingerprint,records:t,search:r,...$(t),updatedAt:e.updatedAt}}catch{return}}async function J(s){try{const e=await k(s,h.memoryIndexBytes);if(typeof e!="object"||e===null||Array.isArray(e))return;const t=e;if(t.schemaVersion!==m||typeof t.model!="string"||typeof t.updatedAt!="string"||typeof t.entries!="object"||t.entries===null||Array.isArray(t.entries))return;const r={};for(const[i,n]of Object.entries(t.entries)){if(typeof n!="object"||n===null||Array.isArray(n))return;const o=n;if(typeof o.contentHash!="string"||!Array.isArray(o.vector)||o.vector.some(a=>typeof a!="number"||!Number.isFinite(a)))return;r[i]={contentHash:o.contentHash,vector:o.vector}}return{schemaVersion:m,model:t.model,entries:r,updatedAt:t.updatedAt}}catch{return}}function P(s){if(s.length===0||s.length>4096||s.some(e=>!Number.isFinite(e)))throw new Error("Embedding vector is invalid.")}function G(s,e){if(s.length!==e.length)return-1;let t=0,r=0,i=0;for(let n=0;n<s.length;n+=1)t+=s[n]*e[n],r+=s[n]**2,i+=e[n]**2;return r===0||i===0?0:t/Math.sqrt(r*i)}function Q(s){const e=new Map;for(const t of s)e.set(t.record.id,t.record);return[...e.values()]}function $(s){const e=Object.fromEntries(T.map(r=>[r,s.filter(i=>i.kind===r).map(i=>i.id)])),t=Object.fromEntries(["active","superseded","expired"].map(r=>[r,s.filter(i=>i.state===r).map(i=>i.id)]));return{activeIds:s.filter(r=>r.state==="active").map(r=>r.id),kindIds:e,stateIds:t}}async function X(s){try{return(await j.stat(s)).size}catch(e){if(O(e))return 0;throw e}}async function C(s){try{const e=await j.stat(s);return`${e.size}:${e.mtimeMs}`}catch(e){if(O(e))return"missing";throw e}}function f(s){return V.createHash("sha256").update(`${s.kind}\0${s.statement.trim().toLocaleLowerCase()}\0${s.topics.join("\0")}`,"utf8").digest("hex")}function Z(s){return V.createHash("sha256").update(s,"utf8").digest("hex").slice(0,16)}function ee(s){return U(s).consolidationPolicy==="retain-on-conflict"}function te(s,e){if(s.topics.length===0||e.topics.length===0)return!1;const t=new Set(s.topics);return e.topics.some(r=>t.has(r))}function w(){return{userMessage:"Memory is being updated by another LotaGate process. Try again shortly."}}function I(){return new Date().toISOString()}export{pe as FileMemoryStore};
@@ -0,0 +1,23 @@
1
+ import https from 'node:https';
2
+ export interface DownloadedMedia {
3
+ readonly bytes: Uint8Array;
4
+ readonly contentType: string | undefined;
5
+ }
6
+ export interface PublicMediaAddress {
7
+ readonly address: string;
8
+ readonly family: 4 | 6;
9
+ }
10
+ export interface PublicMediaDownloaderDependencies {
11
+ resolveAddresses?: (hostname: string) => Promise<readonly PublicMediaAddress[]>;
12
+ request?: typeof https.request;
13
+ }
14
+ interface DownloadOptions {
15
+ readonly maxBytes: number;
16
+ readonly timeoutMs: number;
17
+ readonly signal?: AbortSignal | undefined;
18
+ }
19
+ /** Downloads a generated artifact only through a verified public HTTPS address. */
20
+ export declare function downloadPublicMedia(rawUrl: string | undefined, options: DownloadOptions): Promise<DownloadedMedia>;
21
+ /** Creates an isolated downloader for CLI infrastructure tests and alternate Node transports. */
22
+ export declare function createPublicMediaDownloader(dependencies?: PublicMediaDownloaderDependencies): (rawUrl: string | undefined, options: DownloadOptions) => Promise<DownloadedMedia>;
23
+ export {};
@@ -0,0 +1 @@
1
+ import{lookup as v}from"node:dns/promises";import E from"node:https";import{isIP as L}from"node:net";import{CliError as h}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as b}from"../../domain/errors/error-codes.js";async function H(e,t){return I()(e,t)}function I(e={}){const t=e.resolveAddresses??P,r=e.request??E.request;return async(o,n)=>{const s=g(o);return D(n,async d=>{const l=await R(s.hostname,t,d,n.signal),i=await A(s,l,r,d,n.signal);if(i.statusCode===void 0||i.statusCode<200||i.statusCode>=300)throw i.destroy(),f(`Image download failed with HTTP ${i.statusCode??"unknown"}.`);const a=i.headers["content-length"],c=Array.isArray(a)?a[0]:a;if(c!==void 0&&(!/^\d+$/u.test(c)||Number(c)>n.maxBytes))throw i.destroy(),f("Downloaded image exceeds the supported output limit.");return{bytes:await C(i,n.maxBytes,d,n.signal),contentType:$(i.headers["content-type"])}})}}function g(e){if(e===void 0)throw f("The provider returned an image without Base64 data or a download URL.");let t;try{t=new URL(e)}catch{throw f("The provider returned an invalid image download URL.")}if(t.protocol!=="https:"||t.username||t.password||t.port!==""&&t.port!=="443")throw f("Image download URLs must use public HTTPS on port 443.");return t}async function R(e,t,r,o){if(e.toLowerCase()==="localhost")throw f("Image download URL must not target localhost.");const n=await U(t(e),r,o);if(n.length===0||n.some(s=>!B(s.address)))throw f("Image download URL must resolve only to public network addresses.");return n}async function P(e){return(await v(e,{all:!0,verbatim:!0})).map(r=>({address:r.address,family:r.family===6?6:4}))}async function A(e,t,r,o,n){let s;for(const l of t)try{return await T(e,l,r,o,n)}catch(i){if(o.aborted)throw m(n);s=i}const d=s instanceof Error&&s.message.length>0?`: ${s.message}`:"";throw f(`Image download failed${d}`)}function T(e,t,r,o,n){return new Promise((s,d)=>{let l=!1,i;const a=u=>{l||(l=!0,o.removeEventListener("abort",c),u())},c=()=>{const u=m(n);i?.destroy(u),a(()=>d(u))};try{i=r({protocol:"https:",hostname:e.hostname,port:443,path:`${e.pathname}${e.search}`,method:"GET",servername:e.hostname,lookup:(u,p,w)=>{p.all===!0?w(null,[{address:t.address,family:t.family}]):w(null,t.address,t.family)}},u=>a(()=>s(u))),i.once("error",u=>a(()=>d(u))),o.aborted?c():o.addEventListener("abort",c,{once:!0}),i.end()}catch(u){a(()=>d(u))}})}async function C(e,t,r,o){const n=[];let s=0;const d=()=>{e.destroy()};r.aborted?d():r.addEventListener("abort",d,{once:!0});try{for await(const a of e){if(r.aborted)throw m(o);const c=Buffer.isBuffer(a)?a:Buffer.from(a);if(s+=c.byteLength,s>t)throw e.destroy(),f("Downloaded image exceeds the supported output limit.");n.push(c)}}catch(a){throw r.aborted?m(o):a instanceof h?a:f(a instanceof Error?`Image download failed: ${a.message}`:"Image download failed.")}finally{r.removeEventListener("abort",d)}if(r.aborted)throw m(o);const l=new Uint8Array(s);let i=0;for(const a of n)l.set(a,i),i+=a.byteLength;return l}async function D(e,t){const r=new AbortController,o=setTimeout(()=>r.abort(new Error("Image download timed out.")),e.timeoutMs),n=()=>r.abort(e.signal?.reason);e.signal?.aborted?n():e.signal?.addEventListener("abort",n,{once:!0});try{return await t(r.signal)}finally{clearTimeout(o),e.signal?.removeEventListener("abort",n)}}async function U(e,t,r){if(t.aborted)throw m(r);return new Promise((o,n)=>{const s=()=>{t.removeEventListener("abort",s),n(m(r))};t.addEventListener("abort",s,{once:!0}),e.then(d=>{t.removeEventListener("abort",s),o(d)},d=>{t.removeEventListener("abort",s),n(d)})})}function $(e){return(Array.isArray(e)?e[0]:e)?.split(";",1)[0]?.trim()||void 0}function B(e){const t=L(e);return t===4?y(e):t===6?k(e):!1}function y(e){const t=e.split(".").map(Number),[r,o]=t;return!(r===void 0||o===void 0||r===0||r===10||r===127||r>=224||r===100&&o>=64&&o<=127||r===169&&o===254||r===172&&o>=16&&o<=31||r===192&&o===168||r===198&&(o===18||o===19))}function k(e){const t=e.toLowerCase();if(t==="::"||t==="::1"||t.startsWith("fe80:")||t.startsWith("fc")||t.startsWith("fd"))return!1;const r=t.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/u);return r===null||y(r[1])}function m(e){return e?.aborted?q(e.reason):f("Image download timed out.")}function q(e){return new h(b.INTERRUPTED,"Media command interrupted.",{category:"media",userMessage:"Media command interrupted.",retryable:!0,cause:e})}function f(e){return new h(b.INVALID_ARGUMENT,e,{category:"media",userMessage:e})}export{I as createPublicMediaDownloader,H as downloadPublicMedia};