@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.
- package/README.md +75 -7
- package/SECURITY.md +2 -0
- package/bin/lotagate.mjs +50 -8
- package/dist/application/agent/agent-constants.d.ts +6 -0
- package/dist/application/agent/agent-constants.js +1 -0
- package/dist/application/agent/agent-history.d.ts +3 -0
- package/dist/application/agent/agent-history.js +5 -0
- package/dist/application/agent/agent-input-context.d.ts +12 -0
- package/dist/application/agent/agent-input-context.js +5 -0
- package/dist/application/agent/agent-limit.d.ts +3 -0
- package/dist/application/agent/agent-limit.js +1 -0
- package/dist/application/agent/agent-run-tracker.d.ts +30 -0
- package/dist/application/agent/agent-run-tracker.js +1 -0
- package/dist/application/agent/agent-runtime-context.d.ts +22 -0
- package/dist/application/agent/agent-runtime-context.js +1 -0
- package/dist/application/agent/agent-session-store-registry.d.ts +16 -0
- package/dist/application/agent/agent-session-store-registry.js +1 -0
- package/dist/application/agent/agent-session-store.d.ts +23 -0
- package/dist/application/agent/agent-session-store.js +6 -0
- package/dist/application/agent/capability-profile.d.ts +17 -0
- package/dist/application/agent/capability-profile.js +0 -0
- package/dist/application/agent/cli-agent-execution-service.d.ts +120 -0
- package/dist/application/agent/cli-agent-execution-service.js +1 -0
- package/dist/application/agent/cli-agent-preparation-cache.d.ts +39 -0
- package/dist/application/agent/cli-agent-preparation-cache.js +1 -0
- package/dist/application/agent/cli-agent-run-request.d.ts +12 -0
- package/dist/application/agent/cli-agent-run-request.js +0 -0
- package/dist/application/agent/context-compaction-persistence.d.ts +8 -0
- package/dist/application/agent/context-compaction-persistence.js +1 -0
- package/dist/application/agent/context-compaction.d.ts +22 -0
- package/dist/application/agent/context-compaction.js +8 -0
- package/dist/application/agent/context-token-cache.d.ts +21 -0
- package/dist/application/agent/context-token-cache.js +4 -0
- package/dist/application/agent/context-usage-service.d.ts +52 -0
- package/dist/application/agent/context-usage-service.js +1 -0
- package/dist/application/agent/continuation-checkpoint.d.ts +15 -0
- package/dist/application/agent/continuation-checkpoint.js +2 -0
- package/dist/application/agent/interactive-agent-guidance.d.ts +5 -0
- package/dist/application/agent/interactive-agent-guidance.js +2 -0
- package/dist/application/agent/prompt-data-safety.d.ts +14 -0
- package/dist/application/agent/prompt-data-safety.js +4 -0
- package/dist/application/agent/scoped-tool-executor.d.ts +13 -0
- package/dist/application/agent/scoped-tool-executor.js +1 -0
- package/dist/application/agent/tool-catalog.d.ts +14 -0
- package/dist/application/agent/tool-catalog.js +1 -0
- package/dist/application/agent/tool-display.d.ts +7 -0
- package/dist/application/agent/tool-display.js +1 -0
- package/dist/application/agent/tool-hook-lifecycle.d.ts +19 -0
- package/dist/application/agent/tool-hook-lifecycle.js +1 -0
- package/dist/application/auth/authentication-service.d.ts +20 -0
- package/dist/application/auth/authentication-service.js +1 -0
- package/dist/application/chat/chat-service.d.ts +12 -0
- package/dist/application/chat/chat-service.js +1 -0
- package/dist/application/chat/pending-attachment-store.d.ts +15 -0
- package/dist/application/chat/pending-attachment-store.js +1 -0
- package/dist/application/commands/application-command-executor.d.ts +23 -0
- package/dist/application/commands/application-command-executor.js +3 -0
- package/dist/application/commands/cli-args.d.ts +6 -0
- package/dist/application/commands/cli-args.js +1 -0
- package/dist/application/commands/cli-command-services.d.ts +17 -0
- package/dist/application/commands/cli-command-services.js +33 -0
- package/dist/application/commands/command-cancellation.d.ts +6 -0
- package/dist/application/commands/command-cancellation.js +1 -0
- package/dist/application/commands/command-catalog.d.ts +6 -0
- package/dist/application/commands/command-catalog.js +1 -0
- package/dist/application/commands/command-contract.d.ts +60 -0
- package/dist/application/commands/command-contract.js +0 -0
- package/dist/application/commands/command-hints.d.ts +9 -0
- package/dist/application/commands/command-hints.js +1 -0
- package/dist/application/commands/command-output.d.ts +4 -0
- package/dist/application/commands/command-output.js +0 -0
- package/dist/application/commands/command-parser.d.ts +10 -0
- package/dist/application/commands/command-parser.js +1 -0
- package/dist/application/commands/command-presentation.d.ts +7 -0
- package/dist/application/commands/command-presentation.js +3 -0
- package/dist/application/commands/command-registry.d.ts +11 -0
- package/dist/application/commands/command-registry.js +1 -0
- package/dist/application/commands/command-runtime.d.ts +2 -0
- package/dist/application/commands/command-runtime.js +1 -0
- package/dist/application/commands/goal-command-handlers.d.ts +3 -0
- package/dist/application/commands/goal-command-handlers.js +7 -0
- package/dist/application/commands/media-command-handlers.d.ts +9 -0
- package/dist/application/commands/media-command-handlers.js +9 -0
- package/dist/application/commands/media-command-output.d.ts +11 -0
- package/dist/application/commands/media-command-output.js +1 -0
- package/dist/application/commands/memory-command-handler.d.ts +29 -0
- package/dist/application/commands/memory-command-handler.js +12 -0
- package/dist/application/commands/runtime-command-handlers.d.ts +7 -0
- package/dist/application/commands/runtime-command-handlers.js +14 -0
- package/dist/application/commands/stream-output.d.ts +4 -0
- package/dist/application/commands/stream-output.js +1 -0
- package/dist/application/commands/utility-commands.d.ts +6 -0
- package/dist/application/commands/utility-commands.js +10 -0
- package/dist/application/config/execution-config.d.ts +4 -0
- package/dist/application/config/execution-config.js +1 -0
- package/dist/application/extensions/extension-list-contract.d.ts +18 -0
- package/dist/application/extensions/extension-list-contract.js +0 -0
- package/dist/application/extensions/extension-list-formatters.d.ts +38 -0
- package/dist/application/extensions/extension-list-formatters.js +1 -0
- package/dist/application/extensions/extension-list-output.d.ts +3 -0
- package/dist/application/extensions/extension-list-output.js +3 -0
- package/dist/application/extensions/plugin-contribution-registry.d.ts +31 -0
- package/dist/application/extensions/plugin-contribution-registry.js +1 -0
- package/dist/application/extensions/plugin-detail-contract.d.ts +25 -0
- package/dist/application/extensions/plugin-detail-contract.js +0 -0
- package/dist/application/extensions/plugin-detail-service.d.ts +3 -0
- package/dist/application/extensions/plugin-detail-service.js +1 -0
- package/dist/application/extensions/skill-scope-store.d.ts +23 -0
- package/dist/application/extensions/skill-scope-store.js +1 -0
- package/dist/application/formatting/compact-number.d.ts +2 -0
- package/dist/application/formatting/compact-number.js +1 -0
- package/dist/application/formatting/compact-table.d.ts +22 -0
- package/dist/application/formatting/compact-table.js +2 -0
- package/dist/application/intent/completion-gate.d.ts +3 -0
- package/dist/application/intent/completion-gate.js +1 -0
- package/dist/application/intent/evidence-ledger.d.ts +22 -0
- package/dist/application/intent/evidence-ledger.js +1 -0
- package/dist/application/intent/evidence-recording-tool-executor.d.ts +16 -0
- package/dist/application/intent/evidence-recording-tool-executor.js +1 -0
- package/dist/application/intent/intent-compiler.d.ts +11 -0
- package/dist/application/intent/intent-compiler.js +2 -0
- package/dist/application/intent/intent-execution-gate.d.ts +11 -0
- package/dist/application/intent/intent-execution-gate.js +1 -0
- package/dist/application/intent/intent-host-context.d.ts +6 -0
- package/dist/application/intent/intent-host-context.js +1 -0
- package/dist/application/intent/intent-run-controller.d.ts +56 -0
- package/dist/application/intent/intent-run-controller.js +3 -0
- package/dist/application/intent/project-policy.d.ts +16 -0
- package/dist/application/intent/project-policy.js +1 -0
- package/dist/application/media/video-operation-poller.d.ts +5 -0
- package/dist/application/media/video-operation-poller.js +1 -0
- package/dist/application/memory/memory-capture-policy.d.ts +10 -0
- package/dist/application/memory/memory-capture-policy.js +1 -0
- package/dist/application/memory/memory-consolidation-service.d.ts +12 -0
- package/dist/application/memory/memory-consolidation-service.js +1 -0
- package/dist/application/memory/memory-context-assembler.d.ts +24 -0
- package/dist/application/memory/memory-context-assembler.js +1 -0
- package/dist/application/memory/memory-extractor.d.ts +21 -0
- package/dist/application/memory/memory-extractor.js +2 -0
- package/dist/application/memory/memory-service.d.ts +34 -0
- package/dist/application/memory/memory-service.js +1 -0
- package/dist/application/model/cached-model-catalog.d.ts +19 -0
- package/dist/application/model/cached-model-catalog.js +1 -0
- package/dist/application/model/initial-model-selection.d.ts +10 -0
- package/dist/application/model/initial-model-selection.js +1 -0
- package/dist/application/model/model-catalog-service.d.ts +6 -0
- package/dist/application/model/model-catalog-service.js +1 -0
- package/dist/application/model/model-context-window.d.ts +3 -0
- package/dist/application/model/model-context-window.js +1 -0
- package/dist/application/model/model-response-retry.d.ts +15 -0
- package/dist/application/model/model-response-retry.js +1 -0
- package/dist/application/orchestration/abortable-wait.d.ts +2 -0
- package/dist/application/orchestration/abortable-wait.js +1 -0
- package/dist/application/orchestration/cli-subagent-service.d.ts +77 -0
- package/dist/application/orchestration/cli-subagent-service.js +13 -0
- package/dist/application/orchestration/cli-turn-event-projector.d.ts +15 -0
- package/dist/application/orchestration/cli-turn-event-projector.js +1 -0
- package/dist/application/orchestration/cli-turn-events.d.ts +76 -0
- package/dist/application/orchestration/cli-turn-events.js +1 -0
- package/dist/application/orchestration/cli-turn-persistence.d.ts +6 -0
- package/dist/application/orchestration/cli-turn-persistence.js +1 -0
- package/dist/application/orchestration/goal-evaluator.d.ts +18 -0
- package/dist/application/orchestration/goal-evaluator.js +3 -0
- package/dist/application/orchestration/goal-input.d.ts +3 -0
- package/dist/application/orchestration/goal-input.js +1 -0
- package/dist/application/orchestration/goal-output.d.ts +2 -0
- package/dist/application/orchestration/goal-output.js +2 -0
- package/dist/application/orchestration/goal-runner.d.ts +22 -0
- package/dist/application/orchestration/goal-runner.js +10 -0
- package/dist/application/orchestration/goal-usage.d.ts +9 -0
- package/dist/application/orchestration/goal-usage.js +1 -0
- package/dist/application/orchestration/headless-agent-turn.d.ts +36 -0
- package/dist/application/orchestration/headless-agent-turn.js +4 -0
- package/dist/application/orchestration/orchestration-constants.d.ts +3 -0
- package/dist/application/orchestration/orchestration-constants.js +1 -0
- package/dist/application/orchestration/subagent-coordinator.d.ts +41 -0
- package/dist/application/orchestration/subagent-coordinator.js +1 -0
- package/dist/application/orchestration/subagent-handoff.d.ts +3 -0
- package/dist/application/orchestration/subagent-handoff.js +3 -0
- package/dist/application/orchestration/subagent-tool-executor.d.ts +12 -0
- package/dist/application/orchestration/subagent-tool-executor.js +1 -0
- package/dist/application/orchestration/task-graph.d.ts +13 -0
- package/dist/application/orchestration/task-graph.js +1 -0
- package/dist/application/orchestration/task-scheduler.d.ts +18 -0
- package/dist/application/orchestration/task-scheduler.js +1 -0
- package/dist/application/project/project-trust-service.d.ts +13 -0
- package/dist/application/project/project-trust-service.js +1 -0
- package/dist/application/project-intelligence/project-intelligence-constants.d.ts +56 -0
- package/dist/application/project-intelligence/project-intelligence-constants.js +1 -0
- package/dist/application/project-intelligence/project-intelligence-service.d.ts +14 -0
- package/dist/application/project-intelligence/project-intelligence-service.js +1 -0
- package/dist/application/protocol/browser-host-tool-executor.d.ts +51 -0
- package/dist/application/protocol/browser-host-tool-executor.js +2 -0
- package/dist/application/protocol/computer-host-tool-executor.d.ts +45 -0
- package/dist/application/protocol/computer-host-tool-executor.js +2 -0
- package/dist/application/protocol/desktop-agent-command.d.ts +9 -0
- package/dist/application/protocol/desktop-agent-command.js +3 -0
- package/dist/application/protocol/desktop-agent-contracts.d.ts +34 -0
- package/dist/application/protocol/desktop-agent-contracts.js +1 -0
- package/dist/application/protocol/desktop-agent-helpers.d.ts +5 -0
- package/dist/application/protocol/desktop-agent-helpers.js +1 -0
- package/dist/application/protocol/desktop-agent-request-parser.d.ts +211 -0
- package/dist/application/protocol/desktop-agent-request-parser.js +1 -0
- package/dist/application/protocol/desktop-approval-broker.d.ts +26 -0
- package/dist/application/protocol/desktop-approval-broker.js +1 -0
- package/dist/application/protocol/desktop-attachment-store.d.ts +33 -0
- package/dist/application/protocol/desktop-attachment-store.js +1 -0
- package/dist/application/protocol/desktop-command-catalog.d.ts +2 -0
- package/dist/application/protocol/desktop-command-catalog.js +1 -0
- package/dist/application/protocol/desktop-command-contract.d.ts +26 -0
- package/dist/application/protocol/desktop-command-contract.js +1 -0
- package/dist/application/protocol/desktop-command-executor.d.ts +17 -0
- package/dist/application/protocol/desktop-command-executor.js +1 -0
- package/dist/application/protocol/desktop-command-output.d.ts +15 -0
- package/dist/application/protocol/desktop-command-output.js +1 -0
- package/dist/application/protocol/desktop-execution-policy.d.ts +19 -0
- package/dist/application/protocol/desktop-execution-policy.js +1 -0
- package/dist/application/protocol/desktop-extension-request-handler.d.ts +14 -0
- package/dist/application/protocol/desktop-extension-request-handler.js +1 -0
- package/dist/application/protocol/desktop-extension-service.d.ts +44 -0
- package/dist/application/protocol/desktop-extension-service.js +3 -0
- package/dist/application/protocol/desktop-host-bridge.d.ts +33 -0
- package/dist/application/protocol/desktop-host-bridge.js +1 -0
- package/dist/application/protocol/desktop-host-capabilities.d.ts +12 -0
- package/dist/application/protocol/desktop-host-capabilities.js +1 -0
- package/dist/application/protocol/desktop-host-tool-executor.d.ts +76 -0
- package/dist/application/protocol/desktop-host-tool-executor.js +2 -0
- package/dist/application/protocol/desktop-intent-event-writer.d.ts +20 -0
- package/dist/application/protocol/desktop-intent-event-writer.js +1 -0
- package/dist/application/protocol/desktop-mcp-events.d.ts +10 -0
- package/dist/application/protocol/desktop-mcp-events.js +1 -0
- package/dist/application/protocol/desktop-orchestration-events.d.ts +2 -0
- package/dist/application/protocol/desktop-orchestration-events.js +2 -0
- package/dist/application/protocol/desktop-protocol-helpers.d.ts +13 -0
- package/dist/application/protocol/desktop-protocol-helpers.js +1 -0
- package/dist/application/protocol/json-line-writer.d.ts +31 -0
- package/dist/application/protocol/json-line-writer.js +2 -0
- package/dist/application/protocol/jsonl-agent-command.d.ts +3 -0
- package/dist/application/protocol/jsonl-agent-command.js +3 -0
- package/dist/application/protocol/jsonl-protocol.d.ts +82 -0
- package/dist/application/protocol/jsonl-protocol.js +2 -0
- package/dist/application/protocol/tool-image-content.d.ts +4 -0
- package/dist/application/protocol/tool-image-content.js +1 -0
- package/dist/application/security/delegated-worker-policy.d.ts +3 -0
- package/dist/application/security/delegated-worker-policy.js +1 -0
- package/dist/application/security/desktop-tool-scope-policy.d.ts +4 -0
- package/dist/application/security/desktop-tool-scope-policy.js +1 -0
- package/dist/application/security/tool-action-risk-analyzer.d.ts +13 -0
- package/dist/application/security/tool-action-risk-analyzer.js +1 -0
- package/dist/application/security/tool-approval-service.d.ts +43 -0
- package/dist/application/security/tool-approval-service.js +1 -0
- package/dist/application/security/tool-policy-registry.d.ts +20 -0
- package/dist/application/security/tool-policy-registry.js +1 -0
- package/dist/application/security/tool-risk-classifier.d.ts +19 -0
- package/dist/application/security/tool-risk-classifier.js +1 -0
- package/dist/application/security/workspace-permission-policy.d.ts +10 -0
- package/dist/application/security/workspace-permission-policy.js +1 -0
- package/dist/application/session/project-session-access.d.ts +8 -0
- package/dist/application/session/project-session-access.js +1 -0
- package/dist/application/session/session-compaction-service.d.ts +10 -0
- package/dist/application/session/session-compaction-service.js +1 -0
- package/dist/application/session/session-turn-lifecycle.d.ts +5 -0
- package/dist/application/session/session-turn-lifecycle.js +1 -0
- package/dist/application/workspace/session-execution-workspace.d.ts +59 -0
- package/dist/application/workspace/session-execution-workspace.js +3 -0
- package/dist/application/workspace/workspace-constants.d.ts +17 -0
- package/dist/application/workspace/workspace-constants.js +1 -0
- package/dist/application/workspace/workspace-file-index.d.ts +14 -0
- package/dist/application/workspace/workspace-file-index.js +1 -0
- package/dist/application/workspace/workspace-file-reference-resolver.d.ts +20 -0
- package/dist/application/workspace/workspace-file-reference-resolver.js +17 -0
- package/dist/application/workspace/workspace-instruction-loader.d.ts +8 -0
- package/dist/application/workspace/workspace-instruction-loader.js +1 -0
- package/dist/bootstrap/composition-root.d.ts +7 -0
- package/dist/bootstrap/composition-root.js +1 -0
- package/dist/bootstrap/global-cli-options.d.ts +6 -0
- package/dist/bootstrap/global-cli-options.js +1 -0
- package/dist/bootstrap/native-devtools-stub.d.ts +10 -0
- package/dist/bootstrap/native-devtools-stub.js +1 -0
- package/dist/bootstrap/native-entry.d.ts +1 -0
- package/dist/bootstrap/native-entry.js +2 -0
- package/dist/bootstrap/native-tiktoken.d.ts +4 -0
- package/dist/bootstrap/native-tiktoken.js +1 -0
- package/dist/bootstrap/runtime-factory.d.ts +46 -0
- package/dist/bootstrap/runtime-factory.js +1 -0
- package/dist/bootstrap/shutdown-manager.d.ts +11 -0
- package/dist/bootstrap/shutdown-manager.js +1 -0
- package/dist/bootstrap/startup-sequence.d.ts +5 -0
- package/dist/bootstrap/startup-sequence.js +1 -0
- package/dist/domain/auth/auth-profile.d.ts +14 -0
- package/dist/domain/auth/auth-profile.js +1 -0
- package/dist/domain/config/config-schema.d.ts +24 -0
- package/dist/domain/config/config-schema.js +1 -0
- package/dist/domain/errors/cli-command-hint.d.ts +5 -0
- package/dist/domain/errors/cli-command-hint.js +0 -0
- package/dist/domain/errors/cli-error.d.ts +35 -0
- package/dist/domain/errors/cli-error.js +1 -0
- package/dist/domain/errors/error-codes.d.ts +51 -0
- package/dist/domain/errors/error-codes.js +1 -0
- package/dist/domain/extensions/extension-constants.d.ts +1 -0
- package/dist/domain/extensions/extension-constants.js +1 -0
- package/dist/domain/extensions/extension-scope.d.ts +3 -0
- package/dist/domain/extensions/extension-scope.js +1 -0
- package/dist/domain/extensions/extension-state.d.ts +5 -0
- package/dist/domain/extensions/extension-state.js +1 -0
- package/dist/domain/extensions/hook-manifest.d.ts +13 -0
- package/dist/domain/extensions/hook-manifest.js +1 -0
- package/dist/domain/extensions/host-tool-plugin-ids.d.ts +5 -0
- package/dist/domain/extensions/host-tool-plugin-ids.js +1 -0
- package/dist/domain/extensions/mcp-config.d.ts +35 -0
- package/dist/domain/extensions/mcp-config.js +1 -0
- package/dist/domain/extensions/plugin-agent-manifest.d.ts +8 -0
- package/dist/domain/extensions/plugin-agent-manifest.js +1 -0
- package/dist/domain/extensions/plugin-manifest.d.ts +23 -0
- package/dist/domain/extensions/plugin-manifest.js +1 -0
- package/dist/domain/extensions/skill-manifest.d.ts +10 -0
- package/dist/domain/extensions/skill-manifest.js +3 -0
- package/dist/domain/extensions/yaml-subset.d.ts +9 -0
- package/dist/domain/extensions/yaml-subset.js +2 -0
- package/dist/domain/filesystem/file-change-diff.d.ts +21 -0
- package/dist/domain/filesystem/file-change-diff.js +3 -0
- package/dist/domain/intent/intent-contract.d.ts +33 -0
- package/dist/domain/intent/intent-contract.js +1 -0
- package/dist/domain/media/gateway-media-contract.d.ts +23 -0
- package/dist/domain/media/gateway-media-contract.js +1 -0
- package/dist/domain/media/media-constants.d.ts +3 -0
- package/dist/domain/media/media-constants.js +1 -0
- package/dist/domain/media/media-contract.d.ts +28 -0
- package/dist/domain/media/media-contract.js +0 -0
- package/dist/domain/media/media-execution-policy.d.ts +9 -0
- package/dist/domain/media/media-execution-policy.js +1 -0
- package/dist/domain/memory/memory-constants.d.ts +3 -0
- package/dist/domain/memory/memory-constants.js +1 -0
- package/dist/domain/memory/memory-kinds.d.ts +15 -0
- package/dist/domain/memory/memory-kinds.js +1 -0
- package/dist/domain/memory/memory-retrieval-policy.d.ts +3 -0
- package/dist/domain/memory/memory-retrieval-policy.js +1 -0
- package/dist/domain/memory/memory-search.d.ts +33 -0
- package/dist/domain/memory/memory-search.js +2 -0
- package/dist/domain/memory/memory.d.ts +48 -0
- package/dist/domain/memory/memory.js +1 -0
- package/dist/domain/orchestration/goal.d.ts +57 -0
- package/dist/domain/orchestration/goal.js +1 -0
- package/dist/domain/orchestration/subagent-identity.d.ts +2 -0
- package/dist/domain/orchestration/subagent-identity.js +1 -0
- package/dist/domain/orchestration/subagent.d.ts +33 -0
- package/dist/domain/orchestration/subagent.js +0 -0
- package/dist/domain/orchestration/work-plan.d.ts +15 -0
- package/dist/domain/orchestration/work-plan.js +0 -0
- package/dist/domain/project/project-identity.d.ts +6 -0
- package/dist/domain/project/project-identity.js +1 -0
- package/dist/domain/runtime/assistant-delta-normalizer.d.ts +11 -0
- package/dist/domain/runtime/assistant-delta-normalizer.js +1 -0
- package/dist/domain/runtime/assistant-stream-text.d.ts +11 -0
- package/dist/domain/runtime/assistant-stream-text.js +1 -0
- package/dist/domain/runtime/gateway-request-budget.d.ts +19 -0
- package/dist/domain/runtime/gateway-request-budget.js +1 -0
- package/dist/domain/runtime/resource-limits.d.ts +92 -0
- package/dist/domain/runtime/resource-limits.js +1 -0
- package/dist/domain/session/attachment.d.ts +15 -0
- package/dist/domain/session/attachment.js +0 -0
- package/dist/domain/session/session-schema.d.ts +6 -0
- package/dist/domain/session/session-schema.js +1 -0
- package/dist/domain/session/session.d.ts +27 -0
- package/dist/domain/session/session.js +0 -0
- package/dist/domain/settings/settings-document.d.ts +8 -0
- package/dist/domain/settings/settings-document.js +1 -0
- package/dist/domain/validation/record-schema.d.ts +4 -0
- package/dist/domain/validation/record-schema.js +1 -0
- package/dist/domain/workspace/workspace-settings.d.ts +14 -0
- package/dist/domain/workspace/workspace-settings.js +1 -0
- package/dist/infrastructure/agent-sdk/agent-instance-factory.d.ts +22 -0
- package/dist/infrastructure/agent-sdk/agent-instance-factory.js +1 -0
- package/dist/infrastructure/agent-sdk/model-response-metrics.d.ts +7 -0
- package/dist/infrastructure/agent-sdk/model-response-metrics.js +1 -0
- package/dist/infrastructure/agent-sdk/model-tool-name-mapper.d.ts +13 -0
- package/dist/infrastructure/agent-sdk/model-tool-name-mapper.js +1 -0
- package/dist/infrastructure/agent-sdk/sdk-constants.d.ts +2 -0
- package/dist/infrastructure/agent-sdk/sdk-constants.js +1 -0
- package/dist/infrastructure/agent-sdk/tool-calling-completion-client.d.ts +4 -0
- package/dist/infrastructure/agent-sdk/tool-calling-completion-client.js +1 -0
- package/dist/infrastructure/agent-sdk/tool-calling-model-client.d.ts +11 -0
- package/dist/infrastructure/agent-sdk/tool-calling-model-client.js +1 -0
- package/dist/infrastructure/cache/cache-policy.d.ts +9 -0
- package/dist/infrastructure/cache/cache-policy.js +1 -0
- package/dist/infrastructure/cache/file-cache-store.d.ts +25 -0
- package/dist/infrastructure/cache/file-cache-store.js +2 -0
- package/dist/infrastructure/clipboard/clipboard-adapter-factory.d.ts +11 -0
- package/dist/infrastructure/clipboard/clipboard-adapter-factory.js +1 -0
- package/dist/infrastructure/clipboard/clipboard-constants.d.ts +1 -0
- package/dist/infrastructure/clipboard/clipboard-constants.js +1 -0
- package/dist/infrastructure/clipboard/clipboard-policy.d.ts +8 -0
- package/dist/infrastructure/clipboard/clipboard-policy.js +1 -0
- package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.d.ts +10 -0
- package/dist/infrastructure/clipboard/clipboard-text-adapter-factory.js +1 -0
- package/dist/infrastructure/clipboard/image-normalizer.d.ts +12 -0
- package/dist/infrastructure/clipboard/image-normalizer.js +1 -0
- package/dist/infrastructure/clipboard/windows-clipboard-adapter.d.ts +7 -0
- package/dist/infrastructure/clipboard/windows-clipboard-adapter.js +1 -0
- package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.d.ts +7 -0
- package/dist/infrastructure/clipboard/windows-clipboard-text-adapter.js +1 -0
- package/dist/infrastructure/config/config-loader.d.ts +19 -0
- package/dist/infrastructure/config/config-loader.js +2 -0
- package/dist/infrastructure/config/environment-values.d.ts +2 -0
- package/dist/infrastructure/config/environment-values.js +1 -0
- package/dist/infrastructure/credentials/composite-credential-store.d.ts +11 -0
- package/dist/infrastructure/credentials/composite-credential-store.js +1 -0
- package/dist/infrastructure/credentials/encrypted-file-credential-store.d.ts +17 -0
- package/dist/infrastructure/credentials/encrypted-file-credential-store.js +3 -0
- package/dist/infrastructure/credentials/environment-credential-store.d.ts +11 -0
- package/dist/infrastructure/credentials/environment-credential-store.js +1 -0
- package/dist/infrastructure/credentials/secret-input.d.ts +7 -0
- package/dist/infrastructure/credentials/secret-input.js +3 -0
- package/dist/infrastructure/extensions/composite-mcp-config-store.d.ts +9 -0
- package/dist/infrastructure/extensions/composite-mcp-config-store.js +1 -0
- package/dist/infrastructure/extensions/extension-directory-reader.d.ts +2 -0
- package/dist/infrastructure/extensions/extension-directory-reader.js +1 -0
- package/dist/infrastructure/extensions/extension-integrity.d.ts +7 -0
- package/dist/infrastructure/extensions/extension-integrity.js +1 -0
- package/dist/infrastructure/extensions/extension-source-resolver.d.ts +6 -0
- package/dist/infrastructure/extensions/extension-source-resolver.js +1 -0
- package/dist/infrastructure/extensions/extensions-constants.d.ts +6 -0
- package/dist/infrastructure/extensions/extensions-constants.js +1 -0
- package/dist/infrastructure/extensions/file-mcp-config-store.d.ts +15 -0
- package/dist/infrastructure/extensions/file-mcp-config-store.js +2 -0
- package/dist/infrastructure/extensions/hook-runtime.d.ts +18 -0
- package/dist/infrastructure/extensions/hook-runtime.js +1 -0
- package/dist/infrastructure/extensions/mcp-runtime.d.ts +58 -0
- package/dist/infrastructure/extensions/mcp-runtime.js +1 -0
- package/dist/infrastructure/extensions/plugin-agent-discovery.d.ts +4 -0
- package/dist/infrastructure/extensions/plugin-agent-discovery.js +1 -0
- package/dist/infrastructure/extensions/plugin-discovery.d.ts +5 -0
- package/dist/infrastructure/extensions/plugin-discovery.js +1 -0
- package/dist/infrastructure/extensions/plugin-manager.d.ts +23 -0
- package/dist/infrastructure/extensions/plugin-manager.js +2 -0
- package/dist/infrastructure/extensions/skill-discovery.d.ts +4 -0
- package/dist/infrastructure/extensions/skill-discovery.js +1 -0
- package/dist/infrastructure/extensions/skill-installer.d.ts +9 -0
- package/dist/infrastructure/extensions/skill-installer.js +1 -0
- package/dist/infrastructure/extensions/skill-manager.d.ts +22 -0
- package/dist/infrastructure/extensions/skill-manager.js +2 -0
- package/dist/infrastructure/extensions/skill-roots.d.ts +19 -0
- package/dist/infrastructure/extensions/skill-roots.js +1 -0
- package/dist/infrastructure/extensions/skill-tool-executor.d.ts +20 -0
- package/dist/infrastructure/extensions/skill-tool-executor.js +2 -0
- package/dist/infrastructure/filesystem/atomic-file-store.d.ts +28 -0
- package/dist/infrastructure/filesystem/atomic-file-store.js +1 -0
- package/dist/infrastructure/filesystem/bounded-file-reader.d.ts +6 -0
- package/dist/infrastructure/filesystem/bounded-file-reader.js +1 -0
- package/dist/infrastructure/filesystem/bounded-json-reader.d.ts +1 -0
- package/dist/infrastructure/filesystem/bounded-json-reader.js +1 -0
- package/dist/infrastructure/filesystem/filesystem-constants.d.ts +8 -0
- package/dist/infrastructure/filesystem/filesystem-constants.js +1 -0
- package/dist/infrastructure/filesystem/fs-errors.d.ts +2 -0
- package/dist/infrastructure/filesystem/fs-errors.js +1 -0
- package/dist/infrastructure/filesystem/gateway-media-input-reader.d.ts +12 -0
- package/dist/infrastructure/filesystem/gateway-media-input-reader.js +1 -0
- package/dist/infrastructure/filesystem/local-filesystem-tool-executor.d.ts +25 -0
- package/dist/infrastructure/filesystem/local-filesystem-tool-executor.js +3 -0
- package/dist/infrastructure/filesystem/path-resolver.d.ts +20 -0
- package/dist/infrastructure/filesystem/path-resolver.js +1 -0
- package/dist/infrastructure/filesystem/workspace-media-artifact-store.d.ts +13 -0
- package/dist/infrastructure/filesystem/workspace-media-artifact-store.js +1 -0
- package/dist/infrastructure/logging/daily-rotating-file-writer.d.ts +26 -0
- package/dist/infrastructure/logging/daily-rotating-file-writer.js +2 -0
- package/dist/infrastructure/logging/log-redactor.d.ts +2 -0
- package/dist/infrastructure/logging/log-redactor.js +1 -0
- package/dist/infrastructure/logging/logging-constants.d.ts +3 -0
- package/dist/infrastructure/logging/logging-constants.js +1 -0
- package/dist/infrastructure/logging/logging-policy.d.ts +6 -0
- package/dist/infrastructure/logging/logging-policy.js +1 -0
- package/dist/infrastructure/logging/structured-logger.d.ts +24 -0
- package/dist/infrastructure/logging/structured-logger.js +4 -0
- package/dist/infrastructure/memory/file-memory-store.d.ts +37 -0
- package/dist/infrastructure/memory/file-memory-store.js +11 -0
- package/dist/infrastructure/network/safe-media-downloader.d.ts +23 -0
- package/dist/infrastructure/network/safe-media-downloader.js +1 -0
- package/dist/infrastructure/observability/tool-execution-logger.d.ts +11 -0
- package/dist/infrastructure/observability/tool-execution-logger.js +1 -0
- package/dist/infrastructure/platform/host-platform.d.ts +16 -0
- package/dist/infrastructure/platform/host-platform.js +1 -0
- package/dist/infrastructure/platform/host-process.d.ts +31 -0
- package/dist/infrastructure/platform/host-process.js +1 -0
- package/dist/infrastructure/platform/platform-constants.d.ts +4 -0
- package/dist/infrastructure/platform/platform-constants.js +1 -0
- package/dist/infrastructure/platform/platform-paths.d.ts +25 -0
- package/dist/infrastructure/platform/platform-paths.js +1 -0
- package/dist/infrastructure/platform/process-identity.d.ts +8 -0
- package/dist/infrastructure/platform/process-identity.js +1 -0
- package/dist/infrastructure/platform/process-termination.d.ts +4 -0
- package/dist/infrastructure/platform/process-termination.js +1 -0
- package/dist/infrastructure/platform/read-only-executable.d.ts +4 -0
- package/dist/infrastructure/platform/read-only-executable.js +1 -0
- package/dist/infrastructure/project/file-project-trust-store.d.ts +12 -0
- package/dist/infrastructure/project/file-project-trust-store.js +2 -0
- package/dist/infrastructure/sdk/chat-completion-adapter.d.ts +8 -0
- package/dist/infrastructure/sdk/chat-completion-adapter.js +1 -0
- package/dist/infrastructure/sdk/lotagate-client-factory.d.ts +3 -0
- package/dist/infrastructure/sdk/lotagate-client-factory.js +1 -0
- package/dist/infrastructure/sdk/model-catalog-adapter.d.ts +19 -0
- package/dist/infrastructure/sdk/model-catalog-adapter.js +1 -0
- package/dist/infrastructure/sdk/sdk-media-gateway-client.d.ts +24 -0
- package/dist/infrastructure/sdk/sdk-media-gateway-client.js +1 -0
- package/dist/infrastructure/sessions/file-goal-store.d.ts +21 -0
- package/dist/infrastructure/sessions/file-goal-store.js +1 -0
- package/dist/infrastructure/sessions/file-session-store.d.ts +50 -0
- package/dist/infrastructure/sessions/file-session-store.js +4 -0
- package/dist/infrastructure/sessions/project-session-paths.d.ts +17 -0
- package/dist/infrastructure/sessions/project-session-paths.js +1 -0
- package/dist/infrastructure/sessions/session-constants.d.ts +3 -0
- package/dist/infrastructure/sessions/session-constants.js +1 -0
- package/dist/infrastructure/sessions/session-index.d.ts +16 -0
- package/dist/infrastructure/sessions/session-index.js +3 -0
- package/dist/infrastructure/sessions/session-journal-health.d.ts +7 -0
- package/dist/infrastructure/sessions/session-journal-health.js +1 -0
- package/dist/infrastructure/sessions/session-journal.d.ts +22 -0
- package/dist/infrastructure/sessions/session-journal.js +6 -0
- package/dist/infrastructure/sessions/subagent-journal-store.d.ts +28 -0
- package/dist/infrastructure/sessions/subagent-journal-store.js +2 -0
- package/dist/infrastructure/shell/shell-tool-executor.d.ts +21 -0
- package/dist/infrastructure/shell/shell-tool-executor.js +2 -0
- package/dist/infrastructure/tokens/tiktoken-token-estimator.d.ts +18 -0
- package/dist/infrastructure/tokens/tiktoken-token-estimator.js +1 -0
- package/dist/infrastructure/tokens/token-constants.d.ts +1 -0
- package/dist/infrastructure/tokens/token-constants.js +1 -0
- package/dist/infrastructure/workspace/workspace-settings-store.d.ts +10 -0
- package/dist/infrastructure/workspace/workspace-settings-store.js +4 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.js +3 -0
- package/dist/ports/cache-store.d.ts +10 -0
- package/dist/ports/cache-store.js +0 -0
- package/dist/ports/chat-model.d.ts +30 -0
- package/dist/ports/chat-model.js +0 -0
- package/dist/ports/clipboard-adapter.d.ts +7 -0
- package/dist/ports/clipboard-adapter.js +0 -0
- package/dist/ports/clipboard-text-adapter.d.ts +3 -0
- package/dist/ports/clipboard-text-adapter.js +0 -0
- package/dist/ports/credential-store.d.ts +7 -0
- package/dist/ports/credential-store.js +0 -0
- package/dist/ports/goal-store.d.ts +12 -0
- package/dist/ports/goal-store.js +0 -0
- package/dist/ports/logger.d.ts +8 -0
- package/dist/ports/logger.js +0 -0
- package/dist/ports/media-gateway-client.d.ts +60 -0
- package/dist/ports/media-gateway-client.js +0 -0
- package/dist/ports/memory-store.d.ts +26 -0
- package/dist/ports/memory-store.js +0 -0
- package/dist/ports/model-completion-client.d.ts +8 -0
- package/dist/ports/model-completion-client.js +0 -0
- package/dist/ports/model-diagnostics.d.ts +17 -0
- package/dist/ports/model-diagnostics.js +0 -0
- package/dist/ports/project-trust-store.d.ts +12 -0
- package/dist/ports/project-trust-store.js +0 -0
- package/dist/ports/session-store.d.ts +59 -0
- package/dist/ports/session-store.js +0 -0
- package/dist/ports/subagent-lifecycle.d.ts +31 -0
- package/dist/ports/subagent-lifecycle.js +0 -0
- package/dist/ports/tool-activity.d.ts +13 -0
- package/dist/ports/tool-activity.js +0 -0
- package/dist/presentation/themes/theme.d.ts +19 -0
- package/dist/presentation/themes/theme.js +1 -0
- package/dist/presentation/tui/agent-initialization-renderer.d.ts +4 -0
- package/dist/presentation/tui/agent-initialization-renderer.js +1 -0
- package/dist/presentation/tui/context-display.d.ts +21 -0
- package/dist/presentation/tui/context-display.js +2 -0
- package/dist/presentation/tui/formatters.d.ts +6 -0
- package/dist/presentation/tui/formatters.js +1 -0
- package/dist/presentation/tui/ink/choice-window.d.ts +5 -0
- package/dist/presentation/tui/ink/choice-window.js +1 -0
- package/dist/presentation/tui/ink/components/activity-animation.d.ts +3 -0
- package/dist/presentation/tui/ink/components/activity-animation.js +1 -0
- package/dist/presentation/tui/ink/components/activity-entry.d.ts +6 -0
- package/dist/presentation/tui/ink/components/activity-entry.js +1 -0
- package/dist/presentation/tui/ink/components/activity-status.d.ts +10 -0
- package/dist/presentation/tui/ink/components/activity-status.js +1 -0
- package/dist/presentation/tui/ink/components/choice-modal.d.ts +11 -0
- package/dist/presentation/tui/ink/components/choice-modal.js +1 -0
- package/dist/presentation/tui/ink/components/composer.d.ts +40 -0
- package/dist/presentation/tui/ink/components/composer.js +8 -0
- package/dist/presentation/tui/ink/components/file-diff.d.ts +6 -0
- package/dist/presentation/tui/ink/components/file-diff.js +1 -0
- package/dist/presentation/tui/ink/components/modal.d.ts +8 -0
- package/dist/presentation/tui/ink/components/modal.js +2 -0
- package/dist/presentation/tui/ink/components/shimmer-text.d.ts +8 -0
- package/dist/presentation/tui/ink/components/shimmer-text.js +1 -0
- package/dist/presentation/tui/ink/components/subagent-activity.d.ts +11 -0
- package/dist/presentation/tui/ink/components/subagent-activity.js +1 -0
- package/dist/presentation/tui/ink/components/transcript.d.ts +40 -0
- package/dist/presentation/tui/ink/components/transcript.js +5 -0
- package/dist/presentation/tui/ink/components/welcome-panel.d.ts +6 -0
- package/dist/presentation/tui/ink/components/welcome-panel.js +1 -0
- package/dist/presentation/tui/ink/lotagate-tui.d.ts +6 -0
- package/dist/presentation/tui/ink/lotagate-tui.js +2 -0
- package/dist/presentation/tui/ink/markdown-inline-renderer.d.ts +4 -0
- package/dist/presentation/tui/ink/markdown-inline-renderer.js +1 -0
- package/dist/presentation/tui/ink/markdown-inline.d.ts +13 -0
- package/dist/presentation/tui/ink/markdown-inline.js +1 -0
- package/dist/presentation/tui/ink/markdown-message.d.ts +6 -0
- package/dist/presentation/tui/ink/markdown-message.js +2 -0
- package/dist/presentation/tui/ink/markdown-table.d.ts +16 -0
- package/dist/presentation/tui/ink/markdown-table.js +1 -0
- package/dist/presentation/tui/ink/tui-bridge.d.ts +193 -0
- package/dist/presentation/tui/ink/tui-bridge.js +1 -0
- package/dist/presentation/tui/terminal-capabilities.d.ts +15 -0
- package/dist/presentation/tui/terminal-capabilities.js +1 -0
- package/dist/presentation/tui/terminal-mouse.d.ts +5 -0
- package/dist/presentation/tui/terminal-mouse.js +1 -0
- package/dist/presentation/tui/terminal-screen.d.ts +10 -0
- package/dist/presentation/tui/terminal-screen.js +1 -0
- package/dist/presentation/tui/tui-agent-event-runner.d.ts +29 -0
- package/dist/presentation/tui/tui-agent-event-runner.js +1 -0
- package/dist/presentation/tui/tui-agent-turn-controller.d.ts +45 -0
- package/dist/presentation/tui/tui-agent-turn-controller.js +1 -0
- package/dist/presentation/tui/tui-application-contract.d.ts +11 -0
- package/dist/presentation/tui/tui-application-contract.js +1 -0
- package/dist/presentation/tui/tui-application.d.ts +61 -0
- package/dist/presentation/tui/tui-application.js +3 -0
- package/dist/presentation/tui/tui-clipboard-paste-handlers.d.ts +11 -0
- package/dist/presentation/tui/tui-clipboard-paste-handlers.js +1 -0
- package/dist/presentation/tui/tui-command-context.d.ts +3 -0
- package/dist/presentation/tui/tui-command-context.js +0 -0
- package/dist/presentation/tui/tui-command-executor.d.ts +38 -0
- package/dist/presentation/tui/tui-command-executor.js +4 -0
- package/dist/presentation/tui/tui-command-host-factory.d.ts +40 -0
- package/dist/presentation/tui/tui-command-host-factory.js +1 -0
- package/dist/presentation/tui/tui-context-compaction.d.ts +8 -0
- package/dist/presentation/tui/tui-context-compaction.js +1 -0
- package/dist/presentation/tui/tui-context-service.d.ts +2 -0
- package/dist/presentation/tui/tui-context-service.js +1 -0
- package/dist/presentation/tui/tui-extension-loader.d.ts +21 -0
- package/dist/presentation/tui/tui-extension-loader.js +1 -0
- package/dist/presentation/tui/tui-file-suggestions.d.ts +3 -0
- package/dist/presentation/tui/tui-file-suggestions.js +1 -0
- package/dist/presentation/tui/tui-goal-controller.d.ts +14 -0
- package/dist/presentation/tui/tui-goal-controller.js +1 -0
- package/dist/presentation/tui/tui-initial-model.d.ts +3 -0
- package/dist/presentation/tui/tui-initial-model.js +1 -0
- package/dist/presentation/tui/tui-lifecycle-actions.d.ts +13 -0
- package/dist/presentation/tui/tui-lifecycle-actions.js +1 -0
- package/dist/presentation/tui/tui-manual-compaction.d.ts +18 -0
- package/dist/presentation/tui/tui-manual-compaction.js +1 -0
- package/dist/presentation/tui/tui-media-model-selection.d.ts +12 -0
- package/dist/presentation/tui/tui-media-model-selection.js +1 -0
- package/dist/presentation/tui/tui-prompt-dispatcher.d.ts +16 -0
- package/dist/presentation/tui/tui-prompt-dispatcher.js +1 -0
- package/dist/presentation/tui/tui-skill-controller.d.ts +11 -0
- package/dist/presentation/tui/tui-skill-controller.js +3 -0
- package/dist/presentation/tui/tui-tool-approval.d.ts +22 -0
- package/dist/presentation/tui/tui-tool-approval.js +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +1 -0
- package/native-targets.mjs +1 -1
- package/package.json +13 -12
- package/scripts/install-native.mjs +5 -13
- package/skills/architecture-review/SKILL.md +41 -14
- package/skills/code-review/SKILL.md +41 -12
- package/skills/debugging/SKILL.md +49 -12
- package/skills/documentation/SKILL.md +43 -9
- package/skills/feature-implementation/SKILL.md +58 -19
- package/bin/lotagate.exe +0 -1
- package/skills/api-contract-review/SKILL.md +0 -17
- package/skills/database-review/SKILL.md +0 -17
- package/skills/dependency-review/SKILL.md +0 -16
- package/skills/frontend-review/SKILL.md +0 -18
- package/skills/incident-response/SKILL.md +0 -18
- package/skills/performance-review/SKILL.md +0 -17
- package/skills/refactor/SKILL.md +0 -23
- package/skills/release-readiness/SKILL.md +0 -16
- package/skills/security-review/SKILL.md +0 -16
- package/skills/test-plan/SKILL.md +0 -22
- package/skills/verify/SKILL.md +0 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AuthenticationService as O}from"../../application/auth/authentication-service.js";import{loadExecutionConfig as H}from"../../application/config/execution-config.js";import{CliError as q,asCliError as y}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as P}from"../../domain/errors/error-codes.js";import{buildUserMessage as B}from"../../infrastructure/clipboard/image-normalizer.js";import{createLotaGateClient as G}from"../../infrastructure/sdk/lotagate-client-factory.js";import{estimateTurnUsage as $}from"../../infrastructure/tokens/tiktoken-token-estimator.js";import{AgentRunTracker as J}from"../../application/agent/agent-run-tracker.js";import{prepareCliAgent as V}from"../../application/agent/cli-agent-execution-service.js";import{createTurnId as Y,recordTurnCompletion as z,recordTurnFailure as K,recordTurnStart as Q}from"../../application/session/session-turn-lifecycle.js";import{createTuiContextManagement as X,createTuiContinuationContext as Z}from"./tui-context-compaction.js";import{isAbortError as ee,throwIfAborted as x}from"./tui-lifecycle-actions.js";import{runTuiAgentEvents as te}from"./tui-agent-event-runner.js";import{AUTH_LOGIN_HINT as oe,MODEL_SELECT_HINT as se,formatCliErrorMessage as M,formatCommandHint as I}from"../../application/commands/command-hints.js";class Ae{host;activeAbortController;activePromptRun;constructor(s){this.host=s}isRunning(){return this.activePromptRun!==void 0}getActiveAbortController(){return this.activeAbortController}setActiveAbortController(s){this.activeAbortController=s}abortActive(s){this.activeAbortController?.abort(s)}async runPrompt(s,n,g){return this.sendPrompt(s,this.host.pendingAttachments.list(),n,g)}async sendPrompt(s,n=[],g,d){if(this.activePromptRun!==void 0)return this.host.renderer.notice("A response is already running. Stop it before sending another prompt."),"";try{this.host.pendingAttachments.assertPromptFits(s,n)}catch(A){const w=y(A);return this.host.renderer.error(M(w,"tui")),""}const c=this.host.getSession(),h=c===void 0?void 0:await this.host.executionWorkspaces.acquireTurn(c.id),m=this.executePrompt(s,n,g,d);this.activePromptRun=m,this.host.renderer.setRunActive(!0);try{return await m}finally{this.activePromptRun===m&&(this.activePromptRun=void 0),this.host.renderer.setRunActive(!1),await h?.()}}async executePrompt(s,n,g,d){const c=await H(this.host.runtime,this.host.cwd),h=this.host.getActiveModel()??c.config.model;if(h===null)return this.host.renderer.error(`No model is selected. ${I(se,"tui")}`),"";const m=this.host.getActiveProfile()??c.config.profile??O.defaultProfileName(),A=await this.host.runtime.credentialStore.get(m);if(A===void 0)return this.host.renderer.error(`No API key is configured. ${I(oe,"tui")}`),"";const w=await this.host.runtime.projectTrust.inspect(this.host.cwd),t=this.host.getSession();t!==void 0&&this.host.setExecutionWorkspace(await this.host.executionWorkspaces.prepare({sessionId:t.id,projectRoot:w.canonicalPath})),await this.host.runHookEvent("prompt.before",t?.id??"tui"),this.host.renderer.userPrompt(s,n.map(({attachment:e})=>e));const C=Y();t!==void 0&&await Q(this.host.runtime.sessionStore,t.id,C,s,n.map(({attachment:e})=>e.id));const S=Date.now();let p,v=!1;this.host.renderer.status("Thinking");const f=new AbortController;this.activeAbortController=f;const T=G(A.profile,A.apiKey),U=await this.host.runtime.projectTrust.isTrusted(w),o=t===void 0?void 0:await this.host.runtime.goalStore.get(t.id),i=new J,L={start:e=>this.host.renderer.startToolActivity(e.key,e.label)},N={onSubagentLifecycle:e=>{e.sessionId===t?.id&&this.host.renderer.subagentLifecycle(e)}},W=await this.host.contextService.getModelContextWindow(h,m),_=e=>{i.observeModel(e),e.usage!==void 0&&(p=e.usage,v=!0,d?.onUsage({usage:e.usage,modelCalls:1})),this.host.runtime.logger.debug("Model turn completed.",{model:e.model,stream:e.stream,contentLength:e.contentLength,toolCallCount:e.toolCallCount,toolNames:e.toolNames,finishReason:e.finishReason})},E=await V({runtime:this.host.runtime,projectRoot:w.canonicalPath,executionCwd:this.host.getExecutionWorkspace().executionCwd,executionWorkspaceId:this.host.getExecutionWorkspace().id,model:h,reasoningEffort:c.config.effort,client:T,profile:U?"interactive-trusted":"interactive-untrusted",approvalMode:c.config.approvalMode,subagentJobs:this.host.getSubagentJobs(),...g===void 0?{}:{initialSkill:g},onWrite:e=>this.host.renderer.fileChange(e),prompt:(e,a)=>this.host.approvals.ask(e,a),rememberApproval:e=>this.host.approvals.remember(w.canonicalPath,e),onApprovalPersistenceFailure:(e,a)=>this.host.approvals.rememberFailure(a),audit:e=>this.host.approvals.audit(e),onModelComplete:_,onSubagentModelComplete:e=>{e.usage!==void 0&&d?.onUsage({usage:e.usage,modelCalls:1})},contextManagement:X(T,h,W,e=>this.host.runtime.logger.warn("Context summarization failed; using fallback summary.",{reason:e instanceof Error?e.message:String(e)}),()=>Z(i.snapshot(),o)),agentSessionStore:this.host.agentSessionStore,toolActivity:L,onIntentLifecycle:e=>{e.type==="intent.compiled"?this.host.renderer.status("Understanding the task"):e.type==="intent.verification.required"?this.host.renderer.status("Verifying the result"):e.type==="intent.blocked"&&this.host.renderer.status("Verification is incomplete")},subagentLifecycle:N,...o===void 0?{}:{goal:{objective:o.objective,status:o.status,turns:o.turns,evaluatorRuns:o.evaluatorRuns,tokensUsed:o.usage.totalTokens,...o.tokenBudget===void 0?{}:{tokenBudget:o.tokenBudget},...o.maxTurns===void 0?{}:{maxTurns:o.maxTurns},...o.maxDurationMs===void 0?{}:{maxDurationMs:o.maxDurationMs},...o.lastError===void 0?{}:{lastError:o.lastError},...o.lastEvaluation===void 0?{}:{lastEvaluation:o.lastEvaluation.reason}}}}),u=[];let b=!1;const D=e=>{x(f.signal),u.push(e),this.host.renderer.assistantDelta(e)},F=e=>{x(f.signal),u.splice(0,u.length,e),this.host.renderer.replaceAssistant(e)};try{x(f.signal);const e=await E.buildInput(s);this.host.pendingAttachments.assertPromptFits(e.input,n);const a=n.length===0?void 0:B(e.input,n),r=a?.content===null?void 0:a?.content;if(await te({prepared:E,input:e.input,userInput:e.userInput,...e.workspaceContext===void 0?{}:{workspaceContext:e.workspaceContext},...r===void 0?{}:{inputContent:r},model:h,...t===void 0?{}:{sessionId:t.id},turnId:C,signal:f.signal,agentSessionStore:this.host.agentSessionStore,tracker:i,runtime:this.host.runtime,renderer:this.host.renderer,startedAt:S,getUsage:()=>p,appendAssistantDelta:D,replaceAssistantResponse:F,hasResponse:()=>u.length>0}),u.join("").trim().length===0){const l=i.snapshot();l.toolCalls>0&&i.markStuck();const j=l.toolCalls>0?P.MODEL_EMPTY_FINAL:P.MODEL_PROTOCOL_EMPTY_RESPONSE,R=l.toolCalls>0?"The model completed its tool work without a final text response.":"The model returned neither text nor a tool call.";throw new q(j,R,{category:"model",userMessage:`${R} Check the selected model and gateway tool-calling support, then try again.`,retryable:!0,details:{modelTurns:l.modelTurns,toolCalls:l.toolCalls,toolCompletions:l.toolCompletions,toolFailures:l.toolFailures,toolNames:l.toolNames,finishReason:l.lastFinishReason}})}t!==void 0&&(await this.host.executionWorkspaces.apply(t.id),b=!0),d?.onSnapshot(i.snapshot())}catch(e){const a=f.signal.aborted||ee(e);if(t!==void 0&&!b)try{const r=await this.host.executionWorkspaces.apply(t.id);b=!0,r.appliedPaths.length>0&&this.host.runtime.logger.info("Applied session workspace changes after turn failure.",{sessionId:t.id,turnId:C,appliedPaths:r.appliedPaths})}catch(r){this.host.runtime.logger.error("Failed to apply session workspace changes after turn failure.",{sessionId:t.id,turnId:C,reason:r instanceof Error?r.message:String(r)})}if(t!==void 0&&this.host.agentSessionStore.delete(t.id),a?i.markCancelled():i.snapshot().state!=="stuck"&&i.markFailed(),t!==void 0&&await K(this.host.runtime.sessionStore,t.id,C,e,a),this.host.renderer.finishAssistant(),a)this.host.renderer.notice("Interrupted.");else{const r=y(e);this.host.renderer.failed(),this.host.runtime.logger.error("Agent run failed.",{code:r.code,category:r.category,...r.details??{}}),this.host.renderer.error(M(r,"tui"))}return d?.onError(e),d?.onSnapshot(i.snapshot()),""}finally{this.activeAbortController===f&&(this.activeAbortController=void 0);try{await E.close()}catch(e){this.host.runtime.logger.warn("Agent cleanup failed after a completed turn.",{reason:e instanceof Error?e.message:String(e)})}if(t!==void 0)try{await this.host.executionWorkspaces.markReady(t.id)}catch(e){this.host.runtime.logger.warn("Unable to release TUI execution workspace after turn.",{sessionId:t.id,reason:e instanceof Error?e.message:String(e)})}}this.host.renderer.finishAssistant();try{t!==void 0&&await z(this.host.runtime.sessionStore,t.id,C,u.join(""))}catch(e){this.host.runtime.logger.warn("Unable to persist the completed turn.",{reason:e instanceof Error?e.message:String(e)}),this.host.renderer.notice("Response completed, but the session state could not be saved.")}try{await this.host.runHookEvent("response.after",t?.id??"tui")}catch(e){this.host.runtime.logger.warn("Response hook failed after a completed turn.",{reason:e instanceof Error?e.message:String(e)}),this.host.renderer.notice("Response completed, but the response hook failed.")}this.host.pendingAttachments.clear(),this.host.renderer.setPendingAttachments([]),!v&&p!==void 0&&d?.onUsage({usage:p,modelCalls:1});const k=p?.totalTokens===void 0?$({model:h,prompt:s,response:u.join("")}):p;return!v&&p===void 0&&k!==void 0&&d?.onUsage({usage:k,modelCalls:1}),this.host.renderer.complete(Date.now()-S,k),await this.host.refreshContextUsage(),u.join("")}}export{Ae as TuiAgentTurnController};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Readable } from 'node:stream';
|
|
2
|
+
import type { TerminalOutput } from './terminal-capabilities.js';
|
|
3
|
+
export interface TuiApplicationOptions {
|
|
4
|
+
input?: Readable & {
|
|
5
|
+
isTTY?: boolean;
|
|
6
|
+
};
|
|
7
|
+
output?: TerminalOutput;
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
}
|
|
11
|
+
export declare function formatResumeCommand(sessionId: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{formatCommandInvocation as r}from"../../application/commands/command-presentation.js";import{COMMAND_REGISTRY as n}from"../../application/commands/command-runtime.js";function m(o){const e=n.get("session.resume.direct");if(e===void 0)throw new Error("Missing session resume command contract.");return r(e,"direct",[o],new Map([["interactive",!0]]))}export{m as formatResumeCommand};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
|
|
2
|
+
import type { TuiCommandContext } from './tui-command-context.js';
|
|
3
|
+
import type { ScopedSkill } from '../../infrastructure/extensions/skill-manager.js';
|
|
4
|
+
import type { SkillManifest } from '../../domain/extensions/skill-manifest.js';
|
|
5
|
+
import type { ExtensionScope } from '../../domain/extensions/extension-scope.js';
|
|
6
|
+
import type { TuiContextSnapshot } from './context-display.js';
|
|
7
|
+
import type { GoalTurnCallbacks } from '../../application/orchestration/goal-runner.js';
|
|
8
|
+
import type { CreateGoalInput } from '../../domain/orchestration/goal.js';
|
|
9
|
+
import { type TuiApplicationOptions } from './tui-application-contract.js';
|
|
10
|
+
export declare class TuiApplication {
|
|
11
|
+
private readonly runtime;
|
|
12
|
+
private readonly cwd;
|
|
13
|
+
private readonly options;
|
|
14
|
+
private readonly input;
|
|
15
|
+
private readonly output;
|
|
16
|
+
private readonly renderer;
|
|
17
|
+
private readonly pendingAttachments;
|
|
18
|
+
private session;
|
|
19
|
+
private hookRuntime;
|
|
20
|
+
private hooks;
|
|
21
|
+
private skillRootScopes;
|
|
22
|
+
private enabledPluginNames;
|
|
23
|
+
private pluginMcpConfig;
|
|
24
|
+
private activeForegroundRun;
|
|
25
|
+
private exitArmedUntil;
|
|
26
|
+
private lastInterruptAt;
|
|
27
|
+
private printResumeCommandOnExit;
|
|
28
|
+
private activeModel;
|
|
29
|
+
private activeProfile;
|
|
30
|
+
private readonly approvals;
|
|
31
|
+
private readonly contextService;
|
|
32
|
+
private readonly agentSessionStore;
|
|
33
|
+
private subagentJobs;
|
|
34
|
+
private readonly executionWorkspaces;
|
|
35
|
+
private executionWorkspace;
|
|
36
|
+
private readonly turnController;
|
|
37
|
+
constructor(runtime: CliRuntime, cwd: string, options?: TuiApplicationOptions);
|
|
38
|
+
run(): Promise<number>;
|
|
39
|
+
private processPrompt;
|
|
40
|
+
private attachClipboardImage;
|
|
41
|
+
runPrompt(prompt: string, initialSkill?: SkillManifest, goalCallbacks?: GoalTurnCallbacks): Promise<string>;
|
|
42
|
+
runGoal(objective: string, context: TuiCommandContext, limits?: Omit<CreateGoalInput, 'objective'>): Promise<void>;
|
|
43
|
+
resumeGoal(context: TuiCommandContext): Promise<void>;
|
|
44
|
+
private commandContext;
|
|
45
|
+
getActiveModel(): string | null;
|
|
46
|
+
getActiveProfile(): string | null;
|
|
47
|
+
refreshExtensions(): Promise<void>;
|
|
48
|
+
refreshWelcome(overrides?: {
|
|
49
|
+
model?: string | null;
|
|
50
|
+
profile?: string | null;
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
getContextSnapshot(): Promise<TuiContextSnapshot>;
|
|
53
|
+
private refreshContextUsage;
|
|
54
|
+
runSkill(name: string, args: readonly string[], context: TuiCommandContext, availableSkills?: readonly ScopedSkill[], scope?: ExtensionScope): Promise<void>;
|
|
55
|
+
private reloadExtensions;
|
|
56
|
+
compactSession(): Promise<void>;
|
|
57
|
+
resumeSession(sessionId: string): Promise<void>;
|
|
58
|
+
private handleInterrupt;
|
|
59
|
+
private awaitActiveForegroundRun;
|
|
60
|
+
private runHookEvent;
|
|
61
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{createElement as w}from"react";import{render as v}from"ink";import{detectTerminalCapabilities as S}from"./terminal-capabilities.js";import{enterInteractiveScreen as x,exitInteractiveScreen as C}from"./terminal-screen.js";import{createImageAttachment as b,normalizeImage as A}from"../../infrastructure/clipboard/image-normalizer.js";import{PendingAttachmentStore as P}from"../../application/chat/pending-attachment-store.js";import{CLI_VERSION as l}from"../../version.js";import{InkTuiBridge as k}from"./ink/tui-bridge.js";import{LotaGateTui as y}from"./ink/lotagate-tui.js";import{WorkspaceFileIndex as T}from"../../application/workspace/workspace-file-index.js";import{ProjectSessionAccess as E}from"../../application/session/project-session-access.js";import{createTuiCommandHost as I}from"./tui-command-host-factory.js";import{workspaceFileSuggestions as R}from"./tui-file-suggestions.js";import{warmMcpRuntime as m}from"../../application/agent/cli-agent-execution-service.js";import{TuiToolApprovalCoordinator as M}from"./tui-tool-approval.js";import{TuiContextService as U}from"./tui-context-service.js";import{createTuiClipboardPasteHandlers as W}from"./tui-clipboard-paste-handlers.js";import{dispatchTuiPrompt as j}from"./tui-prompt-dispatcher.js";import{CliAgentSessionStore as H,retainLatestCompaction as p}from"../../application/agent/agent-session-store.js";import{compactManualTuiSession as F}from"./tui-manual-compaction.js";import{resolveInitialModel as g}from"./tui-initial-model.js";import{cancelTuiResponse as G,handleTuiInterrupt as L,isAbortError as N,runTuiHookEvent as O}from"./tui-lifecycle-actions.js";import{loadExecutionConfig as D}from"../../application/config/execution-config.js";import{resumeTuiGoal as $,runTuiGoal as J}from"./tui-goal-controller.js";import{runTuiSkill as z}from"./tui-skill-controller.js";import{SubagentJobRegistry as f}from"../../application/orchestration/cli-subagent-service.js";import{formatResumeCommand as B}from"./tui-application-contract.js";import{SessionExecutionWorkspaceService as q}from"../../application/workspace/session-execution-workspace.js";import{loadTuiExtensions as V}from"./tui-extension-loader.js";import{TuiAgentTurnController as _}from"./tui-agent-turn-controller.js";class ye{runtime;cwd;options;input;output;renderer;pendingAttachments=new P;session;hookRuntime;hooks=[];skillRootScopes=[];enabledPluginNames=[];pluginMcpConfig={};activeForegroundRun;exitArmedUntil=0;lastInterruptAt=0;printResumeCommandOnExit=!1;activeModel=null;activeProfile=null;approvals;contextService;agentSessionStore=new H;subagentJobs=new f;executionWorkspaces;executionWorkspace;turnController;constructor(i,e,t={}){this.runtime=i,this.cwd=e,this.options=t,this.input=t.input??process.stdin,this.output=t.output??process.stdout,this.renderer=new k,this.executionWorkspaces=this.runtime.executionWorkspaces??new q(this.runtime.paths.globalConfigDir,this.runtime.platform),this.contextService=new U(this.runtime,this.cwd),this.approvals=new M({renderer:this.renderer,runtime:this.runtime,getSessionId:()=>this.session?.id,getActiveSignal:()=>this.turnController.getActiveAbortController()?.signal}),this.turnController=new _({runtime:this.runtime,cwd:this.cwd,renderer:this.renderer,pendingAttachments:this.pendingAttachments,approvals:this.approvals,contextService:this.contextService,agentSessionStore:this.agentSessionStore,executionWorkspaces:this.executionWorkspaces,getSession:()=>this.session,getActiveModel:()=>this.activeModel,getActiveProfile:()=>this.activeProfile,getExecutionWorkspace:()=>this.executionWorkspace,setExecutionWorkspace:r=>{this.executionWorkspace=r},getSubagentJobs:()=>this.subagentJobs,runHookEvent:(r,s)=>this.runHookEvent(r,s),refreshContextUsage:()=>this.refreshContextUsage()}),this.renderer.setInterruptHandler(()=>this.handleInterrupt()),this.renderer.setCancelHandler(()=>G(this.turnController.getActiveAbortController(),this.renderer));const n=W({platform:this.runtime.platform,notify:r=>this.renderer.notice(r),attachImage:(r,s)=>this.attachClipboardImage(r,!1,s)});this.renderer.setImagePasteHandler(n.image),this.renderer.setTextPasteHandler(n.text),this.renderer.setClearAttachmentsHandler(()=>{this.pendingAttachments.clear(),this.renderer.setPendingAttachments([])})}async run(){if(!S(this.input,this.output).isInteractive)return this.output.write('Interactive TUI requires a terminal. Use `lotagate chat "prompt"` for non-interactive streaming.\n'),2;x(this.output);const e=v(w(y,{bridge:this.renderer}),{stdin:this.input,stdout:this.output,exitOnCtrlC:!1}),t=()=>this.handleInterrupt(),n=()=>{this.turnController.abortActive(new Error("Interactive session is shutting down.")),this.renderer.requestExit(143)};process.on("SIGINT",t),this.options.signal?.addEventListener("abort",n,{once:!0});let r="completed";try{const s=await this.runtime.projectTrust.inspect(this.cwd);let o=await this.runtime.projectTrust.isTrusted(s),h=await this.runtime.configLoader.load(this.cwd,{includeProject:o}),u=await g(this.runtime,h.config),c={...h,config:{...h.config,model:u}};if(this.activeModel=c.config.model,this.activeProfile=c.config.profile,this.renderer.setWelcome({version:l,cwd:s.canonicalPath,model:c.config.model,profile:c.config.profile,trusted:o}),this.renderer.setFileSuggestions([]),o||(o=await this.renderer.confirmTrust(),o?(await this.runtime.projectTrust.grant(s),h=await this.runtime.configLoader.load(this.cwd),u=await g(this.runtime,h.config),c={...h,config:{...h.config,model:u}},this.activeModel=c.config.model,this.activeProfile=c.config.profile,this.renderer.setWelcome({version:l,cwd:s.canonicalPath,model:this.activeModel,profile:this.activeProfile,trusted:!0}),this.renderer.notice("Project trusted.")):this.renderer.notice("Project remains untrusted; local tools and extensions stay disabled.")),o&&await this.runtime.workspaceSettings.ensureInitialized(s.canonicalPath),await this.reloadExtensions(o,c.config.approvalMode,s.canonicalPath),this.options.sessionId!==void 0){const a=await this.runtime.sessionStore.get(this.options.sessionId);if(a===void 0)throw new Error(`Session not found: ${this.options.sessionId}`);if(a.projectFingerprint!==s.fingerprint)throw new Error("Session belongs to another project.");this.session=a,this.renderer.status(`Resuming session ${a.id}`);for(const d of p(await this.runtime.sessionStore.readTranscript(a.id)))d.type==="user"?this.renderer.userPrompt(d.content):d.type==="assistant"&&(this.renderer.beginAssistant(),this.renderer.assistantDelta(d.content),this.renderer.finishAssistant())}else this.session=await this.runtime.sessionStore.create({projectFingerprint:s.fingerprint,cwd:s.canonicalPath,model:c.config.model,profile:c.config.profile,status:"active"});return this.executionWorkspace=await this.executionWorkspaces.prepare({sessionId:this.session.id,projectRoot:s.canonicalPath}),await this.refreshContextUsage(),await this.runHookEvent("session.start",this.session.id),m(this.runtime,this.cwd).catch(a=>this.runtime.logger.warn("MCP session warm-up failed.",{reason:a instanceof Error?a.message:String(a)})),this.renderer.setSubmitHandler(async a=>{await this.processPrompt(a)&&this.renderer.requestExit()}),this.renderer.clearActivity(),this.renderer.setReady(),new T(s.canonicalPath).listEntries().then(a=>this.renderer.setFileSuggestions(R(a))).catch(a=>this.runtime.logger.debug("Unable to load workspace file suggestions.",{reason:a instanceof Error?a.message:String(a)})),await this.renderer.waitForExit()}catch(s){throw r=N(s)?"cancelled":"failed",s}finally{this.turnController.abortActive(new Error("Interactive session is closing.")),this.renderer.resolveActiveModal(void 0),await this.awaitActiveForegroundRun();try{await this.subagentJobs.close()}catch(s){this.runtime.logger.warn("Unable to close subagent jobs during TUI shutdown.",{reason:s instanceof Error?s.message:String(s)})}if(this.agentSessionStore.clear(),this.session!==void 0){try{await this.runHookEvent("session.end",this.session.id)}catch(s){this.runtime.logger.warn("Session end hook failed during TUI shutdown.",{sessionId:this.session.id,reason:s instanceof Error?s.message:String(s)})}try{await this.runtime.sessionStore.updateStatus(this.session.id,r)}catch(s){this.runtime.logger.warn("Unable to update TUI session status during shutdown.",{sessionId:this.session.id,reason:s instanceof Error?s.message:String(s)})}try{await this.executionWorkspaces.markReady(this.session.id)}catch(s){this.runtime.logger.warn("Unable to release TUI execution workspace.",{sessionId:this.session.id,reason:s instanceof Error?s.message:String(s)})}}process.off("SIGINT",t),this.options.signal?.removeEventListener("abort",n),this.renderer.dispose(),e.unmount(),C(this.output),this.printResumeCommandOnExit&&this.session!==void 0&&this.output.write(`
|
|
2
|
+
${B(this.session.id)}
|
|
3
|
+
`)}}async processPrompt(i){if(this.activeForegroundRun!==void 0)return this.renderer.notice("An operation is already running. Stop it before starting another one."),!1;const e=j(i,{renderer:this.renderer,logger:this.runtime.logger,commandHost:I({runtime:this.runtime,cwd:this.cwd,renderer:this.renderer,pendingAttachments:this.pendingAttachments,getHooks:()=>this.hooks,getSession:()=>this.session,getActiveAbortController:()=>this.turnController.getActiveAbortController(),setActiveAbortController:t=>{this.turnController.setActiveAbortController(t)},attachClipboardImage:t=>this.attachClipboardImage(t),runPrompt:(t,n)=>this.turnController.runPrompt(t,n),runGoal:(t,n,r)=>this.runGoal(t,n,r),resumeGoal:t=>this.resumeGoal(t),runSkill:(t,n,r,s,o)=>this.runSkill(t,n,r,s,o),refreshExtensions:()=>this.refreshExtensions(),compactSession:()=>this.compactSession(),refreshWelcome:t=>this.refreshWelcome(t),getContextSnapshot:()=>this.getContextSnapshot(),resumeSession:t=>this.resumeSession(t)}),pendingAttachments:this.pendingAttachments,commandContext:()=>this.commandContext(),sendPrompt:(t,n)=>this.turnController.sendPrompt(t,n),resetActiveAbortController:()=>{this.turnController.isRunning()||this.turnController.setActiveAbortController(void 0)}});this.activeForegroundRun=e;try{return await e}finally{this.activeForegroundRun===e&&(this.activeForegroundRun=void 0)}}async attachClipboardImage(i,e=!0,t=""){if(i===void 0){e&&this.renderer.notice("Clipboard does not contain an image.");return}const n=A(i.bytes,i.mimeType);this.pendingAttachments.assertCanAdd(n.bytes.byteLength,t,{byteLength:n.bytes.byteLength,mimeType:n.mimeType});const r=this.pendingAttachments.nextId(),s=b(n,"clipboard",r),o=this.session===void 0?s:await this.runtime.sessionStore.saveAttachment(this.session.id,s,n.bytes);this.pendingAttachments.add({attachment:o,bytes:n.bytes},t),this.renderer.setPendingAttachments(this.pendingAttachments.list().map(({attachment:h})=>h)),e&&this.renderer.notice(`Attached ${s.name} \xB7 ${s.mimeType} \xB7 ${s.sizeBytes} bytes`)}async runPrompt(i,e,t){return this.turnController.runPrompt(i,e,t)}async runGoal(i,e,t={}){if(this.turnController.isRunning()){e.write("Stop the active response before starting a goal.");return}await J({runtime:this.runtime,cwd:this.cwd,sessionId:this.session?.id,model:this.activeModel??this.session?.model??null,profile:this.activeProfile??this.session?.profile??null,runPrompt:(n,r)=>this.runPrompt(n,void 0,r),write:n=>e.write(n)},i,t)}async resumeGoal(i){if(this.turnController.isRunning()){i.write("Stop the active response before resuming a goal.");return}await $({runtime:this.runtime,cwd:this.cwd,sessionId:this.session?.id,model:this.activeModel??this.session?.model??null,profile:this.activeProfile??this.session?.profile??null,runPrompt:(e,t)=>this.runPrompt(e,void 0,t),write:e=>i.write(e)})}commandContext(){return{write:i=>this.renderer.commandOutput(i)}}getActiveModel(){return this.activeModel}getActiveProfile(){return this.activeProfile}async refreshExtensions(){const i=await this.runtime.projectTrust.inspect(this.cwd);this.runtime.agentPreparation?.clear(i.canonicalPath);const e=await this.runtime.projectTrust.isTrusted(i),t=await this.runtime.configLoader.load(this.cwd,{includeProject:e});await this.reloadExtensions(e,t.config.approvalMode,i.canonicalPath),await this.refreshContextUsage()}async refreshWelcome(i={}){const e=await this.runtime.projectTrust.inspect(this.cwd);this.runtime.agentPreparation?.clear(e.canonicalPath);const t=await this.runtime.projectTrust.isTrusted(e),n=await this.runtime.configLoader.load(this.cwd,{includeProject:t});this.activeModel=i.model===void 0?this.activeModel??n.config.model:i.model,this.activeProfile=i.profile===void 0?this.activeProfile??n.config.profile:i.profile,this.renderer.setWelcome({version:l,cwd:e.canonicalPath,model:this.activeModel,profile:this.activeProfile,trusted:t}),await this.refreshContextUsage()}async getContextSnapshot(){const i=this.activeModel??this.session?.model??null,e=this.session===void 0?void 0:await this.runtime.goalStore.get(this.session.id),t=await this.contextService.buildForProject({...this.session===void 0?{}:{sessionId:this.session.id},model:i,profileName:this.activeProfile??this.session?.profile??null,pluginNames:this.enabledPluginNames,pluginMcpConfig:this.pluginMcpConfig,pendingAttachments:this.pendingAttachments.size,skillRootScopes:this.skillRootScopes,agentSessionStore:this.agentSessionStore,...e===void 0?{}:{goal:{objective:e.objective,status:e.status,turns:e.turns,evaluatorRuns:e.evaluatorRuns,tokensUsed:e.usage.totalTokens,...e.tokenBudget===void 0?{}:{tokenBudget:e.tokenBudget},...e.maxTurns===void 0?{}:{maxTurns:e.maxTurns},...e.maxDurationMs===void 0?{}:{maxDurationMs:e.maxDurationMs},...e.lastError===void 0?{}:{lastError:e.lastError},...e.lastEvaluation===void 0?{}:{lastEvaluation:e.lastEvaluation.reason}}}});return this.renderer.setContextUsage({usedTokens:t.usedTokens,...t.contextWindow===void 0?{}:{contextWindow:t.contextWindow}}),t}async refreshContextUsage(){try{await this.getContextSnapshot()}catch(i){this.runtime.logger.debug("Unable to refresh context usage.",{reason:i instanceof Error?i.message:String(i)})}}async runSkill(i,e,t,n,r){await z({globalConfigDir:this.runtime.paths.globalConfigDir,skillRootScopes:this.skillRootScopes,runPrompt:(s,o)=>this.turnController.sendPrompt(s,this.pendingAttachments.list(),o)},i,e,t,r,n)}async reloadExtensions(i,e,t){const n=await V({runtime:this.runtime,cwd:this.cwd,trusted:i,approvalMode:e,workspaceRoot:t,approvals:this.approvals});this.hookRuntime=n.hookRuntime,this.skillRootScopes=n.skillRootScopes,this.enabledPluginNames=n.enabledPluginNames,this.pluginMcpConfig=n.pluginMcpConfig,this.hooks=n.hooks}async compactSession(){await F({runtime:this.runtime,cwd:this.cwd,session:this.session,activeModel:this.activeModel,activeProfile:this.activeProfile,activeResponse:this.turnController.getActiveAbortController()!==void 0,renderer:this.renderer,contextService:this.contextService,agentSessionStore:this.agentSessionStore,refreshContextUsage:()=>this.refreshContextUsage()})}async resumeSession(i){if(this.turnController.isRunning())throw new Error("Stop the active response before resuming another session.");const e=await this.runtime.projectTrust.inspect(this.cwd),t=await new E(this.runtime.sessionStore).require(i,e.fingerprint);if(t.id===this.session?.id){this.renderer.notice(`Already using session: ${t.id}`);return}const n=await this.runtime.sessionStore.readTranscript(t.id),r=this.session;r!==void 0&&(await this.subagentJobs.close(),this.subagentJobs=new f,await this.runHookEvent("session.end",r.id),await this.runtime.sessionStore.updateStatus(r.id,"completed"),this.agentSessionStore.delete(r.id)),this.session=await this.runtime.sessionStore.updateStatus(t.id,"active"),this.executionWorkspace=await this.executionWorkspaces.prepare({sessionId:t.id,projectRoot:e.canonicalPath});const s=await D(this.runtime,this.cwd);this.activeModel=t.model??s.config.model,this.activeProfile=t.profile??s.config.profile,this.renderer.setWelcome({version:l,cwd:e.canonicalPath,model:this.activeModel,profile:this.activeProfile,trusted:await this.runtime.projectTrust.isTrusted(e)}),this.renderer.clearTranscript();for(const o of p(n))o.type==="user"?this.renderer.userPrompt(o.content):o.type==="assistant"&&(this.renderer.beginAssistant(),this.renderer.assistantDelta(o.content),this.renderer.finishAssistant());await this.refreshContextUsage(),await this.runHookEvent("session.start",t.id),this.pendingAttachments.clear(),this.renderer.setPendingAttachments([]),m(this.runtime,this.cwd).catch(o=>this.runtime.logger.warn("MCP session warm-up failed.",{reason:o instanceof Error?o.message:String(o)})),this.renderer.notice(`Resumed session: ${t.id}`)}handleInterrupt(){const i=L({lastInterruptAt:this.lastInterruptAt,exitArmedUntil:this.exitArmedUntil,printResumeCommandOnExit:this.printResumeCommandOnExit},this.turnController.getActiveAbortController(),this.renderer);this.lastInterruptAt=i.lastInterruptAt,this.exitArmedUntil=i.exitArmedUntil,this.printResumeCommandOnExit=i.printResumeCommandOnExit}async awaitActiveForegroundRun(){const i=this.activeForegroundRun;if(i!==void 0)try{await i}catch(e){this.runtime.logger.warn("Foreground TUI operation failed during shutdown.",{reason:e instanceof Error?e.message:String(e)})}}async runHookEvent(i,e){await O(this.hookRuntime,this.hooks,i,this.executionWorkspace?.executionCwd??this.cwd,e)}}export{ye as TuiApplication};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ClipboardImage } from '../../ports/clipboard-adapter.js';
|
|
2
|
+
import type { HostPlatformContext } from '../../infrastructure/platform/host-platform.js';
|
|
3
|
+
export interface TuiClipboardPasteHandlers {
|
|
4
|
+
image: (prompt: string) => Promise<void>;
|
|
5
|
+
text: () => Promise<string | undefined>;
|
|
6
|
+
}
|
|
7
|
+
export declare function createTuiClipboardPasteHandlers(options: {
|
|
8
|
+
platform: HostPlatformContext;
|
|
9
|
+
notify: (message: string) => void;
|
|
10
|
+
attachImage: (image: ClipboardImage | undefined, prompt: string) => Promise<void>;
|
|
11
|
+
}): TuiClipboardPasteHandlers;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{asCliError as t}from"../../domain/errors/cli-error.js";import{createClipboardAdapter as m}from"../../infrastructure/clipboard/clipboard-adapter-factory.js";import{createClipboardTextAdapter as o}from"../../infrastructure/clipboard/clipboard-text-adapter-factory.js";import{formatCliErrorMessage as e}from"../../application/commands/command-hints.js";function n(r){return{image:async a=>{try{await r.attachImage(await m(r.platform).readImage(),a)}catch(i){r.notify(e(t(i),"tui"))}},text:async()=>{try{return await o(r.platform).readText()}catch(a){r.notify(e(t(a),"tui"));return}}}}export{n as createTuiClipboardPasteHandlers};
|
|
File without changes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { CommandInvocation } from '../../application/commands/command-contract.js';
|
|
2
|
+
import { type TuiContextSnapshot } from './context-display.js';
|
|
3
|
+
import type { SkillManifest } from '../../domain/extensions/skill-manifest.js';
|
|
4
|
+
import type { ScopedSkill } from '../../infrastructure/extensions/skill-manager.js';
|
|
5
|
+
import type { ExtensionScope } from '../../domain/extensions/extension-scope.js';
|
|
6
|
+
import type { SessionMetadata } from '../../domain/session/session.js';
|
|
7
|
+
import type { HookDefinition } from '../../domain/extensions/hook-manifest.js';
|
|
8
|
+
import type { PendingAttachmentStore } from '../../application/chat/pending-attachment-store.js';
|
|
9
|
+
import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
|
|
10
|
+
import type { InkTuiBridge } from './ink/tui-bridge.js';
|
|
11
|
+
import type { CreateGoalInput } from '../../domain/orchestration/goal.js';
|
|
12
|
+
import type { TuiCommandContext } from './tui-command-context.js';
|
|
13
|
+
export interface TuiCommandHost {
|
|
14
|
+
runtime: CliRuntime;
|
|
15
|
+
cwd: string;
|
|
16
|
+
renderer: InkTuiBridge;
|
|
17
|
+
pendingAttachments: PendingAttachmentStore;
|
|
18
|
+
hooks: readonly HookDefinition[];
|
|
19
|
+
session: SessionMetadata | undefined;
|
|
20
|
+
activeAbortController: AbortController | undefined;
|
|
21
|
+
attachClipboardImage(image: {
|
|
22
|
+
bytes: Uint8Array;
|
|
23
|
+
mimeType: string;
|
|
24
|
+
} | undefined): Promise<void>;
|
|
25
|
+
runPrompt(prompt: string, initialSkill?: SkillManifest): Promise<string>;
|
|
26
|
+
runGoal(objective: string, context: TuiCommandContext, limits?: Omit<CreateGoalInput, 'objective'>): Promise<void>;
|
|
27
|
+
resumeGoal(context: TuiCommandContext): Promise<void>;
|
|
28
|
+
runSkill(name: string, args: readonly string[], context: TuiCommandContext, availableSkills?: readonly ScopedSkill[], scope?: ExtensionScope): Promise<void>;
|
|
29
|
+
refreshExtensions(): Promise<void>;
|
|
30
|
+
compactSession(): Promise<void>;
|
|
31
|
+
refreshWelcome(overrides?: {
|
|
32
|
+
model?: string | null;
|
|
33
|
+
profile?: string | null;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
getContextSnapshot(): Promise<TuiContextSnapshot>;
|
|
36
|
+
resumeSession(sessionId: string): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export declare function executeTuiCommand(invocation: CommandInvocation, host: TuiCommandHost, context: TuiCommandContext): Promise<boolean>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{AuthenticationService as d}from"../../application/auth/authentication-service.js";import{executeApplicationCommand as c}from"../../application/commands/application-command-executor.js";import{runEffortCommand as f,runModelCommand as m}from"../../application/commands/cli-command-services.js";import{REASONING_EFFORTS as p}from"../../domain/config/config-schema.js";import{loadModelCatalog as u}from"../../application/model/model-catalog-service.js";import{formatContextSnapshot as w}from"./context-display.js";import{createClipboardAdapter as g}from"../../infrastructure/clipboard/clipboard-adapter-factory.js";import{formatCompactTable as y}from"../../application/formatting/compact-table.js";import{formatGoalStatus as A}from"../../application/orchestration/goal-output.js";import{parseGoalLimits as b}from"../../application/orchestration/goal-input.js";import{prepareTuiMediaInvocation as S}from"./tui-media-model-selection.js";import{isCliAgentPreparationMutation as C}from"../../application/agent/cli-agent-preparation-cache.js";async function V(e,i,a){switch(e.action.executor){case"tui-exit":return!0;case"tui-clear":return i.renderer.clearTranscript(),!1;case"tui-stop":return L(i,a),!1;case"tui-details":return a.write(`Action details: ${i.renderer.toggleActionDetails()?"on":"off"}`),!1;case"tui-context":return await T(i,a),!1;case"tui-auth-login":return await E(i,e,a),!1;case"tui-model-select":return await P(i,a),!1;case"tui-effort-select":return await W(i,a),!1;case"tui-skill-run":return await k(i,e,a),!1;case"tui-session-resume":return await i.resumeSession(o(e,0,"session id")),!1;case"tui-session-compact":return await i.compactSession(),!1;case"tui-session-rename":return await $(i,e,a),!1;case"tui-goal":return await I(i,e,a),!1;case"tui-attachments":return await j(i,e,a),!1;case"tui-prompt":return await i.runPrompt(e.positionals.join(" ")),!1;case"tui-agent-info":return a.write("The JSONL agent protocol owns stdin/stdout and must be run directly: lotagate agent stdio."),!1;default:{const t=await S(e,{loadModels:()=>u(i.runtime,i.cwd),selectModel:(r,n)=>i.renderer.selectModel(r,n)});return t===void 0?(a.write("Model selection cancelled."),!1):(await M(t,i,a),C(t.action.id,t.action.desktop?.mutationKey)&&i.runtime.agentPreparation?.clear(),await G(i,t),!1)}}}async function M(e,i,a){const t=new AbortController;i.activeAbortController=t;try{await c(e,N(i,a,t.signal))}finally{i.activeAbortController===t&&(i.activeAbortController=void 0)}}function N(e,i,a){return{runtime:e.runtime,cwd:e.cwd,output:{write:t=>i.write(t.endsWith(`
|
|
2
|
+
`)?t.slice(0,-1):t)},selectScope:t=>e.renderer.selectScope(t),activity:{start:(t,r)=>e.renderer.startToolActivity(t,r)},signal:a}}async function G(e,i){i.action.id==="model.use"&&await e.refreshWelcome({model:i.positionals[0]??null}),(i.action.id==="trust.grant"||i.action.id==="trust.revoke")&&(await e.refreshExtensions(),await e.refreshWelcome()),i.action.id.startsWith("plugin.")&&i.action.id!=="plugin.list"&&i.action.id!=="plugin.list.default"&&await e.refreshExtensions()}function L(e,i){e.activeAbortController===void 0?i.write("No response is currently running."):(e.activeAbortController.abort(),i.write("Stopping the active response."))}async function T(e,i){i.write(e.session===void 0?"No active session.":w(await e.getContextSnapshot()))}async function E(e,i,a){const t=await e.runtime.configLoader.load(e.cwd,{includeProject:!1}),r=String(i.options.get("profile")??t.config.profile??d.defaultProfileName()),n=String(i.options.get("base-url")??t.config.baseUrl),l=await e.renderer.requestSecret("LotaGate API key");if(l===void 0){a.write("Login cancelled.");return}const s=await e.runtime.auth.login({profileName:r,baseUrl:n,apiKey:l});await e.runtime.configLoader.setGlobal("profile",s.name),await e.refreshWelcome({profile:s.name}),a.write(`Logged in profile: ${s.name}`)}async function P(e,i){const a=await e.runtime.configLoader.load(e.cwd),t=await u(e.runtime,e.cwd);if(t.data.length===0){i.write("No models are available.");return}const r=await e.renderer.selectModel("Select a model",t.data.map(n=>({value:n.id,label:typeof n.display_name=="string"?n.display_name:n.id})),a.config.model??void 0);if(r===void 0){i.write("Model selection cancelled.");return}await m(["use",r],e.runtime,e.cwd,{write:n=>i.write(n.endsWith(`
|
|
3
|
+
`)?n.slice(0,-1):n)}),await e.refreshWelcome({model:r})}async function W(e,i){const a=await e.runtime.configLoader.load(e.cwd),t=await e.renderer.selectModel("Select reasoning effort",p.map(r=>({value:r,label:r})),a.config.effort);if(t===void 0){i.write("Effort selection cancelled.");return}await f(["use",t],e.runtime,e.cwd,{write:r=>i.write(r.endsWith(`
|
|
4
|
+
`)?r.slice(0,-1):r)})}async function k(e,i,a){const t=o(i,0,"skill name");await e.runSkill(t,i.positionals.slice(1),a,void 0,R(i))}async function $(e,i,a){if(e.session===void 0){a.write("No active session.");return}const t=i.positionals.join(" ").trim();e.session=await e.runtime.sessionStore.rename(e.session.id,t),a.write(`Renamed session: ${e.session.name}`)}async function I(e,i,a){if(i.action.id==="goal.start.tui"){await e.runGoal(i.positionals.join(" "),a,b(i.options));return}if(e.session===void 0){a.write("No active session.");return}if(i.action.id==="goal.status.tui"){const t=await e.runtime.goalStore.get(e.session.id);a.write(t===void 0?"No active goal.":A(t));return}if(i.action.id==="goal.pause.tui"){e.activeAbortController?.abort();const t=await e.runtime.goalStore.get(e.session.id);t?.status==="active"&&await e.runtime.goalStore.pause(e.session.id),a.write(t?.status==="paused"?"Goal already paused.":"Goal paused.");return}if(i.action.id==="goal.resume.tui"){await e.resumeGoal(a);return}e.activeAbortController?.abort(),await e.runtime.goalStore.clear(e.session.id),a.write("Goal cleared.")}async function j(e,i,a){const t=i.action.id;if(t==="attachments.paste"){const r=await g(e.runtime.platform).readImage();await e.attachClipboardImage(r),a.write(r===void 0?"Clipboard does not contain an image.":"Attachment added from clipboard.");return}if(t==="attachments.remove"){const r=o(i,0,"attachment id");e.pendingAttachments.remove(r)?(e.renderer.setPendingAttachments(e.pendingAttachments.list().map(({attachment:n})=>n)),a.write(`Removed attachment: ${r}`)):a.write(`Attachment not found: ${r}`);return}a.write(y(e.pendingAttachments.list().map(({attachment:r})=>({name:r.name,status:r.mimeType,detail:`${r.sizeBytes} bytes`})),{empty:"No pending attachments."}))}function o(e,i,a){const t=e.positionals[i];if(t===void 0)throw new Error(`Missing ${a}.`);return t}function R(e){const i=e.options.get("scope");return i==="user"||i==="project"?i:void 0}export{V as executeTuiCommand};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
|
|
2
|
+
import type { PendingAttachmentStore } from '../../application/chat/pending-attachment-store.js';
|
|
3
|
+
import type { HookDefinition } from '../../domain/extensions/hook-manifest.js';
|
|
4
|
+
import type { SessionMetadata } from '../../domain/session/session.js';
|
|
5
|
+
import type { SkillManifest } from '../../domain/extensions/skill-manifest.js';
|
|
6
|
+
import type { ScopedSkill } from '../../infrastructure/extensions/skill-manager.js';
|
|
7
|
+
import type { ExtensionScope } from '../../domain/extensions/extension-scope.js';
|
|
8
|
+
import type { CreateGoalInput } from '../../domain/orchestration/goal.js';
|
|
9
|
+
import type { InkTuiBridge } from './ink/tui-bridge.js';
|
|
10
|
+
import type { TuiCommandContext } from './tui-command-context.js';
|
|
11
|
+
import type { TuiCommandHost } from './tui-command-executor.js';
|
|
12
|
+
import type { TuiContextSnapshot } from './context-display.js';
|
|
13
|
+
export interface TuiCommandHostBindings {
|
|
14
|
+
runtime: CliRuntime;
|
|
15
|
+
cwd: string;
|
|
16
|
+
renderer: InkTuiBridge;
|
|
17
|
+
pendingAttachments: PendingAttachmentStore;
|
|
18
|
+
getHooks(): readonly HookDefinition[];
|
|
19
|
+
getSession(): SessionMetadata | undefined;
|
|
20
|
+
getActiveAbortController(): AbortController | undefined;
|
|
21
|
+
setActiveAbortController(controller: AbortController | undefined): void;
|
|
22
|
+
attachClipboardImage(image: {
|
|
23
|
+
bytes: Uint8Array;
|
|
24
|
+
mimeType: string;
|
|
25
|
+
} | undefined): Promise<void>;
|
|
26
|
+
runPrompt(prompt: string, initialSkill?: SkillManifest): Promise<string>;
|
|
27
|
+
runGoal(objective: string, context: TuiCommandContext, limits?: Omit<CreateGoalInput, 'objective'>): Promise<void>;
|
|
28
|
+
resumeGoal(context: TuiCommandContext): Promise<void>;
|
|
29
|
+
runSkill(name: string, args: readonly string[], context: TuiCommandContext, availableSkills?: readonly ScopedSkill[], scope?: ExtensionScope): Promise<void>;
|
|
30
|
+
refreshExtensions(): Promise<void>;
|
|
31
|
+
compactSession(): Promise<void>;
|
|
32
|
+
refreshWelcome(overrides?: {
|
|
33
|
+
model?: string | null;
|
|
34
|
+
profile?: string | null;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
getContextSnapshot(): Promise<TuiContextSnapshot>;
|
|
37
|
+
resumeSession(sessionId: string): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/** Adapts TUI-owned mutable state without exposing the application instance as an unsafe structural cast. */
|
|
40
|
+
export declare function createTuiCommandHost(bindings: TuiCommandHostBindings): TuiCommandHost;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function r(e){return{runtime:e.runtime,cwd:e.cwd,renderer:e.renderer,pendingAttachments:e.pendingAttachments,get hooks(){return e.getHooks()},get session(){return e.getSession()},get activeAbortController(){return e.getActiveAbortController()},set activeAbortController(t){e.setActiveAbortController(t)},attachClipboardImage:e.attachClipboardImage,runPrompt:e.runPrompt,runGoal:e.runGoal,resumeGoal:e.resumeGoal,runSkill:e.runSkill,refreshExtensions:e.refreshExtensions,compactSession:e.compactSession,refreshWelcome:e.refreshWelcome,getContextSnapshot:e.getContextSnapshot,resumeSession:e.resumeSession}}export{r as createTuiCommandHost};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SessionStore as AgentSessionStore } from '@lotagate/agent-sdk';
|
|
2
|
+
import type { LotaGate } from '@lotagate/sdk';
|
|
3
|
+
import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
|
|
4
|
+
import type { AgentRunSnapshot } from '../../application/agent/agent-run-tracker.js';
|
|
5
|
+
import { type ContinuationGoal } from '../../application/agent/continuation-checkpoint.js';
|
|
6
|
+
export declare function createTuiContextManagement(client: LotaGate, model: string, contextWindow: number | undefined, onSummaryFailure: (error: unknown) => void, continuationContext?: () => string | undefined): import("@lotagate/agent-sdk").ContextManagementOptions;
|
|
7
|
+
export declare function createTuiContinuationContext(snapshot: AgentRunSnapshot, goal?: ContinuationGoal): string;
|
|
8
|
+
export declare function compactTuiSession(runtime: CliRuntime, agentSessions: AgentSessionStore, sessionId: string, client: LotaGate, model: string, contextWindow?: number, onSummaryFailure?: (error: unknown) => void): Promise<boolean>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createContextManagement as c,redactCompactionSummary as f}from"../../application/agent/context-compaction.js";import{retainLatestCompaction as p,toAgentMessage as d}from"../../application/agent/agent-session-store.js";import{buildAgentHistory as g}from"../../application/agent/agent-history.js";import{compactSessionMessages as y}from"../../application/session/session-compaction-service.js";import{formatContinuationCheckpoint as C}from"../../application/agent/continuation-checkpoint.js";function T(a,e,t,r,n){return c({client:a,model:e,...t===void 0?{}:{contextWindow:t},onSummaryFailure:r,...n===void 0?{}:{continuationContext:n}})}function h(a,e){return C({snapshot:a,...e===void 0?{}:{goal:e}})}async function H(a,e,t,r,n,i,m){const s=await e.get(t),u=s?.messages??await w(a,t),o=await y(u,r,n,i,m);return o.summary===void 0?!1:(s!==void 0&&await e.update(t,{messages:o.messages,status:"completed"}),await a.sessionStore.compact(t,f(o.summary)),!0)}async function w(a,e){const t=await a.sessionStore.readHistory(e);return p(g(t.transcript,t.events)).map(d)}export{H as compactTuiSession,T as createTuiContextManagement,h as createTuiContinuationContext};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { ContextUsageService as TuiContextService } from '../../application/agent/context-usage-service.js';
|
|
2
|
+
export type { ContextUsageServiceInput as TuiContextServiceInput, ContextUsageSnapshot as TuiContextSnapshot } from '../../application/agent/context-usage-service.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ContextUsageService as o}from"../../application/agent/context-usage-service.js";export{o as TuiContextService};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
|
|
2
|
+
import type { CliMcpConfig } from '../../domain/extensions/mcp-config.js';
|
|
3
|
+
import type { HookDefinition } from '../../domain/extensions/hook-manifest.js';
|
|
4
|
+
import { HookRuntime } from '../../infrastructure/extensions/hook-runtime.js';
|
|
5
|
+
import { type SkillRootScope } from '../../infrastructure/extensions/skill-roots.js';
|
|
6
|
+
import type { TuiToolApprovalCoordinator } from './tui-tool-approval.js';
|
|
7
|
+
export interface TuiExtensionState {
|
|
8
|
+
readonly hookRuntime: HookRuntime;
|
|
9
|
+
readonly hooks: readonly HookDefinition[];
|
|
10
|
+
readonly skillRootScopes: readonly SkillRootScope[];
|
|
11
|
+
readonly enabledPluginNames: readonly string[];
|
|
12
|
+
readonly pluginMcpConfig: CliMcpConfig;
|
|
13
|
+
}
|
|
14
|
+
export declare function loadTuiExtensions(options: {
|
|
15
|
+
readonly runtime: CliRuntime;
|
|
16
|
+
readonly cwd: string;
|
|
17
|
+
readonly trusted: boolean;
|
|
18
|
+
readonly approvalMode: 'ask' | 'auto' | 'deny';
|
|
19
|
+
readonly workspaceRoot: string;
|
|
20
|
+
readonly approvals: TuiToolApprovalCoordinator;
|
|
21
|
+
}): Promise<TuiExtensionState>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{PluginContributionRegistry as g}from"../../application/extensions/plugin-contribution-registry.js";import{HookRuntime as f}from"../../infrastructure/extensions/hook-runtime.js";import{resolveSkillRootScopes as p}from"../../infrastructure/extensions/skill-roots.js";import{ShellToolExecutor as d}from"../../infrastructure/shell/shell-tool-executor.js";import{ToolPolicy as k}from"@lotagate/agent-sdk";async function R(c){const{runtime:o,cwd:e,trusted:l,approvalMode:u,workspaceRoot:s,approvals:m}=c,t=new f(new d({platform:o.platform}),{trustedProject:l,enabled:!0,toolPolicy:new k(m.create(u,l,s).policy())});let n=p(e,o.paths.globalConfigDir);if(!l)return{hookRuntime:t,hooks:[],skillRootScopes:n,enabledPluginNames:[],pluginMcpConfig:{}};const i=await new g(o.paths.globalConfigDir).resolve(e,!0);n=p(e,o.paths.globalConfigDir,i.skillRoots);const a=[...await t.loadProject(s)];for(const r of i.plugins)a.push(...await t.load(r));return{hookRuntime:t,hooks:a,skillRootScopes:n,enabledPluginNames:i.plugins.map(r=>r.name),pluginMcpConfig:i.mcpConfig}}export{R as loadTuiExtensions};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function o(i){return i.map(e=>({value:`@${e.path}`,label:`@${e.path}`,description:e.kind==="directory"?"Workspace folder":"Workspace file",kind:e.kind}))}export{o as workspaceFileSuggestions};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
|
|
2
|
+
import type { CreateGoalInput } from '../../domain/orchestration/goal.js';
|
|
3
|
+
import { type GoalTurnCallbacks } from '../../application/orchestration/goal-runner.js';
|
|
4
|
+
export interface TuiGoalControllerOptions {
|
|
5
|
+
runtime: CliRuntime;
|
|
6
|
+
cwd: string;
|
|
7
|
+
sessionId: string | undefined;
|
|
8
|
+
model: string | null;
|
|
9
|
+
profile: string | null;
|
|
10
|
+
runPrompt: (prompt: string, callbacks?: GoalTurnCallbacks) => Promise<string>;
|
|
11
|
+
write: (message: string) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function runTuiGoal(options: TuiGoalControllerOptions, objective: string, limits?: Omit<CreateGoalInput, 'objective'>): Promise<void>;
|
|
14
|
+
export declare function resumeTuiGoal(options: TuiGoalControllerOptions): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AuthenticationService as g}from"../../application/auth/authentication-service.js";import{loadExecutionConfig as I}from"../../application/config/execution-config.js";import{createLotaGateClient as N}from"../../infrastructure/sdk/lotagate-client-factory.js";import{RESOURCE_LIMITS as u}from"../../domain/runtime/resource-limits.js";import{runGoalLoop as S}from"../../application/orchestration/goal-runner.js";import{formatCommandHint as o,MODEL_SELECT_HINT as v,TRUST_GRANT_HINT as x}from"../../application/commands/command-hints.js";async function D(e,r,t={}){await c(e,r,!0,t)}async function _(e){if(e.sessionId===void 0){e.write("No active session.");return}const r=await e.runtime.goalStore.get(e.sessionId);if(r===void 0){e.write("No active goal.");return}await c(e,r.objective,!1)}async function c(e,r,t,l={}){if(e.sessionId===void 0){e.write("No active session.");return}const m=await e.runtime.projectTrust.inspect(e.cwd);if(!await e.runtime.projectTrust.isTrusted(m)){e.write(`Project is not trusted. ${o(x,"tui")}`);return}const i=await I(e.runtime,e.cwd),a=e.model??i.config.model;if(a===null){e.write(`No model is selected. ${o(v,"tui")}`);return}const s=e.profile??i.config.profile??g.defaultProfileName(),n=await e.runtime.auth.requireCredential(s),f=t?await e.runtime.goalStore.replace(e.sessionId,{objective:r,maxTurns:u.goalDefaultMaxTurns,maxDurationMs:u.goalDefaultMaxDurationMs,...l}):await G(e.sessionId,e.runtime),d=N(n.profile,n.apiKey);await S({runtime:e.runtime,sessionId:e.sessionId,objective:f.objective,model:a,client:d,runTurn:(w,T)=>e.runPrompt(w,T),onMessage:e.write})}async function G(e,r){return r.goalStore.resume(e)}export{_ as resumeTuiGoal,D as runTuiGoal};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AuthenticationService as i}from"../../application/auth/authentication-service.js";import{CachedModelCatalog as n,modelCatalogCacheKey as c}from"../../application/model/cached-model-catalog.js";import{ModelCatalogAdapter as d}from"../../infrastructure/sdk/model-catalog-adapter.js";import{createLotaGateClient as s}from"../../infrastructure/sdk/lotagate-client-factory.js";import{selectInitialModel as m}from"../../application/model/initial-model-selection.js";async function u(l,t){if(t.model!==null&&t.model.trim().length>0)return t.model;const r=t.profile??i.defaultProfileName();let o;try{o=await l.credentialStore.get(r)}catch(e){return l.logger.warn("Unable to load credentials while selecting the initial model.",{reason:e instanceof Error?e.message:String(e)}),null}if(o===void 0)return null;try{const e=new n(new d(s(o.profile,o.apiKey)),l.cache,c(o.profile.name,o.profile.baseUrl),l.cachePolicy.modelCatalogTtlMs,l.modelCatalogInFlight);return await m(t.model,{list:()=>e.listModels()},a=>l.configLoader.setGlobal("model",a))}catch(e){return l.logger.warn("Unable to select the first model from the catalog.",{reason:e instanceof Error?e.message:String(e)}),null}}export{u as resolveInitialModel};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HookDefinition, HookEvent } from '../../domain/extensions/hook-manifest.js';
|
|
2
|
+
import type { HookRuntime } from '../../infrastructure/extensions/hook-runtime.js';
|
|
3
|
+
import type { InkTuiBridge } from './ink/tui-bridge.js';
|
|
4
|
+
export interface TuiInterruptState {
|
|
5
|
+
lastInterruptAt: number;
|
|
6
|
+
exitArmedUntil: number;
|
|
7
|
+
printResumeCommandOnExit: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function handleTuiInterrupt(state: TuiInterruptState, activeAbortController: AbortController | undefined, renderer: InkTuiBridge): TuiInterruptState;
|
|
10
|
+
export declare function cancelTuiResponse(activeAbortController: AbortController | undefined, renderer: InkTuiBridge): void;
|
|
11
|
+
export declare function runTuiHookEvent(hookRuntime: HookRuntime | undefined, hooks: readonly HookDefinition[], event: HookEvent, cwd: string, sessionId: string): Promise<void>;
|
|
12
|
+
export declare function isAbortError(error: unknown): boolean;
|
|
13
|
+
export declare function throwIfAborted(signal: AbortSignal): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function u(t,e,r){const n=Date.now();return n-t.lastInterruptAt<75?t:e!==void 0&&!e.signal.aborted?(e.abort(),r.cancelled(),r.notice("Interrupted. Press Ctrl+C again within 2 seconds to exit."),{...t,lastInterruptAt:n,exitArmedUntil:n+2e3}):n<=t.exitArmedUntil?(r.requestExit(),{...t,lastInterruptAt:n,printResumeCommandOnExit:!0}):(r.notice("Press Ctrl+C again within 2 seconds to exit."),{...t,lastInterruptAt:n,exitArmedUntil:n+2e3})}function a(t,e){t!==void 0&&(t.abort(),e.cancelled(),e.notice("Stopping response\u2026"))}async function s(t,e,r,n,o){t===void 0||e.length===0||await t.runEvent(e,r,{sessionId:o,runId:`hook-${Date.now()}`,iteration:0,cwd:n,workspaceRoot:n,maxResultBytes:256*1024})}function i(t){return t instanceof Error?t.name==="AbortError"||t.message.toLowerCase().includes("aborted")?!0:t.cause!==void 0&&i(t.cause):!1}function f(t){if(!t.aborted)return;if(t.reason instanceof Error&&t.reason.name==="AbortError")throw t.reason;const e=new Error(t.reason instanceof Error&&t.reason.message.length>0?t.reason.message:"The operation was aborted.");throw e.name="AbortError",e}export{a as cancelTuiResponse,u as handleTuiInterrupt,i as isAbortError,s as runTuiHookEvent,f as throwIfAborted};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
|
|
2
|
+
import type { SessionMetadata } from '../../domain/session/session.js';
|
|
3
|
+
import type { CliAgentSessionStore } from '../../application/agent/agent-session-store.js';
|
|
4
|
+
import type { TuiContextService } from './tui-context-service.js';
|
|
5
|
+
import type { InkTuiBridge } from './ink/tui-bridge.js';
|
|
6
|
+
export interface TuiManualCompactionOptions {
|
|
7
|
+
runtime: CliRuntime;
|
|
8
|
+
cwd: string;
|
|
9
|
+
session: SessionMetadata | undefined;
|
|
10
|
+
activeModel: string | null;
|
|
11
|
+
activeProfile: string | null;
|
|
12
|
+
activeResponse: boolean;
|
|
13
|
+
renderer: InkTuiBridge;
|
|
14
|
+
contextService: TuiContextService;
|
|
15
|
+
agentSessionStore: CliAgentSessionStore;
|
|
16
|
+
refreshContextUsage: () => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare function compactManualTuiSession(options: TuiManualCompactionOptions): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AuthenticationService as m}from"../../application/auth/authentication-service.js";import{loadExecutionConfig as l}from"../../application/config/execution-config.js";import{createLotaGateClient as s}from"../../infrastructure/sdk/lotagate-client-factory.js";import{CliError as d}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as f}from"../../domain/errors/error-codes.js";import{MODEL_SELECT_HINT as u}from"../../application/commands/command-hints.js";import{compactTuiSession as g}from"./tui-context-compaction.js";async function N(e){if(e.activeResponse)throw new Error("Stop the active response before compacting the session.");if(e.session===void 0){e.renderer.notice("No active session.");return}const i=await l(e.runtime,e.cwd),t=e.session.model??e.activeModel??i.config.model;if(t===null)throw new d(f.MODEL_NOT_FOUND,"No model is selected.",{category:"model",userMessage:"No model is selected.",hint:u});const a=e.session.profile??e.activeProfile??i.config.profile??m.defaultProfileName(),o=await e.runtime.auth.requireCredential(a),n=await e.contextService.getModelContextWindow(t,a);e.renderer.activity("Compacting context manually\u2026",0);try{const c=await g(e.runtime,e.agentSessionStore,e.session.id,s(o.profile,o.apiKey),t,n,r=>e.runtime.logger.warn("Context summarization failed; using fallback summary.",{reason:r instanceof Error?r.message:String(r)}));e.renderer.transcriptNotice(c?"Context compacted manually.":"No conversation to compact."),await e.refreshContextUsage()}finally{e.renderer.clearActivity()}}export{N as compactManualTuiSession};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CommandInvocation } from '../../application/commands/command-contract.js';
|
|
2
|
+
import type { TuiChoice } from './ink/tui-bridge.js';
|
|
3
|
+
import type { loadModelCatalog } from '../../application/model/model-catalog-service.js';
|
|
4
|
+
export type MediaModelCategory = 'image' | 'speech' | 'transcription' | 'translation' | 'video';
|
|
5
|
+
type ModelCatalog = Awaited<ReturnType<typeof loadModelCatalog>>;
|
|
6
|
+
export interface TuiMediaModelSelectionDependencies {
|
|
7
|
+
readonly loadModels: () => Promise<ModelCatalog>;
|
|
8
|
+
readonly selectModel: (title: string, choices: readonly TuiChoice[]) => Promise<string | undefined>;
|
|
9
|
+
}
|
|
10
|
+
/** Adds a request-only media model selection without changing persisted configuration. */
|
|
11
|
+
export declare function prepareTuiMediaInvocation(invocation: CommandInvocation, dependencies: TuiMediaModelSelectionDependencies): Promise<CommandInvocation | undefined>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CliError as s}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as n}from"../../domain/errors/error-codes.js";const c={"image.generate":"image","image.edit":"image","audio.speech":"speech","audio.transcribe":"transcription","audio.translate":"translation","video.generate":"video"};async function u(o,i){const e=c[o.action.id];if(e===void 0||o.options.has("model"))return o;const t=(await i.loadModels()).data.filter(a=>a.model_category===e);if(t.length===0)throw new s(n.MODEL_NOT_FOUND,`No ${e} models are available.`,{category:"model",userMessage:`No ${e} models are available for this command.`,details:{category:e}});const d=await i.selectModel(`Select ${e} model`,t.map(a=>({value:a.id,label:a.id})));if(d===void 0)return;const l=t.find(a=>a.id===d);if(l===void 0)throw new s(n.MODEL_NOT_FOUND,"The selected media model is no longer available.",{category:"model",userMessage:"The selected media model is no longer available. Refresh the model list and try again."});const r=new Map(o.options);return r.set("model",l.id),{...o,options:r}}export{u as prepareTuiMediaInvocation};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Logger } from '../../ports/logger.js';
|
|
2
|
+
import type { AttachmentPayload } from '../../domain/session/attachment.js';
|
|
3
|
+
import type { PendingAttachmentStore } from '../../application/chat/pending-attachment-store.js';
|
|
4
|
+
import type { InkTuiBridge } from './ink/tui-bridge.js';
|
|
5
|
+
import type { TuiCommandContext } from './tui-command-context.js';
|
|
6
|
+
import type { TuiCommandHost } from './tui-command-executor.js';
|
|
7
|
+
export interface TuiPromptDispatcherOptions {
|
|
8
|
+
renderer: InkTuiBridge;
|
|
9
|
+
logger: Logger;
|
|
10
|
+
commandHost: TuiCommandHost;
|
|
11
|
+
pendingAttachments: PendingAttachmentStore;
|
|
12
|
+
commandContext: () => TuiCommandContext;
|
|
13
|
+
sendPrompt: (input: string, attachments: readonly AttachmentPayload[]) => Promise<unknown>;
|
|
14
|
+
resetActiveAbortController: () => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function dispatchTuiPrompt(input: string, options: TuiPromptDispatcherOptions): Promise<boolean>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{asCliError as o}from"../../domain/errors/cli-error.js";import{parseCommandInvocation as c,tokenizeCommandInput as n}from"../../application/commands/command-parser.js";import{COMMAND_REGISTRY as d}from"../../application/commands/command-runtime.js";import{formatCliErrorMessage as m}from"../../application/commands/command-hints.js";import{executeTuiCommand as i}from"./tui-command-executor.js";async function C(t,r){if(t.trimStart().startsWith("/"))return l(t,r);r.logger.info("Interactive prompt started.",{promptLength:t.length,attachmentCount:r.pendingAttachments.size});try{await r.sendPrompt(t,r.pendingAttachments.list()),r.logger.info("Interactive prompt completed.",{promptLength:t.length})}catch(a){r.resetActiveAbortController(),r.renderer.failed();const e=o(a);r.logger.error("Prompt execution failed.",{code:e.code,category:e.category,...e.details??{}}),r.renderer.error(m(e,"tui"))}return!1}async function l(t,r){r.renderer.command(t);try{const a=c(n(t.trimStart().slice(1)),"tui",d);r.logger.info("Slash command started.",{command:a.action.id});const e=await i(a,r.commandHost,r.commandContext());return r.logger.info("Slash command completed.",{command:a.action.id,exit:e}),e}catch(a){const e=o(a);return r.logger.error("Slash command failed.",{code:e.code,category:e.category}),r.renderer.error(m(e,"tui")),!1}}export{C as dispatchTuiPrompt};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SkillManifest } from '../../domain/extensions/skill-manifest.js';
|
|
2
|
+
import type { ExtensionScope } from '../../domain/extensions/extension-scope.js';
|
|
3
|
+
import type { TuiCommandContext } from './tui-command-context.js';
|
|
4
|
+
import { type ScopedSkill } from '../../infrastructure/extensions/skill-manager.js';
|
|
5
|
+
import type { SkillRootScope } from '../../infrastructure/extensions/skill-roots.js';
|
|
6
|
+
export interface TuiSkillControllerOptions {
|
|
7
|
+
globalConfigDir: string;
|
|
8
|
+
skillRootScopes: readonly SkillRootScope[];
|
|
9
|
+
runPrompt: (prompt: string, skill?: SkillManifest) => Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
export declare function runTuiSkill(options: TuiSkillControllerOptions, name: string, args: readonly string[], context: TuiCommandContext, scope?: ExtensionScope, availableSkills?: readonly ScopedSkill[]): Promise<void>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import u from"node:path";import{SkillManager as c}from"../../infrastructure/extensions/skill-manager.js";async function S(l,n,t,r,o,a){const e=(a??await new c(u.join(l.globalConfigDir,"skills-state.json")).listScoped(l.skillRootScopes,{includeShadowed:!0})).find(i=>(i.skillKey===n||i.name===n)&&(o===void 0||i.scope===o));if(e===void 0||!e.enabled||!e.userInvocable){r.write(`Skill unavailable: ${n}`);return}const s=t.join(" ").trim(),d=s.length===0?e.body:`${e.body}
|
|
2
|
+
|
|
3
|
+
Requested scope: ${s}`;await l.runPrompt(d,e)}export{S as runTuiSkill};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CliRuntime } from '../../bootstrap/runtime-factory.js';
|
|
2
|
+
import type { ToolApprovalRequest } from '@lotagate/agent-sdk';
|
|
3
|
+
import { ToolApprovalService, type CliApprovalMode, type ToolApprovalDecision } from '../../application/security/tool-approval-service.js';
|
|
4
|
+
import type { SkillScopeStore } from '../../application/extensions/skill-scope-store.js';
|
|
5
|
+
import type { WorkspacePermissionPolicy } from '../../domain/workspace/workspace-settings.js';
|
|
6
|
+
import type { InkTuiBridge } from './ink/tui-bridge.js';
|
|
7
|
+
export interface TuiToolApprovalHost {
|
|
8
|
+
readonly renderer: InkTuiBridge;
|
|
9
|
+
readonly runtime: CliRuntime;
|
|
10
|
+
getSessionId(): string | undefined;
|
|
11
|
+
getActiveSignal(): AbortSignal | undefined;
|
|
12
|
+
}
|
|
13
|
+
/** Owns the TUI adapter around the application-layer approval service. */
|
|
14
|
+
export declare class TuiToolApprovalCoordinator {
|
|
15
|
+
private readonly host;
|
|
16
|
+
constructor(host: TuiToolApprovalHost);
|
|
17
|
+
ask(request: ToolApprovalRequest, signal?: AbortSignal): Promise<boolean>;
|
|
18
|
+
create(mode: CliApprovalMode, trustedProject: boolean, workspaceRoot: string, skillScopes?: SkillScopeStore, workspacePermissions?: WorkspacePermissionPolicy): ToolApprovalService;
|
|
19
|
+
remember(workspaceRoot: string, request: ToolApprovalRequest): Promise<void>;
|
|
20
|
+
audit(decision: ToolApprovalDecision): Promise<void>;
|
|
21
|
+
rememberFailure(error: unknown): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ToolApprovalService as f}from"../../application/security/tool-approval-service.js";import{permissionRuleForRequest as h}from"../../application/security/workspace-permission-policy.js";import{formatShellCommandForDisplay as c,formatToolActivityName as g}from"../../application/agent/tool-display.js";class k{host;constructor(e){this.host=e}async ask(e,r){this.host.renderer.status("Waiting for approval");try{const o=this.host.renderer.confirmTool(e.toolName,y(e));return r===void 0?await o:r.aborted?(this.host.renderer.resolveActiveModal(void 0),!1):await I(o,r,this.host.renderer)}finally{const o=this.host.getActiveSignal();o!==void 0&&!o.aborted&&this.host.renderer.status("Thinking")}}create(e,r,o,s,a){return new f({mode:e,trustedProject:r,...s===void 0?{}:{skillScopes:s},...a===void 0?{}:{workspacePermissions:a},prompt:n=>this.ask(n),...r?{rememberApproval:n=>this.remember(o,n)}:{},...r?{onRememberApprovalFailure:(n,i)=>this.rememberFailure(i)}:{},audit:n=>this.audit(n)})}async remember(e,r){await this.host.runtime.workspaceSettings.rememberAllow(e,h(r.toolName,r.input))}async audit(e){this.host.runtime.logger.info("Tool authorization decision.",{toolName:e.toolName,stage:e.stage,sessionId:e.sessionId,runId:e.runId,decision:e.decision,reason:e.reason,...e.source===void 0?{}:{source:e.source},...e.executorId===void 0?{}:{executorId:e.executorId},...e.ruleId===void 0?{}:{ruleId:e.ruleId},...e.skillName===void 0?{}:{skillName:e.skillName},...e.riskCategory===void 0?{}:{riskCategory:e.riskCategory}});const r=this.host.getSessionId();r!==void 0&&await this.host.runtime.sessionStore.appendEvent({type:"tool.approval",timestamp:new Date().toISOString(),sessionId:r,data:{toolName:e.toolName,stage:e.stage,sessionId:e.sessionId,runId:e.runId,...e.source===void 0?{}:{source:e.source},...e.executorId===void 0?{}:{executorId:e.executorId},...e.ruleId===void 0?{}:{ruleId:e.ruleId},...e.skillName===void 0?{}:{skillName:e.skillName},...e.riskCategory===void 0?{}:{riskCategory:e.riskCategory},decision:e.decision,reason:e.reason}})}rememberFailure(e){this.host.runtime.logger.warn("Unable to persist tool approval.",{reason:e instanceof Error?e.message:String(e)}),this.host.renderer.notice("Approval accepted for this action, but could not be remembered.")}}function I(t,e,r){return new Promise((o,s)=>{let a=!1;const n=()=>e.removeEventListener("abort",l),i=u=>{a||(a=!0,n(),o(u))},p=u=>{a||(a=!0,n(),s(u))},l=()=>{r.resolveActiveModal(void 0),i(!1)};e.aborted?l():e.addEventListener("abort",l,{once:!0}),t.then(i,p)})}function y(t){if(t.toolName==="filesystem.write")return`Write workspace file: ${m(t.input.path)}`;if(t.toolName==="shell.exec"){const e=typeof t.input.command=="string"?t.input.command:"",r=Array.isArray(t.input.args)?t.input.args.filter(s=>typeof s=="string"):[],o=typeof t.input.script=="string"?m(t.input.script):void 0;return d(`Run command: ${c(e,o===void 0?r:[...r,"-Command",o],240)}`)}return`This ${g(t.toolName)} operation may change workspace or external state.`}function m(t){const e=typeof t=="string"?t:String(t??"");return d(e.replace(/Bearer\s+[^\s]+/giu,"Bearer [REDACTED]").replace(/sk-[A-Za-z0-9_-]{8,}/gu,"[REDACTED]"))}function d(t){return t.length<=240?t:`${t.slice(0,237)}...`}export{k as TuiToolApprovalCoordinator};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CLI_VERSION = "0.1.26";
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const o="0.1.26";export{o as CLI_VERSION};
|
package/native-targets.mjs
CHANGED
|
@@ -29,7 +29,7 @@ function target(id, platforms, arch, libc) {
|
|
|
29
29
|
platforms: Object.freeze(platforms),
|
|
30
30
|
arch,
|
|
31
31
|
packageName: `@lotagate/cli-native-${id}`,
|
|
32
|
-
binaryName: 'lotagate.exe',
|
|
32
|
+
binaryName: platforms.includes('win32') || platforms.includes('cygwin') ? 'lotagate.exe' : 'lotagate',
|
|
33
33
|
libc,
|
|
34
34
|
});
|
|
35
35
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lotagate/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.26",
|
|
4
4
|
"description": "Enterprise-grade terminal client for LotaGate AI agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -26,11 +26,10 @@
|
|
|
26
26
|
},
|
|
27
27
|
"packageManager": "npm@11.8.0",
|
|
28
28
|
"bin": {
|
|
29
|
-
"lotagate": "./bin/lotagate.
|
|
29
|
+
"lotagate": "./bin/lotagate.mjs"
|
|
30
30
|
},
|
|
31
31
|
"sideEffects": false,
|
|
32
32
|
"files": [
|
|
33
|
-
"bin/lotagate.exe",
|
|
34
33
|
"bin/lotagate.mjs",
|
|
35
34
|
"dist",
|
|
36
35
|
"scripts/install-native.mjs",
|
|
@@ -40,6 +39,9 @@
|
|
|
40
39
|
"LICENSE.md",
|
|
41
40
|
"SECURITY.md"
|
|
42
41
|
],
|
|
42
|
+
"exports": {
|
|
43
|
+
"./package.json": "./package.json"
|
|
44
|
+
},
|
|
43
45
|
"publishConfig": {
|
|
44
46
|
"access": "public"
|
|
45
47
|
},
|
|
@@ -62,20 +64,19 @@
|
|
|
62
64
|
"prepack": "npm run build"
|
|
63
65
|
},
|
|
64
66
|
"dependencies": {
|
|
65
|
-
"@lotagate/agent-sdk": "^0.1.
|
|
66
|
-
"@lotagate/
|
|
67
|
-
"@lotagate/sdk": "^0.1.2",
|
|
67
|
+
"@lotagate/agent-sdk": "^0.1.8",
|
|
68
|
+
"@lotagate/sdk": "^0.1.3",
|
|
68
69
|
"ink": "^7.1.1",
|
|
69
70
|
"react": "^19.2.4",
|
|
70
71
|
"tiktoken": "^1.0.22"
|
|
71
72
|
},
|
|
72
73
|
"optionalDependencies": {
|
|
73
|
-
"@lotagate/cli-native-linux-arm64-gnu": "0.1.
|
|
74
|
-
"@lotagate/cli-native-linux-x64-gnu": "0.1.
|
|
75
|
-
"@lotagate/cli-native-macos-arm64": "0.1.
|
|
76
|
-
"@lotagate/cli-native-macos-x64": "0.1.
|
|
77
|
-
"@lotagate/cli-native-windows-arm64": "0.1.
|
|
78
|
-
"@lotagate/cli-native-windows-x64": "0.1.
|
|
74
|
+
"@lotagate/cli-native-linux-arm64-gnu": "0.1.26",
|
|
75
|
+
"@lotagate/cli-native-linux-x64-gnu": "0.1.26",
|
|
76
|
+
"@lotagate/cli-native-macos-arm64": "0.1.26",
|
|
77
|
+
"@lotagate/cli-native-macos-x64": "0.1.26",
|
|
78
|
+
"@lotagate/cli-native-windows-arm64": "0.1.26",
|
|
79
|
+
"@lotagate/cli-native-windows-x64": "0.1.26"
|
|
79
80
|
},
|
|
80
81
|
"devDependencies": {
|
|
81
82
|
"@eslint/js": "9.39.5",
|