@selesai/code 0.13.15 → 0.13.18
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 +37 -0
- package/README.md +2 -14
- package/dist/bun/cli.d.ts +3 -1
- package/dist/bun/cli.js +3 -9
- package/dist/bun/{register-bedrock.js → runtime-setup.js} +5 -0
- package/dist/bun/sandbox-env-setup.d.ts +1 -0
- package/dist/bun/sandbox-env-setup.js +3 -0
- package/dist/cli/auth-command.d.ts +23 -0
- package/dist/cli/auth-command.js +102 -0
- package/dist/cli/config-selector.js +2 -1
- package/dist/cli/setup.d.ts +1 -0
- package/dist/cli/setup.js +11 -0
- package/dist/cli.js +2 -14
- package/dist/config.d.ts +3 -2
- package/dist/config.js +9 -4
- package/dist/core/agent-session-runtime.js +15 -7
- package/dist/core/agent-session.d.ts +2 -6
- package/dist/core/agent-session.js +15 -4
- package/dist/core/compaction/branch-summarization.d.ts +1 -1
- package/dist/core/compaction/branch-summarization.js +2 -1
- package/dist/core/extensions/loader.js +3 -0
- package/dist/core/extensions/types.d.ts +16 -2
- package/dist/core/http-dispatcher.js +2 -0
- package/dist/core/keybindings.d.ts +5 -0
- package/dist/core/keybindings.js +4 -0
- package/dist/core/messages.d.ts +1 -1
- package/dist/core/model-config.d.ts +15 -0
- package/dist/core/model-config.js +3 -0
- package/dist/core/model-runtime.d.ts +1 -0
- package/dist/core/model-runtime.js +5 -2
- package/dist/core/provider-composer.js +8 -2
- package/dist/core/session-export.d.ts +3 -0
- package/dist/core/session-export.js +31 -0
- package/dist/core/session-manager.d.ts +3 -2
- package/dist/core/session-manager.js +40 -13
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.js +4 -2
- package/dist/core/system-prompt.js +10 -10
- package/dist/core/tools/bash.js +3 -117
- package/dist/core/tools/edit.d.ts +1 -12
- package/dist/core/tools/edit.js +5 -163
- package/dist/core/tools/find.js +4 -55
- package/dist/core/tools/grep.js +4 -60
- package/dist/core/tools/ls.js +4 -49
- package/dist/core/tools/read.d.ts +4 -0
- package/dist/core/tools/read.js +10 -122
- package/dist/core/tools/renderers/bash.d.ts +11 -0
- package/dist/core/tools/renderers/bash.js +129 -0
- package/dist/core/tools/renderers/edit.d.ts +22 -0
- package/dist/core/tools/renderers/edit.js +166 -0
- package/dist/core/tools/renderers/find.d.ts +9 -0
- package/dist/core/tools/renderers/find.js +63 -0
- package/dist/core/tools/renderers/grep.d.ts +9 -0
- package/dist/core/tools/renderers/grep.js +68 -0
- package/dist/core/tools/renderers/index.d.ts +27 -0
- package/dist/core/tools/renderers/index.js +46 -0
- package/dist/core/tools/renderers/ls.d.ts +9 -0
- package/dist/core/tools/renderers/ls.js +57 -0
- package/dist/core/tools/renderers/read.d.ts +10 -0
- package/dist/core/tools/renderers/read.js +128 -0
- package/dist/core/tools/renderers/write.d.ts +9 -0
- package/dist/core/tools/renderers/write.js +152 -0
- package/dist/core/tools/write.js +5 -146
- package/dist/extensions/capability-gateway/index.ts +12 -1
- package/dist/extensions/capability-gateway/integration.test.ts +23 -0
- package/dist/extensions/pi-hermes-memory/CHANGELOG.md +18 -0
- package/dist/extensions/pi-hermes-memory/README.md +16 -12
- package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +1 -1
- package/dist/extensions/pi-hermes-memory/package-lock.json +587 -62
- package/dist/extensions/pi-hermes-memory/package.json +4 -4
- package/dist/extensions/pi-hermes-memory/src/config.ts +32 -0
- package/dist/extensions/pi-hermes-memory/src/constants.ts +12 -2
- package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +109 -51
- package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +9 -3
- package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +257 -98
- package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +9 -2
- package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +5 -0
- package/dist/extensions/pi-hermes-memory/src/index.ts +22 -2
- package/dist/extensions/pi-hermes-memory/src/paths.ts +1 -1
- package/dist/extensions/pi-hermes-memory/src/store/db.ts +6 -0
- package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +58 -1
- package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +60 -8
- package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +169 -7
- package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +7 -21
- package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +134 -15
- package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +4 -2
- package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +24 -9
- package/dist/extensions/pi-hermes-memory/src/types.ts +11 -0
- package/dist/extensions/pi-hermes-memory/tests/config.test.ts +42 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +159 -3
- package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +452 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +39 -0
- package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +91 -0
- package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +29 -0
- package/dist/extensions/pi-hermes-memory/tests/store/fts-query.test.ts +116 -0
- package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +163 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +233 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +12 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +175 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +2 -2
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +22 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +37 -1
- package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
- package/dist/extensions/pi-intercom/README.md +16 -2
- package/dist/extensions/pi-intercom/broker/spawn.test.ts +19 -2
- package/dist/extensions/pi-intercom/broker/spawn.ts +4 -4
- package/dist/extensions/pi-intercom/index.ts +1 -1
- package/dist/extensions/pi-intercom/intercom.integration.test.ts +121 -2
- package/dist/extensions/pi-intercom/package.json +1 -1
- package/dist/extensions/pi-intercom/project-agent.test.ts +1 -1
- package/dist/extensions/pi-intercom/project-agent.ts +1 -6
- package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +7 -6
- package/dist/extensions/pi-rewind-hook/index.test.ts +7 -0
- package/dist/extensions/pi-subagents/.github/workflows/test.yml +36 -4
- package/dist/extensions/pi-subagents/CHANGELOG.md +120 -0
- package/dist/extensions/pi-subagents/README.md +3 -3
- package/dist/extensions/pi-subagents/agents/researcher.md +23 -13
- package/dist/extensions/pi-subagents/agents/reviewer.md +1 -1
- package/dist/extensions/pi-subagents/agents/scout.md +1 -1
- package/dist/extensions/pi-subagents/docs/agents.md +32 -16
- package/dist/extensions/pi-subagents/docs/configuration.md +41 -15
- package/dist/extensions/pi-subagents/docs/extension-api.md +109 -6
- package/dist/extensions/pi-subagents/docs/missions.md +2 -0
- package/dist/extensions/pi-subagents/docs/models.md +58 -1
- package/dist/extensions/pi-subagents/docs/observability.md +50 -12
- package/dist/extensions/pi-subagents/docs/tool-reference.md +17 -10
- package/dist/extensions/pi-subagents/docs/watchdog.md +1 -1
- package/dist/extensions/pi-subagents/docs/workflows.md +26 -9
- package/dist/extensions/pi-subagents/package-lock.json +747 -177
- package/dist/extensions/pi-subagents/package.json +6 -4
- package/dist/extensions/pi-subagents/runner-server-preload.mjs +13 -0
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +2 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +1 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +21 -4
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +2 -0
- package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +63 -0
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +61 -16
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +2 -0
- package/dist/extensions/pi-subagents/src/agents/agents.ts +8 -0
- package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +0 -1
- package/dist/extensions/pi-subagents/src/api/{pi-args.ts → child-tool-plan.ts} +1 -1
- package/dist/extensions/pi-subagents/src/api/preflight.ts +7 -4
- package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -2
- package/dist/extensions/pi-subagents/src/api/workflow-resources.ts +6 -0
- package/dist/extensions/pi-subagents/src/extension/config.ts +4 -2
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +2 -10
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +9 -11
- package/dist/extensions/pi-subagents/src/extension/index.ts +99 -10
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +13 -0
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +7 -23
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +11 -8
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +25 -7
- package/dist/extensions/pi-subagents/src/integrations/pi-web-session-liveness.ts +73 -0
- package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +228 -136
- package/dist/extensions/pi-subagents/src/intercom/supervisor-ui.ts +244 -0
- package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +37 -16
- package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +18 -18
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +51 -25
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +46 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +14 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +9 -0
- package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +10 -12
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -15
- package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +40 -29
- package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +8 -0
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +79 -247
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +88 -12
- package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +6 -6
- package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +24 -24
- package/dist/extensions/pi-subagents/src/runs/background/retained-nested-route-tracker.ts +96 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +642 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +75 -6
- package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +163 -0
- package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +86 -0
- package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +31 -0
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +18 -4
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +597 -1092
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +3 -0
- package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +4 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +20 -17
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +296 -394
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +4 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +9 -5
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +630 -283
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +8 -5
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +78 -98
- package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +16 -3
- package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +47 -47
- package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +1 -2
- package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +174 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +14 -3
- package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +319 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +25 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +126 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +373 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +530 -0
- package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +2 -2
- package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +2 -1
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +16 -0
- package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +11 -11
- package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +30 -20
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +5 -4
- package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +84 -15
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +88 -12
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +37 -53
- package/dist/extensions/pi-subagents/src/runs/shared/nested-path.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +18 -7
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +57 -12
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +3 -4
- package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +0 -11
- package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +4 -1
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-drain-observation.ts +42 -0
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +69 -0
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +307 -0
- package/dist/extensions/pi-subagents/src/runs/shared/run-fanout-budget.ts +8 -21
- package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +3 -30
- package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +17 -4
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +2 -0
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +99 -386
- package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +18 -62
- package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +0 -14
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +31 -9
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +190 -0
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +506 -226
- package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +1 -1
- package/dist/extensions/pi-subagents/src/shared/jsonl-writer.ts +11 -0
- package/dist/extensions/pi-subagents/src/shared/model-response-aliases.ts +13 -0
- package/dist/extensions/pi-subagents/src/shared/thinking-ceiling.ts +0 -6
- package/dist/extensions/pi-subagents/src/shared/types.ts +145 -89
- package/dist/extensions/pi-subagents/src/shared/utils.ts +13 -6
- package/dist/extensions/pi-subagents/src/shared/watch-strategy.ts +2 -0
- package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +18 -13
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +0 -6
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +1 -1
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +11 -6
- package/dist/extensions/pi-subagents/src/tui/render.ts +277 -46
- package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +0 -1
- package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +12 -12
- package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +116 -15
- package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +15 -18
- package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +57 -8
- package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +19 -19
- package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +3 -3
- package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +97 -22
- package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +3 -0
- package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +336 -21
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +1181 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +2240 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +2268 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +1512 -0
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +231 -16
- package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +4 -18
- package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +95 -0
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +9 -15
- package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +374 -0
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +20 -10
- package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +18 -6
- package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +151 -0
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +42 -1
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +150 -25
- package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +354 -0
- package/dist/extensions/pi-subagents/test/integration/shared-cwd-terminal-evidence.test.ts +117 -0
- package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +3678 -0
- package/dist/extensions/pi-subagents/test/integration/{single-execution.test.ts → single-execution.part-2.test.ts} +500 -4207
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1 -2
- package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +127 -0
- package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +365 -0
- package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +31 -0
- package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +74 -0
- package/dist/extensions/pi-subagents/test/smoke/pi085-extension.ts +16 -0
- package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +699 -0
- package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +418 -0
- package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +13 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +30 -76
- package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +84 -0
- package/dist/extensions/pi-subagents/test/support/result-publication-capacity-preload.mjs +70 -0
- package/dist/extensions/pi-subagents/test/support/runner-child-session-factory.ts +17 -0
- package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +390 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +120 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +24 -3
- package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +87 -0
- package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +163 -0
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +70 -31
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +78 -3
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +2 -8
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +73 -66
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +51 -1
- package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +49 -1
- package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +103 -0
- package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +9 -8
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +10 -7
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +48 -6
- package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +90 -0
- package/dist/extensions/pi-subagents/test/unit/{pi-args-permission-system.test.ts → child-tool-plan-permission-system.test.ts} +48 -86
- package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +33 -0
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +18 -18
- package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +8 -7
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +225 -65
- package/dist/extensions/pi-subagents/test/unit/extension-bindings.test.ts +17 -22
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +11 -1
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +47 -3
- package/dist/extensions/pi-subagents/test/unit/foreign-workflow-steering.test.ts +74 -0
- package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +23 -29
- package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +96 -4
- package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +4 -4
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +116 -55
- package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +58 -1
- package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +104 -3
- package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +10 -1
- package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +31 -1
- package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +102 -51
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +196 -6
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +181 -38
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +62 -70
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +58 -53
- package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +42 -0
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +84 -0
- package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +13 -5
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +21 -5
- package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +5 -4
- package/dist/extensions/pi-subagents/test/unit/permissions.test.ts +2 -6
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +28 -2
- package/dist/extensions/pi-subagents/test/unit/pi-web-session-liveness.test.ts +209 -0
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +38 -1
- package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +43 -0
- package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +24 -2
- package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +174 -0
- package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +94 -0
- package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +1329 -0
- package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +29 -80
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +11 -8
- package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/retained-nested-route-tracker.test.ts +175 -0
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +38 -12
- package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +2 -5
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +89 -1
- package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +2 -16
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +27 -3
- package/dist/extensions/pi-subagents/test/unit/scheduled-supervisor-demand.test.ts +215 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +15 -11
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +237 -1
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -5
- package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +14 -1
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +130 -739
- package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +682 -0
- package/dist/extensions/pi-subagents/test/unit/supervisor-ui.test.ts +137 -0
- package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +1 -11
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +23 -3
- package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +8 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +19 -1
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +72 -4
- package/dist/extensions/pi-subagents/test/unit/workflow-checklist.test.ts +17 -3
- package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +34 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +12 -2
- package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +46 -6
- package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/workflow-resources.test.ts +133 -1
- package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +53 -2
- package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +222 -14
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +526 -85
- package/dist/extensions/pi-web-agent/src/backends/config.ts +1 -0
- package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +5 -3
- package/dist/extensions/pi-web-agent/src/search/tokenin.ts +7 -3
- package/dist/extensions/pi-web-agent/src/types.ts +1 -1
- package/dist/extensions/pi-zentui/README.md +17 -0
- package/dist/extensions/pi-zentui/assets/screenshots/footer-status-hyperlink.png +0 -0
- package/dist/extensions/pi-zentui/docs/configuration.md +71 -2
- package/dist/extensions/pi-zentui/extensions/zentui/config.ts +11 -0
- package/dist/extensions/pi-zentui/extensions/zentui/editor-transfer.ts +14 -0
- package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +29 -13
- package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +5 -4
- package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +11 -0
- package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +11 -10
- package/dist/extensions/pi-zentui/extensions/zentui/index.ts +77 -3
- package/dist/extensions/pi-zentui/extensions/zentui/presets.ts +77 -0
- package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +103 -2
- package/dist/extensions/pi-zentui/extensions/zentui/working-line-extension-segments.ts +115 -0
- package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +87 -5
- package/dist/extensions/pi-zentui/package-lock.json +277 -517
- package/dist/extensions/pi-zentui/package.json +7 -4
- package/dist/extensions/pi-zentui/test/config-presets.test.ts +238 -0
- package/dist/extensions/pi-zentui/test/editor-transfer.test.ts +24 -1
- package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +570 -2
- package/dist/extensions/pi-zentui/test/extension-status.test.ts +90 -0
- package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +243 -0
- package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
- package/dist/extensions/pi-zentui/test/presets.test.ts +121 -0
- package/dist/extensions/pi-zentui/test/settings-command.test.ts +205 -1
- package/dist/extensions/pi-zentui/test/working-line-extension-segments.test.ts +139 -0
- package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +237 -3
- package/dist/extensions/pi-zentui/test/working-line.test.ts +94 -2
- package/dist/index.d.ts +1 -1
- package/dist/main.js +4 -1
- package/dist/modes/interactive/chat-viewport.d.ts +19 -0
- package/dist/modes/interactive/chat-viewport.js +27 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +6 -2
- package/dist/modes/interactive/components/assistant-message.js +30 -13
- package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
- package/dist/modes/interactive/components/custom-editor.js +39 -1
- package/dist/modes/interactive/components/first-time-setup.js +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts +2 -0
- package/dist/modes/interactive/components/markdown-transform.js +18 -0
- package/dist/modes/interactive/components/model-selector.js +19 -17
- package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
- package/dist/modes/interactive/components/settings-selector.d.ts +7 -1
- package/dist/modes/interactive/components/settings-selector.js +128 -20
- package/dist/modes/interactive/components/settings-submenu.d.ts +71 -0
- package/dist/modes/interactive/components/settings-submenu.js +164 -0
- package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
- package/dist/modes/interactive/components/status-indicator.js +10 -3
- package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
- package/dist/modes/interactive/components/thinking-selector.js +75 -18
- package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
- package/dist/modes/interactive/components/tool-execution.js +35 -33
- package/dist/modes/interactive/components/trust-selector.js +2 -2
- package/dist/modes/interactive/interactive-mode.d.ts +13 -15
- package/dist/modes/interactive/interactive-mode.js +144 -80
- package/dist/modes/interactive/session-share.d.ts +15 -0
- package/dist/modes/interactive/session-share.js +183 -0
- package/dist/modes/interactive/theme/dark.json +2 -1
- package/dist/modes/interactive/theme/light.json +2 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-controller.js +5 -0
- package/dist/modes/interactive/theme/theme-json.d.ts +83 -0
- package/dist/modes/interactive/theme/theme-json.js +129 -0
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive/theme/theme.d.ts +14 -5
- package/dist/modes/interactive/theme/theme.js +18 -119
- package/dist/modes/interactive/tui-renderer.d.ts +20 -0
- package/dist/modes/interactive/tui-renderer.js +65 -0
- package/dist/utils/exif-orientation.js +2 -3
- package/dist/utils/management-http.d.ts +24 -0
- package/dist/utils/management-http.js +53 -0
- package/dist/utils/text.d.ts +7 -0
- package/dist/utils/text.js +8 -0
- package/dist/utils/tools-manager.d.ts +1 -0
- package/dist/utils/tools-manager.js +43 -21
- package/docs/docs.json +0 -4
- package/package.json +4 -4
- package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +0 -415
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +0 -1059
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +0 -116
- package/dist/extensions/pi-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +0 -224
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +0 -6986
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +0 -447
- package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +0 -185
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +0 -311
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +0 -84
- package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +0 -202
- package/dist/extensions/pi-subagents/test/unit/close-grace-timer.test.ts +0 -101
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +0 -2347
- package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +0 -104
- package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +0 -49
- package/dist/skills/imagegen-frontend-mobile/SKILL.md +0 -1465
- package/dist/skills/imagegen-frontend-web/SKILL.md +0 -987
- package/dist/skills/implanger/SKILL.md +0 -70
- package/dist/skills/output/SKILL.md +0 -49
- package/dist/skills/planger/SKILL.md +0 -167
- package/dist/skills/workflow/SKILL.md +0 -95
- package/docs/workflows.md +0 -18
- /package/dist/bun/{register-bedrock.d.ts → runtime-setup.d.ts} +0 -0
|
@@ -2,17 +2,21 @@ import { Container, fuzzyFilter, getKeybindings, Input, Key, matchesKey, Spacer,
|
|
|
2
2
|
import { getModelSearchText } from "../model-search.js";
|
|
3
3
|
import { theme } from "../theme/theme.js";
|
|
4
4
|
import { DynamicBorder } from "./dynamic-border.js";
|
|
5
|
-
import {
|
|
5
|
+
import { keyDisplayText } from "./keybinding-hints.js";
|
|
6
6
|
function isEnabled(enabledIds, id) {
|
|
7
7
|
return enabledIds === null || enabledIds.includes(id);
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
/** Collapse an explicit list back to null (= all enabled) when it covers every available model. */
|
|
10
|
+
function normalizeEnabled(result, allIds) {
|
|
11
|
+
return result.length === allIds.length && result.every((id) => allIds.includes(id)) ? null : result;
|
|
12
|
+
}
|
|
13
|
+
function toggle(enabledIds, allIds, id) {
|
|
10
14
|
if (enabledIds === null)
|
|
11
|
-
return
|
|
15
|
+
return allIds.filter((modelId) => modelId !== id);
|
|
12
16
|
const index = enabledIds.indexOf(id);
|
|
13
17
|
if (index >= 0)
|
|
14
18
|
return [...enabledIds.slice(0, index), ...enabledIds.slice(index + 1)];
|
|
15
|
-
return [...enabledIds, id];
|
|
19
|
+
return normalizeEnabled([...enabledIds, id], allIds);
|
|
16
20
|
}
|
|
17
21
|
function enableAll(enabledIds, allIds, targetIds) {
|
|
18
22
|
if (enabledIds === null)
|
|
@@ -23,7 +27,7 @@ function enableAll(enabledIds, allIds, targetIds) {
|
|
|
23
27
|
if (!result.includes(id))
|
|
24
28
|
result.push(id);
|
|
25
29
|
}
|
|
26
|
-
return result
|
|
30
|
+
return normalizeEnabled(result, allIds);
|
|
27
31
|
}
|
|
28
32
|
function clearAll(enabledIds, allIds, targetIds) {
|
|
29
33
|
if (enabledIds === null) {
|
|
@@ -91,7 +95,7 @@ export class ScopedModelsSelectorComponent extends Container {
|
|
|
91
95
|
this.addChild(new DynamicBorder());
|
|
92
96
|
this.addChild(new Spacer(1));
|
|
93
97
|
this.addChild(new Text(theme.fg("accent", theme.bold("Model Configuration")), 0, 0));
|
|
94
|
-
this.addChild(new Text(theme.fg("muted", `Session-only. ${
|
|
98
|
+
this.addChild(new Text(theme.fg("muted", `Session-only. ${keyDisplayText("app.models.save")} to save to settings.`), 0, 0));
|
|
95
99
|
this.addChild(new Spacer(1));
|
|
96
100
|
// Search input
|
|
97
101
|
this.searchInput = new Input();
|
|
@@ -122,12 +126,12 @@ export class ScopedModelsSelectorComponent extends Container {
|
|
|
122
126
|
? "all enabled"
|
|
123
127
|
: `${enabledCount}/${this.allIds.length} enabled${unavailableCount ? ` · ${unavailableCount} unavailable` : ""}`;
|
|
124
128
|
const parts = [
|
|
125
|
-
`${
|
|
126
|
-
`${
|
|
127
|
-
`${
|
|
128
|
-
`${
|
|
129
|
-
`${
|
|
130
|
-
`${
|
|
129
|
+
`${keyDisplayText("tui.select.confirm")} toggle`,
|
|
130
|
+
`${keyDisplayText("app.models.enableAll")} all`,
|
|
131
|
+
`${keyDisplayText("app.models.clearAll")} clear`,
|
|
132
|
+
`${keyDisplayText("app.models.toggleProvider")} provider`,
|
|
133
|
+
`${keyDisplayText("app.models.reorderUp")}/${keyDisplayText("app.models.reorderDown")} reorder`,
|
|
134
|
+
`${keyDisplayText("app.models.save")} save`,
|
|
131
135
|
countText,
|
|
132
136
|
];
|
|
133
137
|
return this.isDirty
|
|
@@ -157,22 +161,16 @@ export class ScopedModelsSelectorComponent extends Container {
|
|
|
157
161
|
}
|
|
158
162
|
const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible));
|
|
159
163
|
const endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);
|
|
160
|
-
const allEnabled = this.enabledIds === null;
|
|
161
164
|
for (let i = startIndex; i < endIndex; i++) {
|
|
162
165
|
const item = this.filteredItems[i];
|
|
163
166
|
const isSelected = i === this.selectedIndex;
|
|
164
167
|
const prefix = isSelected ? theme.fg("accent", "→ ") : " ";
|
|
165
168
|
const id = item.model?.id ?? item.fullId;
|
|
166
|
-
const
|
|
169
|
+
const styledId = item.model ? id : theme.strikethrough(id);
|
|
170
|
+
const modelText = isSelected ? theme.fg("accent", styledId) : styledId;
|
|
167
171
|
const providerBadge = theme.fg("muted", item.model ? ` [${item.model.provider}]` : " [unavailable]");
|
|
168
|
-
const status = item.model
|
|
169
|
-
|
|
170
|
-
? ""
|
|
171
|
-
: item.enabled
|
|
172
|
-
? theme.fg("success", " ✓")
|
|
173
|
-
: theme.fg("dim", " ✗")
|
|
174
|
-
: theme.fg("dim", " ✗");
|
|
175
|
-
this.listContainer.addChild(new Text(`${prefix}${modelText}${providerBadge}${status}`, 0, 0));
|
|
172
|
+
const status = item.model && item.enabled ? theme.fg("accent", "✓ ") : " ";
|
|
173
|
+
this.listContainer.addChild(new Text(`${prefix}${status}${modelText}${providerBadge}`, 0, 0));
|
|
176
174
|
}
|
|
177
175
|
// Add scroll indicator if needed
|
|
178
176
|
if (startIndex > 0 || endIndex < this.filteredItems.length) {
|
|
@@ -227,7 +225,7 @@ export class ScopedModelsSelectorComponent extends Container {
|
|
|
227
225
|
if (kb.matches(data, "tui.select.confirm")) {
|
|
228
226
|
const item = this.filteredItems[this.selectedIndex];
|
|
229
227
|
if (item) {
|
|
230
|
-
this.enabledIds = toggle(this.enabledIds, item.fullId);
|
|
228
|
+
this.enabledIds = toggle(this.enabledIds, this.allIds, item.fullId);
|
|
231
229
|
this.isDirty = true;
|
|
232
230
|
this.refresh();
|
|
233
231
|
this.notifyChange();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
-
import type
|
|
2
|
+
import { type Model, type Transport } from "@earendil-works/pi-ai";
|
|
3
3
|
import { Container, type ScrollViewScrollbar, SettingsList } from "@earendil-works/pi-tui";
|
|
4
4
|
import type { DefaultProjectTrust, FullscreenExitOutput, TuiMode, WarningSettings } from "../../../core/settings-manager.ts";
|
|
5
5
|
import { type TerminalTheme } from "../theme/theme.ts";
|
|
@@ -29,6 +29,10 @@ export interface SettingsConfig {
|
|
|
29
29
|
httpIdleTimeoutMs: number;
|
|
30
30
|
thinkingLevel: ThinkingLevel;
|
|
31
31
|
availableThinkingLevels: ThinkingLevel[];
|
|
32
|
+
defaultModel: string;
|
|
33
|
+
currentModel?: Model<any>;
|
|
34
|
+
availableDefaultModels: readonly Model<any>[];
|
|
35
|
+
modelThinkingLevels: Record<string, ThinkingLevel>;
|
|
32
36
|
currentTheme: string;
|
|
33
37
|
terminalTheme: TerminalTheme;
|
|
34
38
|
availableThemes: string[];
|
|
@@ -67,6 +71,8 @@ export interface SettingsCallbacks {
|
|
|
67
71
|
onFollowUpModeChange: (mode: "all" | "one-at-a-time") => void;
|
|
68
72
|
onTransportChange: (transport: Transport) => void;
|
|
69
73
|
onHttpIdleTimeoutMsChange: (timeoutMs: number) => void;
|
|
74
|
+
onModelThinkingLevelChange: (provider: string, modelId: string, level: ThinkingLevel) => void;
|
|
75
|
+
onModelThinkingLevelRemove: (provider: string, modelId: string) => void;
|
|
70
76
|
onThinkingLevelChange: (level: ThinkingLevel) => void;
|
|
71
77
|
onThemeChange: (theme: string) => void;
|
|
72
78
|
onThemePreview?: (theme: string) => void;
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { getSupportedThinkingLevels } from "@earendil-works/pi-ai";
|
|
1
2
|
import { Container, getCapabilities, SelectList, SettingsList, Spacer, Text, } from "@earendil-works/pi-tui";
|
|
2
3
|
import { formatHttpIdleTimeoutMs, HTTP_IDLE_TIMEOUT_CHOICES } from "../../../core/http-dispatcher.js";
|
|
3
4
|
import { getSelectListTheme, getSettingsListTheme, parseAutoThemeSetting, theme, } from "../theme/theme.js";
|
|
4
5
|
import { DynamicBorder } from "./dynamic-border.js";
|
|
5
6
|
import { keyDisplayText } from "./keybinding-hints.js";
|
|
7
|
+
import { SteppedSubmenu } from "./settings-submenu.js";
|
|
8
|
+
const MODEL_PICKER_LAYOUT = { minPrimaryColumnWidth: 12, maxPrimaryColumnWidth: 46 };
|
|
6
9
|
const SETTINGS_SUBMENU_SELECT_LIST_LAYOUT = {
|
|
7
10
|
minPrimaryColumnWidth: 12,
|
|
8
11
|
maxPrimaryColumnWidth: 32,
|
|
@@ -132,18 +135,21 @@ class SelectSubmenu extends Container {
|
|
|
132
135
|
this.selectList.handleInput(data);
|
|
133
136
|
}
|
|
134
137
|
}
|
|
135
|
-
function themeItems(availableThemes) {
|
|
136
|
-
return availableThemes.map((name) => ({
|
|
138
|
+
function themeItems(availableThemes, currentTheme) {
|
|
139
|
+
return availableThemes.map((name) => ({
|
|
140
|
+
value: name,
|
|
141
|
+
label: `${name === currentTheme ? "✓ " : " "}${name}`,
|
|
142
|
+
}));
|
|
137
143
|
}
|
|
138
144
|
const AUTOMATIC_THEME_VALUE = "/";
|
|
139
|
-
function singleModeThemeItems(availableThemes) {
|
|
145
|
+
function singleModeThemeItems(availableThemes, currentTheme) {
|
|
140
146
|
return [
|
|
141
147
|
{
|
|
142
148
|
value: AUTOMATIC_THEME_VALUE,
|
|
143
|
-
label: "Automatic",
|
|
149
|
+
label: " Automatic",
|
|
144
150
|
description: "Use separate themes for light and dark terminal appearance",
|
|
145
151
|
},
|
|
146
|
-
...themeItems(availableThemes),
|
|
152
|
+
...themeItems(availableThemes, currentTheme),
|
|
147
153
|
];
|
|
148
154
|
}
|
|
149
155
|
function preferredTheme(availableThemes, preferred, fallback) {
|
|
@@ -203,7 +209,7 @@ class ThemeSubmenu extends Container {
|
|
|
203
209
|
}
|
|
204
210
|
showSingleMenu() {
|
|
205
211
|
this.mode = "single";
|
|
206
|
-
const menu = new SelectSubmenu("Theme", "Select a theme, or choose Automatic to follow terminal appearance.", singleModeThemeItems(this.availableThemes), this.singleTheme, (value) => {
|
|
212
|
+
const menu = new SelectSubmenu("Theme", "Select a theme, or choose Automatic to follow terminal appearance.", singleModeThemeItems(this.availableThemes, this.singleTheme), this.singleTheme, (value) => {
|
|
207
213
|
if (value === AUTOMATIC_THEME_VALUE) {
|
|
208
214
|
this.mode = "automatic";
|
|
209
215
|
this.callbacks.onThemePreview?.(this.getThemeSetting());
|
|
@@ -280,7 +286,7 @@ class ThemeSubmenu extends Container {
|
|
|
280
286
|
this.setContent(content, settingsList);
|
|
281
287
|
}
|
|
282
288
|
createThemeSelect(title, description, currentValue, done, onSelect) {
|
|
283
|
-
return new SelectSubmenu(title, description, themeItems(this.availableThemes), currentValue, onSelect, () => {
|
|
289
|
+
return new SelectSubmenu(title, description, themeItems(this.availableThemes, currentValue), currentValue, onSelect, () => {
|
|
284
290
|
this.callbacks.onThemePreview?.(this.getThemeSetting());
|
|
285
291
|
done();
|
|
286
292
|
}, (value) => this.callbacks.onThemePreview?.(value));
|
|
@@ -302,6 +308,22 @@ class ThemeSubmenu extends Container {
|
|
|
302
308
|
this.onDone();
|
|
303
309
|
}
|
|
304
310
|
}
|
|
311
|
+
const CLEAR_OVERRIDE_VALUE = "__clear__";
|
|
312
|
+
function modelSettingKey(model) {
|
|
313
|
+
return `${model.provider}/${model.id}`;
|
|
314
|
+
}
|
|
315
|
+
function modelDisplayLabel(model) {
|
|
316
|
+
return `${model.id} [${model.provider}]`;
|
|
317
|
+
}
|
|
318
|
+
function modelThinkingOverridesSummary(overrides) {
|
|
319
|
+
const count = Object.keys(overrides).length;
|
|
320
|
+
if (count === 0)
|
|
321
|
+
return "none";
|
|
322
|
+
return `${count} configured`;
|
|
323
|
+
}
|
|
324
|
+
function modelItemLabel(model) {
|
|
325
|
+
return `${model.id} ${theme.fg("muted", `[${model.provider}]`)}`;
|
|
326
|
+
}
|
|
305
327
|
/**
|
|
306
328
|
* Main settings selector component.
|
|
307
329
|
*/
|
|
@@ -311,7 +333,12 @@ export class SettingsSelectorComponent extends Container {
|
|
|
311
333
|
super();
|
|
312
334
|
const supportsImages = getCapabilities().images;
|
|
313
335
|
const followUpKey = keyDisplayText("app.message.followUp");
|
|
336
|
+
const cycleThinkingKey = keyDisplayText("app.thinking.cycle");
|
|
314
337
|
let currentWarnings = { ...config.warnings };
|
|
338
|
+
const currentModelThinkingLevels = { ...config.modelThinkingLevels };
|
|
339
|
+
const defaultModelByValue = new Map(config.availableDefaultModels.map((model) => [modelSettingKey(model), model]));
|
|
340
|
+
const currentDefaultModelKey = defaultModelByValue.has(config.defaultModel) ? config.defaultModel : undefined;
|
|
341
|
+
const currentModelKey = config.currentModel ? modelSettingKey(config.currentModel) : undefined;
|
|
315
342
|
let skillsChanged = false;
|
|
316
343
|
const items = [
|
|
317
344
|
{
|
|
@@ -373,7 +400,7 @@ export class SettingsSelectorComponent extends Container {
|
|
|
373
400
|
{
|
|
374
401
|
id: "cache-miss-notices",
|
|
375
402
|
label: "Cache miss notices",
|
|
376
|
-
description: "Show transcript notices for
|
|
403
|
+
description: "Show transcript notices for cache costs and provider recovery diagnostics",
|
|
377
404
|
currentValue: config.showCacheMissNotices ? "true" : "false",
|
|
378
405
|
values: ["true", "false"],
|
|
379
406
|
},
|
|
@@ -440,18 +467,99 @@ export class SettingsSelectorComponent extends Container {
|
|
|
440
467
|
}, () => done()),
|
|
441
468
|
},
|
|
442
469
|
{
|
|
443
|
-
id: "thinking",
|
|
444
|
-
label: "
|
|
445
|
-
description:
|
|
446
|
-
currentValue:
|
|
447
|
-
submenu: (
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
470
|
+
id: "model-thinking",
|
|
471
|
+
label: "Default thinking level per model",
|
|
472
|
+
description: `Override the default thinking level for specific models. ${cycleThinkingKey} cycles in-session.`,
|
|
473
|
+
currentValue: modelThinkingOverridesSummary(currentModelThinkingLevels),
|
|
474
|
+
submenu: (_currentValue, done) => {
|
|
475
|
+
const steps = [
|
|
476
|
+
{
|
|
477
|
+
key: "model",
|
|
478
|
+
title: "Per-Model Thinking Level",
|
|
479
|
+
description: "Select a model to configure",
|
|
480
|
+
options: () => {
|
|
481
|
+
const sorted = [...config.availableDefaultModels].sort((a, b) => {
|
|
482
|
+
const aKey = modelSettingKey(a);
|
|
483
|
+
const bKey = modelSettingKey(b);
|
|
484
|
+
if (aKey === currentModelKey)
|
|
485
|
+
return -1;
|
|
486
|
+
if (bKey === currentModelKey)
|
|
487
|
+
return 1;
|
|
488
|
+
if (aKey === currentDefaultModelKey)
|
|
489
|
+
return -1;
|
|
490
|
+
if (bKey === currentDefaultModelKey)
|
|
491
|
+
return 1;
|
|
492
|
+
return a.provider.localeCompare(b.provider);
|
|
493
|
+
});
|
|
494
|
+
const items = sorted.map((model) => {
|
|
495
|
+
const key = modelSettingKey(model);
|
|
496
|
+
const override = currentModelThinkingLevels[key];
|
|
497
|
+
return {
|
|
498
|
+
value: key,
|
|
499
|
+
label: modelItemLabel(model),
|
|
500
|
+
description: override ?? undefined,
|
|
501
|
+
};
|
|
502
|
+
});
|
|
503
|
+
if (items.length === 0) {
|
|
504
|
+
items.push({
|
|
505
|
+
value: "__none__",
|
|
506
|
+
label: "No models available",
|
|
507
|
+
description: "Log in to a provider or configure an API key first",
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
return items;
|
|
511
|
+
},
|
|
512
|
+
preselect: () => currentModelKey ?? currentDefaultModelKey,
|
|
513
|
+
searchable: true,
|
|
514
|
+
layout: MODEL_PICKER_LAYOUT,
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
key: "level",
|
|
518
|
+
title: (ctx) => {
|
|
519
|
+
const m = defaultModelByValue.get(ctx.model);
|
|
520
|
+
return `Thinking Level for ${m ? modelDisplayLabel(m) : ctx.model}`;
|
|
521
|
+
},
|
|
522
|
+
description: "Select default thinking level for this model",
|
|
523
|
+
options: (ctx) => {
|
|
524
|
+
const model = defaultModelByValue.get(ctx.model);
|
|
525
|
+
if (!model)
|
|
526
|
+
return [];
|
|
527
|
+
const levels = (model.reasoning ? getSupportedThinkingLevels(model) : ["off"]);
|
|
528
|
+
const activeLevel = currentModelThinkingLevels[ctx.model];
|
|
529
|
+
const items = levels.map((level) => ({
|
|
530
|
+
value: level,
|
|
531
|
+
label: `${level === activeLevel ? "✓ " : " "}${level}`,
|
|
532
|
+
description: THINKING_DESCRIPTIONS[level],
|
|
533
|
+
}));
|
|
534
|
+
if (currentModelThinkingLevels[ctx.model] !== undefined) {
|
|
535
|
+
items.push({
|
|
536
|
+
value: CLEAR_OVERRIDE_VALUE,
|
|
537
|
+
label: " (clear override)",
|
|
538
|
+
description: `Revert to global default (${config.thinkingLevel})`,
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
return items;
|
|
542
|
+
},
|
|
543
|
+
preselect: (ctx) => currentModelThinkingLevels[ctx.model],
|
|
544
|
+
},
|
|
545
|
+
];
|
|
546
|
+
const summary = () => modelThinkingOverridesSummary(currentModelThinkingLevels);
|
|
547
|
+
return new SteppedSubmenu(steps, (selections) => {
|
|
548
|
+
const model = defaultModelByValue.get(selections.model);
|
|
549
|
+
if (!model)
|
|
550
|
+
return;
|
|
551
|
+
if (selections.level === CLEAR_OVERRIDE_VALUE) {
|
|
552
|
+
callbacks.onModelThinkingLevelRemove(model.provider, model.id);
|
|
553
|
+
delete currentModelThinkingLevels[selections.model];
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
callbacks.onModelThinkingLevelChange(model.provider, model.id, selections.level);
|
|
557
|
+
currentModelThinkingLevels[selections.model] = selections.level;
|
|
558
|
+
}
|
|
559
|
+
}, () => {
|
|
560
|
+
done(summary());
|
|
561
|
+
}, { loop: true });
|
|
562
|
+
},
|
|
455
563
|
},
|
|
456
564
|
{
|
|
457
565
|
id: "tui-mode",
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Container, type SelectItem, type SelectListLayoutOptions } from "@earendil-works/pi-tui";
|
|
2
|
+
export interface SelectSubmenuOptions {
|
|
3
|
+
/** Enable type-to-search fuzzy filtering. */
|
|
4
|
+
searchable?: boolean;
|
|
5
|
+
/** Override the select list layout (column widths). */
|
|
6
|
+
layout?: SelectListLayoutOptions;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Single-step submenu that shows a titled select list.
|
|
10
|
+
* With `searchable: true`, typing filters the list using fuzzy matching.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SelectSubmenu extends Container {
|
|
13
|
+
private selectList;
|
|
14
|
+
private listChildIndex;
|
|
15
|
+
private allOptions;
|
|
16
|
+
private listLayout;
|
|
17
|
+
private searchInput;
|
|
18
|
+
private onSelectCb;
|
|
19
|
+
private onCancelCb;
|
|
20
|
+
private onSelectionChangeCb?;
|
|
21
|
+
constructor(title: string, description: string, options: SelectItem[], currentValue: string, onSelect: (value: string) => void, onCancel: () => void, onSelectionChange?: (value: string) => void, submenuOptions?: SelectSubmenuOptions);
|
|
22
|
+
private buildSelectList;
|
|
23
|
+
private applyFilter;
|
|
24
|
+
handleInput(data: string): void;
|
|
25
|
+
}
|
|
26
|
+
/** One step in a {@link SteppedSubmenu}. */
|
|
27
|
+
export interface SteppedSubmenuStep {
|
|
28
|
+
/** Unique key \u2014 the selected value is stored in the result context under this key. */
|
|
29
|
+
key: string;
|
|
30
|
+
/** Title shown at the top of the step. Receives prior selections. */
|
|
31
|
+
title: string | ((context: Record<string, string>) => string);
|
|
32
|
+
/** Description shown below the title. Receives prior selections. */
|
|
33
|
+
description: string | ((context: Record<string, string>) => string);
|
|
34
|
+
/** Build the option list for this step. Called fresh each time the step is shown. */
|
|
35
|
+
options: (context: Record<string, string>) => SelectItem[];
|
|
36
|
+
/** Optionally pre-select a value when entering this step. */
|
|
37
|
+
preselect?: (context: Record<string, string>) => string | undefined;
|
|
38
|
+
/** Enable type-to-search fuzzy filtering for this step. */
|
|
39
|
+
searchable?: boolean;
|
|
40
|
+
/** Override the select list layout (column widths) for this step. */
|
|
41
|
+
layout?: SelectListLayoutOptions;
|
|
42
|
+
}
|
|
43
|
+
interface SteppedSubmenuOptions {
|
|
44
|
+
/** Start at this step index (0-based), skipping earlier steps. Requires initialContext for skipped keys. */
|
|
45
|
+
startAtStep?: number;
|
|
46
|
+
/** Pre-fill selections for skipped steps. */
|
|
47
|
+
initialContext?: Record<string, string>;
|
|
48
|
+
/** After completing the last step, loop back to step 0 instead of closing. */
|
|
49
|
+
loop?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generic N-step submenu built on top of {@link SelectSubmenu}.
|
|
53
|
+
*
|
|
54
|
+
* Each step's options can depend on prior selections via the shared context.
|
|
55
|
+
* Esc goes back one step; Esc at step 0 cancels.
|
|
56
|
+
* With `loop: true`, completing the final step invokes `onComplete` then returns to step 0.
|
|
57
|
+
*/
|
|
58
|
+
export declare class SteppedSubmenu extends Container {
|
|
59
|
+
private readonly steps;
|
|
60
|
+
private readonly onComplete;
|
|
61
|
+
private readonly onCancel;
|
|
62
|
+
private readonly opts;
|
|
63
|
+
private activeComponent;
|
|
64
|
+
private context;
|
|
65
|
+
constructor(steps: SteppedSubmenuStep[], onComplete: (context: Record<string, string>) => void, onCancel: () => void, opts?: SteppedSubmenuOptions);
|
|
66
|
+
private buildStep;
|
|
67
|
+
render(width: number): string[];
|
|
68
|
+
handleInput(data: string): void;
|
|
69
|
+
invalidate(): void;
|
|
70
|
+
}
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Container, fuzzyFilter, getKeybindings, Input, SelectList, Spacer, Text, } from "@earendil-works/pi-tui";
|
|
2
|
+
import { getSelectListTheme, theme } from "../theme/theme.js";
|
|
3
|
+
const SUBMENU_SELECT_LIST_LAYOUT = {
|
|
4
|
+
minPrimaryColumnWidth: 12,
|
|
5
|
+
maxPrimaryColumnWidth: 32,
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Single-step submenu that shows a titled select list.
|
|
9
|
+
* With `searchable: true`, typing filters the list using fuzzy matching.
|
|
10
|
+
*/
|
|
11
|
+
export class SelectSubmenu extends Container {
|
|
12
|
+
selectList;
|
|
13
|
+
listChildIndex;
|
|
14
|
+
allOptions;
|
|
15
|
+
listLayout;
|
|
16
|
+
searchInput;
|
|
17
|
+
onSelectCb;
|
|
18
|
+
onCancelCb;
|
|
19
|
+
onSelectionChangeCb;
|
|
20
|
+
constructor(title, description, options, currentValue, onSelect, onCancel, onSelectionChange, submenuOptions) {
|
|
21
|
+
super();
|
|
22
|
+
this.allOptions = options;
|
|
23
|
+
this.listLayout = submenuOptions?.layout ?? SUBMENU_SELECT_LIST_LAYOUT;
|
|
24
|
+
this.onSelectCb = onSelect;
|
|
25
|
+
this.onCancelCb = onCancel;
|
|
26
|
+
this.onSelectionChangeCb = onSelectionChange;
|
|
27
|
+
// Title
|
|
28
|
+
this.addChild(new Text(theme.bold(theme.fg("accent", title)), 0, 0));
|
|
29
|
+
// Description
|
|
30
|
+
if (description) {
|
|
31
|
+
this.addChild(new Spacer(1));
|
|
32
|
+
this.addChild(new Text(theme.fg("muted", description), 0, 0));
|
|
33
|
+
}
|
|
34
|
+
// Search input
|
|
35
|
+
if (submenuOptions?.searchable) {
|
|
36
|
+
this.addChild(new Spacer(1));
|
|
37
|
+
this.searchInput = new Input();
|
|
38
|
+
this.searchInput.onSubmit = () => {
|
|
39
|
+
this.selectList.handleInput("\r");
|
|
40
|
+
};
|
|
41
|
+
this.addChild(this.searchInput);
|
|
42
|
+
}
|
|
43
|
+
// Spacer
|
|
44
|
+
this.addChild(new Spacer(1));
|
|
45
|
+
// Select list
|
|
46
|
+
this.selectList = this.buildSelectList(options, currentValue);
|
|
47
|
+
this.listChildIndex = this.children.length;
|
|
48
|
+
this.addChild(this.selectList);
|
|
49
|
+
// Hint
|
|
50
|
+
this.addChild(new Spacer(1));
|
|
51
|
+
const hint = submenuOptions?.searchable
|
|
52
|
+
? " Type to filter \u00b7 Enter to select \u00b7 Esc to go back"
|
|
53
|
+
: " Enter to select \u00b7 Esc to go back";
|
|
54
|
+
this.addChild(new Text(theme.fg("dim", hint), 0, 0));
|
|
55
|
+
}
|
|
56
|
+
buildSelectList(options, preselect) {
|
|
57
|
+
const list = new SelectList(options, Math.min(options.length, 10), getSelectListTheme(), this.listLayout);
|
|
58
|
+
const idx = options.findIndex((o) => o.value === preselect);
|
|
59
|
+
if (idx !== -1)
|
|
60
|
+
list.setSelectedIndex(idx);
|
|
61
|
+
list.onSelect = (item) => this.onSelectCb(item.value);
|
|
62
|
+
list.onCancel = this.onCancelCb;
|
|
63
|
+
if (this.onSelectionChangeCb) {
|
|
64
|
+
const cb = this.onSelectionChangeCb;
|
|
65
|
+
list.onSelectionChange = (item) => cb(item.value);
|
|
66
|
+
}
|
|
67
|
+
return list;
|
|
68
|
+
}
|
|
69
|
+
applyFilter(query) {
|
|
70
|
+
const filtered = query
|
|
71
|
+
? fuzzyFilter(this.allOptions, query, (item) => `${item.label} ${item.description ?? ""}`)
|
|
72
|
+
: this.allOptions;
|
|
73
|
+
const newList = this.buildSelectList(filtered, "");
|
|
74
|
+
this.children[this.listChildIndex] = newList;
|
|
75
|
+
this.selectList = newList;
|
|
76
|
+
}
|
|
77
|
+
handleInput(data) {
|
|
78
|
+
if (this.searchInput) {
|
|
79
|
+
const kb = getKeybindings();
|
|
80
|
+
const isNav = kb.matches(data, "tui.select.up") ||
|
|
81
|
+
kb.matches(data, "tui.select.down") ||
|
|
82
|
+
kb.matches(data, "tui.select.confirm") ||
|
|
83
|
+
kb.matches(data, "tui.select.cancel");
|
|
84
|
+
if (isNav) {
|
|
85
|
+
this.selectList.handleInput(data);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.searchInput.handleInput(data);
|
|
89
|
+
this.applyFilter(this.searchInput.getValue());
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.selectList.handleInput(data);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Generic N-step submenu built on top of {@link SelectSubmenu}.
|
|
99
|
+
*
|
|
100
|
+
* Each step's options can depend on prior selections via the shared context.
|
|
101
|
+
* Esc goes back one step; Esc at step 0 cancels.
|
|
102
|
+
* With `loop: true`, completing the final step invokes `onComplete` then returns to step 0.
|
|
103
|
+
*/
|
|
104
|
+
export class SteppedSubmenu extends Container {
|
|
105
|
+
steps;
|
|
106
|
+
onComplete;
|
|
107
|
+
onCancel;
|
|
108
|
+
opts;
|
|
109
|
+
activeComponent;
|
|
110
|
+
context;
|
|
111
|
+
constructor(steps, onComplete, onCancel, opts = {}) {
|
|
112
|
+
super();
|
|
113
|
+
this.steps = steps;
|
|
114
|
+
this.onComplete = onComplete;
|
|
115
|
+
this.onCancel = onCancel;
|
|
116
|
+
this.opts = opts;
|
|
117
|
+
this.context = { ...(opts.initialContext ?? {}) };
|
|
118
|
+
this.activeComponent = this.buildStep(opts.startAtStep ?? 0);
|
|
119
|
+
}
|
|
120
|
+
buildStep(stepIndex) {
|
|
121
|
+
const step = this.steps[stepIndex];
|
|
122
|
+
const total = this.steps.length;
|
|
123
|
+
const stepLabel = total > 1 ? `Step ${stepIndex + 1}/${total} \u00b7 ` : "";
|
|
124
|
+
const title = typeof step.title === "function" ? step.title(this.context) : step.title;
|
|
125
|
+
const desc = typeof step.description === "function" ? step.description(this.context) : step.description;
|
|
126
|
+
const items = step.options(this.context);
|
|
127
|
+
const preselect = step.preselect?.(this.context) ?? "";
|
|
128
|
+
return new SelectSubmenu(title, `${stepLabel}${desc}`, items, preselect, (value) => {
|
|
129
|
+
this.context[step.key] = value;
|
|
130
|
+
if (stepIndex < total - 1) {
|
|
131
|
+
// Advance to next step
|
|
132
|
+
this.activeComponent = this.buildStep(stepIndex + 1);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// Final step \u2014 deliver result
|
|
136
|
+
this.onComplete({ ...this.context });
|
|
137
|
+
if (this.opts.loop) {
|
|
138
|
+
this.context = {};
|
|
139
|
+
this.activeComponent = this.buildStep(0);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
this.onCancel();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}, () => {
|
|
146
|
+
if (stepIndex > 0) {
|
|
147
|
+
delete this.context[step.key];
|
|
148
|
+
this.activeComponent = this.buildStep(stepIndex - 1);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
this.onCancel();
|
|
152
|
+
}
|
|
153
|
+
}, undefined, step.searchable || step.layout ? { searchable: step.searchable, layout: step.layout } : undefined);
|
|
154
|
+
}
|
|
155
|
+
render(width) {
|
|
156
|
+
return this.activeComponent.render(width);
|
|
157
|
+
}
|
|
158
|
+
handleInput(data) {
|
|
159
|
+
this.activeComponent.handleInput?.(data);
|
|
160
|
+
}
|
|
161
|
+
invalidate() {
|
|
162
|
+
this.activeComponent.invalidate?.();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -7,7 +7,9 @@ export declare class StatusIndicator extends Loader {
|
|
|
7
7
|
dispose(): void;
|
|
8
8
|
}
|
|
9
9
|
export declare class WorkingStatusIndicator extends StatusIndicator {
|
|
10
|
-
constructor(ui: TUI, message: string, indicator?: WorkingIndicatorOptions);
|
|
10
|
+
constructor(ui: TUI, message: string, indicator?: WorkingIndicatorOptions, colorFn?: (text: string) => string);
|
|
11
|
+
renderInBorder(width: number): string;
|
|
12
|
+
renderSpinnerInBorder(width: number): string;
|
|
11
13
|
}
|
|
12
14
|
export declare class ImageCaptioningStatusIndicator extends StatusIndicator {
|
|
13
15
|
constructor(ui: TUI);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Loader } from "@earendil-works/pi-tui";
|
|
1
|
+
import { Loader, truncateToWidth } from "@earendil-works/pi-tui";
|
|
2
2
|
import { theme } from "../theme/theme.js";
|
|
3
3
|
import { CountdownTimer } from "./countdown-timer.js";
|
|
4
4
|
import { keyText } from "./keybinding-hints.js";
|
|
@@ -13,8 +13,15 @@ export class StatusIndicator extends Loader {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
export class WorkingStatusIndicator extends StatusIndicator {
|
|
16
|
-
constructor(ui, message, indicator) {
|
|
17
|
-
super("working", ui, (
|
|
16
|
+
constructor(ui, message, indicator, colorFn) {
|
|
17
|
+
super("working", ui, colorFn ?? ((text) => theme.fg("accent", text)), colorFn ?? ((text) => theme.fg("muted", text)), message, indicator);
|
|
18
|
+
}
|
|
19
|
+
renderInBorder(width) {
|
|
20
|
+
const line = super.render(width + 2)[1] ?? "";
|
|
21
|
+
return truncateToWidth(line.startsWith(" ") ? line.slice(1).trimEnd() : line.trimEnd(), width, "");
|
|
22
|
+
}
|
|
23
|
+
renderSpinnerInBorder(width) {
|
|
24
|
+
return truncateToWidth(this.getRenderedIndicator(), width, "");
|
|
18
25
|
}
|
|
19
26
|
}
|
|
20
27
|
export class ImageCaptioningStatusIndicator extends StatusIndicator {
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
-
import { Container, SelectList } from "@earendil-works/pi-tui";
|
|
2
|
+
import { Container, type Focusable, SelectList } from "@earendil-works/pi-tui";
|
|
3
3
|
/**
|
|
4
4
|
* Component that renders a thinking level selector with borders
|
|
5
5
|
*/
|
|
6
|
-
export declare class ThinkingSelectorComponent extends Container {
|
|
6
|
+
export declare class ThinkingSelectorComponent extends Container implements Focusable {
|
|
7
|
+
private searchInput;
|
|
7
8
|
private selectList;
|
|
8
|
-
|
|
9
|
+
private selectListChildIndex;
|
|
10
|
+
private allItems;
|
|
11
|
+
private onSelect;
|
|
12
|
+
private onCancel;
|
|
13
|
+
private onSelectAsDefault?;
|
|
14
|
+
private _focused;
|
|
15
|
+
get focused(): boolean;
|
|
16
|
+
set focused(value: boolean);
|
|
17
|
+
constructor(currentLevel: ThinkingLevel, availableLevels: ThinkingLevel[], onSelect: (level: ThinkingLevel) => void, onCancel: () => void, onSelectAsDefault?: (level: ThinkingLevel) => void, defaultThinkingLevel?: ThinkingLevel);
|
|
18
|
+
private buildSelectList;
|
|
19
|
+
private applyFilter;
|
|
20
|
+
handleInput(keyData: string): void;
|
|
9
21
|
getSelectList(): SelectList;
|
|
10
22
|
}
|