@caupulican/pi-adaptative 0.80.103 → 0.81.1
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/CHANGELOG.md +128 -0
- package/dist/cli/session-picker.d.ts +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +6 -6
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +154 -512
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +675 -4589
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autonomy/session-lane-record.d.ts +1 -1
- package/dist/core/autonomy/session-lane-record.d.ts.map +1 -1
- package/dist/core/autonomy/session-lane-record.js.map +1 -1
- package/dist/core/autonomy/status.d.ts +1 -0
- package/dist/core/autonomy/status.d.ts.map +1 -1
- package/dist/core/autonomy/status.js +1 -0
- package/dist/core/autonomy/status.js.map +1 -1
- package/dist/core/autonomy-telemetry.d.ts +80 -0
- package/dist/core/autonomy-telemetry.d.ts.map +1 -0
- package/dist/core/autonomy-telemetry.js +266 -0
- package/dist/core/autonomy-telemetry.js.map +1 -0
- package/dist/core/background-lane-controller.d.ts +186 -0
- package/dist/core/background-lane-controller.d.ts.map +1 -0
- package/dist/core/background-lane-controller.js +691 -0
- package/dist/core/background-lane-controller.js.map +1 -0
- package/dist/core/bash-execution-controller.d.ts +51 -0
- package/dist/core/bash-execution-controller.d.ts.map +1 -0
- package/dist/core/bash-execution-controller.js +96 -0
- package/dist/core/bash-execution-controller.js.map +1 -0
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +9 -2
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction-support.d.ts +56 -0
- package/dist/core/compaction-support.d.ts.map +1 -0
- package/dist/core/compaction-support.js +99 -0
- package/dist/core/compaction-support.js.map +1 -0
- package/dist/core/context/artifact-retrieval.d.ts +1 -1
- package/dist/core/context/artifact-retrieval.d.ts.map +1 -1
- package/dist/core/context/artifact-retrieval.js +1 -1
- package/dist/core/context/artifact-retrieval.js.map +1 -1
- package/dist/core/context/context-composition.d.ts.map +1 -1
- package/dist/core/context/context-composition.js +1 -1
- package/dist/core/context/context-composition.js.map +1 -1
- package/dist/core/context/tool-output-packer.d.ts +1 -1
- package/dist/core/context/tool-output-packer.d.ts.map +1 -1
- package/dist/core/context/tool-output-packer.js +1 -1
- package/dist/core/context/tool-output-packer.js.map +1 -1
- package/dist/core/context-gc.d.ts.map +1 -1
- package/dist/core/context-gc.js +1 -1
- package/dist/core/context-gc.js.map +1 -1
- package/dist/core/context-pipeline.d.ts +223 -0
- package/dist/core/context-pipeline.d.ts.map +1 -0
- package/dist/core/context-pipeline.js +594 -0
- package/dist/core/context-pipeline.js.map +1 -0
- package/dist/core/cost/daily-usage.d.ts +1 -1
- package/dist/core/cost/daily-usage.d.ts.map +1 -1
- package/dist/core/cost/daily-usage.js +1 -1
- package/dist/core/cost/daily-usage.js.map +1 -1
- package/dist/core/cost/session-usage.d.ts +1 -1
- package/dist/core/cost/session-usage.d.ts.map +1 -1
- package/dist/core/cost/session-usage.js +1 -1
- package/dist/core/cost/session-usage.js.map +1 -1
- package/dist/core/delegation/session-worker-result.d.ts +1 -1
- package/dist/core/delegation/session-worker-result.d.ts.map +1 -1
- package/dist/core/delegation/session-worker-result.js.map +1 -1
- package/dist/core/exec.d.ts +2 -0
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +15 -9
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/index.d.ts +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +2 -2
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/extensions/builtin.d.ts.map +1 -1
- package/dist/core/extensions/builtin.js +2 -2
- package/dist/core/extensions/builtin.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/goal-loop-controller.d.ts +24 -0
- package/dist/core/goal-loop-controller.d.ts.map +1 -0
- package/dist/core/goal-loop-controller.js +83 -0
- package/dist/core/goal-loop-controller.js.map +1 -0
- package/dist/core/goals/goal-runtime-snapshot.d.ts +1 -1
- package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
- package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
- package/dist/core/goals/session-goal-state.d.ts +1 -1
- package/dist/core/goals/session-goal-state.d.ts.map +1 -1
- package/dist/core/goals/session-goal-state.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts +4 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +6 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/learning/learning-audit.d.ts +1 -1
- package/dist/core/learning/learning-audit.d.ts.map +1 -1
- package/dist/core/learning/learning-audit.js.map +1 -1
- package/dist/core/learning/session-learning-decision.d.ts +1 -1
- package/dist/core/learning/session-learning-decision.d.ts.map +1 -1
- package/dist/core/learning/session-learning-decision.js.map +1 -1
- package/dist/core/local-runtime-controller.d.ts +99 -0
- package/dist/core/local-runtime-controller.d.ts.map +1 -0
- package/dist/core/local-runtime-controller.js +214 -0
- package/dist/core/local-runtime-controller.js.map +1 -0
- package/dist/core/memory/providers/transcript-recall.d.ts.map +1 -1
- package/dist/core/memory/providers/transcript-recall.js +1 -1
- package/dist/core/memory/providers/transcript-recall.js.map +1 -1
- package/dist/core/memory-controller.d.ts +139 -0
- package/dist/core/memory-controller.d.ts.map +1 -0
- package/dist/core/memory-controller.js +323 -0
- package/dist/core/memory-controller.js.map +1 -0
- package/dist/core/model-router/status.d.ts +1 -1
- package/dist/core/model-router/status.d.ts.map +1 -1
- package/dist/core/model-router/status.js.map +1 -1
- package/dist/core/model-router-controller.d.ts +140 -0
- package/dist/core/model-router-controller.d.ts.map +1 -0
- package/dist/core/model-router-controller.js +623 -0
- package/dist/core/model-router-controller.js.map +1 -0
- package/dist/core/model-selection-controller.d.ts +95 -0
- package/dist/core/model-selection-controller.d.ts.map +1 -0
- package/dist/core/model-selection-controller.js +252 -0
- package/dist/core/model-selection-controller.js.map +1 -0
- package/dist/core/models/model-ref.d.ts +13 -0
- package/dist/core/models/model-ref.d.ts.map +1 -1
- package/dist/core/models/model-ref.js +22 -0
- package/dist/core/models/model-ref.js.map +1 -1
- package/dist/core/profile-filter-controller.d.ts +77 -0
- package/dist/core/profile-filter-controller.d.ts.map +1 -0
- package/dist/core/profile-filter-controller.js +159 -0
- package/dist/core/profile-filter-controller.js.map +1 -0
- package/dist/core/reflection-controller.d.ts +111 -0
- package/dist/core/reflection-controller.d.ts.map +1 -0
- package/dist/core/reflection-controller.js +412 -0
- package/dist/core/reflection-controller.js.map +1 -0
- package/dist/core/research/model-fitness.d.ts +12 -0
- package/dist/core/research/model-fitness.d.ts.map +1 -1
- package/dist/core/research/model-fitness.js +21 -0
- package/dist/core/research/model-fitness.js.map +1 -1
- package/dist/core/research/session-evidence-bundle.d.ts +1 -1
- package/dist/core/research/session-evidence-bundle.d.ts.map +1 -1
- package/dist/core/research/session-evidence-bundle.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +222 -0
- package/dist/core/runtime-builder.d.ts.map +1 -0
- package/dist/core/runtime-builder.js +640 -0
- package/dist/core/runtime-builder.js.map +1 -0
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -4
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-analytics.d.ts +96 -0
- package/dist/core/session-analytics.d.ts.map +1 -0
- package/dist/core/session-analytics.js +331 -0
- package/dist/core/session-analytics.js.map +1 -0
- package/dist/core/session-manager-factory.d.ts +18 -0
- package/dist/core/session-manager-factory.d.ts.map +1 -0
- package/dist/core/session-manager-factory.js +32 -0
- package/dist/core/session-manager-factory.js.map +1 -0
- package/dist/core/session-tree-navigator.d.ts +68 -0
- package/dist/core/session-tree-navigator.d.ts.map +1 -0
- package/dist/core/session-tree-navigator.js +217 -0
- package/dist/core/session-tree-navigator.js.map +1 -0
- package/dist/core/settings-manager.d.ts +16 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +22 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt-builder.d.ts +63 -0
- package/dist/core/system-prompt-builder.d.ts.map +1 -0
- package/dist/core/system-prompt-builder.js +181 -0
- package/dist/core/system-prompt-builder.js.map +1 -0
- package/dist/core/tool-gate-controller.d.ts +36 -0
- package/dist/core/tool-gate-controller.d.ts.map +1 -0
- package/dist/core/tool-gate-controller.js +94 -0
- package/dist/core/tool-gate-controller.js.map +1 -0
- package/dist/core/tools/artifact-retrieve.d.ts.map +1 -1
- package/dist/core/tools/artifact-retrieve.js +1 -1
- package/dist/core/tools/artifact-retrieve.js.map +1 -1
- package/dist/core/tools/bash.d.ts +4 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +49 -7
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +61 -1
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +1 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/read.d.ts +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +13 -12
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.d.ts +59 -0
- package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -0
- package/dist/modes/interactive/auth-dialogs-controller.js +398 -0
- package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -0
- package/dist/modes/interactive/auto-learn-controller.d.ts +168 -0
- package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -0
- package/dist/modes/interactive/auto-learn-controller.js +1239 -0
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -0
- package/dist/modes/interactive/autocomplete-provider.d.ts +26 -0
- package/dist/modes/interactive/autocomplete-provider.d.ts.map +1 -0
- package/dist/modes/interactive/autocomplete-provider.js +103 -0
- package/dist/modes/interactive/autocomplete-provider.js.map +1 -0
- package/dist/modes/interactive/autonomy-commands.d.ts +38 -0
- package/dist/modes/interactive/autonomy-commands.d.ts.map +1 -0
- package/dist/modes/interactive/autonomy-commands.js +142 -0
- package/dist/modes/interactive/autonomy-commands.js.map +1 -0
- package/dist/modes/interactive/clipboard-input.d.ts +37 -0
- package/dist/modes/interactive/clipboard-input.d.ts.map +1 -0
- package/dist/modes/interactive/clipboard-input.js +59 -0
- package/dist/modes/interactive/clipboard-input.js.map +1 -0
- package/dist/modes/interactive/compaction-queue.d.ts +30 -0
- package/dist/modes/interactive/compaction-queue.d.ts.map +1 -0
- package/dist/modes/interactive/compaction-queue.js +91 -0
- package/dist/modes/interactive/compaction-queue.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +1 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +2 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/config-backup.d.ts +27 -0
- package/dist/modes/interactive/config-backup.d.ts.map +1 -0
- package/dist/modes/interactive/config-backup.js +146 -0
- package/dist/modes/interactive/config-backup.js.map +1 -0
- package/dist/modes/interactive/editor-overlay-host.d.ts +48 -0
- package/dist/modes/interactive/editor-overlay-host.d.ts.map +1 -0
- package/dist/modes/interactive/editor-overlay-host.js +43 -0
- package/dist/modes/interactive/editor-overlay-host.js.map +1 -0
- package/dist/modes/interactive/extension-ui-host.d.ts +165 -0
- package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -0
- package/dist/modes/interactive/extension-ui-host.js +610 -0
- package/dist/modes/interactive/extension-ui-host.js.map +1 -0
- package/dist/modes/interactive/external-editor.d.ts +18 -0
- package/dist/modes/interactive/external-editor.d.ts.map +1 -0
- package/dist/modes/interactive/external-editor.js +107 -0
- package/dist/modes/interactive/external-editor.js.map +1 -0
- package/dist/modes/interactive/history-reload-math.d.ts +24 -0
- package/dist/modes/interactive/history-reload-math.d.ts.map +1 -0
- package/dist/modes/interactive/history-reload-math.js +129 -0
- package/dist/modes/interactive/history-reload-math.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +22 -238
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +714 -5910
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/key-handlers.d.ts +46 -0
- package/dist/modes/interactive/key-handlers.d.ts.map +1 -0
- package/dist/modes/interactive/key-handlers.js +80 -0
- package/dist/modes/interactive/key-handlers.js.map +1 -0
- package/dist/modes/interactive/local-model-commands.d.ts +68 -0
- package/dist/modes/interactive/local-model-commands.d.ts.map +1 -0
- package/dist/modes/interactive/local-model-commands.js +288 -0
- package/dist/modes/interactive/local-model-commands.js.map +1 -0
- package/dist/modes/interactive/profile-menu-controller.d.ts +77 -0
- package/dist/modes/interactive/profile-menu-controller.d.ts.map +1 -0
- package/dist/modes/interactive/profile-menu-controller.js +917 -0
- package/dist/modes/interactive/profile-menu-controller.js.map +1 -0
- package/dist/modes/interactive/report-commands.d.ts +46 -0
- package/dist/modes/interactive/report-commands.d.ts.map +1 -0
- package/dist/modes/interactive/report-commands.js +255 -0
- package/dist/modes/interactive/report-commands.js.map +1 -0
- package/dist/modes/interactive/resource-display.d.ts +73 -0
- package/dist/modes/interactive/resource-display.d.ts.map +1 -0
- package/dist/modes/interactive/resource-display.js +278 -0
- package/dist/modes/interactive/resource-display.js.map +1 -0
- package/dist/modes/interactive/resource-shell-commands.d.ts +64 -0
- package/dist/modes/interactive/resource-shell-commands.d.ts.map +1 -0
- package/dist/modes/interactive/resource-shell-commands.js +202 -0
- package/dist/modes/interactive/resource-shell-commands.js.map +1 -0
- package/dist/modes/interactive/session-flow-commands.d.ts +139 -0
- package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -0
- package/dist/modes/interactive/session-flow-commands.js +458 -0
- package/dist/modes/interactive/session-flow-commands.js.map +1 -0
- package/dist/modes/interactive/session-io-commands.d.ts +73 -0
- package/dist/modes/interactive/session-io-commands.d.ts.map +1 -0
- package/dist/modes/interactive/session-io-commands.js +202 -0
- package/dist/modes/interactive/session-io-commands.js.map +1 -0
- package/dist/modes/interactive/settings-selector-flow.d.ts +42 -0
- package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -0
- package/dist/modes/interactive/settings-selector-flow.js +287 -0
- package/dist/modes/interactive/settings-selector-flow.js.map +1 -0
- package/dist/modes/interactive/signal-lifecycle.d.ts +55 -0
- package/dist/modes/interactive/signal-lifecycle.d.ts.map +1 -0
- package/dist/modes/interactive/signal-lifecycle.js +177 -0
- package/dist/modes/interactive/signal-lifecycle.js.map +1 -0
- package/dist/modes/interactive/startup-checks.d.ts +38 -0
- package/dist/modes/interactive/startup-checks.d.ts.map +1 -0
- package/dist/modes/interactive/startup-checks.js +189 -0
- package/dist/modes/interactive/startup-checks.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +1 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -14
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +5 -30
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/process-memory.d.ts +8 -0
- package/dist/utils/process-memory.d.ts.map +1 -0
- package/dist/utils/process-memory.js +11 -0
- package/dist/utils/process-memory.js.map +1 -0
- package/dist/utils/shell.d.ts +0 -9
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +0 -37
- package/dist/utils/shell.js.map +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/11-sessions.ts +8 -8
- package/examples/sdk/13-session-runtime.ts +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
- package/dist/core/compaction/branch-summarization.d.ts +0 -88
- package/dist/core/compaction/branch-summarization.d.ts.map +0 -1
- package/dist/core/compaction/branch-summarization.js +0 -243
- package/dist/core/compaction/branch-summarization.js.map +0 -1
- package/dist/core/compaction/compaction.d.ts +0 -143
- package/dist/core/compaction/compaction.d.ts.map +0 -1
- package/dist/core/compaction/compaction.js +0 -659
- package/dist/core/compaction/compaction.js.map +0 -1
- package/dist/core/compaction/index.d.ts +0 -7
- package/dist/core/compaction/index.d.ts.map +0 -1
- package/dist/core/compaction/index.js +0 -7
- package/dist/core/compaction/index.js.map +0 -1
- package/dist/core/compaction/utils.d.ts +0 -38
- package/dist/core/compaction/utils.d.ts.map +0 -1
- package/dist/core/compaction/utils.js +0 -153
- package/dist/core/compaction/utils.js.map +0 -1
- package/dist/core/message-retention.d.ts +0 -26
- package/dist/core/message-retention.d.ts.map +0 -1
- package/dist/core/message-retention.js +0 -95
- package/dist/core/message-retention.js.map +0 -1
- package/dist/core/messages.d.ts +0 -77
- package/dist/core/messages.d.ts.map +0 -1
- package/dist/core/messages.js +0 -123
- package/dist/core/messages.js.map +0 -1
- package/dist/core/session-manager.d.ts +0 -337
- package/dist/core/session-manager.d.ts.map +0 -1
- package/dist/core/session-manager.js +0 -1328
- package/dist/core/session-manager.js.map +0 -1
- package/dist/core/tools/truncate.d.ts +0 -70
- package/dist/core/tools/truncate.d.ts.map +0 -1
- package/dist/core/tools/truncate.js +0 -215
- package/dist/core/tools/truncate.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-io-commands.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/session-io-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzC,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,cAAc,CAAC,CAAC;IACvE,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/E,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IACjC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/E,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;IACxE,gBAAgB,EAAE;QAAE,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,eAAe,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IACnE,yBAAyB,IAAI,IAAI,CAAC;IAClC,0BAA0B,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvF,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;IAC7D,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAChE,QAAQ,CAAC,aAAa,EAAE;QAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACrE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,EAAE;QAAE,aAAa,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CAC3C;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9F;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD9F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuF9E;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAkB3E","sourcesContent":["/**\n * Session import/export/share/copy/name command bodies extracted from\n * interactive-mode.\n *\n * These drive session serialization (JSONL/HTML export, JSONL import, secret\n * gist share), clipboard copy of the last agent message, and session naming\n * through narrow per-command host seams. `getPathCommandArgument` stays host-side\n * (pure parser, tested directly and shared by export/import); interactive-mode\n * keeps thin delegating wrappers, so the `/import` behaviour test keeps\n * exercising it unchanged.\n */\n\nimport { spawn, spawnSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { EditorComponent, TUI } from \"@caupulican/pi-tui\";\nimport { Spacer, Text } from \"@caupulican/pi-tui\";\nimport { getShareViewerUrl } from \"../../config.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport { SessionImportFileNotFoundError } from \"../../core/agent-session-runtime.ts\";\nimport { MissingSessionCwdError } from \"../../core/session-cwd.ts\";\nimport { copyToClipboard } from \"../../utils/clipboard.ts\";\nimport { BorderedLoader } from \"./components/bordered-loader.ts\";\nimport type { EditorOverlayHost } from \"./editor-overlay-host.ts\";\nimport type { ExtensionUiHost } from \"./extension-ui-host.ts\";\nimport { theme } from \"./theme/theme.ts\";\n\ntype PathCommand = \"/export\" | \"/import\";\n\nexport interface ExportCommandHost {\n\treadonly session: Pick<AgentSession, \"exportToJsonl\" | \"exportToHtml\">;\n\tgetPathCommandArgument(text: string, command: PathCommand): string | undefined;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n}\n\nexport interface ImportCommandHost {\n\tgetPathCommandArgument(text: string, command: PathCommand): string | undefined;\n\tshowError(message: string): void;\n\tshowStatus(message: string): void;\n\treadonly extensionUiHost: Pick<ExtensionUiHost, \"showExtensionConfirm\">;\n\tloadingAnimation: { stop: () => void } | undefined;\n\treadonly statusContainer: { clear: () => void };\n\treadonly runtimeHost: Pick<AgentSessionRuntime, \"importFromJsonl\">;\n\trenderCurrentSessionState(): void;\n\tpromptForMissingSessionCwd(error: MissingSessionCwdError): Promise<string | undefined>;\n\thandleFatalRuntimeError(prefix: string, error: unknown): Promise<never>;\n}\n\nexport interface ShareCommandHost {\n\tshowError(message: string): void;\n\tshowStatus(message: string): void;\n\treadonly session: Pick<AgentSession, \"exportToHtml\">;\n\treadonly ui: TUI;\n\treadonly overlayHost: EditorOverlayHost;\n\treadonly editor: EditorComponent;\n}\n\nexport interface CopyCommandHost {\n\treadonly session: Pick<AgentSession, \"getLastAssistantText\">;\n\tshowError(message: string): void;\n\tshowStatus(message: string): void;\n}\n\nexport interface NameCommandHost {\n\treadonly sessionManager: Pick<SessionManager, \"getSessionName\">;\n\treadonly chatContainer: { addChild: (child: Text | Spacer) => void };\n\tshowWarning(message: string): void;\n\treadonly session: Pick<AgentSession, \"setSessionName\">;\n\treadonly ui: { requestRender: () => void };\n}\n\nexport async function handleExportCommand(host: ExportCommandHost, text: string): Promise<void> {\n\tconst outputPath = host.getPathCommandArgument(text, \"/export\");\n\n\ttry {\n\t\tif (outputPath?.endsWith(\".jsonl\")) {\n\t\t\tconst filePath = host.session.exportToJsonl(outputPath);\n\t\t\thost.showStatus(`Session exported to: ${filePath}`);\n\t\t} else {\n\t\t\tconst filePath = await host.session.exportToHtml(outputPath);\n\t\t\thost.showStatus(`Session exported to: ${filePath}`);\n\t\t}\n\t} catch (error: unknown) {\n\t\thost.showError(`Failed to export session: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t}\n}\n\nexport async function handleImportCommand(host: ImportCommandHost, text: string): Promise<void> {\n\tconst inputPath = host.getPathCommandArgument(text, \"/import\");\n\tif (!inputPath) {\n\t\thost.showError(\"Usage: /import <path.jsonl>\");\n\t\treturn;\n\t}\n\n\tconst confirmed = await host.extensionUiHost.showExtensionConfirm(\n\t\t\"Import session\",\n\t\t`Replace current session with ${inputPath}?`,\n\t);\n\tif (!confirmed) {\n\t\thost.showStatus(\"Import cancelled\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (host.loadingAnimation) {\n\t\t\thost.loadingAnimation.stop();\n\t\t\thost.loadingAnimation = undefined;\n\t\t}\n\t\thost.statusContainer.clear();\n\t\tconst result = await host.runtimeHost.importFromJsonl(inputPath);\n\t\tif (result.cancelled) {\n\t\t\thost.showStatus(\"Import cancelled\");\n\t\t\treturn;\n\t\t}\n\t\thost.renderCurrentSessionState();\n\t\thost.showStatus(`Session imported from: ${inputPath}`);\n\t} catch (error: unknown) {\n\t\tif (error instanceof MissingSessionCwdError) {\n\t\t\tconst selectedCwd = await host.promptForMissingSessionCwd(error);\n\t\t\tif (!selectedCwd) {\n\t\t\t\thost.showStatus(\"Import cancelled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await host.runtimeHost.importFromJsonl(inputPath, selectedCwd);\n\t\t\tif (result.cancelled) {\n\t\t\t\thost.showStatus(\"Import cancelled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thost.renderCurrentSessionState();\n\t\t\thost.showStatus(`Session imported from: ${inputPath}`);\n\t\t\treturn;\n\t\t}\n\t\tif (error instanceof SessionImportFileNotFoundError) {\n\t\t\thost.showError(`Failed to import session: ${error.message}`);\n\t\t\treturn;\n\t\t}\n\t\tawait host.handleFatalRuntimeError(\"Failed to import session\", error);\n\t}\n}\n\nexport async function handleShareCommand(host: ShareCommandHost): Promise<void> {\n\t// Check if gh is available and logged in\n\ttry {\n\t\tconst authResult = spawnSync(\"gh\", [\"auth\", \"status\"], { encoding: \"utf-8\" });\n\t\tif (authResult.status !== 0) {\n\t\t\thost.showError(\"GitHub CLI is not logged in. Run 'gh auth login' first.\");\n\t\t\treturn;\n\t\t}\n\t} catch {\n\t\thost.showError(\"GitHub CLI (gh) is not installed. Install it from https://cli.github.com/\");\n\t\treturn;\n\t}\n\n\t// Export to a temp file\n\tconst tmpFile = path.join(os.tmpdir(), \"session.html\");\n\ttry {\n\t\tawait host.session.exportToHtml(tmpFile);\n\t} catch (error: unknown) {\n\t\thost.showError(`Failed to export session: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\treturn;\n\t}\n\n\t// Show cancellable loader, replacing the editor\n\tconst loader = new BorderedLoader(host.ui, theme, \"Creating gist...\");\n\thost.overlayHost.swap(loader);\n\n\tconst restoreEditor = () => {\n\t\tloader.dispose();\n\t\thost.overlayHost.swap(host.editor, { render: \"none\" });\n\t\ttry {\n\t\t\tfs.unlinkSync(tmpFile);\n\t\t} catch {\n\t\t\t// Ignore cleanup errors\n\t\t}\n\t};\n\n\t// Create a secret gist asynchronously\n\tlet proc: ReturnType<typeof spawn> | null = null;\n\n\tloader.onAbort = () => {\n\t\tproc?.kill();\n\t\trestoreEditor();\n\t\thost.showStatus(\"Share cancelled\");\n\t};\n\n\ttry {\n\t\tconst result = await new Promise<{ stdout: string; stderr: string; code: number | null }>((resolve) => {\n\t\t\tproc = spawn(\"gh\", [\"gist\", \"create\", \"--public=false\", tmpFile]);\n\t\t\tlet stdout = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\t\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\t\tstderr += data.toString();\n\t\t\t});\n\t\t\tproc.on(\"close\", (code) => resolve({ stdout, stderr, code }));\n\t\t});\n\n\t\tif (loader.signal.aborted) return;\n\n\t\trestoreEditor();\n\n\t\tif (result.code !== 0) {\n\t\t\tconst errorMsg = result.stderr?.trim() || \"Unknown error\";\n\t\t\thost.showError(`Failed to create gist: ${errorMsg}`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Extract gist ID from the URL returned by gh\n\t\t// gh returns something like: https://gist.github.com/username/GIST_ID\n\t\tconst gistUrl = result.stdout?.trim();\n\t\tconst gistId = gistUrl?.split(\"/\").pop();\n\t\tif (!gistId) {\n\t\t\thost.showError(\"Failed to parse gist ID from gh output\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Create the preview URL\n\t\tconst previewUrl = getShareViewerUrl(gistId);\n\t\thost.showStatus(`Share URL: ${previewUrl}\\nGist: ${gistUrl}`);\n\t} catch (error: unknown) {\n\t\tif (!loader.signal.aborted) {\n\t\t\trestoreEditor();\n\t\t\thost.showError(`Failed to create gist: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\t}\n\t}\n}\n\nexport async function handleCopyCommand(host: CopyCommandHost): Promise<void> {\n\tconst text = host.session.getLastAssistantText();\n\tif (!text) {\n\t\thost.showError(\"No agent messages to copy yet.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait copyToClipboard(text);\n\t\thost.showStatus(\"Copied last agent message to clipboard\");\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function handleNameCommand(host: NameCommandHost, text: string): void {\n\tconst name = text.replace(/^\\/name\\s*/, \"\").trim();\n\tif (!name) {\n\t\tconst currentName = host.sessionManager.getSessionName();\n\t\tif (currentName) {\n\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\thost.chatContainer.addChild(new Text(theme.fg(\"dim\", `Session name: ${currentName}`), 1, 0));\n\t\t} else {\n\t\t\thost.showWarning(\"Usage: /name <name>\");\n\t\t}\n\t\thost.ui.requestRender();\n\t\treturn;\n\t}\n\n\thost.session.setSessionName(name);\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new Text(theme.fg(\"dim\", `Session name set: ${name}`), 1, 0));\n\thost.ui.requestRender();\n}\n"]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session import/export/share/copy/name command bodies extracted from
|
|
3
|
+
* interactive-mode.
|
|
4
|
+
*
|
|
5
|
+
* These drive session serialization (JSONL/HTML export, JSONL import, secret
|
|
6
|
+
* gist share), clipboard copy of the last agent message, and session naming
|
|
7
|
+
* through narrow per-command host seams. `getPathCommandArgument` stays host-side
|
|
8
|
+
* (pure parser, tested directly and shared by export/import); interactive-mode
|
|
9
|
+
* keeps thin delegating wrappers, so the `/import` behaviour test keeps
|
|
10
|
+
* exercising it unchanged.
|
|
11
|
+
*/
|
|
12
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
13
|
+
import * as fs from "node:fs";
|
|
14
|
+
import * as os from "node:os";
|
|
15
|
+
import * as path from "node:path";
|
|
16
|
+
import { Spacer, Text } from "@caupulican/pi-tui";
|
|
17
|
+
import { getShareViewerUrl } from "../../config.js";
|
|
18
|
+
import { SessionImportFileNotFoundError } from "../../core/agent-session-runtime.js";
|
|
19
|
+
import { MissingSessionCwdError } from "../../core/session-cwd.js";
|
|
20
|
+
import { copyToClipboard } from "../../utils/clipboard.js";
|
|
21
|
+
import { BorderedLoader } from "./components/bordered-loader.js";
|
|
22
|
+
import { theme } from "./theme/theme.js";
|
|
23
|
+
export async function handleExportCommand(host, text) {
|
|
24
|
+
const outputPath = host.getPathCommandArgument(text, "/export");
|
|
25
|
+
try {
|
|
26
|
+
if (outputPath?.endsWith(".jsonl")) {
|
|
27
|
+
const filePath = host.session.exportToJsonl(outputPath);
|
|
28
|
+
host.showStatus(`Session exported to: ${filePath}`);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const filePath = await host.session.exportToHtml(outputPath);
|
|
32
|
+
host.showStatus(`Session exported to: ${filePath}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
host.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function handleImportCommand(host, text) {
|
|
40
|
+
const inputPath = host.getPathCommandArgument(text, "/import");
|
|
41
|
+
if (!inputPath) {
|
|
42
|
+
host.showError("Usage: /import <path.jsonl>");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const confirmed = await host.extensionUiHost.showExtensionConfirm("Import session", `Replace current session with ${inputPath}?`);
|
|
46
|
+
if (!confirmed) {
|
|
47
|
+
host.showStatus("Import cancelled");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
if (host.loadingAnimation) {
|
|
52
|
+
host.loadingAnimation.stop();
|
|
53
|
+
host.loadingAnimation = undefined;
|
|
54
|
+
}
|
|
55
|
+
host.statusContainer.clear();
|
|
56
|
+
const result = await host.runtimeHost.importFromJsonl(inputPath);
|
|
57
|
+
if (result.cancelled) {
|
|
58
|
+
host.showStatus("Import cancelled");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
host.renderCurrentSessionState();
|
|
62
|
+
host.showStatus(`Session imported from: ${inputPath}`);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error instanceof MissingSessionCwdError) {
|
|
66
|
+
const selectedCwd = await host.promptForMissingSessionCwd(error);
|
|
67
|
+
if (!selectedCwd) {
|
|
68
|
+
host.showStatus("Import cancelled");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const result = await host.runtimeHost.importFromJsonl(inputPath, selectedCwd);
|
|
72
|
+
if (result.cancelled) {
|
|
73
|
+
host.showStatus("Import cancelled");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
host.renderCurrentSessionState();
|
|
77
|
+
host.showStatus(`Session imported from: ${inputPath}`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (error instanceof SessionImportFileNotFoundError) {
|
|
81
|
+
host.showError(`Failed to import session: ${error.message}`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
await host.handleFatalRuntimeError("Failed to import session", error);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function handleShareCommand(host) {
|
|
88
|
+
// Check if gh is available and logged in
|
|
89
|
+
try {
|
|
90
|
+
const authResult = spawnSync("gh", ["auth", "status"], { encoding: "utf-8" });
|
|
91
|
+
if (authResult.status !== 0) {
|
|
92
|
+
host.showError("GitHub CLI is not logged in. Run 'gh auth login' first.");
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
host.showError("GitHub CLI (gh) is not installed. Install it from https://cli.github.com/");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Export to a temp file
|
|
101
|
+
const tmpFile = path.join(os.tmpdir(), "session.html");
|
|
102
|
+
try {
|
|
103
|
+
await host.session.exportToHtml(tmpFile);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
host.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Show cancellable loader, replacing the editor
|
|
110
|
+
const loader = new BorderedLoader(host.ui, theme, "Creating gist...");
|
|
111
|
+
host.overlayHost.swap(loader);
|
|
112
|
+
const restoreEditor = () => {
|
|
113
|
+
loader.dispose();
|
|
114
|
+
host.overlayHost.swap(host.editor, { render: "none" });
|
|
115
|
+
try {
|
|
116
|
+
fs.unlinkSync(tmpFile);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Ignore cleanup errors
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
// Create a secret gist asynchronously
|
|
123
|
+
let proc = null;
|
|
124
|
+
loader.onAbort = () => {
|
|
125
|
+
proc?.kill();
|
|
126
|
+
restoreEditor();
|
|
127
|
+
host.showStatus("Share cancelled");
|
|
128
|
+
};
|
|
129
|
+
try {
|
|
130
|
+
const result = await new Promise((resolve) => {
|
|
131
|
+
proc = spawn("gh", ["gist", "create", "--public=false", tmpFile]);
|
|
132
|
+
let stdout = "";
|
|
133
|
+
let stderr = "";
|
|
134
|
+
proc.stdout?.on("data", (data) => {
|
|
135
|
+
stdout += data.toString();
|
|
136
|
+
});
|
|
137
|
+
proc.stderr?.on("data", (data) => {
|
|
138
|
+
stderr += data.toString();
|
|
139
|
+
});
|
|
140
|
+
proc.on("close", (code) => resolve({ stdout, stderr, code }));
|
|
141
|
+
});
|
|
142
|
+
if (loader.signal.aborted)
|
|
143
|
+
return;
|
|
144
|
+
restoreEditor();
|
|
145
|
+
if (result.code !== 0) {
|
|
146
|
+
const errorMsg = result.stderr?.trim() || "Unknown error";
|
|
147
|
+
host.showError(`Failed to create gist: ${errorMsg}`);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Extract gist ID from the URL returned by gh
|
|
151
|
+
// gh returns something like: https://gist.github.com/username/GIST_ID
|
|
152
|
+
const gistUrl = result.stdout?.trim();
|
|
153
|
+
const gistId = gistUrl?.split("/").pop();
|
|
154
|
+
if (!gistId) {
|
|
155
|
+
host.showError("Failed to parse gist ID from gh output");
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Create the preview URL
|
|
159
|
+
const previewUrl = getShareViewerUrl(gistId);
|
|
160
|
+
host.showStatus(`Share URL: ${previewUrl}\nGist: ${gistUrl}`);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (!loader.signal.aborted) {
|
|
164
|
+
restoreEditor();
|
|
165
|
+
host.showError(`Failed to create gist: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
export async function handleCopyCommand(host) {
|
|
170
|
+
const text = host.session.getLastAssistantText();
|
|
171
|
+
if (!text) {
|
|
172
|
+
host.showError("No agent messages to copy yet.");
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
await copyToClipboard(text);
|
|
177
|
+
host.showStatus("Copied last agent message to clipboard");
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
host.showError(error instanceof Error ? error.message : String(error));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
export function handleNameCommand(host, text) {
|
|
184
|
+
const name = text.replace(/^\/name\s*/, "").trim();
|
|
185
|
+
if (!name) {
|
|
186
|
+
const currentName = host.sessionManager.getSessionName();
|
|
187
|
+
if (currentName) {
|
|
188
|
+
host.chatContainer.addChild(new Spacer(1));
|
|
189
|
+
host.chatContainer.addChild(new Text(theme.fg("dim", `Session name: ${currentName}`), 1, 0));
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
host.showWarning("Usage: /name <name>");
|
|
193
|
+
}
|
|
194
|
+
host.ui.requestRender();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
host.session.setSessionName(name);
|
|
198
|
+
host.chatContainer.addChild(new Spacer(1));
|
|
199
|
+
host.chatContainer.addChild(new Text(theme.fg("dim", `Session name set: ${name}`), 1, 0));
|
|
200
|
+
host.ui.requestRender();
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=session-io-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-io-commands.js","sourceRoot":"","sources":["../../../src/modes/interactive/session-io-commands.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session import/export/share/copy/name command bodies extracted from\n * interactive-mode.\n *\n * These drive session serialization (JSONL/HTML export, JSONL import, secret\n * gist share), clipboard copy of the last agent message, and session naming\n * through narrow per-command host seams. `getPathCommandArgument` stays host-side\n * (pure parser, tested directly and shared by export/import); interactive-mode\n * keeps thin delegating wrappers, so the `/import` behaviour test keeps\n * exercising it unchanged.\n */\n\nimport { spawn, spawnSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { EditorComponent, TUI } from \"@caupulican/pi-tui\";\nimport { Spacer, Text } from \"@caupulican/pi-tui\";\nimport { getShareViewerUrl } from \"../../config.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport { SessionImportFileNotFoundError } from \"../../core/agent-session-runtime.ts\";\nimport { MissingSessionCwdError } from \"../../core/session-cwd.ts\";\nimport { copyToClipboard } from \"../../utils/clipboard.ts\";\nimport { BorderedLoader } from \"./components/bordered-loader.ts\";\nimport type { EditorOverlayHost } from \"./editor-overlay-host.ts\";\nimport type { ExtensionUiHost } from \"./extension-ui-host.ts\";\nimport { theme } from \"./theme/theme.ts\";\n\ntype PathCommand = \"/export\" | \"/import\";\n\nexport interface ExportCommandHost {\n\treadonly session: Pick<AgentSession, \"exportToJsonl\" | \"exportToHtml\">;\n\tgetPathCommandArgument(text: string, command: PathCommand): string | undefined;\n\tshowStatus(message: string): void;\n\tshowError(message: string): void;\n}\n\nexport interface ImportCommandHost {\n\tgetPathCommandArgument(text: string, command: PathCommand): string | undefined;\n\tshowError(message: string): void;\n\tshowStatus(message: string): void;\n\treadonly extensionUiHost: Pick<ExtensionUiHost, \"showExtensionConfirm\">;\n\tloadingAnimation: { stop: () => void } | undefined;\n\treadonly statusContainer: { clear: () => void };\n\treadonly runtimeHost: Pick<AgentSessionRuntime, \"importFromJsonl\">;\n\trenderCurrentSessionState(): void;\n\tpromptForMissingSessionCwd(error: MissingSessionCwdError): Promise<string | undefined>;\n\thandleFatalRuntimeError(prefix: string, error: unknown): Promise<never>;\n}\n\nexport interface ShareCommandHost {\n\tshowError(message: string): void;\n\tshowStatus(message: string): void;\n\treadonly session: Pick<AgentSession, \"exportToHtml\">;\n\treadonly ui: TUI;\n\treadonly overlayHost: EditorOverlayHost;\n\treadonly editor: EditorComponent;\n}\n\nexport interface CopyCommandHost {\n\treadonly session: Pick<AgentSession, \"getLastAssistantText\">;\n\tshowError(message: string): void;\n\tshowStatus(message: string): void;\n}\n\nexport interface NameCommandHost {\n\treadonly sessionManager: Pick<SessionManager, \"getSessionName\">;\n\treadonly chatContainer: { addChild: (child: Text | Spacer) => void };\n\tshowWarning(message: string): void;\n\treadonly session: Pick<AgentSession, \"setSessionName\">;\n\treadonly ui: { requestRender: () => void };\n}\n\nexport async function handleExportCommand(host: ExportCommandHost, text: string): Promise<void> {\n\tconst outputPath = host.getPathCommandArgument(text, \"/export\");\n\n\ttry {\n\t\tif (outputPath?.endsWith(\".jsonl\")) {\n\t\t\tconst filePath = host.session.exportToJsonl(outputPath);\n\t\t\thost.showStatus(`Session exported to: ${filePath}`);\n\t\t} else {\n\t\t\tconst filePath = await host.session.exportToHtml(outputPath);\n\t\t\thost.showStatus(`Session exported to: ${filePath}`);\n\t\t}\n\t} catch (error: unknown) {\n\t\thost.showError(`Failed to export session: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t}\n}\n\nexport async function handleImportCommand(host: ImportCommandHost, text: string): Promise<void> {\n\tconst inputPath = host.getPathCommandArgument(text, \"/import\");\n\tif (!inputPath) {\n\t\thost.showError(\"Usage: /import <path.jsonl>\");\n\t\treturn;\n\t}\n\n\tconst confirmed = await host.extensionUiHost.showExtensionConfirm(\n\t\t\"Import session\",\n\t\t`Replace current session with ${inputPath}?`,\n\t);\n\tif (!confirmed) {\n\t\thost.showStatus(\"Import cancelled\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (host.loadingAnimation) {\n\t\t\thost.loadingAnimation.stop();\n\t\t\thost.loadingAnimation = undefined;\n\t\t}\n\t\thost.statusContainer.clear();\n\t\tconst result = await host.runtimeHost.importFromJsonl(inputPath);\n\t\tif (result.cancelled) {\n\t\t\thost.showStatus(\"Import cancelled\");\n\t\t\treturn;\n\t\t}\n\t\thost.renderCurrentSessionState();\n\t\thost.showStatus(`Session imported from: ${inputPath}`);\n\t} catch (error: unknown) {\n\t\tif (error instanceof MissingSessionCwdError) {\n\t\t\tconst selectedCwd = await host.promptForMissingSessionCwd(error);\n\t\t\tif (!selectedCwd) {\n\t\t\t\thost.showStatus(\"Import cancelled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await host.runtimeHost.importFromJsonl(inputPath, selectedCwd);\n\t\t\tif (result.cancelled) {\n\t\t\t\thost.showStatus(\"Import cancelled\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thost.renderCurrentSessionState();\n\t\t\thost.showStatus(`Session imported from: ${inputPath}`);\n\t\t\treturn;\n\t\t}\n\t\tif (error instanceof SessionImportFileNotFoundError) {\n\t\t\thost.showError(`Failed to import session: ${error.message}`);\n\t\t\treturn;\n\t\t}\n\t\tawait host.handleFatalRuntimeError(\"Failed to import session\", error);\n\t}\n}\n\nexport async function handleShareCommand(host: ShareCommandHost): Promise<void> {\n\t// Check if gh is available and logged in\n\ttry {\n\t\tconst authResult = spawnSync(\"gh\", [\"auth\", \"status\"], { encoding: \"utf-8\" });\n\t\tif (authResult.status !== 0) {\n\t\t\thost.showError(\"GitHub CLI is not logged in. Run 'gh auth login' first.\");\n\t\t\treturn;\n\t\t}\n\t} catch {\n\t\thost.showError(\"GitHub CLI (gh) is not installed. Install it from https://cli.github.com/\");\n\t\treturn;\n\t}\n\n\t// Export to a temp file\n\tconst tmpFile = path.join(os.tmpdir(), \"session.html\");\n\ttry {\n\t\tawait host.session.exportToHtml(tmpFile);\n\t} catch (error: unknown) {\n\t\thost.showError(`Failed to export session: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\treturn;\n\t}\n\n\t// Show cancellable loader, replacing the editor\n\tconst loader = new BorderedLoader(host.ui, theme, \"Creating gist...\");\n\thost.overlayHost.swap(loader);\n\n\tconst restoreEditor = () => {\n\t\tloader.dispose();\n\t\thost.overlayHost.swap(host.editor, { render: \"none\" });\n\t\ttry {\n\t\t\tfs.unlinkSync(tmpFile);\n\t\t} catch {\n\t\t\t// Ignore cleanup errors\n\t\t}\n\t};\n\n\t// Create a secret gist asynchronously\n\tlet proc: ReturnType<typeof spawn> | null = null;\n\n\tloader.onAbort = () => {\n\t\tproc?.kill();\n\t\trestoreEditor();\n\t\thost.showStatus(\"Share cancelled\");\n\t};\n\n\ttry {\n\t\tconst result = await new Promise<{ stdout: string; stderr: string; code: number | null }>((resolve) => {\n\t\t\tproc = spawn(\"gh\", [\"gist\", \"create\", \"--public=false\", tmpFile]);\n\t\t\tlet stdout = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\t\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\t\tstderr += data.toString();\n\t\t\t});\n\t\t\tproc.on(\"close\", (code) => resolve({ stdout, stderr, code }));\n\t\t});\n\n\t\tif (loader.signal.aborted) return;\n\n\t\trestoreEditor();\n\n\t\tif (result.code !== 0) {\n\t\t\tconst errorMsg = result.stderr?.trim() || \"Unknown error\";\n\t\t\thost.showError(`Failed to create gist: ${errorMsg}`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Extract gist ID from the URL returned by gh\n\t\t// gh returns something like: https://gist.github.com/username/GIST_ID\n\t\tconst gistUrl = result.stdout?.trim();\n\t\tconst gistId = gistUrl?.split(\"/\").pop();\n\t\tif (!gistId) {\n\t\t\thost.showError(\"Failed to parse gist ID from gh output\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Create the preview URL\n\t\tconst previewUrl = getShareViewerUrl(gistId);\n\t\thost.showStatus(`Share URL: ${previewUrl}\\nGist: ${gistUrl}`);\n\t} catch (error: unknown) {\n\t\tif (!loader.signal.aborted) {\n\t\t\trestoreEditor();\n\t\t\thost.showError(`Failed to create gist: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\t}\n\t}\n}\n\nexport async function handleCopyCommand(host: CopyCommandHost): Promise<void> {\n\tconst text = host.session.getLastAssistantText();\n\tif (!text) {\n\t\thost.showError(\"No agent messages to copy yet.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tawait copyToClipboard(text);\n\t\thost.showStatus(\"Copied last agent message to clipboard\");\n\t} catch (error) {\n\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t}\n}\n\nexport function handleNameCommand(host: NameCommandHost, text: string): void {\n\tconst name = text.replace(/^\\/name\\s*/, \"\").trim();\n\tif (!name) {\n\t\tconst currentName = host.sessionManager.getSessionName();\n\t\tif (currentName) {\n\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\thost.chatContainer.addChild(new Text(theme.fg(\"dim\", `Session name: ${currentName}`), 1, 0));\n\t\t} else {\n\t\t\thost.showWarning(\"Usage: /name <name>\");\n\t\t}\n\t\thost.ui.requestRender();\n\t\treturn;\n\t}\n\n\thost.session.setSessionName(name);\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new Text(theme.fg(\"dim\", `Session name set: ${name}`), 1, 0));\n\thost.ui.requestRender();\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/settings` selector flow extracted from interactive-mode.
|
|
3
|
+
*
|
|
4
|
+
* Builds the SettingsSelectorComponent model from the current settings/session
|
|
5
|
+
* state and wires its change callbacks back through a `SettingsSelectorHost`
|
|
6
|
+
* seam. Self-mod/auto-learn validation, autonomy-preset application, autocomplete
|
|
7
|
+
* rebuild, and the resources-hub hand-off stay host-side (shared with other
|
|
8
|
+
* flows); interactive-mode keeps a thin wrapper building the host once.
|
|
9
|
+
*/
|
|
10
|
+
import type { Component, Container, EditorComponent, SelectItem, TUI } from "@caupulican/pi-tui";
|
|
11
|
+
import type { AgentSession } from "../../core/agent-session.ts";
|
|
12
|
+
import type { AutonomyMode, SelfModificationSettings, SettingsManager, SettingsScope } from "../../core/settings-manager.ts";
|
|
13
|
+
import type { CustomEditor } from "./components/custom-editor.ts";
|
|
14
|
+
import type { FooterComponent } from "./components/footer.ts";
|
|
15
|
+
export interface SettingsSelectorHost {
|
|
16
|
+
readonly session: AgentSession;
|
|
17
|
+
readonly settingsManager: SettingsManager;
|
|
18
|
+
readonly footer: FooterComponent;
|
|
19
|
+
readonly chatContainer: Container;
|
|
20
|
+
readonly ui: TUI;
|
|
21
|
+
readonly defaultEditor: CustomEditor;
|
|
22
|
+
readonly editor: EditorComponent;
|
|
23
|
+
hideThinkingBlock: boolean;
|
|
24
|
+
showSelector(create: (done: () => void) => {
|
|
25
|
+
component: Component;
|
|
26
|
+
focus: Component;
|
|
27
|
+
}): void;
|
|
28
|
+
showStatus(message: string): void;
|
|
29
|
+
showWarning(message: string): void;
|
|
30
|
+
showError(message: string): void;
|
|
31
|
+
getAutoLearnModelOptions(): SelectItem[];
|
|
32
|
+
setupAutocompleteProvider(): void;
|
|
33
|
+
updateEditorBorderColor(): void;
|
|
34
|
+
rebuildChatFromMessages(): Promise<void>;
|
|
35
|
+
validateSelfModificationSource(settings: SelfModificationSettings): string | undefined;
|
|
36
|
+
applyAutonomyMode(mode: AutonomyMode, scope?: SettingsScope): void;
|
|
37
|
+
validateAutoLearnModelValue(value: string | undefined): string | undefined;
|
|
38
|
+
updateAutoLearnFooter(): void;
|
|
39
|
+
handleResourcesHubAction(action: string): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
export declare function showSettingsSelector(host: SettingsSelectorHost): void;
|
|
42
|
+
//# sourceMappingURL=settings-selector-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-selector-flow.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/settings-selector-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EACX,YAAY,EACZ,wBAAwB,EACxB,eAAe,EACf,aAAa,EACb,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC;IAClC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IACjB,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7F,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,wBAAwB,IAAI,UAAU,EAAE,CAAC;IACzC,yBAAyB,IAAI,IAAI,CAAC;IAClC,uBAAuB,IAAI,IAAI,CAAC;IAChC,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,8BAA8B,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,GAAG,SAAS,CAAC;IACvF,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACnE,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3E,qBAAqB,IAAI,IAAI,CAAC;IAC9B,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAyRrE","sourcesContent":["/**\n * `/settings` selector flow extracted from interactive-mode.\n *\n * Builds the SettingsSelectorComponent model from the current settings/session\n * state and wires its change callbacks back through a `SettingsSelectorHost`\n * seam. Self-mod/auto-learn validation, autonomy-preset application, autocomplete\n * rebuild, and the resources-hub hand-off stay host-side (shared with other\n * flows); interactive-mode keeps a thin wrapper building the host once.\n */\n\nimport type { Component, Container, EditorComponent, SelectItem, TUI } from \"@caupulican/pi-tui\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport { configureHttpDispatcher, formatHttpIdleTimeoutMs } from \"../../core/http-dispatcher.ts\";\nimport type {\n\tAutonomyMode,\n\tSelfModificationSettings,\n\tSettingsManager,\n\tSettingsScope,\n} from \"../../core/settings-manager.ts\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.ts\";\nimport type { CustomEditor } from \"./components/custom-editor.ts\";\nimport type { FooterComponent } from \"./components/footer.ts\";\nimport { SettingsSelectorComponent } from \"./components/settings-selector.ts\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.ts\";\nimport { ToolGroupComponent } from \"./components/tool-group.ts\";\nimport { getAvailableThemes, setTheme } from \"./theme/theme.ts\";\n\nexport interface SettingsSelectorHost {\n\treadonly session: AgentSession;\n\treadonly settingsManager: SettingsManager;\n\treadonly footer: FooterComponent;\n\treadonly chatContainer: Container;\n\treadonly ui: TUI;\n\treadonly defaultEditor: CustomEditor;\n\treadonly editor: EditorComponent;\n\thideThinkingBlock: boolean;\n\tshowSelector(create: (done: () => void) => { component: Component; focus: Component }): void;\n\tshowStatus(message: string): void;\n\tshowWarning(message: string): void;\n\tshowError(message: string): void;\n\tgetAutoLearnModelOptions(): SelectItem[];\n\tsetupAutocompleteProvider(): void;\n\tupdateEditorBorderColor(): void;\n\trebuildChatFromMessages(): Promise<void>;\n\tvalidateSelfModificationSource(settings: SelfModificationSettings): string | undefined;\n\tapplyAutonomyMode(mode: AutonomyMode, scope?: SettingsScope): void;\n\tvalidateAutoLearnModelValue(value: string | undefined): string | undefined;\n\tupdateAutoLearnFooter(): void;\n\thandleResourcesHubAction(action: string): Promise<void>;\n}\n\nexport function showSettingsSelector(host: SettingsSelectorHost): void {\n\thost.showSelector((done) => {\n\t\tconst projectSettings = host.settingsManager.getProjectSettings();\n\t\tconst profileOptions = [\n\t\t\t{\n\t\t\t\tvalue: \"(none)\",\n\t\t\t\tlabel: \"(none)\",\n\t\t\t\tdescription: \"Use configured profile selection (session default)\",\n\t\t\t},\n\t\t\t...host.settingsManager\n\t\t\t\t.getProfileRegistry()\n\t\t\t\t.listProfiles()\n\t\t\t\t.map((profile) => ({\n\t\t\t\t\tvalue: profile.name,\n\t\t\t\t\tlabel: profile.name,\n\t\t\t\t\tdescription: profile.description ?? profile.source,\n\t\t\t\t})),\n\t\t];\n\t\tconst selector = new SettingsSelectorComponent(\n\t\t\t{\n\t\t\t\tautoCompact: host.session.autoCompactionEnabled,\n\t\t\t\tshowImages: host.settingsManager.getShowImages(),\n\t\t\t\timageWidthCells: host.settingsManager.getImageWidthCells(),\n\t\t\t\tautoResizeImages: host.settingsManager.getImageAutoResize(),\n\t\t\t\tblockImages: host.settingsManager.getBlockImages(),\n\t\t\t\tenableSkillCommands: host.settingsManager.getEnableSkillCommands(),\n\t\t\t\tsteeringMode: host.session.steeringMode,\n\t\t\t\tfollowUpMode: host.session.followUpMode,\n\t\t\t\ttransport: host.settingsManager.getTransport(),\n\t\t\t\thttpIdleTimeoutMs: host.settingsManager.getHttpIdleTimeoutMs(),\n\t\t\t\tthinkingLevel: host.session.thinkingLevel,\n\t\t\t\tavailableThinkingLevels: host.session.getAvailableThinkingLevels(),\n\t\t\t\tcurrentTheme: host.settingsManager.getTheme() || \"dark\",\n\t\t\t\t// The picker offers only themes the active profile permits (no-bypass). The theme\n\t\t\t\t// registry/renderer keeps the full set, so an already-applied theme still renders\n\t\t\t\t// even if the profile would block re-selecting it.\n\t\t\t\tavailableThemes: getAvailableThemes().filter((name) =>\n\t\t\t\t\thost.settingsManager.isResourceAllowedByProfile(\"themes\", name),\n\t\t\t\t),\n\t\t\t\thideThinkingBlock: host.hideThinkingBlock,\n\t\t\t\tcollapseChangelog: host.settingsManager.getCollapseChangelog(),\n\t\t\t\tenableInstallTelemetry: host.settingsManager.getEnableInstallTelemetry(),\n\t\t\t\tdoubleEscapeAction: host.settingsManager.getDoubleEscapeAction(),\n\t\t\t\ttreeFilterMode: host.settingsManager.getTreeFilterMode(),\n\t\t\t\tshowHardwareCursor: host.settingsManager.getShowHardwareCursor(),\n\t\t\t\teditorPaddingX: host.settingsManager.getEditorPaddingX(),\n\t\t\t\tautocompleteMaxVisible: host.settingsManager.getAutocompleteMaxVisible(),\n\t\t\t\tquietStartup: host.settingsManager.getQuietStartup(),\n\t\t\t\tclearOnShrink: host.settingsManager.getClearOnShrink(),\n\t\t\t\tshowTerminalProgress: host.settingsManager.getShowTerminalProgress(),\n\t\t\t\twarnings: host.settingsManager.getWarnings(),\n\t\t\t\tselfModification: host.settingsManager.getSelfModificationSettings(),\n\t\t\t\tselfModificationScope: projectSettings.selfModification ? \"project\" : \"global\",\n\t\t\t\tautonomy: host.settingsManager.getAutonomySettings(),\n\t\t\t\tautonomyScope: projectSettings.autonomy ? \"project\" : \"global\",\n\t\t\t\tresearchLane: host.settingsManager.getResearchLaneSettings(),\n\t\t\t\tresearchLaneScope: projectSettings.researchLane ? \"project\" : \"global\",\n\t\t\t\tworkerDelegation: host.settingsManager.getWorkerDelegationSettings(),\n\t\t\t\tworkerDelegationScope: projectSettings.workerDelegation ? \"project\" : \"global\",\n\t\t\t\tcontextCuration: host.settingsManager.getContextCurationSettings(),\n\t\t\t\tcontextCurationScope: projectSettings.contextPolicy?.curation ? \"project\" : \"global\",\n\t\t\t\tlearningPolicy: host.settingsManager.getLearningPolicySettings(),\n\t\t\t\tlearningPolicyScope: projectSettings.learningPolicy ? \"project\" : \"global\",\n\t\t\t\tmodelCapability: host.settingsManager.getModelCapabilitySettings(),\n\t\t\t\tmodelCapabilityScope: projectSettings.modelCapability ? \"project\" : \"global\",\n\t\t\t\tmodelRouter: host.settingsManager.getModelRouterSettings(),\n\t\t\t\tmodelRouterScope: projectSettings.modelRouter ? \"project\" : \"global\",\n\t\t\t\tautoLearn: host.settingsManager.getAutoLearnSettings(),\n\t\t\t\tautoLearnScope: projectSettings.autoLearn ? \"project\" : \"global\",\n\t\t\t\tautoLearnModelOptions: host.getAutoLearnModelOptions(),\n\t\t\t\tcontextPolicyEnforcement: host.settingsManager.getContextPromptEnforcementSettings(),\n\t\t\t\tcontextPolicyEnforcementScope: projectSettings.contextPolicy?.enforcement ? \"project\" : \"global\",\n\t\t\t\tcontextMemoryRetrieval: host.settingsManager.getMemoryRetrievalSettings(),\n\t\t\t\tcontextMemoryRetrievalScope: projectSettings.contextPolicy?.memory ? \"project\" : \"global\",\n\t\t\t\tcurrentModelPattern: host.session.model\n\t\t\t\t\t? `${host.session.model.provider}/${host.session.model.id}`\n\t\t\t\t\t: undefined,\n\t\t\t\tactiveProfileName: host.settingsManager.getActiveResourceProfileNames()[0],\n\t\t\t\tprofileOptions,\n\t\t\t\texternalResourceRoots: host.settingsManager.getExternalResourceRoots(),\n\t\t\t\ttrustedResourceRoots: host.settingsManager.getTrustedResourceRoots(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tonAutoCompactChange: (enabled) => {\n\t\t\t\t\thost.session.setAutoCompactionEnabled(enabled);\n\t\t\t\t\thost.footer.setAutoCompactEnabled(enabled);\n\t\t\t\t},\n\t\t\t\tonShowImagesChange: (enabled) => {\n\t\t\t\t\thost.settingsManager.setShowImages(enabled);\n\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\tif (child instanceof ToolExecutionComponent || child instanceof ToolGroupComponent) {\n\t\t\t\t\t\t\tchild.setShowImages(enabled);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t\tonImageWidthCellsChange: (width) => {\n\t\t\t\t\thost.settingsManager.setImageWidthCells(width);\n\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\tif (child instanceof ToolExecutionComponent || child instanceof ToolGroupComponent) {\n\t\t\t\t\t\t\tchild.setImageWidthCells(width);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t\tonAutoResizeImagesChange: (enabled) => {\n\t\t\t\t\thost.settingsManager.setImageAutoResize(enabled);\n\t\t\t\t},\n\t\t\t\tonBlockImagesChange: (blocked) => {\n\t\t\t\t\thost.settingsManager.setBlockImages(blocked);\n\t\t\t\t},\n\t\t\t\tonEnableSkillCommandsChange: (enabled) => {\n\t\t\t\t\thost.settingsManager.setEnableSkillCommands(enabled);\n\t\t\t\t\thost.setupAutocompleteProvider();\n\t\t\t\t},\n\t\t\t\tonSteeringModeChange: (mode) => {\n\t\t\t\t\thost.session.setSteeringMode(mode);\n\t\t\t\t},\n\t\t\t\tonFollowUpModeChange: (mode) => {\n\t\t\t\t\thost.session.setFollowUpMode(mode);\n\t\t\t\t},\n\t\t\t\tonTransportChange: (transport) => {\n\t\t\t\t\thost.settingsManager.setTransport(transport);\n\t\t\t\t\thost.session.agent.transport = transport;\n\t\t\t\t},\n\t\t\t\tonHttpIdleTimeoutMsChange: (timeoutMs) => {\n\t\t\t\t\thost.settingsManager.setHttpIdleTimeoutMs(timeoutMs);\n\t\t\t\t\tconfigureHttpDispatcher(timeoutMs);\n\t\t\t\t\thost.showStatus(`HTTP idle timeout: ${formatHttpIdleTimeoutMs(timeoutMs)}`);\n\t\t\t\t},\n\t\t\t\tonThinkingLevelChange: (level) => {\n\t\t\t\t\thost.session.setThinkingLevel(level);\n\t\t\t\t\thost.footer.invalidate();\n\t\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\t},\n\t\t\t\tonThemeChange: (themeName) => {\n\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\thost.settingsManager.setTheme(themeName);\n\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\tif (!result.success) {\n\t\t\t\t\t\thost.showError(`Failed to load theme \"${themeName}\": ${result.error}\\nFell back to dark theme.`);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonThemePreview: (themeName) => {\n\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonHideThinkingBlockChange: (hidden) => {\n\t\t\t\t\thost.hideThinkingBlock = hidden;\n\t\t\t\t\thost.settingsManager.setHideThinkingBlock(hidden);\n\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\tif (child instanceof AssistantMessageComponent) {\n\t\t\t\t\t\t\tchild.setHideThinkingBlock(hidden);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvoid host.rebuildChatFromMessages();\n\t\t\t\t},\n\t\t\t\tonCollapseChangelogChange: (collapsed) => {\n\t\t\t\t\thost.settingsManager.setCollapseChangelog(collapsed);\n\t\t\t\t},\n\t\t\t\tonEnableInstallTelemetryChange: (enabled) => {\n\t\t\t\t\thost.settingsManager.setEnableInstallTelemetry(enabled);\n\t\t\t\t},\n\t\t\t\tonQuietStartupChange: (enabled) => {\n\t\t\t\t\thost.settingsManager.setQuietStartup(enabled);\n\t\t\t\t},\n\t\t\t\tonDoubleEscapeActionChange: (action) => {\n\t\t\t\t\thost.settingsManager.setDoubleEscapeAction(action);\n\t\t\t\t},\n\t\t\t\tonTreeFilterModeChange: (mode) => {\n\t\t\t\t\thost.settingsManager.setTreeFilterMode(mode);\n\t\t\t\t},\n\t\t\t\tonShowHardwareCursorChange: (enabled) => {\n\t\t\t\t\thost.settingsManager.setShowHardwareCursor(enabled);\n\t\t\t\t\thost.ui.setShowHardwareCursor(enabled);\n\t\t\t\t},\n\t\t\t\tonEditorPaddingXChange: (padding) => {\n\t\t\t\t\thost.settingsManager.setEditorPaddingX(padding);\n\t\t\t\t\thost.defaultEditor.setPaddingX(padding);\n\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setPaddingX !== undefined) {\n\t\t\t\t\t\thost.editor.setPaddingX(padding);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonAutocompleteMaxVisibleChange: (maxVisible) => {\n\t\t\t\t\thost.settingsManager.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\thost.defaultEditor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setAutocompleteMaxVisible !== undefined) {\n\t\t\t\t\t\thost.editor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonClearOnShrinkChange: (enabled) => {\n\t\t\t\t\thost.settingsManager.setClearOnShrink(enabled);\n\t\t\t\t\thost.ui.setClearOnShrink(enabled);\n\t\t\t\t},\n\t\t\t\tonShowTerminalProgressChange: (enabled) => {\n\t\t\t\t\thost.settingsManager.setShowTerminalProgress(enabled);\n\t\t\t\t},\n\t\t\t\tonWarningsChange: (warnings) => {\n\t\t\t\t\thost.settingsManager.setWarnings(warnings);\n\t\t\t\t},\n\t\t\t\tonSelfModificationChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setSelfModificationSettings(settings, scope);\n\t\t\t\t\tconst validationMessage = host.validateSelfModificationSource(settings);\n\t\t\t\t\tif (validationMessage) {\n\t\t\t\t\t\thost.showWarning(validationMessage);\n\t\t\t\t\t}\n\t\t\t\t\thost.showStatus(\n\t\t\t\t\t\t`Self modification settings saved to ${scope}. Start a new session or /reload for system-prompt guardrails to fully refresh.`,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tonAutonomyChange: (settings, scope) => {\n\t\t\t\t\thost.applyAutonomyMode(settings.mode ?? \"off\", scope);\n\t\t\t\t\thost.showStatus(`Autonomy mode ${settings.mode ?? \"off\"} saved to ${scope}. Use /autonomy status.`);\n\t\t\t\t},\n\t\t\t\tonResearchLaneChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setResearchLaneSettings(settings, scope);\n\t\t\t\t\thost.showStatus(\n\t\t\t\t\t\t`Research lane settings saved to ${scope}. Use /autonomy research or /autonomy diagnostics.`,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tonWorkerDelegationChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setWorkerDelegationSettings(settings, scope);\n\t\t\t\t\thost.showStatus(`Worker delegation settings saved to ${scope}. The delegate tool uses them.`);\n\t\t\t\t},\n\t\t\t\tonLearningPolicyChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setLearningPolicySettings(settings, scope);\n\t\t\t\t\thost.showStatus(`Learning policy saved to ${scope}.`);\n\t\t\t\t},\n\t\t\t\tonModelCapabilityChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setModelCapabilitySettings(settings, scope);\n\t\t\t\t\thost.showStatus(`Model capability mode saved to ${scope}. Applies on the next model switch or /reload.`);\n\t\t\t\t},\n\t\t\t\tonContextCurationChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setContextCurationSettings(settings, scope);\n\t\t\t\t\thost.showStatus(\n\t\t\t\t\t\t`Context curation settings saved to ${scope}. Run /fitness <model> first if the model is unprobed.`,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tonModelRouterChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setModelRouterSettings(settings, scope);\n\t\t\t\t\tfor (const value of [settings.cheapModel, settings.expensiveModel, settings.learningModel]) {\n\t\t\t\t\t\tconst validationMessage = host.validateAutoLearnModelValue(value);\n\t\t\t\t\t\tif (validationMessage) {\n\t\t\t\t\t\t\thost.showWarning(validationMessage.replace(\"Auto Learn model\", \"Model router model\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\thost.updateAutoLearnFooter();\n\t\t\t\t\thost.showStatus(`Model Router settings saved to ${scope}. Use /session or /usage to inspect routing.`);\n\t\t\t\t},\n\t\t\t\tonAutoLearnChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setAutoLearnSettings(settings, scope);\n\t\t\t\t\tconst validationMessage = host.validateAutoLearnModelValue(settings.model);\n\t\t\t\t\tif (validationMessage) {\n\t\t\t\t\t\thost.showWarning(validationMessage);\n\t\t\t\t\t}\n\t\t\t\t\thost.updateAutoLearnFooter();\n\t\t\t\t\thost.showStatus(`Auto Learn settings saved to ${scope}. Use /auto-learn status or /auto-learn run.`);\n\t\t\t\t},\n\t\t\t\tonContextPolicyEnforcementChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setContextPromptEnforcementSettings(settings, scope);\n\t\t\t\t\thost.showStatus(`Context/prompt-policy settings saved to ${scope}.`);\n\t\t\t\t},\n\t\t\t\tonContextMemoryRetrievalChange: (settings, scope) => {\n\t\t\t\t\thost.settingsManager.setMemoryRetrievalSettings(settings, scope);\n\t\t\t\t\thost.showStatus(`Context/memory-retrieval settings saved to ${scope}.`);\n\t\t\t\t},\n\t\t\t\tonResourcesHubAction: (action) => {\n\t\t\t\t\tdone();\n\t\t\t\t\tvoid host.handleResourcesHubAction(action);\n\t\t\t\t},\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tdone();\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\treturn { component: selector, focus: selector.getSettingsList() };\n\t});\n}\n"]}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/settings` selector flow extracted from interactive-mode.
|
|
3
|
+
*
|
|
4
|
+
* Builds the SettingsSelectorComponent model from the current settings/session
|
|
5
|
+
* state and wires its change callbacks back through a `SettingsSelectorHost`
|
|
6
|
+
* seam. Self-mod/auto-learn validation, autonomy-preset application, autocomplete
|
|
7
|
+
* rebuild, and the resources-hub hand-off stay host-side (shared with other
|
|
8
|
+
* flows); interactive-mode keeps a thin wrapper building the host once.
|
|
9
|
+
*/
|
|
10
|
+
import { configureHttpDispatcher, formatHttpIdleTimeoutMs } from "../../core/http-dispatcher.js";
|
|
11
|
+
import { AssistantMessageComponent } from "./components/assistant-message.js";
|
|
12
|
+
import { SettingsSelectorComponent } from "./components/settings-selector.js";
|
|
13
|
+
import { ToolExecutionComponent } from "./components/tool-execution.js";
|
|
14
|
+
import { ToolGroupComponent } from "./components/tool-group.js";
|
|
15
|
+
import { getAvailableThemes, setTheme } from "./theme/theme.js";
|
|
16
|
+
export function showSettingsSelector(host) {
|
|
17
|
+
host.showSelector((done) => {
|
|
18
|
+
const projectSettings = host.settingsManager.getProjectSettings();
|
|
19
|
+
const profileOptions = [
|
|
20
|
+
{
|
|
21
|
+
value: "(none)",
|
|
22
|
+
label: "(none)",
|
|
23
|
+
description: "Use configured profile selection (session default)",
|
|
24
|
+
},
|
|
25
|
+
...host.settingsManager
|
|
26
|
+
.getProfileRegistry()
|
|
27
|
+
.listProfiles()
|
|
28
|
+
.map((profile) => ({
|
|
29
|
+
value: profile.name,
|
|
30
|
+
label: profile.name,
|
|
31
|
+
description: profile.description ?? profile.source,
|
|
32
|
+
})),
|
|
33
|
+
];
|
|
34
|
+
const selector = new SettingsSelectorComponent({
|
|
35
|
+
autoCompact: host.session.autoCompactionEnabled,
|
|
36
|
+
showImages: host.settingsManager.getShowImages(),
|
|
37
|
+
imageWidthCells: host.settingsManager.getImageWidthCells(),
|
|
38
|
+
autoResizeImages: host.settingsManager.getImageAutoResize(),
|
|
39
|
+
blockImages: host.settingsManager.getBlockImages(),
|
|
40
|
+
enableSkillCommands: host.settingsManager.getEnableSkillCommands(),
|
|
41
|
+
steeringMode: host.session.steeringMode,
|
|
42
|
+
followUpMode: host.session.followUpMode,
|
|
43
|
+
transport: host.settingsManager.getTransport(),
|
|
44
|
+
httpIdleTimeoutMs: host.settingsManager.getHttpIdleTimeoutMs(),
|
|
45
|
+
thinkingLevel: host.session.thinkingLevel,
|
|
46
|
+
availableThinkingLevels: host.session.getAvailableThinkingLevels(),
|
|
47
|
+
currentTheme: host.settingsManager.getTheme() || "dark",
|
|
48
|
+
// The picker offers only themes the active profile permits (no-bypass). The theme
|
|
49
|
+
// registry/renderer keeps the full set, so an already-applied theme still renders
|
|
50
|
+
// even if the profile would block re-selecting it.
|
|
51
|
+
availableThemes: getAvailableThemes().filter((name) => host.settingsManager.isResourceAllowedByProfile("themes", name)),
|
|
52
|
+
hideThinkingBlock: host.hideThinkingBlock,
|
|
53
|
+
collapseChangelog: host.settingsManager.getCollapseChangelog(),
|
|
54
|
+
enableInstallTelemetry: host.settingsManager.getEnableInstallTelemetry(),
|
|
55
|
+
doubleEscapeAction: host.settingsManager.getDoubleEscapeAction(),
|
|
56
|
+
treeFilterMode: host.settingsManager.getTreeFilterMode(),
|
|
57
|
+
showHardwareCursor: host.settingsManager.getShowHardwareCursor(),
|
|
58
|
+
editorPaddingX: host.settingsManager.getEditorPaddingX(),
|
|
59
|
+
autocompleteMaxVisible: host.settingsManager.getAutocompleteMaxVisible(),
|
|
60
|
+
quietStartup: host.settingsManager.getQuietStartup(),
|
|
61
|
+
clearOnShrink: host.settingsManager.getClearOnShrink(),
|
|
62
|
+
showTerminalProgress: host.settingsManager.getShowTerminalProgress(),
|
|
63
|
+
warnings: host.settingsManager.getWarnings(),
|
|
64
|
+
selfModification: host.settingsManager.getSelfModificationSettings(),
|
|
65
|
+
selfModificationScope: projectSettings.selfModification ? "project" : "global",
|
|
66
|
+
autonomy: host.settingsManager.getAutonomySettings(),
|
|
67
|
+
autonomyScope: projectSettings.autonomy ? "project" : "global",
|
|
68
|
+
researchLane: host.settingsManager.getResearchLaneSettings(),
|
|
69
|
+
researchLaneScope: projectSettings.researchLane ? "project" : "global",
|
|
70
|
+
workerDelegation: host.settingsManager.getWorkerDelegationSettings(),
|
|
71
|
+
workerDelegationScope: projectSettings.workerDelegation ? "project" : "global",
|
|
72
|
+
contextCuration: host.settingsManager.getContextCurationSettings(),
|
|
73
|
+
contextCurationScope: projectSettings.contextPolicy?.curation ? "project" : "global",
|
|
74
|
+
learningPolicy: host.settingsManager.getLearningPolicySettings(),
|
|
75
|
+
learningPolicyScope: projectSettings.learningPolicy ? "project" : "global",
|
|
76
|
+
modelCapability: host.settingsManager.getModelCapabilitySettings(),
|
|
77
|
+
modelCapabilityScope: projectSettings.modelCapability ? "project" : "global",
|
|
78
|
+
modelRouter: host.settingsManager.getModelRouterSettings(),
|
|
79
|
+
modelRouterScope: projectSettings.modelRouter ? "project" : "global",
|
|
80
|
+
autoLearn: host.settingsManager.getAutoLearnSettings(),
|
|
81
|
+
autoLearnScope: projectSettings.autoLearn ? "project" : "global",
|
|
82
|
+
autoLearnModelOptions: host.getAutoLearnModelOptions(),
|
|
83
|
+
contextPolicyEnforcement: host.settingsManager.getContextPromptEnforcementSettings(),
|
|
84
|
+
contextPolicyEnforcementScope: projectSettings.contextPolicy?.enforcement ? "project" : "global",
|
|
85
|
+
contextMemoryRetrieval: host.settingsManager.getMemoryRetrievalSettings(),
|
|
86
|
+
contextMemoryRetrievalScope: projectSettings.contextPolicy?.memory ? "project" : "global",
|
|
87
|
+
currentModelPattern: host.session.model
|
|
88
|
+
? `${host.session.model.provider}/${host.session.model.id}`
|
|
89
|
+
: undefined,
|
|
90
|
+
activeProfileName: host.settingsManager.getActiveResourceProfileNames()[0],
|
|
91
|
+
profileOptions,
|
|
92
|
+
externalResourceRoots: host.settingsManager.getExternalResourceRoots(),
|
|
93
|
+
trustedResourceRoots: host.settingsManager.getTrustedResourceRoots(),
|
|
94
|
+
}, {
|
|
95
|
+
onAutoCompactChange: (enabled) => {
|
|
96
|
+
host.session.setAutoCompactionEnabled(enabled);
|
|
97
|
+
host.footer.setAutoCompactEnabled(enabled);
|
|
98
|
+
},
|
|
99
|
+
onShowImagesChange: (enabled) => {
|
|
100
|
+
host.settingsManager.setShowImages(enabled);
|
|
101
|
+
for (const child of host.chatContainer.children) {
|
|
102
|
+
if (child instanceof ToolExecutionComponent || child instanceof ToolGroupComponent) {
|
|
103
|
+
child.setShowImages(enabled);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
host.ui.requestRender();
|
|
107
|
+
},
|
|
108
|
+
onImageWidthCellsChange: (width) => {
|
|
109
|
+
host.settingsManager.setImageWidthCells(width);
|
|
110
|
+
for (const child of host.chatContainer.children) {
|
|
111
|
+
if (child instanceof ToolExecutionComponent || child instanceof ToolGroupComponent) {
|
|
112
|
+
child.setImageWidthCells(width);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
host.ui.requestRender();
|
|
116
|
+
},
|
|
117
|
+
onAutoResizeImagesChange: (enabled) => {
|
|
118
|
+
host.settingsManager.setImageAutoResize(enabled);
|
|
119
|
+
},
|
|
120
|
+
onBlockImagesChange: (blocked) => {
|
|
121
|
+
host.settingsManager.setBlockImages(blocked);
|
|
122
|
+
},
|
|
123
|
+
onEnableSkillCommandsChange: (enabled) => {
|
|
124
|
+
host.settingsManager.setEnableSkillCommands(enabled);
|
|
125
|
+
host.setupAutocompleteProvider();
|
|
126
|
+
},
|
|
127
|
+
onSteeringModeChange: (mode) => {
|
|
128
|
+
host.session.setSteeringMode(mode);
|
|
129
|
+
},
|
|
130
|
+
onFollowUpModeChange: (mode) => {
|
|
131
|
+
host.session.setFollowUpMode(mode);
|
|
132
|
+
},
|
|
133
|
+
onTransportChange: (transport) => {
|
|
134
|
+
host.settingsManager.setTransport(transport);
|
|
135
|
+
host.session.agent.transport = transport;
|
|
136
|
+
},
|
|
137
|
+
onHttpIdleTimeoutMsChange: (timeoutMs) => {
|
|
138
|
+
host.settingsManager.setHttpIdleTimeoutMs(timeoutMs);
|
|
139
|
+
configureHttpDispatcher(timeoutMs);
|
|
140
|
+
host.showStatus(`HTTP idle timeout: ${formatHttpIdleTimeoutMs(timeoutMs)}`);
|
|
141
|
+
},
|
|
142
|
+
onThinkingLevelChange: (level) => {
|
|
143
|
+
host.session.setThinkingLevel(level);
|
|
144
|
+
host.footer.invalidate();
|
|
145
|
+
host.updateEditorBorderColor();
|
|
146
|
+
},
|
|
147
|
+
onThemeChange: (themeName) => {
|
|
148
|
+
const result = setTheme(themeName, true);
|
|
149
|
+
host.settingsManager.setTheme(themeName);
|
|
150
|
+
host.ui.invalidate();
|
|
151
|
+
if (!result.success) {
|
|
152
|
+
host.showError(`Failed to load theme "${themeName}": ${result.error}\nFell back to dark theme.`);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
onThemePreview: (themeName) => {
|
|
156
|
+
const result = setTheme(themeName, true);
|
|
157
|
+
if (result.success) {
|
|
158
|
+
host.ui.invalidate();
|
|
159
|
+
host.ui.requestRender();
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
onHideThinkingBlockChange: (hidden) => {
|
|
163
|
+
host.hideThinkingBlock = hidden;
|
|
164
|
+
host.settingsManager.setHideThinkingBlock(hidden);
|
|
165
|
+
for (const child of host.chatContainer.children) {
|
|
166
|
+
if (child instanceof AssistantMessageComponent) {
|
|
167
|
+
child.setHideThinkingBlock(hidden);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
void host.rebuildChatFromMessages();
|
|
171
|
+
},
|
|
172
|
+
onCollapseChangelogChange: (collapsed) => {
|
|
173
|
+
host.settingsManager.setCollapseChangelog(collapsed);
|
|
174
|
+
},
|
|
175
|
+
onEnableInstallTelemetryChange: (enabled) => {
|
|
176
|
+
host.settingsManager.setEnableInstallTelemetry(enabled);
|
|
177
|
+
},
|
|
178
|
+
onQuietStartupChange: (enabled) => {
|
|
179
|
+
host.settingsManager.setQuietStartup(enabled);
|
|
180
|
+
},
|
|
181
|
+
onDoubleEscapeActionChange: (action) => {
|
|
182
|
+
host.settingsManager.setDoubleEscapeAction(action);
|
|
183
|
+
},
|
|
184
|
+
onTreeFilterModeChange: (mode) => {
|
|
185
|
+
host.settingsManager.setTreeFilterMode(mode);
|
|
186
|
+
},
|
|
187
|
+
onShowHardwareCursorChange: (enabled) => {
|
|
188
|
+
host.settingsManager.setShowHardwareCursor(enabled);
|
|
189
|
+
host.ui.setShowHardwareCursor(enabled);
|
|
190
|
+
},
|
|
191
|
+
onEditorPaddingXChange: (padding) => {
|
|
192
|
+
host.settingsManager.setEditorPaddingX(padding);
|
|
193
|
+
host.defaultEditor.setPaddingX(padding);
|
|
194
|
+
if (host.editor !== host.defaultEditor && host.editor.setPaddingX !== undefined) {
|
|
195
|
+
host.editor.setPaddingX(padding);
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
onAutocompleteMaxVisibleChange: (maxVisible) => {
|
|
199
|
+
host.settingsManager.setAutocompleteMaxVisible(maxVisible);
|
|
200
|
+
host.defaultEditor.setAutocompleteMaxVisible(maxVisible);
|
|
201
|
+
if (host.editor !== host.defaultEditor && host.editor.setAutocompleteMaxVisible !== undefined) {
|
|
202
|
+
host.editor.setAutocompleteMaxVisible(maxVisible);
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
onClearOnShrinkChange: (enabled) => {
|
|
206
|
+
host.settingsManager.setClearOnShrink(enabled);
|
|
207
|
+
host.ui.setClearOnShrink(enabled);
|
|
208
|
+
},
|
|
209
|
+
onShowTerminalProgressChange: (enabled) => {
|
|
210
|
+
host.settingsManager.setShowTerminalProgress(enabled);
|
|
211
|
+
},
|
|
212
|
+
onWarningsChange: (warnings) => {
|
|
213
|
+
host.settingsManager.setWarnings(warnings);
|
|
214
|
+
},
|
|
215
|
+
onSelfModificationChange: (settings, scope) => {
|
|
216
|
+
host.settingsManager.setSelfModificationSettings(settings, scope);
|
|
217
|
+
const validationMessage = host.validateSelfModificationSource(settings);
|
|
218
|
+
if (validationMessage) {
|
|
219
|
+
host.showWarning(validationMessage);
|
|
220
|
+
}
|
|
221
|
+
host.showStatus(`Self modification settings saved to ${scope}. Start a new session or /reload for system-prompt guardrails to fully refresh.`);
|
|
222
|
+
},
|
|
223
|
+
onAutonomyChange: (settings, scope) => {
|
|
224
|
+
host.applyAutonomyMode(settings.mode ?? "off", scope);
|
|
225
|
+
host.showStatus(`Autonomy mode ${settings.mode ?? "off"} saved to ${scope}. Use /autonomy status.`);
|
|
226
|
+
},
|
|
227
|
+
onResearchLaneChange: (settings, scope) => {
|
|
228
|
+
host.settingsManager.setResearchLaneSettings(settings, scope);
|
|
229
|
+
host.showStatus(`Research lane settings saved to ${scope}. Use /autonomy research or /autonomy diagnostics.`);
|
|
230
|
+
},
|
|
231
|
+
onWorkerDelegationChange: (settings, scope) => {
|
|
232
|
+
host.settingsManager.setWorkerDelegationSettings(settings, scope);
|
|
233
|
+
host.showStatus(`Worker delegation settings saved to ${scope}. The delegate tool uses them.`);
|
|
234
|
+
},
|
|
235
|
+
onLearningPolicyChange: (settings, scope) => {
|
|
236
|
+
host.settingsManager.setLearningPolicySettings(settings, scope);
|
|
237
|
+
host.showStatus(`Learning policy saved to ${scope}.`);
|
|
238
|
+
},
|
|
239
|
+
onModelCapabilityChange: (settings, scope) => {
|
|
240
|
+
host.settingsManager.setModelCapabilitySettings(settings, scope);
|
|
241
|
+
host.showStatus(`Model capability mode saved to ${scope}. Applies on the next model switch or /reload.`);
|
|
242
|
+
},
|
|
243
|
+
onContextCurationChange: (settings, scope) => {
|
|
244
|
+
host.settingsManager.setContextCurationSettings(settings, scope);
|
|
245
|
+
host.showStatus(`Context curation settings saved to ${scope}. Run /fitness <model> first if the model is unprobed.`);
|
|
246
|
+
},
|
|
247
|
+
onModelRouterChange: (settings, scope) => {
|
|
248
|
+
host.settingsManager.setModelRouterSettings(settings, scope);
|
|
249
|
+
for (const value of [settings.cheapModel, settings.expensiveModel, settings.learningModel]) {
|
|
250
|
+
const validationMessage = host.validateAutoLearnModelValue(value);
|
|
251
|
+
if (validationMessage) {
|
|
252
|
+
host.showWarning(validationMessage.replace("Auto Learn model", "Model router model"));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
host.updateAutoLearnFooter();
|
|
256
|
+
host.showStatus(`Model Router settings saved to ${scope}. Use /session or /usage to inspect routing.`);
|
|
257
|
+
},
|
|
258
|
+
onAutoLearnChange: (settings, scope) => {
|
|
259
|
+
host.settingsManager.setAutoLearnSettings(settings, scope);
|
|
260
|
+
const validationMessage = host.validateAutoLearnModelValue(settings.model);
|
|
261
|
+
if (validationMessage) {
|
|
262
|
+
host.showWarning(validationMessage);
|
|
263
|
+
}
|
|
264
|
+
host.updateAutoLearnFooter();
|
|
265
|
+
host.showStatus(`Auto Learn settings saved to ${scope}. Use /auto-learn status or /auto-learn run.`);
|
|
266
|
+
},
|
|
267
|
+
onContextPolicyEnforcementChange: (settings, scope) => {
|
|
268
|
+
host.settingsManager.setContextPromptEnforcementSettings(settings, scope);
|
|
269
|
+
host.showStatus(`Context/prompt-policy settings saved to ${scope}.`);
|
|
270
|
+
},
|
|
271
|
+
onContextMemoryRetrievalChange: (settings, scope) => {
|
|
272
|
+
host.settingsManager.setMemoryRetrievalSettings(settings, scope);
|
|
273
|
+
host.showStatus(`Context/memory-retrieval settings saved to ${scope}.`);
|
|
274
|
+
},
|
|
275
|
+
onResourcesHubAction: (action) => {
|
|
276
|
+
done();
|
|
277
|
+
void host.handleResourcesHubAction(action);
|
|
278
|
+
},
|
|
279
|
+
onCancel: () => {
|
|
280
|
+
done();
|
|
281
|
+
host.ui.requestRender();
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
return { component: selector, focus: selector.getSettingsList() };
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=settings-selector-flow.js.map
|