@lotagate/cli 0.1.20 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application/agent/agent-history.d.ts +3 -0
- package/dist/application/agent/agent-history.js +81 -0
- package/dist/application/agent/agent-input-context.d.ts +9 -0
- package/dist/application/agent/agent-input-context.js +12 -0
- package/dist/application/agent/agent-limit.d.ts +3 -0
- package/dist/application/agent/agent-limit.js +12 -0
- package/dist/application/agent/agent-run-tracker.d.ts +30 -0
- package/dist/application/agent/agent-run-tracker.js +68 -0
- package/dist/application/agent/agent-session-store.d.ts +19 -0
- package/dist/application/agent/agent-session-store.js +74 -0
- package/dist/application/agent/capability-profile.d.ts +37 -0
- package/dist/application/agent/capability-profile.js +13 -0
- package/dist/application/agent/cli-agent-execution-service.d.ts +81 -0
- package/dist/application/agent/cli-agent-execution-service.js +279 -0
- package/dist/application/agent/context-compaction-persistence.d.ts +8 -0
- package/dist/application/agent/context-compaction-persistence.js +27 -0
- package/dist/application/agent/context-compaction.d.ts +20 -0
- package/dist/application/agent/context-compaction.js +114 -0
- package/dist/application/agent/prompt-data-safety.d.ts +14 -0
- package/dist/application/agent/prompt-data-safety.js +38 -0
- package/dist/application/agent/safe-system-prompt.d.ts +3 -0
- package/dist/application/agent/safe-system-prompt.js +19 -0
- package/dist/application/agent/scoped-tool-executor.d.ts +13 -0
- package/dist/application/agent/scoped-tool-executor.js +32 -0
- package/dist/application/agent/system-prompt-builder.d.ts +14 -0
- package/dist/application/agent/system-prompt-builder.js +199 -0
- package/dist/application/agent/tool-catalog.d.ts +14 -0
- package/dist/application/agent/tool-catalog.js +30 -0
- package/dist/application/agent/tool-display.d.ts +6 -0
- package/dist/application/agent/tool-display.js +59 -0
- package/dist/application/agent/tool-hook-lifecycle.d.ts +19 -0
- package/dist/application/agent/tool-hook-lifecycle.js +85 -0
- package/dist/application/auth/authentication-service.d.ts +20 -0
- package/dist/application/auth/authentication-service.js +44 -0
- package/dist/application/chat/chat-service.d.ts +12 -0
- package/dist/application/chat/chat-service.js +19 -0
- package/dist/application/chat/pending-attachment-store.d.ts +12 -0
- package/dist/application/chat/pending-attachment-store.js +28 -0
- package/dist/application/commands/application-command-executor.d.ts +20 -0
- package/dist/application/commands/application-command-executor.js +66 -0
- package/dist/application/commands/cli-args.d.ts +6 -0
- package/dist/application/commands/cli-args.js +43 -0
- package/dist/application/commands/cli-command-services.d.ts +16 -0
- package/dist/application/commands/cli-command-services.js +405 -0
- package/dist/application/commands/command-catalog.d.ts +6 -0
- package/dist/application/commands/command-catalog.js +159 -0
- package/dist/application/commands/command-contract.d.ts +58 -0
- package/dist/application/commands/command-contract.js +1 -0
- package/dist/application/commands/command-hints.d.ts +9 -0
- package/dist/application/commands/command-hints.js +17 -0
- package/dist/application/commands/command-output.d.ts +4 -0
- package/dist/application/commands/command-output.js +1 -0
- package/dist/application/commands/command-parser.d.ts +10 -0
- package/dist/application/commands/command-parser.js +155 -0
- package/dist/application/commands/command-presentation.d.ts +7 -0
- package/dist/application/commands/command-presentation.js +131 -0
- package/dist/application/commands/command-registry.d.ts +11 -0
- package/dist/application/commands/command-registry.js +64 -0
- package/dist/application/commands/command-runtime.d.ts +2 -0
- package/dist/application/commands/command-runtime.js +3 -0
- package/dist/application/commands/goal-command-handlers.d.ts +3 -0
- package/dist/application/commands/goal-command-handlers.js +120 -0
- package/dist/application/commands/media-command-handlers.d.ts +9 -0
- package/dist/application/commands/media-command-handlers.js +307 -0
- package/dist/application/commands/media-command-output.d.ts +11 -0
- package/dist/application/commands/media-command-output.js +8 -0
- package/dist/application/commands/runtime-command-handlers.d.ts +7 -0
- package/dist/application/commands/runtime-command-handlers.js +177 -0
- package/dist/application/commands/stream-output.d.ts +4 -0
- package/dist/application/commands/stream-output.js +10 -0
- package/dist/application/commands/utility-commands.d.ts +6 -0
- package/dist/application/commands/utility-commands.js +81 -0
- package/dist/application/config/execution-config.d.ts +4 -0
- package/dist/application/config/execution-config.js +6 -0
- package/dist/application/extensions/extension-list-contract.d.ts +13 -0
- package/dist/application/extensions/extension-list-contract.js +1 -0
- package/dist/application/extensions/extension-list-formatters.d.ts +31 -0
- package/dist/application/extensions/extension-list-formatters.js +98 -0
- package/dist/application/extensions/extension-list-output.d.ts +3 -0
- package/dist/application/extensions/extension-list-output.js +7 -0
- package/dist/application/extensions/plugin-contribution-registry.d.ts +15 -0
- package/dist/application/extensions/plugin-contribution-registry.js +80 -0
- package/dist/application/extensions/skill-scope-store.d.ts +23 -0
- package/dist/application/extensions/skill-scope-store.js +33 -0
- package/dist/application/formatting/compact-number.d.ts +2 -0
- package/dist/application/formatting/compact-number.js +18 -0
- package/dist/application/formatting/compact-table.d.ts +22 -0
- package/dist/application/formatting/compact-table.js +49 -0
- package/dist/application/media/video-operation-poller.d.ts +5 -0
- package/dist/application/media/video-operation-poller.js +42 -0
- package/dist/application/model/cached-model-catalog.d.ts +13 -0
- package/dist/application/model/cached-model-catalog.js +31 -0
- package/dist/application/model/initial-model-selection.d.ts +10 -0
- package/dist/application/model/initial-model-selection.js +11 -0
- package/dist/application/model/model-catalog-service.d.ts +6 -0
- package/dist/application/model/model-catalog-service.js +13 -0
- package/dist/application/model/model-context-window.d.ts +3 -0
- package/dist/application/model/model-context-window.js +23 -0
- package/dist/application/orchestration/cli-subagent-service.d.ts +70 -0
- package/dist/application/orchestration/cli-subagent-service.js +328 -0
- package/dist/application/orchestration/cli-turn-event-projector.d.ts +12 -0
- package/dist/application/orchestration/cli-turn-event-projector.js +81 -0
- package/dist/application/orchestration/cli-turn-events.d.ts +76 -0
- package/dist/application/orchestration/cli-turn-events.js +39 -0
- package/dist/application/orchestration/cli-turn-persistence.d.ts +6 -0
- package/dist/application/orchestration/cli-turn-persistence.js +14 -0
- package/dist/application/orchestration/goal-evaluator.d.ts +18 -0
- package/dist/application/orchestration/goal-evaluator.js +88 -0
- package/dist/application/orchestration/goal-input.d.ts +3 -0
- package/dist/application/orchestration/goal-input.js +19 -0
- package/dist/application/orchestration/goal-output.d.ts +2 -0
- package/dist/application/orchestration/goal-output.js +11 -0
- package/dist/application/orchestration/goal-runner.d.ts +22 -0
- package/dist/application/orchestration/goal-runner.js +153 -0
- package/dist/application/orchestration/goal-usage.d.ts +9 -0
- package/dist/application/orchestration/goal-usage.js +19 -0
- package/dist/application/orchestration/headless-agent-turn.d.ts +32 -0
- package/dist/application/orchestration/headless-agent-turn.js +82 -0
- package/dist/application/orchestration/plan-generator.d.ts +7 -0
- package/dist/application/orchestration/plan-generator.js +34 -0
- package/dist/application/orchestration/subagent-coordinator.d.ts +33 -0
- package/dist/application/orchestration/subagent-coordinator.js +28 -0
- package/dist/application/orchestration/subagent-handoff.d.ts +2 -0
- package/dist/application/orchestration/subagent-handoff.js +68 -0
- package/dist/application/orchestration/subagent-tool-executor.d.ts +12 -0
- package/dist/application/orchestration/subagent-tool-executor.js +93 -0
- package/dist/application/orchestration/task-assessment.d.ts +4 -0
- package/dist/application/orchestration/task-assessment.js +35 -0
- package/dist/application/orchestration/task-graph.d.ts +13 -0
- package/dist/application/orchestration/task-graph.js +56 -0
- package/dist/application/orchestration/task-scheduler.d.ts +18 -0
- package/dist/application/orchestration/task-scheduler.js +88 -0
- package/dist/application/project/project-trust-service.d.ts +13 -0
- package/dist/application/project/project-trust-service.js +74 -0
- package/dist/application/protocol/browser-host-tool-executor.d.ts +41 -0
- package/dist/application/protocol/browser-host-tool-executor.js +88 -0
- package/dist/application/protocol/desktop-agent-command.d.ts +9 -0
- package/dist/application/protocol/desktop-agent-command.js +663 -0
- package/dist/application/protocol/desktop-attachment-store.d.ts +16 -0
- package/dist/application/protocol/desktop-attachment-store.js +82 -0
- package/dist/application/protocol/desktop-command-catalog.d.ts +2 -0
- package/dist/application/protocol/desktop-command-catalog.js +19 -0
- package/dist/application/protocol/desktop-command-contract.d.ts +22 -0
- package/dist/application/protocol/desktop-command-contract.js +3 -0
- package/dist/application/protocol/desktop-command-executor.d.ts +16 -0
- package/dist/application/protocol/desktop-command-executor.js +47 -0
- package/dist/application/protocol/desktop-command-output.d.ts +15 -0
- package/dist/application/protocol/desktop-command-output.js +24 -0
- package/dist/application/protocol/desktop-execution-policy.d.ts +17 -0
- package/dist/application/protocol/desktop-execution-policy.js +49 -0
- package/dist/application/protocol/desktop-host-tool-executor.d.ts +57 -0
- package/dist/application/protocol/desktop-host-tool-executor.js +53 -0
- package/dist/application/protocol/desktop-orchestration-events.d.ts +5 -0
- package/dist/application/protocol/desktop-orchestration-events.js +37 -0
- package/dist/application/protocol/json-line-writer.d.ts +9 -0
- package/dist/application/protocol/json-line-writer.js +19 -0
- package/dist/application/protocol/jsonl-agent-command.d.ts +3 -0
- package/dist/application/protocol/jsonl-agent-command.js +97 -0
- package/dist/application/protocol/jsonl-protocol.d.ts +52 -0
- package/dist/application/protocol/jsonl-protocol.js +170 -0
- package/dist/application/security/desktop-tool-scope-policy.d.ts +3 -0
- package/dist/application/security/desktop-tool-scope-policy.js +52 -0
- package/dist/application/security/tool-action-risk-analyzer.d.ts +13 -0
- package/dist/application/security/tool-action-risk-analyzer.js +64 -0
- package/dist/application/security/tool-approval-service.d.ts +35 -0
- package/dist/application/security/tool-approval-service.js +97 -0
- package/dist/application/security/tool-risk-classifier.d.ts +11 -0
- package/dist/application/security/tool-risk-classifier.js +65 -0
- package/dist/application/security/workspace-permission-policy.d.ts +10 -0
- package/dist/application/security/workspace-permission-policy.js +50 -0
- package/dist/application/session/project-session-access.d.ts +8 -0
- package/dist/application/session/project-session-access.js +19 -0
- package/dist/application/session/session-compaction-service.d.ts +10 -0
- package/dist/application/session/session-compaction-service.js +43 -0
- package/dist/application/session/session-turn-lifecycle.d.ts +5 -0
- package/dist/application/session/session-turn-lifecycle.js +31 -0
- package/dist/application/workspace/workspace-file-index.d.ts +15 -0
- package/dist/application/workspace/workspace-file-index.js +60 -0
- package/dist/application/workspace/workspace-file-reference-resolver.d.ts +14 -0
- package/dist/application/workspace/workspace-file-reference-resolver.js +123 -0
- package/dist/application/workspace/workspace-instruction-loader.d.ts +8 -0
- package/dist/application/workspace/workspace-instruction-loader.js +55 -0
- package/dist/bootstrap/composition-root.d.ts +6 -0
- package/dist/bootstrap/composition-root.js +4 -0
- package/dist/bootstrap/global-cli-options.d.ts +6 -0
- package/dist/bootstrap/global-cli-options.js +29 -0
- package/dist/bootstrap/native-devtools-stub.d.ts +10 -0
- package/dist/bootstrap/native-devtools-stub.js +10 -0
- package/dist/bootstrap/native-entry.d.ts +1 -0
- package/dist/bootstrap/native-entry.js +6 -0
- package/dist/bootstrap/native-tiktoken.d.ts +4 -0
- package/dist/bootstrap/native-tiktoken.js +5 -0
- package/dist/bootstrap/runtime-factory.d.ts +35 -0
- package/dist/bootstrap/runtime-factory.js +44 -0
- package/dist/bootstrap/shutdown-manager.d.ts +10 -0
- package/dist/bootstrap/shutdown-manager.js +14 -0
- package/dist/bootstrap/startup-sequence.d.ts +5 -0
- package/dist/bootstrap/startup-sequence.js +10 -0
- package/dist/domain/auth/auth-profile.d.ts +14 -0
- package/dist/domain/auth/auth-profile.js +39 -0
- package/dist/domain/config/config-schema.d.ts +17 -0
- package/dist/domain/config/config-schema.js +105 -0
- package/dist/domain/errors/cli-command-hint.d.ts +5 -0
- package/dist/domain/errors/cli-command-hint.js +1 -0
- package/dist/domain/errors/cli-error.d.ts +35 -0
- package/dist/domain/errors/cli-error.js +129 -0
- package/dist/domain/errors/error-codes.d.ts +46 -0
- package/dist/domain/errors/error-codes.js +45 -0
- package/dist/domain/extensions/extension-scope.d.ts +3 -0
- package/dist/domain/extensions/extension-scope.js +23 -0
- package/dist/domain/extensions/extension-state.d.ts +5 -0
- package/dist/domain/extensions/extension-state.js +11 -0
- package/dist/domain/extensions/hook-manifest.d.ts +10 -0
- package/dist/domain/extensions/hook-manifest.js +23 -0
- package/dist/domain/extensions/mcp-config.d.ts +18 -0
- package/dist/domain/extensions/mcp-config.js +111 -0
- package/dist/domain/extensions/plugin-manifest.d.ts +11 -0
- package/dist/domain/extensions/plugin-manifest.js +43 -0
- package/dist/domain/extensions/skill-manifest.d.ts +10 -0
- package/dist/domain/extensions/skill-manifest.js +51 -0
- package/dist/domain/filesystem/file-change-diff.d.ts +21 -0
- package/dist/domain/filesystem/file-change-diff.js +60 -0
- package/dist/domain/media/gateway-media-contract.d.ts +23 -0
- package/dist/domain/media/gateway-media-contract.js +163 -0
- package/dist/domain/media/media-contract.d.ts +28 -0
- package/dist/domain/media/media-contract.js +1 -0
- package/dist/domain/media/media-execution-policy.d.ts +9 -0
- package/dist/domain/media/media-execution-policy.js +31 -0
- package/dist/domain/orchestration/goal.d.ts +58 -0
- package/dist/domain/orchestration/goal.js +113 -0
- package/dist/domain/orchestration/subagent-identity.d.ts +2 -0
- package/dist/domain/orchestration/subagent-identity.js +8 -0
- package/dist/domain/orchestration/subagent.d.ts +33 -0
- package/dist/domain/orchestration/subagent.js +1 -0
- package/dist/domain/orchestration/task.d.ts +31 -0
- package/dist/domain/orchestration/task.js +1 -0
- package/dist/domain/project/project-identity.d.ts +6 -0
- package/dist/domain/project/project-identity.js +4 -0
- package/dist/domain/runtime/assistant-delta-normalizer.d.ts +11 -0
- package/dist/domain/runtime/assistant-delta-normalizer.js +19 -0
- package/dist/domain/runtime/resource-limits.d.ts +60 -0
- package/dist/domain/runtime/resource-limits.js +60 -0
- package/dist/domain/session/attachment.d.ts +13 -0
- package/dist/domain/session/attachment.js +1 -0
- package/dist/domain/session/session-schema.d.ts +6 -0
- package/dist/domain/session/session-schema.js +28 -0
- package/dist/domain/session/session.d.ts +27 -0
- package/dist/domain/session/session.js +1 -0
- package/dist/domain/settings/settings-document.d.ts +8 -0
- package/dist/domain/settings/settings-document.js +36 -0
- package/dist/domain/validation/record-schema.d.ts +4 -0
- package/dist/domain/validation/record-schema.js +9 -0
- package/dist/domain/workspace/workspace-settings.d.ts +12 -0
- package/dist/domain/workspace/workspace-settings.js +44 -0
- package/dist/infrastructure/agent-sdk/agent-instance-factory.d.ts +22 -0
- package/dist/infrastructure/agent-sdk/agent-instance-factory.js +31 -0
- package/dist/infrastructure/agent-sdk/tool-calling-model-client.d.ts +11 -0
- package/dist/infrastructure/agent-sdk/tool-calling-model-client.js +447 -0
- package/dist/infrastructure/cache/cache-policy.d.ts +7 -0
- package/dist/infrastructure/cache/cache-policy.js +18 -0
- package/dist/infrastructure/cache/file-cache-store.d.ts +17 -0
- package/dist/infrastructure/cache/file-cache-store.js +121 -0
- package/dist/infrastructure/clipboard/clipboard-adapter-factory.d.ts +11 -0
- package/dist/infrastructure/clipboard/clipboard-adapter-factory.js +98 -0
- package/dist/infrastructure/clipboard/clipboard-policy.d.ts +8 -0
- package/dist/infrastructure/clipboard/clipboard-policy.js +19 -0
- package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.d.ts +10 -0
- package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.js +94 -0
- package/dist/infrastructure/clipboard/image-normalizer.d.ts +12 -0
- package/dist/infrastructure/clipboard/image-normalizer.js +78 -0
- package/dist/infrastructure/clipboard/windows-clipboard-adapter.d.ts +7 -0
- package/dist/infrastructure/clipboard/windows-clipboard-adapter.js +66 -0
- package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.d.ts +7 -0
- package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.js +70 -0
- package/dist/infrastructure/config/config-loader.d.ts +19 -0
- package/dist/infrastructure/config/config-loader.js +76 -0
- package/dist/infrastructure/config/environment-values.d.ts +2 -0
- package/dist/infrastructure/config/environment-values.js +7 -0
- package/dist/infrastructure/credentials/composite-credential-store.d.ts +11 -0
- package/dist/infrastructure/credentials/composite-credential-store.js +32 -0
- package/dist/infrastructure/credentials/encrypted-file-credential-store.d.ts +17 -0
- package/dist/infrastructure/credentials/encrypted-file-credential-store.js +181 -0
- package/dist/infrastructure/credentials/environment-credential-store.d.ts +11 -0
- package/dist/infrastructure/credentials/environment-credential-store.js +37 -0
- package/dist/infrastructure/credentials/secret-input.d.ts +7 -0
- package/dist/infrastructure/credentials/secret-input.js +44 -0
- package/dist/infrastructure/extensions/composite-mcp-config-store.d.ts +9 -0
- package/dist/infrastructure/extensions/composite-mcp-config-store.js +10 -0
- package/dist/infrastructure/extensions/extension-directory-reader.d.ts +2 -0
- package/dist/infrastructure/extensions/extension-directory-reader.js +15 -0
- package/dist/infrastructure/extensions/extension-source-resolver.d.ts +6 -0
- package/dist/infrastructure/extensions/extension-source-resolver.js +126 -0
- package/dist/infrastructure/extensions/file-mcp-config-store.d.ts +15 -0
- package/dist/infrastructure/extensions/file-mcp-config-store.js +66 -0
- package/dist/infrastructure/extensions/hook-runtime.d.ts +18 -0
- package/dist/infrastructure/extensions/hook-runtime.js +66 -0
- package/dist/infrastructure/extensions/mcp-runtime.d.ts +12 -0
- package/dist/infrastructure/extensions/mcp-runtime.js +52 -0
- package/dist/infrastructure/extensions/plugin-discovery.d.ts +5 -0
- package/dist/infrastructure/extensions/plugin-discovery.js +52 -0
- package/dist/infrastructure/extensions/plugin-manager.d.ts +26 -0
- package/dist/infrastructure/extensions/plugin-manager.js +139 -0
- package/dist/infrastructure/extensions/skill-discovery.d.ts +4 -0
- package/dist/infrastructure/extensions/skill-discovery.js +29 -0
- package/dist/infrastructure/extensions/skill-installer.d.ts +8 -0
- package/dist/infrastructure/extensions/skill-installer.js +88 -0
- package/dist/infrastructure/extensions/skill-manager.d.ts +22 -0
- package/dist/infrastructure/extensions/skill-manager.js +67 -0
- package/dist/infrastructure/extensions/skill-roots.d.ts +19 -0
- package/dist/infrastructure/extensions/skill-roots.js +25 -0
- package/dist/infrastructure/extensions/skill-tool-executor.d.ts +18 -0
- package/dist/infrastructure/extensions/skill-tool-executor.js +53 -0
- package/dist/infrastructure/filesystem/atomic-file-store.d.ts +12 -0
- package/dist/infrastructure/filesystem/atomic-file-store.js +106 -0
- package/dist/infrastructure/filesystem/bounded-file-reader.d.ts +6 -0
- package/dist/infrastructure/filesystem/bounded-file-reader.js +24 -0
- package/dist/infrastructure/filesystem/bounded-json-reader.d.ts +1 -0
- package/dist/infrastructure/filesystem/bounded-json-reader.js +7 -0
- package/dist/infrastructure/filesystem/fs-errors.d.ts +2 -0
- package/dist/infrastructure/filesystem/fs-errors.js +6 -0
- package/dist/infrastructure/filesystem/gateway-media-input-reader.d.ts +12 -0
- package/dist/infrastructure/filesystem/gateway-media-input-reader.js +49 -0
- package/dist/infrastructure/filesystem/local-filesystem-tool-executor.d.ts +21 -0
- package/dist/infrastructure/filesystem/local-filesystem-tool-executor.js +176 -0
- package/dist/infrastructure/filesystem/path-resolver.d.ts +20 -0
- package/dist/infrastructure/filesystem/path-resolver.js +119 -0
- package/dist/infrastructure/filesystem/workspace-media-artifact-store.d.ts +13 -0
- package/dist/infrastructure/filesystem/workspace-media-artifact-store.js +152 -0
- package/dist/infrastructure/logging/daily-rotating-file-writer.d.ts +20 -0
- package/dist/infrastructure/logging/daily-rotating-file-writer.js +75 -0
- package/dist/infrastructure/logging/log-redactor.d.ts +2 -0
- package/dist/infrastructure/logging/log-redactor.js +26 -0
- package/dist/infrastructure/logging/logging-policy.d.ts +6 -0
- package/dist/infrastructure/logging/logging-policy.js +6 -0
- package/dist/infrastructure/logging/structured-logger.d.ts +24 -0
- package/dist/infrastructure/logging/structured-logger.js +40 -0
- package/dist/infrastructure/network/safe-media-downloader.d.ts +23 -0
- package/dist/infrastructure/network/safe-media-downloader.js +239 -0
- package/dist/infrastructure/platform/host-platform.d.ts +14 -0
- package/dist/infrastructure/platform/host-platform.js +23 -0
- package/dist/infrastructure/platform/host-process.d.ts +17 -0
- package/dist/infrastructure/platform/host-process.js +116 -0
- package/dist/infrastructure/platform/platform-paths.d.ts +25 -0
- package/dist/infrastructure/platform/platform-paths.js +33 -0
- package/dist/infrastructure/project/file-project-trust-store.d.ts +12 -0
- package/dist/infrastructure/project/file-project-trust-store.js +59 -0
- package/dist/infrastructure/sdk/chat-completion-adapter.d.ts +8 -0
- package/dist/infrastructure/sdk/chat-completion-adapter.js +115 -0
- package/dist/infrastructure/sdk/lotagate-client-factory.d.ts +3 -0
- package/dist/infrastructure/sdk/lotagate-client-factory.js +8 -0
- package/dist/infrastructure/sdk/model-catalog-adapter.d.ts +19 -0
- package/dist/infrastructure/sdk/model-catalog-adapter.js +28 -0
- package/dist/infrastructure/sdk/sdk-media-gateway-client.d.ts +20 -0
- package/dist/infrastructure/sdk/sdk-media-gateway-client.js +97 -0
- package/dist/infrastructure/sessions/file-goal-store.d.ts +21 -0
- package/dist/infrastructure/sessions/file-goal-store.js +160 -0
- package/dist/infrastructure/sessions/file-session-store.d.ts +48 -0
- package/dist/infrastructure/sessions/file-session-store.js +525 -0
- package/dist/infrastructure/sessions/project-session-paths.d.ts +17 -0
- package/dist/infrastructure/sessions/project-session-paths.js +41 -0
- package/dist/infrastructure/sessions/session-index.d.ts +16 -0
- package/dist/infrastructure/sessions/session-index.js +84 -0
- package/dist/infrastructure/sessions/session-journal.d.ts +22 -0
- package/dist/infrastructure/sessions/session-journal.js +137 -0
- package/dist/infrastructure/sessions/subagent-journal-store.d.ts +28 -0
- package/dist/infrastructure/sessions/subagent-journal-store.js +30 -0
- package/dist/infrastructure/shell/shell-tool-executor.d.ts +17 -0
- package/dist/infrastructure/shell/shell-tool-executor.js +115 -0
- package/dist/infrastructure/tokens/tiktoken-token-estimator.d.ts +18 -0
- package/dist/infrastructure/tokens/tiktoken-token-estimator.js +48 -0
- package/dist/infrastructure/workspace/workspace-settings-store.d.ts +9 -0
- package/dist/infrastructure/workspace/workspace-settings-store.js +75 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.js +66 -0
- package/dist/ports/cache-store.d.ts +10 -0
- package/dist/ports/cache-store.js +1 -0
- package/dist/ports/chat-model.d.ts +30 -0
- package/dist/ports/chat-model.js +1 -0
- package/dist/ports/clipboard-adapter.d.ts +7 -0
- package/dist/ports/clipboard-adapter.js +1 -0
- package/dist/ports/clipboard-text-adapter.d.ts +3 -0
- package/dist/ports/clipboard-text-adapter.js +1 -0
- package/dist/ports/credential-store.d.ts +7 -0
- package/dist/ports/credential-store.js +1 -0
- package/dist/ports/goal-store.d.ts +12 -0
- package/dist/ports/goal-store.js +1 -0
- package/dist/ports/logger.d.ts +8 -0
- package/dist/ports/logger.js +1 -0
- package/dist/ports/media-gateway-client.d.ts +54 -0
- package/dist/ports/media-gateway-client.js +1 -0
- package/dist/ports/model-diagnostics.d.ts +17 -0
- package/dist/ports/model-diagnostics.js +1 -0
- package/dist/ports/project-trust-store.d.ts +12 -0
- package/dist/ports/project-trust-store.js +1 -0
- package/dist/ports/session-store.d.ts +58 -0
- package/dist/ports/session-store.js +1 -0
- package/dist/ports/subagent-lifecycle.d.ts +31 -0
- package/dist/ports/subagent-lifecycle.js +1 -0
- package/dist/ports/tool-activity.d.ts +13 -0
- package/dist/ports/tool-activity.js +1 -0
- package/dist/presentation/themes/theme.d.ts +19 -0
- package/dist/presentation/themes/theme.js +8 -0
- package/dist/presentation/tui/agent-initialization-renderer.d.ts +4 -0
- package/dist/presentation/tui/agent-initialization-renderer.js +37 -0
- package/dist/presentation/tui/context-display.d.ts +21 -0
- package/dist/presentation/tui/context-display.js +33 -0
- package/dist/presentation/tui/formatters.d.ts +6 -0
- package/dist/presentation/tui/formatters.js +60 -0
- package/dist/presentation/tui/ink/choice-window.d.ts +5 -0
- package/dist/presentation/tui/ink/choice-window.js +5 -0
- package/dist/presentation/tui/ink/components/activity-entry.d.ts +6 -0
- package/dist/presentation/tui/ink/components/activity-entry.js +16 -0
- package/dist/presentation/tui/ink/components/activity-status.d.ts +10 -0
- package/dist/presentation/tui/ink/components/activity-status.js +21 -0
- package/dist/presentation/tui/ink/components/choice-modal.d.ts +11 -0
- package/dist/presentation/tui/ink/components/choice-modal.js +29 -0
- package/dist/presentation/tui/ink/components/composer.d.ts +40 -0
- package/dist/presentation/tui/ink/components/composer.js +271 -0
- package/dist/presentation/tui/ink/components/file-diff.d.ts +6 -0
- package/dist/presentation/tui/ink/components/file-diff.js +34 -0
- package/dist/presentation/tui/ink/components/modal.d.ts +8 -0
- package/dist/presentation/tui/ink/components/modal.js +110 -0
- package/dist/presentation/tui/ink/components/shimmer-text.d.ts +6 -0
- package/dist/presentation/tui/ink/components/shimmer-text.js +9 -0
- package/dist/presentation/tui/ink/components/subagent-activity.d.ts +11 -0
- package/dist/presentation/tui/ink/components/subagent-activity.js +61 -0
- package/dist/presentation/tui/ink/components/transcript.d.ts +39 -0
- package/dist/presentation/tui/ink/components/transcript.js +121 -0
- package/dist/presentation/tui/ink/components/welcome-panel.d.ts +6 -0
- package/dist/presentation/tui/ink/components/welcome-panel.js +20 -0
- package/dist/presentation/tui/ink/lotagate-tui.d.ts +6 -0
- package/dist/presentation/tui/ink/lotagate-tui.js +136 -0
- package/dist/presentation/tui/ink/markdown-inline-renderer.d.ts +4 -0
- package/dist/presentation/tui/ink/markdown-inline-renderer.js +20 -0
- package/dist/presentation/tui/ink/markdown-inline.d.ts +13 -0
- package/dist/presentation/tui/ink/markdown-inline.js +91 -0
- package/dist/presentation/tui/ink/markdown-message.d.ts +6 -0
- package/dist/presentation/tui/ink/markdown-message.js +66 -0
- package/dist/presentation/tui/ink/markdown-table.d.ts +16 -0
- package/dist/presentation/tui/ink/markdown-table.js +77 -0
- package/dist/presentation/tui/ink/tui-bridge.d.ts +195 -0
- package/dist/presentation/tui/ink/tui-bridge.js +289 -0
- package/dist/presentation/tui/terminal-capabilities.d.ts +15 -0
- package/dist/presentation/tui/terminal-capabilities.js +7 -0
- package/dist/presentation/tui/terminal-mouse.d.ts +5 -0
- package/dist/presentation/tui/terminal-mouse.js +19 -0
- package/dist/presentation/tui/terminal-screen.d.ts +10 -0
- package/dist/presentation/tui/terminal-screen.js +23 -0
- package/dist/presentation/tui/tui-agent-event-runner.d.ts +24 -0
- package/dist/presentation/tui/tui-agent-event-runner.js +69 -0
- package/dist/presentation/tui/tui-application-contract.d.ts +10 -0
- package/dist/presentation/tui/tui-application-contract.js +8 -0
- package/dist/presentation/tui/tui-application.d.ts +62 -0
- package/dist/presentation/tui/tui-application.js +675 -0
- package/dist/presentation/tui/tui-attachment-input.d.ts +2 -0
- package/dist/presentation/tui/tui-attachment-input.js +5 -0
- package/dist/presentation/tui/tui-clipboard-paste-handlers.d.ts +11 -0
- package/dist/presentation/tui/tui-clipboard-paste-handlers.js +25 -0
- package/dist/presentation/tui/tui-command-context.d.ts +3 -0
- package/dist/presentation/tui/tui-command-context.js +1 -0
- package/dist/presentation/tui/tui-command-executor.d.ts +38 -0
- package/dist/presentation/tui/tui-command-executor.js +214 -0
- package/dist/presentation/tui/tui-command-host-factory.d.ts +40 -0
- package/dist/presentation/tui/tui-command-host-factory.js +23 -0
- package/dist/presentation/tui/tui-context-compaction.d.ts +5 -0
- package/dist/presentation/tui/tui-context-compaction.js +22 -0
- package/dist/presentation/tui/tui-context-service.d.ts +34 -0
- package/dist/presentation/tui/tui-context-service.js +126 -0
- package/dist/presentation/tui/tui-file-suggestions.d.ts +3 -0
- package/dist/presentation/tui/tui-file-suggestions.js +8 -0
- package/dist/presentation/tui/tui-goal-controller.d.ts +14 -0
- package/dist/presentation/tui/tui-goal-controller.js +52 -0
- package/dist/presentation/tui/tui-initial-model.d.ts +3 -0
- package/dist/presentation/tui/tui-initial-model.js +28 -0
- package/dist/presentation/tui/tui-lifecycle-actions.d.ts +13 -0
- package/dist/presentation/tui/tui-lifecycle-actions.js +45 -0
- package/dist/presentation/tui/tui-manual-compaction.d.ts +18 -0
- package/dist/presentation/tui/tui-manual-compaction.js +31 -0
- package/dist/presentation/tui/tui-media-model-selection.d.ts +12 -0
- package/dist/presentation/tui/tui-media-model-selection.js +38 -0
- package/dist/presentation/tui/tui-prompt-dispatcher.d.ts +16 -0
- package/dist/presentation/tui/tui-prompt-dispatcher.js +38 -0
- package/dist/presentation/tui/tui-skill-controller.d.ts +11 -0
- package/dist/presentation/tui/tui-skill-controller.js +13 -0
- package/dist/presentation/tui/tui-tool-approval.d.ts +22 -0
- package/dist/presentation/tui/tui-tool-approval.js +73 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +1 -0
- package/package.json +9 -8
- package/scripts/install-native.mjs +11 -11
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ChildProcess, type SpawnOptions } from 'node:child_process';
|
|
2
|
+
import type { HostPlatformContext } from './host-platform.js';
|
|
3
|
+
export interface PreparedPlatformCommand {
|
|
4
|
+
command: string;
|
|
5
|
+
args: readonly string[];
|
|
6
|
+
windowsVerbatimArguments: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface PlatformExecOptions {
|
|
9
|
+
cwd?: string;
|
|
10
|
+
env?: NonNullable<SpawnOptions['env']>;
|
|
11
|
+
maxBufferBytes?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function spawnPlatformProcess(command: string, args: readonly string[], platform: HostPlatformContext, options?: SpawnOptions): ChildProcess;
|
|
14
|
+
export declare function execPlatformCommand(command: string, args: readonly string[], platform: HostPlatformContext, options?: PlatformExecOptions): Promise<void>;
|
|
15
|
+
export declare function terminatePlatformProcess(child: ChildProcess, platform: HostPlatformContext): void;
|
|
16
|
+
export declare function createSafeChildEnvironment(platform: HostPlatformContext): NonNullable<SpawnOptions['env']>;
|
|
17
|
+
export declare function preparePlatformCommand(command: string, args: readonly string[], platform: HostPlatformContext): PreparedPlatformCommand;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
const DEFAULT_EXEC_BUFFER_BYTES = 2 * 1024 * 1024;
|
|
4
|
+
const WINDOWS_META_CHARS = /([()\][%!^"`<>&|;, *?])/gu;
|
|
5
|
+
const WINDOWS_DIRECT_EXECUTABLE = /\.(?:com|exe)$/iu;
|
|
6
|
+
const WINDOWS_CMD_SHIM = /node_modules[\\/]\.bin[\\/][^\\/]+\.cmd$/iu;
|
|
7
|
+
export function spawnPlatformProcess(command, args, platform, options = {}) {
|
|
8
|
+
const prepared = preparePlatformCommand(command, args, platform);
|
|
9
|
+
return spawn(prepared.command, [...prepared.args], {
|
|
10
|
+
...options,
|
|
11
|
+
shell: false,
|
|
12
|
+
windowsHide: true,
|
|
13
|
+
...(prepared.windowsVerbatimArguments ? { windowsVerbatimArguments: true } : {}),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export function execPlatformCommand(command, args, platform, options = {}) {
|
|
17
|
+
const maxBufferBytes = options.maxBufferBytes ?? DEFAULT_EXEC_BUFFER_BYTES;
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const child = spawnPlatformProcess(command, args, platform, {
|
|
20
|
+
...(options.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
21
|
+
...(options.env === undefined ? {} : { env: options.env }),
|
|
22
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
23
|
+
});
|
|
24
|
+
const stdout = [];
|
|
25
|
+
const stderr = [];
|
|
26
|
+
let outputBytes = 0;
|
|
27
|
+
let settled = false;
|
|
28
|
+
const append = (target, chunk) => {
|
|
29
|
+
if (settled)
|
|
30
|
+
return;
|
|
31
|
+
outputBytes += chunk.byteLength;
|
|
32
|
+
if (outputBytes > maxBufferBytes) {
|
|
33
|
+
settled = true;
|
|
34
|
+
terminatePlatformProcess(child, platform);
|
|
35
|
+
reject(new Error('Process output exceeded the configured limit.'));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
target.push(chunk);
|
|
39
|
+
};
|
|
40
|
+
child.stdout?.on('data', (chunk) => append(stdout, chunk));
|
|
41
|
+
child.stderr?.on('data', (chunk) => append(stderr, chunk));
|
|
42
|
+
child.once('error', (error) => {
|
|
43
|
+
if (settled)
|
|
44
|
+
return;
|
|
45
|
+
settled = true;
|
|
46
|
+
reject(error);
|
|
47
|
+
});
|
|
48
|
+
child.once('close', (code) => {
|
|
49
|
+
if (settled)
|
|
50
|
+
return;
|
|
51
|
+
settled = true;
|
|
52
|
+
if (code === 0)
|
|
53
|
+
resolve();
|
|
54
|
+
else
|
|
55
|
+
reject(new Error(Buffer.concat(stderr).toString('utf8').trim() || `Process exited with code ${String(code)}.`));
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export function terminatePlatformProcess(child, platform) {
|
|
60
|
+
const pid = child.pid;
|
|
61
|
+
if (pid === undefined)
|
|
62
|
+
return;
|
|
63
|
+
if (platform.isWindows) {
|
|
64
|
+
const killer = spawn('taskkill', ['/pid', String(pid), '/t', '/f'], { windowsHide: true, stdio: 'ignore' });
|
|
65
|
+
killer.once('error', () => child.kill());
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (platform.supportsProcessGroups) {
|
|
69
|
+
try {
|
|
70
|
+
process.kill(-pid, 'SIGTERM');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
catch { /* Fall through when the process group is unavailable. */ }
|
|
74
|
+
}
|
|
75
|
+
child.kill();
|
|
76
|
+
}
|
|
77
|
+
export function createSafeChildEnvironment(platform) {
|
|
78
|
+
const keys = platform.isWindows
|
|
79
|
+
? ['PATHEXT', 'SystemRoot', 'ComSpec', 'COMSPEC', 'TEMP', 'TMP', 'HOME', 'USERPROFILE', 'APPDATA', 'LOCALAPPDATA', 'LANG', 'LC_ALL']
|
|
80
|
+
: ['PATH', 'HOME', 'TMPDIR', 'TEMP', 'LANG', 'LC_ALL', 'XDG_RUNTIME_DIR', 'WAYLAND_DISPLAY', 'DISPLAY'];
|
|
81
|
+
const result = {};
|
|
82
|
+
if (platform.isWindows) {
|
|
83
|
+
const pathValue = platform.env['Path'] ?? platform.env['PATH'];
|
|
84
|
+
if (pathValue !== undefined)
|
|
85
|
+
result['Path'] = pathValue;
|
|
86
|
+
}
|
|
87
|
+
for (const key of keys) {
|
|
88
|
+
const value = platform.env[key];
|
|
89
|
+
if (value !== undefined)
|
|
90
|
+
result[key] = value;
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
export function preparePlatformCommand(command, args, platform) {
|
|
95
|
+
if (!platform.isWindows || WINDOWS_DIRECT_EXECUTABLE.test(command))
|
|
96
|
+
return { command, args, windowsVerbatimArguments: false };
|
|
97
|
+
const normalizedCommand = path.win32.normalize(command);
|
|
98
|
+
const doubleEscape = WINDOWS_CMD_SHIM.test(normalizedCommand);
|
|
99
|
+
const escapedCommand = escapeWindowsCommand(normalizedCommand);
|
|
100
|
+
const escapedArgs = args.map((arg) => escapeWindowsArgument(arg, doubleEscape));
|
|
101
|
+
return {
|
|
102
|
+
command: platform.env['ComSpec'] ?? platform.env['COMSPEC'] ?? 'cmd.exe',
|
|
103
|
+
args: ['/d', '/s', '/c', `"${[escapedCommand, ...escapedArgs].join(' ')}"`],
|
|
104
|
+
windowsVerbatimArguments: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function escapeWindowsCommand(value) {
|
|
108
|
+
return value.replace(WINDOWS_META_CHARS, '^$1');
|
|
109
|
+
}
|
|
110
|
+
function escapeWindowsArgument(value, doubleEscape) {
|
|
111
|
+
let escaped = value
|
|
112
|
+
.replace(/(?=(\\+?)?)\1"/gu, '$1$1\\"')
|
|
113
|
+
.replace(/(?=(\\+?)?)\1$/gu, '$1$1');
|
|
114
|
+
escaped = `"${escaped}"`.replace(WINDOWS_META_CHARS, '^$1');
|
|
115
|
+
return doubleEscape ? escaped.replace(WINDOWS_META_CHARS, '^$1') : escaped;
|
|
116
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type HostPlatformContext } from './host-platform.js';
|
|
2
|
+
export interface PlatformPaths {
|
|
3
|
+
platform: HostPlatformContext;
|
|
4
|
+
home: string;
|
|
5
|
+
globalConfigDir: string;
|
|
6
|
+
globalConfigFile: string;
|
|
7
|
+
credentialsFile: string;
|
|
8
|
+
credentialKeyFile: string;
|
|
9
|
+
projectsDir: string;
|
|
10
|
+
cacheDir: string;
|
|
11
|
+
logsDir: string;
|
|
12
|
+
skillsDir: string;
|
|
13
|
+
pluginsDir: string;
|
|
14
|
+
mcpConfigFile: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function resolvePlatformPaths(env?: Readonly<Record<string, string | undefined>>, platform?: HostPlatformContext): PlatformPaths;
|
|
17
|
+
export declare function resolveProjectConfigPaths(cwd: string): {
|
|
18
|
+
directory: string;
|
|
19
|
+
settings: string;
|
|
20
|
+
localSettings: string;
|
|
21
|
+
skillsDir: string;
|
|
22
|
+
pluginsDir: string;
|
|
23
|
+
hooksDir: string;
|
|
24
|
+
mcpConfigFile: string;
|
|
25
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { detectHostPlatform } from './host-platform.js';
|
|
4
|
+
export function resolvePlatformPaths(env = process.env, platform = detectHostPlatform({ env })) {
|
|
5
|
+
const home = env['LOTAGATE_HOME']?.trim() || os.homedir();
|
|
6
|
+
const root = path.join(home, '.lotagate');
|
|
7
|
+
return {
|
|
8
|
+
platform,
|
|
9
|
+
home,
|
|
10
|
+
globalConfigDir: root,
|
|
11
|
+
globalConfigFile: path.join(root, 'settings.json'),
|
|
12
|
+
credentialsFile: path.join(root, 'credentials.enc.json'),
|
|
13
|
+
credentialKeyFile: path.join(root, 'credentials.key'),
|
|
14
|
+
projectsDir: path.join(root, 'projects'),
|
|
15
|
+
cacheDir: path.join(root, 'cache'),
|
|
16
|
+
logsDir: path.join(root, 'logs'),
|
|
17
|
+
skillsDir: path.join(root, 'skills'),
|
|
18
|
+
pluginsDir: path.join(root, 'plugins'),
|
|
19
|
+
mcpConfigFile: path.join(root, 'mcp.json'),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function resolveProjectConfigPaths(cwd) {
|
|
23
|
+
const directory = path.join(cwd, '.lotagate');
|
|
24
|
+
return {
|
|
25
|
+
directory,
|
|
26
|
+
settings: path.join(directory, 'settings.json'),
|
|
27
|
+
localSettings: path.join(directory, 'settings.local.json'),
|
|
28
|
+
skillsDir: path.join(directory, 'skills'),
|
|
29
|
+
pluginsDir: path.join(directory, 'plugins'),
|
|
30
|
+
hooksDir: path.join(directory, 'hooks'),
|
|
31
|
+
mcpConfigFile: path.join(directory, 'mcp.json'),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ProjectTrustStore, TrustedProject } from '../../ports/project-trust-store.js';
|
|
2
|
+
import type { PlatformPaths } from '../platform/platform-paths.js';
|
|
3
|
+
export declare class FileProjectTrustStore implements ProjectTrustStore {
|
|
4
|
+
private readonly filePath;
|
|
5
|
+
constructor(paths: PlatformPaths);
|
|
6
|
+
list(): Promise<readonly TrustedProject[]>;
|
|
7
|
+
get(fingerprint: string): Promise<TrustedProject | undefined>;
|
|
8
|
+
grant(project: TrustedProject): Promise<void>;
|
|
9
|
+
revoke(fingerprint: string): Promise<boolean>;
|
|
10
|
+
private read;
|
|
11
|
+
private write;
|
|
12
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isFileNotFound } from '../filesystem/fs-errors.js';
|
|
4
|
+
import { atomicWriteFile, withFileLock } from '../filesystem/atomic-file-store.js';
|
|
5
|
+
import { readJsonFileBounded } from '../filesystem/bounded-json-reader.js';
|
|
6
|
+
import { RESOURCE_LIMITS } from '../../domain/runtime/resource-limits.js';
|
|
7
|
+
export class FileProjectTrustStore {
|
|
8
|
+
filePath;
|
|
9
|
+
constructor(paths) {
|
|
10
|
+
this.filePath = path.join(paths.globalConfigDir, 'trusted-projects.json');
|
|
11
|
+
}
|
|
12
|
+
async list() {
|
|
13
|
+
return (await this.read()).projects;
|
|
14
|
+
}
|
|
15
|
+
async get(fingerprint) {
|
|
16
|
+
return (await this.read()).projects.find((project) => project.fingerprint === fingerprint);
|
|
17
|
+
}
|
|
18
|
+
async grant(project) {
|
|
19
|
+
await withFileLock(this.filePath, async () => {
|
|
20
|
+
const file = await this.read();
|
|
21
|
+
const projects = file.projects.filter((candidate) => candidate.fingerprint !== project.fingerprint);
|
|
22
|
+
projects.push(project);
|
|
23
|
+
await this.write({ version: 1, projects });
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async revoke(fingerprint) {
|
|
27
|
+
return withFileLock(this.filePath, async () => {
|
|
28
|
+
const file = await this.read();
|
|
29
|
+
const projects = file.projects.filter((project) => project.fingerprint !== fingerprint);
|
|
30
|
+
if (projects.length === file.projects.length)
|
|
31
|
+
return false;
|
|
32
|
+
await this.write({ version: 1, projects });
|
|
33
|
+
return true;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async read() {
|
|
37
|
+
try {
|
|
38
|
+
const value = await readJsonFileBounded(this.filePath, RESOURCE_LIMITS.configFileBytes);
|
|
39
|
+
if (!isTrustFile(value))
|
|
40
|
+
throw new Error('Invalid trust file.');
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (isFileNotFound(error))
|
|
45
|
+
return { version: 1, projects: [] };
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async write(file) {
|
|
50
|
+
await fs.mkdir(path.dirname(this.filePath), { recursive: true });
|
|
51
|
+
await atomicWriteFile(this.filePath, `${JSON.stringify(file, null, 2)}\n`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function isTrustFile(value) {
|
|
55
|
+
if (typeof value !== 'object' || value === null)
|
|
56
|
+
return false;
|
|
57
|
+
const record = value;
|
|
58
|
+
return record['version'] === 1 && Array.isArray(record['projects']);
|
|
59
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type LotaGate } from '@lotagate/sdk';
|
|
2
|
+
import type { ChatModelPort, ChatModelRequest, ChatModelEvent } from '../../ports/chat-model.js';
|
|
3
|
+
export declare class SdkChatCompletionAdapter implements ChatModelPort {
|
|
4
|
+
private readonly client;
|
|
5
|
+
constructor(client: LotaGate);
|
|
6
|
+
stream(request: ChatModelRequest): AsyncIterable<ChatModelEvent>;
|
|
7
|
+
private fallbackToBufferedCompletion;
|
|
8
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { SdkErrorCode } from '@lotagate/sdk';
|
|
2
|
+
import { CliError } from '../../domain/errors/cli-error.js';
|
|
3
|
+
import { CLI_ERROR_CODES } from '../../domain/errors/error-codes.js';
|
|
4
|
+
import { buildUserMessage } from '../clipboard/image-normalizer.js';
|
|
5
|
+
export class SdkChatCompletionAdapter {
|
|
6
|
+
client;
|
|
7
|
+
constructor(client) {
|
|
8
|
+
this.client = client;
|
|
9
|
+
}
|
|
10
|
+
async *stream(request) {
|
|
11
|
+
const messages = [
|
|
12
|
+
...(request.system === undefined || request.system.trim().length === 0 ? [] : [{ role: 'system', content: request.system }]),
|
|
13
|
+
buildUserMessage(request.prompt, request.attachments),
|
|
14
|
+
];
|
|
15
|
+
const options = request.signal === undefined ? undefined : { signal: request.signal };
|
|
16
|
+
let emittedDelta = false;
|
|
17
|
+
try {
|
|
18
|
+
yield { type: 'activity', state: 'connecting' };
|
|
19
|
+
const stream = await this.client.chat.completions.create({
|
|
20
|
+
model: request.model,
|
|
21
|
+
messages,
|
|
22
|
+
stream: true,
|
|
23
|
+
}, options);
|
|
24
|
+
yield { type: 'activity', state: 'thinking' };
|
|
25
|
+
for await (const chunk of stream) {
|
|
26
|
+
if (chunk.usage !== undefined)
|
|
27
|
+
yield { type: 'usage', usage: mapUsage(chunk.usage) };
|
|
28
|
+
const content = chunk.choices[0]?.delta.content;
|
|
29
|
+
if (typeof content === 'string' && content.length > 0) {
|
|
30
|
+
emittedDelta = true;
|
|
31
|
+
yield { type: 'activity', state: 'writing' };
|
|
32
|
+
yield { type: 'delta', content };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
yield { type: 'activity', state: 'completed' };
|
|
36
|
+
yield { type: 'completed' };
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (request.signal?.aborted === true) {
|
|
40
|
+
throw request.signal.reason ?? createAbortError();
|
|
41
|
+
}
|
|
42
|
+
if (!emittedDelta && isSseParseError(error)) {
|
|
43
|
+
yield* this.fallbackToBufferedCompletion(request, messages, options);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
throw new CliError(CLI_ERROR_CODES.MODEL_STREAM_FAILED, 'Chat completion stream failed.', {
|
|
47
|
+
category: 'model',
|
|
48
|
+
userMessage: 'Unable to read the model stream. The gateway may have returned an invalid SSE payload. Check the model, authentication and base URL.',
|
|
49
|
+
retryable: true,
|
|
50
|
+
cause: error,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async *fallbackToBufferedCompletion(request, messages, options) {
|
|
55
|
+
try {
|
|
56
|
+
const response = await this.client.chat.completions.create({
|
|
57
|
+
model: request.model,
|
|
58
|
+
messages: [...messages],
|
|
59
|
+
stream: false,
|
|
60
|
+
}, options);
|
|
61
|
+
if (response.usage !== undefined)
|
|
62
|
+
yield { type: 'usage', usage: mapUsage(response.usage) };
|
|
63
|
+
const content = textContent(response.choices[0]?.message.content);
|
|
64
|
+
if (content.length > 0) {
|
|
65
|
+
yield { type: 'activity', state: 'writing' };
|
|
66
|
+
yield { type: 'delta', content };
|
|
67
|
+
}
|
|
68
|
+
yield { type: 'activity', state: 'completed' };
|
|
69
|
+
yield { type: 'completed' };
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (request.signal?.aborted === true) {
|
|
73
|
+
throw request.signal.reason ?? createAbortError();
|
|
74
|
+
}
|
|
75
|
+
throw new CliError(CLI_ERROR_CODES.MODEL_STREAM_FAILED, 'Chat completion fallback failed.', {
|
|
76
|
+
category: 'model',
|
|
77
|
+
userMessage: 'Unable to read the model response. Check the model, authentication and base URL.',
|
|
78
|
+
retryable: true,
|
|
79
|
+
cause: error,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function createAbortError() {
|
|
85
|
+
const error = new Error('The operation was aborted.');
|
|
86
|
+
error.name = 'AbortError';
|
|
87
|
+
return error;
|
|
88
|
+
}
|
|
89
|
+
function mapUsage(usage) {
|
|
90
|
+
return {
|
|
91
|
+
...(typeof usage.prompt_tokens === 'number' ? { promptTokens: usage.prompt_tokens } : {}),
|
|
92
|
+
...(typeof usage.completion_tokens === 'number' ? { completionTokens: usage.completion_tokens } : {}),
|
|
93
|
+
...(typeof usage.total_tokens === 'number' ? { totalTokens: usage.total_tokens } : {}),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function isSseParseError(error) {
|
|
97
|
+
return typeof error === 'object'
|
|
98
|
+
&& error !== null
|
|
99
|
+
&& 'errorCode' in error
|
|
100
|
+
&& error.errorCode === SdkErrorCode.ResponseParseError;
|
|
101
|
+
}
|
|
102
|
+
function textContent(content) {
|
|
103
|
+
if (typeof content === 'string')
|
|
104
|
+
return content;
|
|
105
|
+
if (!Array.isArray(content))
|
|
106
|
+
return '';
|
|
107
|
+
return content
|
|
108
|
+
.map((part) => {
|
|
109
|
+
if (typeof part !== 'object' || part === null || !('text' in part))
|
|
110
|
+
return '';
|
|
111
|
+
const text = part.text;
|
|
112
|
+
return typeof text === 'string' ? text : '';
|
|
113
|
+
})
|
|
114
|
+
.join('');
|
|
115
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ModelListResponse, ModelSummary } from '@lotagate/sdk';
|
|
2
|
+
export interface ModelCatalogClient {
|
|
3
|
+
models: {
|
|
4
|
+
list(): Promise<ModelListResponse>;
|
|
5
|
+
retrieve(model: string): Promise<ModelSummary>;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export declare class ModelCatalogAdapter {
|
|
9
|
+
private readonly client;
|
|
10
|
+
constructor(client: ModelCatalogClient);
|
|
11
|
+
/** Lists every selectable gateway model while excluding embeddings from interactive selection. */
|
|
12
|
+
listModels(): Promise<{
|
|
13
|
+
data: ModelSummary[];
|
|
14
|
+
object: "list" | string;
|
|
15
|
+
}>;
|
|
16
|
+
get(model: string): Promise<ModelSummary>;
|
|
17
|
+
}
|
|
18
|
+
/** Reads the optional gateway metadata without coupling the CLI to SDK internals. */
|
|
19
|
+
export declare function getModelContextWindow(model: ModelSummary): number | undefined;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class ModelCatalogAdapter {
|
|
2
|
+
client;
|
|
3
|
+
constructor(client) {
|
|
4
|
+
this.client = client;
|
|
5
|
+
}
|
|
6
|
+
/** Lists every selectable gateway model while excluding embeddings from interactive selection. */
|
|
7
|
+
async listModels() {
|
|
8
|
+
const response = await this.client.models.list();
|
|
9
|
+
return {
|
|
10
|
+
...response,
|
|
11
|
+
data: response.data.filter((model) => model['model_category'] !== 'embedding'),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async get(model) {
|
|
15
|
+
return this.client.models.retrieve(model);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Reads the optional gateway metadata without coupling the CLI to SDK internals. */
|
|
19
|
+
export function getModelContextWindow(model) {
|
|
20
|
+
const value = model['context_window'];
|
|
21
|
+
if (typeof value === 'number' && Number.isInteger(value) && value > 0)
|
|
22
|
+
return value;
|
|
23
|
+
if (typeof value === 'string' && /^\d+$/u.test(value)) {
|
|
24
|
+
const parsed = Number(value);
|
|
25
|
+
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LotaGate } from '@lotagate/sdk';
|
|
2
|
+
import type { MediaGatewayClient, AudioUploadInput, ImageEditInput, ImageGenerationInput, MediaRequestOptions, SpeechInput } from '../../ports/media-gateway-client.js';
|
|
3
|
+
import type { GeneratedImage, MediaBinary, VideoOperation } from '../../domain/media/media-contract.js';
|
|
4
|
+
/** SDK boundary adapter. Application code only sees CLI-owned media contracts. */
|
|
5
|
+
export declare class SdkMediaGatewayClient implements MediaGatewayClient {
|
|
6
|
+
private readonly client;
|
|
7
|
+
constructor(client: LotaGate);
|
|
8
|
+
generateImage(input: ImageGenerationInput, options?: MediaRequestOptions): Promise<readonly GeneratedImage[]>;
|
|
9
|
+
editImage(input: ImageEditInput, options?: MediaRequestOptions): Promise<readonly GeneratedImage[]>;
|
|
10
|
+
createSpeech(input: SpeechInput, options?: MediaRequestOptions): Promise<MediaBinary>;
|
|
11
|
+
transcribe(input: AudioUploadInput, options?: MediaRequestOptions): Promise<string>;
|
|
12
|
+
translate(input: AudioUploadInput, options?: MediaRequestOptions): Promise<string>;
|
|
13
|
+
createVideo(input: {
|
|
14
|
+
model: string;
|
|
15
|
+
prompt: string;
|
|
16
|
+
parameters?: Record<string, unknown>;
|
|
17
|
+
}, options?: MediaRequestOptions): Promise<VideoOperation>;
|
|
18
|
+
getVideoOperation(id: string, options?: MediaRequestOptions): Promise<VideoOperation>;
|
|
19
|
+
downloadVideo(id: string, options?: MediaRequestOptions): Promise<MediaBinary>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/** SDK boundary adapter. Application code only sees CLI-owned media contracts. */
|
|
2
|
+
export class SdkMediaGatewayClient {
|
|
3
|
+
client;
|
|
4
|
+
constructor(client) {
|
|
5
|
+
this.client = client;
|
|
6
|
+
}
|
|
7
|
+
async generateImage(input, options) {
|
|
8
|
+
const response = await this.client.images.generations.create(toImageGenerationRequest(input), options);
|
|
9
|
+
return response.data.map((image) => ({
|
|
10
|
+
...(typeof image.b64_json === 'string' ? { base64: image.b64_json } : {}),
|
|
11
|
+
...(typeof image.url === 'string' ? { url: image.url } : {}),
|
|
12
|
+
...(typeof image.revised_prompt === 'string' ? { revisedPrompt: image.revised_prompt } : {}),
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
async editImage(input, options) {
|
|
16
|
+
const request = {
|
|
17
|
+
...toImageGenerationRequest(input), image: input.images,
|
|
18
|
+
...(input.mask === undefined ? {} : { mask: input.mask }),
|
|
19
|
+
...(input.inputFidelity === undefined ? {} : { input_fidelity: input.inputFidelity }),
|
|
20
|
+
};
|
|
21
|
+
const response = await this.client.images.edits.create(request, options);
|
|
22
|
+
return response.data.map((image) => ({
|
|
23
|
+
...(typeof image.b64_json === 'string' ? { base64: image.b64_json } : {}),
|
|
24
|
+
...(typeof image.url === 'string' ? { url: image.url } : {}),
|
|
25
|
+
...(typeof image.revised_prompt === 'string' ? { revisedPrompt: image.revised_prompt } : {}),
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
async createSpeech(input, options) {
|
|
29
|
+
const response = await this.client.audio.speech.create({
|
|
30
|
+
model: input.model, input: input.input, voice: input.voice,
|
|
31
|
+
...(input.instructions === undefined ? {} : { instructions: input.instructions }),
|
|
32
|
+
...(input.responseFormat === undefined ? {} : { response_format: input.responseFormat }),
|
|
33
|
+
...(input.speed === undefined ? {} : { speed: input.speed }),
|
|
34
|
+
}, options);
|
|
35
|
+
return binaryResponse(response);
|
|
36
|
+
}
|
|
37
|
+
async transcribe(input, options) {
|
|
38
|
+
const response = await this.client.audio.transcriptions.create(toTranscriptionRequest(input), options);
|
|
39
|
+
return response.text;
|
|
40
|
+
}
|
|
41
|
+
async translate(input, options) {
|
|
42
|
+
const response = await this.client.audio.translations.create(toTranslationRequest(input), options);
|
|
43
|
+
return response.text;
|
|
44
|
+
}
|
|
45
|
+
async createVideo(input, options) {
|
|
46
|
+
const request = { model: input.model, instances: [{ prompt: input.prompt }], ...(input.parameters === undefined ? {} : { parameters: input.parameters }) };
|
|
47
|
+
return toVideoOperation(await this.client.video.generations.create(request, options));
|
|
48
|
+
}
|
|
49
|
+
async getVideoOperation(id, options) {
|
|
50
|
+
return toVideoOperation(await this.client.video.operations.retrieve(id, options));
|
|
51
|
+
}
|
|
52
|
+
async downloadVideo(id, options) {
|
|
53
|
+
return binaryResponse(await this.client.video.operations.download(id, options));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function toImageGenerationRequest(input) {
|
|
57
|
+
return {
|
|
58
|
+
model: input.model, prompt: input.prompt,
|
|
59
|
+
...(input.n === undefined ? {} : { n: input.n }), ...(input.size === undefined ? {} : { size: input.size }),
|
|
60
|
+
...(input.quality === undefined ? {} : { quality: input.quality }), ...(input.background === undefined ? {} : { background: input.background }),
|
|
61
|
+
...(input.outputFormat === undefined ? {} : { output_format: input.outputFormat }), ...(input.outputCompression === undefined ? {} : { output_compression: input.outputCompression }),
|
|
62
|
+
...(input.moderation === undefined ? {} : { moderation: input.moderation }), ...(input.user === undefined ? {} : { user: input.user }),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function toTranscriptionRequest(input) {
|
|
66
|
+
const request = { model: input.model, file: input.file, filename: input.filename };
|
|
67
|
+
if (input.prompt !== undefined)
|
|
68
|
+
request.prompt = input.prompt;
|
|
69
|
+
if (input.temperature !== undefined)
|
|
70
|
+
request.temperature = input.temperature;
|
|
71
|
+
if (input.responseFormat !== undefined)
|
|
72
|
+
request.response_format = input.responseFormat;
|
|
73
|
+
if (input.language !== undefined)
|
|
74
|
+
request.language = input.language;
|
|
75
|
+
if (input.timestampGranularities !== undefined)
|
|
76
|
+
request.timestamp_granularities = [...input.timestampGranularities];
|
|
77
|
+
if (input.include !== undefined)
|
|
78
|
+
request.include = [...input.include];
|
|
79
|
+
return request;
|
|
80
|
+
}
|
|
81
|
+
function toTranslationRequest(input) {
|
|
82
|
+
const request = { model: input.model, file: input.file, filename: input.filename };
|
|
83
|
+
if (input.prompt !== undefined)
|
|
84
|
+
request.prompt = input.prompt;
|
|
85
|
+
if (input.temperature !== undefined)
|
|
86
|
+
request.temperature = input.temperature;
|
|
87
|
+
if (input.responseFormat !== undefined)
|
|
88
|
+
request.response_format = input.responseFormat;
|
|
89
|
+
return request;
|
|
90
|
+
}
|
|
91
|
+
function binaryResponse(response) {
|
|
92
|
+
const contentType = response.headers.get('content-type')?.split(';', 1)[0]?.trim();
|
|
93
|
+
return { bytes: new Uint8Array(response.data), ...(contentType === undefined || contentType.length === 0 ? {} : { contentType }) };
|
|
94
|
+
}
|
|
95
|
+
function toVideoOperation(operation) {
|
|
96
|
+
return { id: operation.name, done: operation.done === true, ...(typeof operation.error?.message === 'string' ? { errorMessage: operation.error.message } : {}) };
|
|
97
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type CreateGoalInput, type GoalEvaluation, type GoalState, type GoalUsageDelta } from '../../domain/orchestration/goal.js';
|
|
2
|
+
import type { GoalStore } from '../../ports/goal-store.js';
|
|
3
|
+
import type { SessionStore } from '../../ports/session-store.js';
|
|
4
|
+
export declare class FileGoalStore implements GoalStore {
|
|
5
|
+
private readonly sessions;
|
|
6
|
+
constructor(sessions: SessionStore);
|
|
7
|
+
get(sessionId: string): Promise<GoalState | undefined>;
|
|
8
|
+
create(sessionId: string, input: CreateGoalInput): Promise<GoalState>;
|
|
9
|
+
replace(sessionId: string, input: CreateGoalInput): Promise<GoalState>;
|
|
10
|
+
pause(sessionId: string, reason?: string): Promise<GoalState>;
|
|
11
|
+
resume(sessionId: string): Promise<GoalState>;
|
|
12
|
+
recordTurn(sessionId: string): Promise<GoalState>;
|
|
13
|
+
recordUsage(sessionId: string, delta: GoalUsageDelta): Promise<GoalState>;
|
|
14
|
+
recordEvaluation(sessionId: string, evaluation: GoalEvaluation): Promise<GoalState>;
|
|
15
|
+
clear(sessionId: string, reason?: string): Promise<void>;
|
|
16
|
+
private requireActiveUnlocked;
|
|
17
|
+
private getOrThrowUnlocked;
|
|
18
|
+
private invalidState;
|
|
19
|
+
private appendState;
|
|
20
|
+
private append;
|
|
21
|
+
}
|