@caupulican/pi-adaptative 0.94.1 → 0.96.0
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 +58 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +32 -13
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +7 -4
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +201 -293
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +272 -392
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts +52 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts.map +1 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js +118 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js.map +1 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.ts +169 -0
- package/dist/bundled-resources/extensions/tmux-agent-manager/templates/builder-validator.json +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/templates/provider-prompt-smoke.json +1 -1
- package/dist/bundled-resources/extensions/tps/index.d.ts +3 -0
- package/dist/bundled-resources/extensions/tps/index.d.ts.map +1 -0
- package/dist/bundled-resources/extensions/tps/index.js +44 -0
- package/dist/bundled-resources/extensions/tps/index.js.map +1 -0
- package/dist/bundled-resources/extensions/tps/index.ts +48 -0
- package/dist/bundled-resources/skills/pi-harness-learning/SKILL.md +13 -7
- package/dist/bundled-resources/skills/worker-profile-writer/SKILL.md +11 -11
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +12 -3
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +11 -41
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +93 -160
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autonomy/envelope-enforcement.d.ts +6 -1
- package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
- package/dist/core/autonomy/envelope-enforcement.js +26 -25
- package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
- package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
- package/dist/core/autonomy/lane-private-paths.js +2 -1
- package/dist/core/autonomy/lane-private-paths.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts +8 -8
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +45 -30
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/autonomy/worker-session-private-scope.d.ts +12 -0
- package/dist/core/autonomy/worker-session-private-scope.d.ts.map +1 -0
- package/dist/core/autonomy/worker-session-private-scope.js +42 -0
- package/dist/core/autonomy/worker-session-private-scope.js.map +1 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.d.ts +65 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.d.ts.map +1 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.js +145 -0
- package/dist/core/autonomy/worker-tool-adapter-registry.js.map +1 -0
- package/dist/core/background-lane-controller.d.ts +1 -1
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +1 -1
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +8 -2
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +10 -2
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/compaction-controller.d.ts +3 -0
- package/dist/core/compaction-controller.d.ts.map +1 -1
- package/dist/core/compaction-controller.js +12 -1
- package/dist/core/compaction-controller.js.map +1 -1
- package/dist/core/cost-guard-controller.d.ts +37 -0
- package/dist/core/cost-guard-controller.d.ts.map +1 -0
- package/dist/core/cost-guard-controller.js +71 -0
- package/dist/core/cost-guard-controller.js.map +1 -0
- package/dist/core/cost-guard.d.ts +9 -4
- package/dist/core/cost-guard.d.ts.map +1 -1
- package/dist/core/cost-guard.js +7 -3
- package/dist/core/cost-guard.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +0 -1
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.d.ts +16 -3
- package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.js +114 -55
- package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
- package/dist/core/delegation/worker-claim.d.ts +1 -2
- package/dist/core/delegation/worker-claim.d.ts.map +1 -1
- package/dist/core/delegation/worker-claim.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +19 -6
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +125 -40
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-delegation-request.d.ts +3 -3
- package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-request.js +13 -19
- package/dist/core/delegation/worker-delegation-request.js.map +1 -1
- package/dist/core/delegation/worker-execution-policy.d.ts +3 -2
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
- package/dist/core/delegation/worker-execution-policy.js +54 -39
- package/dist/core/delegation/worker-execution-policy.js.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.d.ts +3 -3
- package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.js +7 -7
- package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
- package/dist/core/delegation/worker-machine-scope.d.ts +12 -0
- package/dist/core/delegation/worker-machine-scope.d.ts.map +1 -0
- package/dist/core/delegation/worker-machine-scope.js +38 -0
- package/dist/core/delegation/worker-machine-scope.js.map +1 -0
- package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.js +6 -1
- package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-runner.d.ts +5 -7
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +1 -4
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +3 -2
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.js +50 -25
- package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.d.ts +6 -0
- package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
- package/dist/core/durable-custom-message-turn-controller.js +38 -15
- package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
- package/dist/core/extension-binding-controller.d.ts +5 -1
- package/dist/core/extension-binding-controller.d.ts.map +1 -1
- package/dist/core/extension-binding-controller.js +15 -0
- package/dist/core/extension-binding-controller.js.map +1 -1
- package/dist/core/extension-import-authority.d.ts +3 -1
- package/dist/core/extension-import-authority.d.ts.map +1 -1
- package/dist/core/extension-import-authority.js +15 -0
- package/dist/core/extension-import-authority.js.map +1 -1
- package/dist/core/extensions/factory-runtime.d.ts.map +1 -1
- package/dist/core/extensions/factory-runtime.js +5 -0
- package/dist/core/extensions/factory-runtime.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +8 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +14 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +188 -72
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +2 -0
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +8 -0
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts +5 -4
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js +23 -19
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/keybindings.d.ts +2 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/learning/auto-learn-settings.d.ts +84 -0
- package/dist/core/learning/auto-learn-settings.d.ts.map +1 -0
- package/dist/core/learning/auto-learn-settings.js +66 -0
- package/dist/core/learning/auto-learn-settings.js.map +1 -0
- package/dist/core/learning/reflection-engine.d.ts +4 -0
- package/dist/core/learning/reflection-engine.d.ts.map +1 -1
- package/dist/core/learning/reflection-engine.js +48 -10
- package/dist/core/learning/reflection-engine.js.map +1 -1
- package/dist/core/local-prefix-warm-controller.d.ts +24 -0
- package/dist/core/local-prefix-warm-controller.d.ts.map +1 -0
- package/dist/core/local-prefix-warm-controller.js +79 -0
- package/dist/core/local-prefix-warm-controller.js.map +1 -0
- package/dist/core/memory/providers/file-store.d.ts +2 -0
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +71 -15
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory/worker-memory-tools.d.ts +5 -0
- package/dist/core/memory/worker-memory-tools.d.ts.map +1 -0
- package/dist/core/memory/worker-memory-tools.js +5 -0
- package/dist/core/memory/worker-memory-tools.js.map +1 -0
- package/dist/core/model-capability.d.ts +7 -0
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js +12 -0
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -10
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-router-controller.d.ts +3 -2
- package/dist/core/model-router-controller.d.ts.map +1 -1
- package/dist/core/model-router-controller.js +3 -2
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/orchestration/contracts.d.ts +16 -12
- package/dist/core/orchestration/contracts.d.ts.map +1 -1
- package/dist/core/orchestration/contracts.js +2 -2
- package/dist/core/orchestration/contracts.js.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
- package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.js +6 -1
- package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
- package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
- package/dist/core/orchestration/profile-registry.js +14 -0
- package/dist/core/orchestration/profile-registry.js.map +1 -1
- package/dist/core/orchestration/task-profile-writer.d.ts +7 -4
- package/dist/core/orchestration/task-profile-writer.d.ts.map +1 -1
- package/dist/core/orchestration/task-profile-writer.js +71 -59
- package/dist/core/orchestration/task-profile-writer.js.map +1 -1
- package/dist/core/orchestration/thinking-level-schema.d.ts +7 -0
- package/dist/core/orchestration/thinking-level-schema.d.ts.map +1 -0
- package/dist/core/orchestration/thinking-level-schema.js +19 -0
- package/dist/core/orchestration/thinking-level-schema.js.map +1 -0
- package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.js +12 -5
- package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
- package/dist/core/profile-filter-controller.d.ts.map +1 -1
- package/dist/core/profile-filter-controller.js +5 -2
- package/dist/core/profile-filter-controller.js.map +1 -1
- package/dist/core/provider-prompt-contracts.d.ts +6 -5
- package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
- package/dist/core/provider-prompt-contracts.js +9 -11
- package/dist/core/provider-prompt-contracts.js.map +1 -1
- package/dist/core/provider-request-context-controller.d.ts +2 -0
- package/dist/core/provider-request-context-controller.d.ts.map +1 -1
- package/dist/core/provider-request-context-controller.js +10 -3
- package/dist/core/provider-request-context-controller.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +56 -27
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +206 -117
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +6 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/risk-classifier.d.ts.map +1 -1
- package/dist/core/risk-classifier.js +22 -2
- package/dist/core/risk-classifier.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +1 -0
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +25 -14
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.js +55 -10
- package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
- package/dist/core/session-role.d.ts +6 -8
- package/dist/core/session-role.d.ts.map +1 -1
- package/dist/core/session-role.js +8 -18
- package/dist/core/session-role.js.map +1 -1
- package/dist/core/settings-manager.d.ts +20 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +75 -50
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skill-vault.d.ts +15 -0
- package/dist/core/skill-vault.d.ts.map +1 -1
- package/dist/core/skill-vault.js +79 -45
- package/dist/core/skill-vault.js.map +1 -1
- package/dist/core/skills.d.ts +3 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +6 -6
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt-builder.d.ts +3 -0
- package/dist/core/system-prompt-builder.d.ts.map +1 -1
- package/dist/core/system-prompt-builder.js +73 -13
- package/dist/core/system-prompt-builder.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +6 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-capability-policy.d.ts +3 -0
- package/dist/core/tool-capability-policy.d.ts.map +1 -1
- package/dist/core/tool-capability-policy.js +13 -2
- package/dist/core/tool-capability-policy.js.map +1 -1
- package/dist/core/toolkit/script-runner.d.ts +2 -1
- package/dist/core/toolkit/script-runner.d.ts.map +1 -1
- package/dist/core/toolkit/script-runner.js +10 -2
- package/dist/core/toolkit/script-runner.js.map +1 -1
- package/dist/core/tools/delegate-status.d.ts +1 -1
- package/dist/core/tools/delegate-status.d.ts.map +1 -1
- package/dist/core/tools/delegate-status.js +1 -1
- package/dist/core/tools/delegate-status.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +4 -15
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +111 -73
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/goal.d.ts +3 -4
- package/dist/core/tools/goal.d.ts.map +1 -1
- package/dist/core/tools/goal.js +30 -23
- package/dist/core/tools/goal.js.map +1 -1
- package/dist/core/tools/orchestration-panel.d.ts +7 -0
- package/dist/core/tools/orchestration-panel.d.ts.map +1 -1
- package/dist/core/tools/orchestration-panel.js +58 -9
- package/dist/core/tools/orchestration-panel.js.map +1 -1
- package/dist/core/tools/profile-writer.d.ts +2 -8
- package/dist/core/tools/profile-writer.d.ts.map +1 -1
- package/dist/core/tools/profile-writer.js +6 -18
- package/dist/core/tools/profile-writer.js.map +1 -1
- package/dist/core/tools/run-toolkit-script.d.ts +1 -1
- package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
- package/dist/core/tools/run-toolkit-script.js +2 -2
- package/dist/core/tools/run-toolkit-script.js.map +1 -1
- package/dist/core/tools/skill-audit.d.ts +28 -1
- package/dist/core/tools/skill-audit.d.ts.map +1 -1
- package/dist/core/tools/skill-audit.js +56 -12
- package/dist/core/tools/skill-audit.js.map +1 -1
- package/dist/core/tools/skill.d.ts +12 -1
- package/dist/core/tools/skill.d.ts.map +1 -1
- package/dist/core/tools/skill.js +52 -0
- package/dist/core/tools/skill.js.map +1 -1
- package/dist/core/tools/skillify.d.ts.map +1 -1
- package/dist/core/tools/skillify.js +16 -7
- package/dist/core/tools/skillify.js.map +1 -1
- package/dist/core/tools/task-steps.d.ts.map +1 -1
- package/dist/core/tools/task-steps.js +2 -1
- package/dist/core/tools/task-steps.js.map +1 -1
- package/dist/core/tools/tmux-dispatch.d.ts +4 -16
- package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
- package/dist/core/tools/tmux-dispatch.js +5 -20
- package/dist/core/tools/tmux-dispatch.js.map +1 -1
- package/dist/core/worktree-sync/codes.d.ts +1 -2
- package/dist/core/worktree-sync/codes.d.ts.map +1 -1
- package/dist/core/worktree-sync/codes.js +1 -2
- package/dist/core/worktree-sync/codes.js.map +1 -1
- package/dist/core/worktree-sync/lane-gate.d.ts +4 -8
- package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
- package/dist/core/worktree-sync/lane-gate.js +5 -51
- package/dist/core/worktree-sync/lane-gate.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.d.ts +6 -7
- package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.js +30 -207
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
- package/dist/modes/interactive/autonomy-commands.js +2 -2
- package/dist/modes/interactive/autonomy-commands.js.map +1 -1
- package/dist/modes/interactive/components/agents-overlay.d.ts +16 -4
- package/dist/modes/interactive/components/agents-overlay.d.ts.map +1 -1
- package/dist/modes/interactive/components/agents-overlay.js +108 -29
- package/dist/modes/interactive/components/agents-overlay.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +17 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/fitness-role-selector.js +2 -2
- package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +150 -73
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +5 -4
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/report-commands.d.ts.map +1 -1
- package/dist/modes/interactive/report-commands.js +8 -4
- package/dist/modes/interactive/report-commands.js.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.js +10 -0
- package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
- package/docs/extensions.md +10 -0
- package/docs/harness-architecture.md +28 -32
- package/docs/index.md +2 -1
- package/docs/keybindings.md +2 -0
- package/docs/process-matrix.md +8 -6
- package/docs/resources.md +1 -1
- package/docs/settings.md +61 -51
- package/docs/task-steps.md +2 -0
- package/docs/tmux-agent-manager.md +48 -41
- package/docs/usage.md +1 -1
- package/docs/work-lifecycle.md +137 -0
- package/docs/worker-profiles.md +8 -6
- package/docs/worktree-sync.md +26 -20
- 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/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +0 -133
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +0 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +0 -199
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +0 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +0 -312
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { truncateToWidth } from "@caupulican/pi-tui";
|
|
2
|
-
import { renderOrchestrationPanelLines, } from "../../../core/tools/orchestration-panel.js";
|
|
2
|
+
import { goalEvidencePanelRow, goalRequirementPanelRow, renderOrchestrationPanelLines, taskStepPanelRow, } from "../../../core/tools/orchestration-panel.js";
|
|
3
3
|
import { theme } from "../theme/theme.js";
|
|
4
4
|
import { isBackgroundToolActivityItem } from "./activity-lane.js";
|
|
5
5
|
import { formatKeyText } from "./keybinding-hints.js";
|
|
@@ -32,14 +32,26 @@ function workerRow(record, nowMs) {
|
|
|
32
32
|
const meta = [
|
|
33
33
|
record.type === "tmux-worker" ? "tmux" : "agent",
|
|
34
34
|
record.profileId,
|
|
35
|
+
record.modelRef,
|
|
36
|
+
record.thinkingLevel,
|
|
35
37
|
workerElapsed(record, nowMs),
|
|
36
38
|
record.costUsd !== undefined ? `$${record.costUsd.toFixed(2)}` : undefined,
|
|
37
39
|
].filter((value) => value !== undefined && value !== "");
|
|
40
|
+
const details = [
|
|
41
|
+
`lane: ${record.laneId}`,
|
|
42
|
+
record.goalId ? `goal: ${record.goalId}` : undefined,
|
|
43
|
+
record.reasonCode ? `reason: ${record.reasonCode}` : undefined,
|
|
44
|
+
record.worktreeLaneKey ? `worktree: ${record.worktreeLaneKey}` : undefined,
|
|
45
|
+
record.evidenceEntryId ? `evidence: ${record.evidenceEntryId}` : undefined,
|
|
46
|
+
record.startedAt ? `started: ${record.startedAt}` : undefined,
|
|
47
|
+
record.completedAt ? `completed: ${record.completedAt}` : undefined,
|
|
48
|
+
].filter((value) => value !== undefined);
|
|
38
49
|
return {
|
|
39
50
|
status: record.status,
|
|
40
51
|
label: record.label ?? record.laneId,
|
|
41
52
|
section: "Workers",
|
|
42
53
|
meta,
|
|
54
|
+
details,
|
|
43
55
|
};
|
|
44
56
|
}
|
|
45
57
|
function backgroundToolRow(item) {
|
|
@@ -51,42 +63,88 @@ function backgroundToolRow(item) {
|
|
|
51
63
|
};
|
|
52
64
|
}
|
|
53
65
|
const ACTIVE_WORKER_STATUSES = new Set(["queued", "running"]);
|
|
54
|
-
|
|
66
|
+
const ACTIVE_BACKGROUND_TOOL_STATUSES = new Set(["active", "waiting"]);
|
|
67
|
+
function projectWorkActivity(snapshot, nowMs) {
|
|
55
68
|
const workers = snapshot.laneRecords.filter((record) => record.type === "worker" || record.type === "tmux-worker");
|
|
56
69
|
const activeWorkers = workers.filter((record) => ACTIVE_WORKER_STATUSES.has(record.status));
|
|
57
70
|
const finishedWorkers = workers
|
|
58
71
|
.filter((record) => !ACTIVE_WORKER_STATUSES.has(record.status))
|
|
59
72
|
.sort((a, b) => (b.completedAt ?? "").localeCompare(a.completedAt ?? ""))
|
|
60
73
|
.slice(0, MAX_FINISHED_WORKERS);
|
|
61
|
-
const backgroundTools = snapshot.items.filter((item) => isBackgroundToolActivityItem(item) && (item.status
|
|
62
|
-
const rows = [
|
|
63
|
-
...activeWorkers.map((record) => workerRow(record, nowMs)),
|
|
64
|
-
...finishedWorkers.map((record) => workerRow(record, nowMs)),
|
|
65
|
-
...backgroundTools.map(backgroundToolRow),
|
|
66
|
-
];
|
|
67
|
-
const shown = rows.slice(0, MAX_ROWS);
|
|
74
|
+
const backgroundTools = snapshot.items.filter((item) => isBackgroundToolActivityItem(item) && ACTIVE_BACKGROUND_TOOL_STATUSES.has(item.status));
|
|
68
75
|
const running = activeWorkers.filter((record) => record.status === "running").length;
|
|
69
76
|
const queued = activeWorkers.length - running;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
return {
|
|
78
|
+
workers,
|
|
79
|
+
activeWorkers,
|
|
80
|
+
rows: [
|
|
81
|
+
...activeWorkers.map((record) => workerRow(record, nowMs)),
|
|
82
|
+
...finishedWorkers.map((record) => workerRow(record, nowMs)),
|
|
83
|
+
...backgroundTools.map(backgroundToolRow),
|
|
84
|
+
],
|
|
85
|
+
summary: [
|
|
86
|
+
running > 0 ? `${running} running` : undefined,
|
|
87
|
+
queued > 0 ? `${queued} queued` : undefined,
|
|
88
|
+
backgroundTools.length > 0
|
|
89
|
+
? `${backgroundTools.length} background tool${backgroundTools.length === 1 ? "" : "s"}`
|
|
90
|
+
: undefined,
|
|
91
|
+
].filter((value) => value !== undefined),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function buildAgentsPanelModel(snapshot, nowMs) {
|
|
95
|
+
const activity = projectWorkActivity(snapshot, nowMs);
|
|
96
|
+
const shown = activity.rows.slice(0, MAX_ROWS);
|
|
77
97
|
return {
|
|
78
98
|
label: "Agents",
|
|
79
|
-
status: workers.some((record) => record.status === "failed") ? "error" : "info",
|
|
80
|
-
summary,
|
|
99
|
+
status: activity.workers.some((record) => record.status === "failed") ? "error" : "info",
|
|
100
|
+
summary: activity.summary,
|
|
81
101
|
rows: shown,
|
|
82
|
-
hiddenRowCount: rows.length - shown.length,
|
|
102
|
+
hiddenRowCount: activity.rows.length - shown.length,
|
|
83
103
|
emptyText: "No agents or background work right now",
|
|
84
104
|
};
|
|
85
105
|
}
|
|
106
|
+
/** Complete, bounded projection for the interactive work inspector. */
|
|
107
|
+
export function buildWorkPanelModel(snapshot, nowMs) {
|
|
108
|
+
const goal = snapshot.goalState;
|
|
109
|
+
const task = snapshot.taskState;
|
|
110
|
+
const activity = projectWorkActivity(snapshot, nowMs);
|
|
111
|
+
const satisfied = goal?.requirements.filter((requirement) => requirement.status === "satisfied").length ?? 0;
|
|
112
|
+
const rows = [
|
|
113
|
+
...(goal?.requirements.map(goalRequirementPanelRow) ?? []),
|
|
114
|
+
...(goal?.evidence.map(goalEvidencePanelRow) ?? []),
|
|
115
|
+
...(task?.steps.map((step) => ({ ...taskStepPanelRow(step), section: "Plan" })) ?? []),
|
|
116
|
+
...activity.rows,
|
|
117
|
+
];
|
|
118
|
+
const summary = [
|
|
119
|
+
goal ? `goal ${goal.status.replace("_", " ")}` : undefined,
|
|
120
|
+
goal ? `${satisfied}/${goal.requirements.length} requirements` : undefined,
|
|
121
|
+
task ? `${task.steps.length + task.archive.completed + task.archive.cancelled} plan steps` : undefined,
|
|
122
|
+
...activity.summary,
|
|
123
|
+
].filter((value) => value !== undefined);
|
|
124
|
+
return {
|
|
125
|
+
label: "Work",
|
|
126
|
+
status: goal?.status === "blocked" ||
|
|
127
|
+
goal?.status === "paused" ||
|
|
128
|
+
activity.workers.some((record) => record.status === "failed")
|
|
129
|
+
? "warning"
|
|
130
|
+
: activity.activeWorkers.length > 0 || task?.steps.some((step) => step.status === "in_progress")
|
|
131
|
+
? "running"
|
|
132
|
+
: "info",
|
|
133
|
+
summary,
|
|
134
|
+
description: goal?.userGoal,
|
|
135
|
+
wrapRows: true,
|
|
136
|
+
rows,
|
|
137
|
+
notices: goal?.blockedReason ? [{ status: "warning", text: goal.blockedReason }] : [],
|
|
138
|
+
emptyText: "No goal, plan, agents, or background work right now",
|
|
139
|
+
};
|
|
140
|
+
}
|
|
86
141
|
export class AgentsOverlay {
|
|
87
142
|
constructor(options) {
|
|
88
143
|
this.mounted = false;
|
|
89
144
|
this.elapsedRedrawEnabled = false;
|
|
145
|
+
this.scrollTop = 0;
|
|
146
|
+
this.lastPageRows = 1;
|
|
147
|
+
this.lastMaxScroll = 0;
|
|
90
148
|
this.options = options;
|
|
91
149
|
}
|
|
92
150
|
mount() {
|
|
@@ -122,7 +180,20 @@ export class AgentsOverlay {
|
|
|
122
180
|
this.options.keybindings.matches(data, "app.agents.open")) {
|
|
123
181
|
this.dispose();
|
|
124
182
|
this.options.onClose();
|
|
183
|
+
return;
|
|
125
184
|
}
|
|
185
|
+
if (this.options.keybindings.matches(data, "app.transcript.top"))
|
|
186
|
+
this.scrollTo(0);
|
|
187
|
+
else if (this.options.keybindings.matches(data, "app.transcript.bottom"))
|
|
188
|
+
this.scrollTo(this.lastMaxScroll);
|
|
189
|
+
else if (this.options.keybindings.matches(data, "app.transcript.scrollUp"))
|
|
190
|
+
this.scrollBy(-1);
|
|
191
|
+
else if (this.options.keybindings.matches(data, "app.transcript.scrollDown"))
|
|
192
|
+
this.scrollBy(1);
|
|
193
|
+
else if (this.options.keybindings.matches(data, "app.transcript.pageUp"))
|
|
194
|
+
this.scrollBy(-this.lastPageRows);
|
|
195
|
+
else if (this.options.keybindings.matches(data, "app.transcript.pageDown"))
|
|
196
|
+
this.scrollBy(this.lastPageRows);
|
|
126
197
|
}
|
|
127
198
|
render(width) {
|
|
128
199
|
const nowMs = this.options.now?.() ?? Date.now();
|
|
@@ -131,20 +202,28 @@ export class AgentsOverlay {
|
|
|
131
202
|
record.status === "running" &&
|
|
132
203
|
record.startedAt !== undefined &&
|
|
133
204
|
!Number.isNaN(Date.parse(record.startedAt))));
|
|
134
|
-
const model =
|
|
205
|
+
const model = buildWorkPanelModel(snapshot, nowMs);
|
|
135
206
|
const surface = (text) => theme.bg("customMessageBg", truncateToWidth(text, width, "", true));
|
|
136
|
-
const
|
|
137
|
-
capitalize: true,
|
|
138
|
-
});
|
|
207
|
+
const key = (action) => formatKeyText(this.options.keybindings.getKeys(action).join("/"), { capitalize: true });
|
|
139
208
|
const body = renderOrchestrationPanelLines(theme, model, Math.max(1, width - 2), true);
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
209
|
+
const viewportRows = Math.max(6, this.options.viewportRows?.() ?? 24);
|
|
210
|
+
const pageRows = Math.max(3, viewportRows - 2);
|
|
211
|
+
this.lastPageRows = pageRows;
|
|
212
|
+
this.lastMaxScroll = Math.max(0, body.length - pageRows);
|
|
213
|
+
this.scrollTop = Math.min(this.scrollTop, this.lastMaxScroll);
|
|
214
|
+
const visible = body.slice(this.scrollTop, this.scrollTop + pageRows);
|
|
215
|
+
const position = this.lastMaxScroll > 0 ? ` · ${this.scrollTop + 1}-${this.scrollTop + visible.length}/${body.length}` : "";
|
|
216
|
+
const footer = ` ${key("app.transcript.scrollUp")}/${key("app.transcript.scrollDown")} scroll · ${key("app.transcript.pageUp")}/${key("app.transcript.pageDown")} page · ${key("app.transcript.top")}/${key("app.transcript.bottom")} jump · ${key("app.agents.close")} close${position}`;
|
|
217
|
+
return [surface(""), ...visible.map((line) => surface(` ${line}`)), surface(theme.fg("muted", footer))];
|
|
146
218
|
}
|
|
147
219
|
invalidate() { }
|
|
220
|
+
scrollBy(delta) {
|
|
221
|
+
this.scrollTo(this.scrollTop + delta);
|
|
222
|
+
}
|
|
223
|
+
scrollTo(next) {
|
|
224
|
+
this.scrollTop = Math.max(0, Math.min(this.lastMaxScroll, next));
|
|
225
|
+
this.options.requestRender();
|
|
226
|
+
}
|
|
148
227
|
dispose() {
|
|
149
228
|
this.mounted = false;
|
|
150
229
|
this.setElapsedRedrawEnabled(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-overlay.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/agents-overlay.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, truncateToWidth } from \"@caupulican/pi-tui\";\nimport type { LaneRecord } from \"../../../core/autonomy/lane-tracker.ts\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport {\n\ttype OrchestrationPanelModel,\n\ttype OrchestrationPanelRow,\n\trenderOrchestrationPanelLines,\n} from \"../../../core/tools/orchestration-panel.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { type ActivityLaneItem, isBackgroundToolActivityItem } from \"./activity-lane.ts\";\nimport { formatKeyText } from \"./keybinding-hints.ts\";\n\n/**\n * On-demand detail view behind the statusline's aggregated concurrency counts:\n * the statusline shows \"2 agent · 3 bash\", this overlay names each worker and\n * background tool with status, elapsed time, and cost. Read-only; the same key\n * that opens it closes it, so it behaves as a peek.\n */\n\nexport interface AgentsOverlaySnapshot {\n\tlaneRecords: readonly LaneRecord[];\n\titems: readonly ActivityLaneItem[];\n}\n\nexport interface AgentsOverlayOptions {\n\tkeybindings: KeybindingsManager;\n\tsnapshot: () => AgentsOverlaySnapshot;\n\trequestRender: () => void;\n\tonClose: () => void;\n\t/** Injectable clock for tests. */\n\tnow?: () => number;\n}\n\nconst MAX_ROWS = 12;\nconst MAX_FINISHED_WORKERS = 4;\nconst ELAPSED_REDRAW_INTERVAL_MS = 1_000;\n\nexport function formatElapsed(ms: number): string {\n\tif (!Number.isFinite(ms) || ms < 0) return \"\";\n\tconst totalSeconds = Math.floor(ms / 1000);\n\tif (totalSeconds < 60) return `${totalSeconds}s`;\n\tconst minutes = Math.floor(totalSeconds / 60);\n\tif (minutes < 60) return `${minutes}m${String(totalSeconds % 60).padStart(2, \"0\")}s`;\n\treturn `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, \"0\")}m`;\n}\n\nfunction workerElapsed(record: LaneRecord, nowMs: number): string {\n\tif (!record.startedAt) return \"\";\n\tconst started = Date.parse(record.startedAt);\n\tif (Number.isNaN(started)) return \"\";\n\tconst end = record.completedAt ? Date.parse(record.completedAt) : nowMs;\n\tif (Number.isNaN(end)) return \"\";\n\treturn formatElapsed(end - started);\n}\n\nfunction workerRow(record: LaneRecord, nowMs: number): OrchestrationPanelRow {\n\tconst meta = [\n\t\trecord.type === \"tmux-worker\" ? \"tmux\" : \"agent\",\n\t\trecord.profileId,\n\t\tworkerElapsed(record, nowMs),\n\t\trecord.costUsd !== undefined ? `$${record.costUsd.toFixed(2)}` : undefined,\n\t].filter((value): value is string => value !== undefined && value !== \"\");\n\treturn {\n\t\tstatus: record.status,\n\t\tlabel: record.label ?? record.laneId,\n\t\tsection: \"Workers\",\n\t\tmeta,\n\t};\n}\n\nfunction backgroundToolRow(item: ActivityLaneItem): OrchestrationPanelRow {\n\treturn {\n\t\tstatus: item.status === \"waiting\" ? \"queued\" : \"running\",\n\t\tlabel: item.label,\n\t\tsection: \"Background tools\",\n\t\tmeta: item.tag ? [item.tag] : [],\n\t};\n}\n\nconst ACTIVE_WORKER_STATUSES = new Set<LaneRecord[\"status\"]>([\"queued\", \"running\"]);\n\nexport function buildAgentsPanelModel(snapshot: AgentsOverlaySnapshot, nowMs: number): OrchestrationPanelModel {\n\tconst workers = snapshot.laneRecords.filter((record) => record.type === \"worker\" || record.type === \"tmux-worker\");\n\tconst activeWorkers = workers.filter((record) => ACTIVE_WORKER_STATUSES.has(record.status));\n\tconst finishedWorkers = workers\n\t\t.filter((record) => !ACTIVE_WORKER_STATUSES.has(record.status))\n\t\t.sort((a, b) => (b.completedAt ?? \"\").localeCompare(a.completedAt ?? \"\"))\n\t\t.slice(0, MAX_FINISHED_WORKERS);\n\tconst backgroundTools = snapshot.items.filter(\n\t\t(item) => isBackgroundToolActivityItem(item) && (item.status === \"active\" || item.status === \"waiting\"),\n\t);\n\n\tconst rows: OrchestrationPanelRow[] = [\n\t\t...activeWorkers.map((record) => workerRow(record, nowMs)),\n\t\t...finishedWorkers.map((record) => workerRow(record, nowMs)),\n\t\t...backgroundTools.map(backgroundToolRow),\n\t];\n\tconst shown = rows.slice(0, MAX_ROWS);\n\n\tconst running = activeWorkers.filter((record) => record.status === \"running\").length;\n\tconst queued = activeWorkers.length - running;\n\tconst summary = [\n\t\trunning > 0 ? `${running} running` : undefined,\n\t\tqueued > 0 ? `${queued} queued` : undefined,\n\t\tbackgroundTools.length > 0\n\t\t\t? `${backgroundTools.length} background tool${backgroundTools.length === 1 ? \"\" : \"s\"}`\n\t\t\t: undefined,\n\t].filter((value): value is string => value !== undefined);\n\n\treturn {\n\t\tlabel: \"Agents\",\n\t\tstatus: workers.some((record) => record.status === \"failed\") ? \"error\" : \"info\",\n\t\tsummary,\n\t\trows: shown,\n\t\thiddenRowCount: rows.length - shown.length,\n\t\temptyText: \"No agents or background work right now\",\n\t};\n}\n\nexport class AgentsOverlay implements Component {\n\tprivate readonly options: AgentsOverlayOptions;\n\tprivate mounted = false;\n\tprivate elapsedRedrawEnabled = false;\n\tprivate elapsedRedrawTimer: ReturnType<typeof setTimeout> | undefined;\n\n\tconstructor(options: AgentsOverlayOptions) {\n\t\tthis.options = options;\n\t}\n\n\tmount(): void {\n\t\tif (this.mounted) return;\n\t\tthis.mounted = true;\n\t\tthis.scheduleElapsedRedraw();\n\t}\n\n\tprivate scheduleElapsedRedraw(): void {\n\t\tif (!this.mounted || !this.elapsedRedrawEnabled || this.elapsedRedrawTimer) return;\n\t\tthis.elapsedRedrawTimer = setTimeout(() => {\n\t\t\tthis.elapsedRedrawTimer = undefined;\n\t\t\tif (!this.mounted || !this.elapsedRedrawEnabled) return;\n\t\t\tthis.options.requestRender();\n\t\t\tthis.scheduleElapsedRedraw();\n\t\t}, ELAPSED_REDRAW_INTERVAL_MS);\n\t\tthis.elapsedRedrawTimer.unref?.();\n\t}\n\n\tprivate setElapsedRedrawEnabled(enabled: boolean): void {\n\t\tthis.elapsedRedrawEnabled = enabled;\n\t\tif (!enabled) {\n\t\t\tif (this.elapsedRedrawTimer) clearTimeout(this.elapsedRedrawTimer);\n\t\t\tthis.elapsedRedrawTimer = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.scheduleElapsedRedraw();\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (\n\t\t\tthis.options.keybindings.matches(data, \"app.agents.close\") ||\n\t\t\tthis.options.keybindings.matches(data, \"app.agents.open\")\n\t\t) {\n\t\t\tthis.dispose();\n\t\t\tthis.options.onClose();\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tconst nowMs = this.options.now?.() ?? Date.now();\n\t\tconst snapshot = this.options.snapshot();\n\t\tthis.setElapsedRedrawEnabled(\n\t\t\tsnapshot.laneRecords.some(\n\t\t\t\t(record) =>\n\t\t\t\t\t(record.type === \"worker\" || record.type === \"tmux-worker\") &&\n\t\t\t\t\trecord.status === \"running\" &&\n\t\t\t\t\trecord.startedAt !== undefined &&\n\t\t\t\t\t!Number.isNaN(Date.parse(record.startedAt)),\n\t\t\t),\n\t\t);\n\t\tconst model = buildAgentsPanelModel(snapshot, nowMs);\n\t\tconst surface = (text: string) => theme.bg(\"customMessageBg\", truncateToWidth(text, width, \"\", true));\n\t\tconst closeKey = formatKeyText(this.options.keybindings.getKeys(\"app.agents.close\").join(\"/\"), {\n\t\t\tcapitalize: true,\n\t\t});\n\t\tconst body = renderOrchestrationPanelLines(theme, model, Math.max(1, width - 2), true);\n\t\treturn [\n\t\t\tsurface(\"\"),\n\t\t\t...body.map((line) => surface(` ${line}`)),\n\t\t\tsurface(\"\"),\n\t\t\tsurface(theme.fg(\"muted\", ` ${closeKey} close`)),\n\t\t];\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.mounted = false;\n\t\tthis.setElapsedRedrawEnabled(false);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agents-overlay.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/agents-overlay.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, truncateToWidth } from \"@caupulican/pi-tui\";\nimport type { LaneRecord } from \"../../../core/autonomy/lane-tracker.ts\";\nimport type { GoalState } from \"../../../core/goals/goal-state.ts\";\nimport type { KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport type { TaskStepsState } from \"../../../core/tasks/task-state.ts\";\nimport {\n\tgoalEvidencePanelRow,\n\tgoalRequirementPanelRow,\n\ttype OrchestrationPanelModel,\n\ttype OrchestrationPanelRow,\n\trenderOrchestrationPanelLines,\n\ttaskStepPanelRow,\n} from \"../../../core/tools/orchestration-panel.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { type ActivityLaneItem, isBackgroundToolActivityItem } from \"./activity-lane.ts\";\nimport { formatKeyText } from \"./keybinding-hints.ts\";\n\n/**\n * On-demand work inspector behind the compact activity lane. One canonical snapshot\n * exposes goal, requirements, plan, workers, and background tools without duplicating\n * lifecycle state. The viewport is scrollable; the same key that opens it closes it.\n */\n\nexport interface AgentsOverlaySnapshot {\n\tgoalState?: GoalState;\n\ttaskState?: TaskStepsState;\n\tlaneRecords: readonly LaneRecord[];\n\titems: readonly ActivityLaneItem[];\n}\n\nexport interface AgentsOverlayOptions {\n\tkeybindings: KeybindingsManager;\n\tsnapshot: () => AgentsOverlaySnapshot;\n\trequestRender: () => void;\n\tonClose: () => void;\n\t/** Injectable clock for tests. */\n\tnow?: () => number;\n\t/** Terminal row budget used by the scrollable inspector. */\n\tviewportRows?: () => number;\n}\n\nconst MAX_ROWS = 12;\nconst MAX_FINISHED_WORKERS = 4;\nconst ELAPSED_REDRAW_INTERVAL_MS = 1_000;\n\nexport function formatElapsed(ms: number): string {\n\tif (!Number.isFinite(ms) || ms < 0) return \"\";\n\tconst totalSeconds = Math.floor(ms / 1000);\n\tif (totalSeconds < 60) return `${totalSeconds}s`;\n\tconst minutes = Math.floor(totalSeconds / 60);\n\tif (minutes < 60) return `${minutes}m${String(totalSeconds % 60).padStart(2, \"0\")}s`;\n\treturn `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, \"0\")}m`;\n}\n\nfunction workerElapsed(record: LaneRecord, nowMs: number): string {\n\tif (!record.startedAt) return \"\";\n\tconst started = Date.parse(record.startedAt);\n\tif (Number.isNaN(started)) return \"\";\n\tconst end = record.completedAt ? Date.parse(record.completedAt) : nowMs;\n\tif (Number.isNaN(end)) return \"\";\n\treturn formatElapsed(end - started);\n}\n\nfunction workerRow(record: LaneRecord, nowMs: number): OrchestrationPanelRow {\n\tconst meta = [\n\t\trecord.type === \"tmux-worker\" ? \"tmux\" : \"agent\",\n\t\trecord.profileId,\n\t\trecord.modelRef,\n\t\trecord.thinkingLevel,\n\t\tworkerElapsed(record, nowMs),\n\t\trecord.costUsd !== undefined ? `$${record.costUsd.toFixed(2)}` : undefined,\n\t].filter((value): value is string => value !== undefined && value !== \"\");\n\tconst details = [\n\t\t`lane: ${record.laneId}`,\n\t\trecord.goalId ? `goal: ${record.goalId}` : undefined,\n\t\trecord.reasonCode ? `reason: ${record.reasonCode}` : undefined,\n\t\trecord.worktreeLaneKey ? `worktree: ${record.worktreeLaneKey}` : undefined,\n\t\trecord.evidenceEntryId ? `evidence: ${record.evidenceEntryId}` : undefined,\n\t\trecord.startedAt ? `started: ${record.startedAt}` : undefined,\n\t\trecord.completedAt ? `completed: ${record.completedAt}` : undefined,\n\t].filter((value): value is string => value !== undefined);\n\treturn {\n\t\tstatus: record.status,\n\t\tlabel: record.label ?? record.laneId,\n\t\tsection: \"Workers\",\n\t\tmeta,\n\t\tdetails,\n\t};\n}\n\nfunction backgroundToolRow(item: ActivityLaneItem): OrchestrationPanelRow {\n\treturn {\n\t\tstatus: item.status === \"waiting\" ? \"queued\" : \"running\",\n\t\tlabel: item.label,\n\t\tsection: \"Background tools\",\n\t\tmeta: item.tag ? [item.tag] : [],\n\t};\n}\n\nconst ACTIVE_WORKER_STATUSES = new Set<LaneRecord[\"status\"]>([\"queued\", \"running\"]);\nconst ACTIVE_BACKGROUND_TOOL_STATUSES = new Set<ActivityLaneItem[\"status\"]>([\"active\", \"waiting\"]);\n\ninterface WorkActivityProjection {\n\tworkers: LaneRecord[];\n\tactiveWorkers: LaneRecord[];\n\trows: OrchestrationPanelRow[];\n\tsummary: string[];\n}\n\nfunction projectWorkActivity(snapshot: AgentsOverlaySnapshot, nowMs: number): WorkActivityProjection {\n\tconst workers = snapshot.laneRecords.filter((record) => record.type === \"worker\" || record.type === \"tmux-worker\");\n\tconst activeWorkers = workers.filter((record) => ACTIVE_WORKER_STATUSES.has(record.status));\n\tconst finishedWorkers = workers\n\t\t.filter((record) => !ACTIVE_WORKER_STATUSES.has(record.status))\n\t\t.sort((a, b) => (b.completedAt ?? \"\").localeCompare(a.completedAt ?? \"\"))\n\t\t.slice(0, MAX_FINISHED_WORKERS);\n\tconst backgroundTools = snapshot.items.filter(\n\t\t(item) => isBackgroundToolActivityItem(item) && ACTIVE_BACKGROUND_TOOL_STATUSES.has(item.status),\n\t);\n\tconst running = activeWorkers.filter((record) => record.status === \"running\").length;\n\tconst queued = activeWorkers.length - running;\n\treturn {\n\t\tworkers,\n\t\tactiveWorkers,\n\t\trows: [\n\t\t\t...activeWorkers.map((record) => workerRow(record, nowMs)),\n\t\t\t...finishedWorkers.map((record) => workerRow(record, nowMs)),\n\t\t\t...backgroundTools.map(backgroundToolRow),\n\t\t],\n\t\tsummary: [\n\t\t\trunning > 0 ? `${running} running` : undefined,\n\t\t\tqueued > 0 ? `${queued} queued` : undefined,\n\t\t\tbackgroundTools.length > 0\n\t\t\t\t? `${backgroundTools.length} background tool${backgroundTools.length === 1 ? \"\" : \"s\"}`\n\t\t\t\t: undefined,\n\t\t].filter((value): value is string => value !== undefined),\n\t};\n}\n\nexport function buildAgentsPanelModel(snapshot: AgentsOverlaySnapshot, nowMs: number): OrchestrationPanelModel {\n\tconst activity = projectWorkActivity(snapshot, nowMs);\n\tconst shown = activity.rows.slice(0, MAX_ROWS);\n\treturn {\n\t\tlabel: \"Agents\",\n\t\tstatus: activity.workers.some((record) => record.status === \"failed\") ? \"error\" : \"info\",\n\t\tsummary: activity.summary,\n\t\trows: shown,\n\t\thiddenRowCount: activity.rows.length - shown.length,\n\t\temptyText: \"No agents or background work right now\",\n\t};\n}\n\n/** Complete, bounded projection for the interactive work inspector. */\nexport function buildWorkPanelModel(snapshot: AgentsOverlaySnapshot, nowMs: number): OrchestrationPanelModel {\n\tconst goal = snapshot.goalState;\n\tconst task = snapshot.taskState;\n\tconst activity = projectWorkActivity(snapshot, nowMs);\n\tconst satisfied = goal?.requirements.filter((requirement) => requirement.status === \"satisfied\").length ?? 0;\n\tconst rows: OrchestrationPanelRow[] = [\n\t\t...(goal?.requirements.map(goalRequirementPanelRow) ?? []),\n\t\t...(goal?.evidence.map(goalEvidencePanelRow) ?? []),\n\t\t...(task?.steps.map((step) => ({ ...taskStepPanelRow(step), section: \"Plan\" })) ?? []),\n\t\t...activity.rows,\n\t];\n\tconst summary = [\n\t\tgoal ? `goal ${goal.status.replace(\"_\", \" \")}` : undefined,\n\t\tgoal ? `${satisfied}/${goal.requirements.length} requirements` : undefined,\n\t\ttask ? `${task.steps.length + task.archive.completed + task.archive.cancelled} plan steps` : undefined,\n\t\t...activity.summary,\n\t].filter((value): value is string => value !== undefined);\n\treturn {\n\t\tlabel: \"Work\",\n\t\tstatus:\n\t\t\tgoal?.status === \"blocked\" ||\n\t\t\tgoal?.status === \"paused\" ||\n\t\t\tactivity.workers.some((record) => record.status === \"failed\")\n\t\t\t\t? \"warning\"\n\t\t\t\t: activity.activeWorkers.length > 0 || task?.steps.some((step) => step.status === \"in_progress\")\n\t\t\t\t\t? \"running\"\n\t\t\t\t\t: \"info\",\n\t\tsummary,\n\t\tdescription: goal?.userGoal,\n\t\twrapRows: true,\n\t\trows,\n\t\tnotices: goal?.blockedReason ? [{ status: \"warning\", text: goal.blockedReason }] : [],\n\t\temptyText: \"No goal, plan, agents, or background work right now\",\n\t};\n}\n\nexport class AgentsOverlay implements Component {\n\tprivate readonly options: AgentsOverlayOptions;\n\tprivate mounted = false;\n\tprivate elapsedRedrawEnabled = false;\n\tprivate elapsedRedrawTimer: ReturnType<typeof setTimeout> | undefined;\n\tprivate scrollTop = 0;\n\tprivate lastPageRows = 1;\n\tprivate lastMaxScroll = 0;\n\n\tconstructor(options: AgentsOverlayOptions) {\n\t\tthis.options = options;\n\t}\n\n\tmount(): void {\n\t\tif (this.mounted) return;\n\t\tthis.mounted = true;\n\t\tthis.scheduleElapsedRedraw();\n\t}\n\n\tprivate scheduleElapsedRedraw(): void {\n\t\tif (!this.mounted || !this.elapsedRedrawEnabled || this.elapsedRedrawTimer) return;\n\t\tthis.elapsedRedrawTimer = setTimeout(() => {\n\t\t\tthis.elapsedRedrawTimer = undefined;\n\t\t\tif (!this.mounted || !this.elapsedRedrawEnabled) return;\n\t\t\tthis.options.requestRender();\n\t\t\tthis.scheduleElapsedRedraw();\n\t\t}, ELAPSED_REDRAW_INTERVAL_MS);\n\t\tthis.elapsedRedrawTimer.unref?.();\n\t}\n\n\tprivate setElapsedRedrawEnabled(enabled: boolean): void {\n\t\tthis.elapsedRedrawEnabled = enabled;\n\t\tif (!enabled) {\n\t\t\tif (this.elapsedRedrawTimer) clearTimeout(this.elapsedRedrawTimer);\n\t\t\tthis.elapsedRedrawTimer = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.scheduleElapsedRedraw();\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (\n\t\t\tthis.options.keybindings.matches(data, \"app.agents.close\") ||\n\t\t\tthis.options.keybindings.matches(data, \"app.agents.open\")\n\t\t) {\n\t\t\tthis.dispose();\n\t\t\tthis.options.onClose();\n\t\t\treturn;\n\t\t}\n\t\tif (this.options.keybindings.matches(data, \"app.transcript.top\")) this.scrollTo(0);\n\t\telse if (this.options.keybindings.matches(data, \"app.transcript.bottom\")) this.scrollTo(this.lastMaxScroll);\n\t\telse if (this.options.keybindings.matches(data, \"app.transcript.scrollUp\")) this.scrollBy(-1);\n\t\telse if (this.options.keybindings.matches(data, \"app.transcript.scrollDown\")) this.scrollBy(1);\n\t\telse if (this.options.keybindings.matches(data, \"app.transcript.pageUp\")) this.scrollBy(-this.lastPageRows);\n\t\telse if (this.options.keybindings.matches(data, \"app.transcript.pageDown\")) this.scrollBy(this.lastPageRows);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst nowMs = this.options.now?.() ?? Date.now();\n\t\tconst snapshot = this.options.snapshot();\n\t\tthis.setElapsedRedrawEnabled(\n\t\t\tsnapshot.laneRecords.some(\n\t\t\t\t(record) =>\n\t\t\t\t\t(record.type === \"worker\" || record.type === \"tmux-worker\") &&\n\t\t\t\t\trecord.status === \"running\" &&\n\t\t\t\t\trecord.startedAt !== undefined &&\n\t\t\t\t\t!Number.isNaN(Date.parse(record.startedAt)),\n\t\t\t),\n\t\t);\n\t\tconst model = buildWorkPanelModel(snapshot, nowMs);\n\t\tconst surface = (text: string) => theme.bg(\"customMessageBg\", truncateToWidth(text, width, \"\", true));\n\t\tconst key = (action: Parameters<KeybindingsManager[\"getKeys\"]>[0]) =>\n\t\t\tformatKeyText(this.options.keybindings.getKeys(action).join(\"/\"), { capitalize: true });\n\t\tconst body = renderOrchestrationPanelLines(theme, model, Math.max(1, width - 2), true);\n\t\tconst viewportRows = Math.max(6, this.options.viewportRows?.() ?? 24);\n\t\tconst pageRows = Math.max(3, viewportRows - 2);\n\t\tthis.lastPageRows = pageRows;\n\t\tthis.lastMaxScroll = Math.max(0, body.length - pageRows);\n\t\tthis.scrollTop = Math.min(this.scrollTop, this.lastMaxScroll);\n\t\tconst visible = body.slice(this.scrollTop, this.scrollTop + pageRows);\n\t\tconst position =\n\t\t\tthis.lastMaxScroll > 0 ? ` · ${this.scrollTop + 1}-${this.scrollTop + visible.length}/${body.length}` : \"\";\n\t\tconst footer = ` ${key(\"app.transcript.scrollUp\")}/${key(\"app.transcript.scrollDown\")} scroll · ${key(\"app.transcript.pageUp\")}/${key(\"app.transcript.pageDown\")} page · ${key(\"app.transcript.top\")}/${key(\"app.transcript.bottom\")} jump · ${key(\"app.agents.close\")} close${position}`;\n\t\treturn [surface(\"\"), ...visible.map((line) => surface(` ${line}`)), surface(theme.fg(\"muted\", footer))];\n\t}\n\n\tinvalidate(): void {}\n\n\tprivate scrollBy(delta: number): void {\n\t\tthis.scrollTo(this.scrollTop + delta);\n\t}\n\n\tprivate scrollTo(next: number): void {\n\t\tthis.scrollTop = Math.max(0, Math.min(this.lastMaxScroll, next));\n\t\tthis.options.requestRender();\n\t}\n\n\tdispose(): void {\n\t\tthis.mounted = false;\n\t\tthis.setElapsedRedrawEnabled(false);\n\t}\n}\n"]}
|
|
@@ -162,6 +162,9 @@ function readSummaryContract(message, kind, items) {
|
|
|
162
162
|
return items && items.length > 0 ? createBackgroundActivitySummaryContract(kind, items) : undefined;
|
|
163
163
|
}
|
|
164
164
|
function formatBackgroundActivitySummary(message) {
|
|
165
|
+
const supervisionSummary = formatSupervisionActivitySummary(message);
|
|
166
|
+
if (supervisionSummary)
|
|
167
|
+
return supervisionSummary;
|
|
165
168
|
const kind = message.customType === "background-worker-completion"
|
|
166
169
|
? "agent"
|
|
167
170
|
: message.customType === "background-tool-completion"
|
|
@@ -195,4 +198,18 @@ function formatBackgroundActivitySummary(message) {
|
|
|
195
198
|
status: summary.failedCount > 0 ? "error" : summary.attentionCount + summary.canceledCount > 0 ? "warning" : "success",
|
|
196
199
|
};
|
|
197
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Supervision is durable model input, but its raw lifecycle prose is not a second TUI renderer.
|
|
203
|
+
* Keep it in the session/custom-message stream for the model and transcript overlay while the
|
|
204
|
+
* foreground history uses the same one-line activity projection as background completions.
|
|
205
|
+
*/
|
|
206
|
+
function formatSupervisionActivitySummary(message) {
|
|
207
|
+
if (message.customType === "worktree-sync-notice") {
|
|
208
|
+
return { text: "Worktree sync activity", status: "warning" };
|
|
209
|
+
}
|
|
210
|
+
if (message.customType === "process-matrix-notice") {
|
|
211
|
+
return { text: "Process supervision activity", status: "warning" };
|
|
212
|
+
}
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
198
215
|
//# sourceMappingURL=custom-message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"@caupulican/pi-agent-core\";\nimport type { TextContent } from \"@caupulican/pi-ai\";\nimport {\n\tBox,\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\ttype MarkdownTheme,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n} from \"@caupulican/pi-tui\";\nimport type { MessageRenderer } from \"../../../core/extensions/types.ts\";\nimport {\n\ttype BackgroundActivitySummaryContract,\n\ttype BackgroundActivitySummaryItem,\n\tcreateBackgroundActivitySummaryContract,\n\tisBackgroundActivitySummaryContract,\n} from \"../../../core/foreground-terminal-handoff-controller.ts\";\nimport { isPlainRecord } from \"../../../core/util/value-guards.ts\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.ts\";\nimport { renderTitleBadge } from \"./tool-title.ts\";\n\n/**\n * Component that renders a custom message entry from extensions.\n * Uses distinct styling to differentiate from user messages.\n */\nexport class CustomMessageComponent extends Container {\n\tprivate message: CustomMessage<unknown>;\n\tprivate customRenderer?: MessageRenderer;\n\tprivate box: Box;\n\tprivate customComponent?: Component;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate _expanded = false;\n\n\tconstructor(\n\t\tmessage: CustomMessage<unknown>,\n\t\tcustomRenderer?: MessageRenderer,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t) {\n\t\tsuper();\n\t\tthis.message = message;\n\t\tthis.customRenderer = customRenderer;\n\t\tthis.markdownTheme = markdownTheme;\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create box with purple background (used for default rendering)\n\t\tthis.box = new Box(1, 1, (t) => theme.bg(\"customMessageBg\", t));\n\n\t\tthis.rebuild();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this._expanded !== expanded) {\n\t\t\tthis._expanded = expanded;\n\t\t\tthis.rebuild();\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.rebuild();\n\t}\n\n\tprivate rebuild(): void {\n\t\t// Remove previous content component\n\t\tif (this.customComponent) {\n\t\t\tthis.removeChild(this.customComponent);\n\t\t\tthis.customComponent = undefined;\n\t\t}\n\t\tthis.removeChild(this.box);\n\n\t\tconst backgroundSummary = formatBackgroundActivitySummary(this.message);\n\t\tif (backgroundSummary) {\n\t\t\tthis.customComponent = new BackgroundActivitySummaryComponent(backgroundSummary);\n\t\t\tthis.addChild(this.customComponent);\n\t\t\treturn;\n\t\t}\n\n\t\t// Try custom renderer first - it handles its own styling\n\t\tif (this.customRenderer) {\n\t\t\ttry {\n\t\t\t\tconst component = this.customRenderer(this.message, { expanded: this._expanded }, theme);\n\t\t\t\tif (component) {\n\t\t\t\t\t// Custom renderer provides its own styled component\n\t\t\t\t\tthis.customComponent = component;\n\t\t\t\t\tthis.addChild(component);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Fall through to default rendering\n\t\t\t}\n\t\t}\n\n\t\t// Default rendering uses our box\n\t\tthis.addChild(this.box);\n\t\tthis.box.clear();\n\n\t\t// Default rendering: label + content\n\t\tthis.box.addChild(new Text(renderTitleBadge(theme, { label: this.message.customType }), 0, 0));\n\t\tthis.box.addChild(new Spacer(1));\n\n\t\t// Extract text content\n\t\tlet text: string;\n\t\tif (typeof this.message.content === \"string\") {\n\t\t\ttext = this.message.content;\n\t\t} else {\n\t\t\ttext = this.message.content\n\t\t\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tthis.box.addChild(\n\t\t\tnew Markdown(text, 0, 0, this.markdownTheme, {\n\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t}),\n\t\t);\n\t}\n}\n\nfunction boundedIds(ids: readonly string[], totalCount: number): string {\n\tconst shown = ids.slice(0, 4);\n\tconst omitted = Math.max(0, totalCount - shown.length);\n\treturn `[${shown.join(\", \")}${omitted > 0 ? `, +${omitted}` : \"\"}]`;\n}\n\ninterface BackgroundActivitySummary {\n\ttext: string;\n\tstatus: \"success\" | \"warning\" | \"error\";\n}\n\nclass BackgroundActivitySummaryComponent implements Component {\n\tprivate readonly summary: BackgroundActivitySummary;\n\n\tconstructor(summary: BackgroundActivitySummary) {\n\t\tthis.summary = summary;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst line = `${theme.fg(this.summary.status, \"•\")} ${theme.fg(\"muted\", this.summary.text)}`;\n\t\treturn [truncateToWidth(line, Math.max(1, width), \"…\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction noun(count: number, singular: string): string {\n\treturn count === 1 ? singular : `${singular}s`;\n}\n\nfunction formatCountedStatus(\n\tcount: number,\n\tsingularNoun: string,\n\tsingularVerb: string,\n\tpluralVerb: string,\n\tids: readonly string[],\n): string | undefined {\n\tif (count === 0) return undefined;\n\tconst verb = count === 1 ? singularVerb : pluralVerb;\n\tconst idsText = ids.length > 0 ? ` ${boundedIds(ids, count)}` : \"\";\n\treturn `${count} ${noun(count, singularNoun)} ${verb}${idsText}`;\n}\n\nfunction fallbackBackgroundActivitySummary(kind: \"agent\" | \"task\"): BackgroundActivitySummary {\n\tconst singularNoun = kind === \"agent\" ? \"agent\" : \"background task\";\n\treturn {\n\t\ttext: `Background ${singularNoun} activity unavailable`,\n\t\tstatus: \"warning\",\n\t};\n}\n\nfunction recordSummaryItems(\n\tkind: \"agent\" | \"task\",\n\trecords: readonly Record<string, unknown>[],\n): BackgroundActivitySummaryItem[] | undefined {\n\tconst items: BackgroundActivitySummaryItem[] = [];\n\tfor (const record of records) {\n\t\tconst id = kind === \"agent\" ? record.laneId : record.taskId;\n\t\tif (typeof id !== \"string\" || id.length === 0 || typeof record.status !== \"string\") return undefined;\n\t\tif (kind === \"agent\") {\n\t\t\tconst claimNeedsReview = isPlainRecord(record.claim) && record.claim.parentReviewRequired === true;\n\t\t\tconst status =\n\t\t\t\trecord.status === \"failed\" || record.status === \"timeout\" || record.status === \"budget_exhausted\"\n\t\t\t\t\t? \"failed\"\n\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t? \"canceled\"\n\t\t\t\t\t\t: claimNeedsReview || record.status === \"partial\" || record.status === \"blocked\"\n\t\t\t\t\t\t\t? \"attention\"\n\t\t\t\t\t\t\t: record.status === \"succeeded\"\n\t\t\t\t\t\t\t\t? \"success\"\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\tif (!status) return undefined;\n\t\t\titems.push({ id, status });\n\t\t\tcontinue;\n\t\t}\n\t\tif (record.status !== \"completed\" && record.status !== \"failed\" && record.status !== \"canceled\") return undefined;\n\t\titems.push({\n\t\t\tid,\n\t\t\tstatus: record.status === \"failed\" ? \"failed\" : record.status === \"canceled\" ? \"canceled\" : \"success\",\n\t\t});\n\t}\n\treturn items;\n}\n\nfunction readSummaryContract(\n\tmessage: CustomMessage<unknown>,\n\tkind: \"agent\" | \"task\",\n\titems: readonly BackgroundActivitySummaryItem[] | undefined,\n): BackgroundActivitySummaryContract | undefined {\n\tif (isPlainRecord(message.details) && isBackgroundActivitySummaryContract(message.details.summary)) {\n\t\tconst summary = message.details.summary;\n\t\tif (summary.kind !== kind || !items || summary.totalCount < items.length) return undefined;\n\t\tconst includedCounts = {\n\t\t\tattention: items.filter((item) => item.status === \"attention\").length,\n\t\t\tfailed: items.filter((item) => item.status === \"failed\").length,\n\t\t\tcanceled: items.filter((item) => item.status === \"canceled\").length,\n\t\t};\n\t\tif (\n\t\t\tsummary.attentionCount < includedCounts.attention ||\n\t\t\tsummary.failedCount < includedCounts.failed ||\n\t\t\tsummary.canceledCount < includedCounts.canceled\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn summary;\n\t}\n\treturn items && items.length > 0 ? createBackgroundActivitySummaryContract(kind, items) : undefined;\n}\n\nfunction formatBackgroundActivitySummary(message: CustomMessage<unknown>): BackgroundActivitySummary | undefined {\n\tconst kind =\n\t\tmessage.customType === \"background-worker-completion\"\n\t\t\t? \"agent\"\n\t\t\t: message.customType === \"background-tool-completion\"\n\t\t\t\t? \"task\"\n\t\t\t\t: undefined;\n\tif (!kind) return undefined;\n\tif (!isPlainRecord(message.details) || !Array.isArray(message.details.records))\n\t\treturn fallbackBackgroundActivitySummary(kind);\n\tif (message.details.records.some((record) => !isPlainRecord(record))) return fallbackBackgroundActivitySummary(kind);\n\tconst records = message.details.records as Record<string, unknown>[];\n\tconst items = recordSummaryItems(kind, records);\n\tconst summary = readSummaryContract(message, kind, items);\n\tif (!summary || !items) return fallbackBackgroundActivitySummary(kind);\n\tconst nounName = kind === \"agent\" ? \"agent\" : \"background task\";\n\tconst attentionIds = items.filter((item) => item.status === \"attention\").map((item) => item.id);\n\tconst failedIds = items.filter((item) => item.status === \"failed\").map((item) => item.id);\n\tconst canceledIds = items.filter((item) => item.status === \"canceled\").map((item) => item.id);\n\tconst text = [\n\t\t`${summary.totalCount} ${noun(summary.totalCount, nounName)} finished`,\n\t\tformatCountedStatus(summary.attentionCount, nounName, \"needs verification\", \"need verification\", attentionIds),\n\t\tformatCountedStatus(summary.failedCount, nounName, \"failed\", \"failed\", failedIds),\n\t\tformatCountedStatus(summary.canceledCount, nounName, \"canceled\", \"canceled\", canceledIds),\n\t]\n\t\t.filter((part): part is string => part !== undefined)\n\t\t.join(\" | \");\n\treturn {\n\t\ttext,\n\t\tstatus:\n\t\t\tsummary.failedCount > 0 ? \"error\" : summary.attentionCount + summary.canceledCount > 0 ? \"warning\" : \"success\",\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"custom-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"@caupulican/pi-agent-core\";\nimport type { TextContent } from \"@caupulican/pi-ai\";\nimport {\n\tBox,\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\ttype MarkdownTheme,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n} from \"@caupulican/pi-tui\";\nimport type { MessageRenderer } from \"../../../core/extensions/types.ts\";\nimport {\n\ttype BackgroundActivitySummaryContract,\n\ttype BackgroundActivitySummaryItem,\n\tcreateBackgroundActivitySummaryContract,\n\tisBackgroundActivitySummaryContract,\n} from \"../../../core/foreground-terminal-handoff-controller.ts\";\nimport { isPlainRecord } from \"../../../core/util/value-guards.ts\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.ts\";\nimport { renderTitleBadge } from \"./tool-title.ts\";\n\n/**\n * Component that renders a custom message entry from extensions.\n * Uses distinct styling to differentiate from user messages.\n */\nexport class CustomMessageComponent extends Container {\n\tprivate message: CustomMessage<unknown>;\n\tprivate customRenderer?: MessageRenderer;\n\tprivate box: Box;\n\tprivate customComponent?: Component;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate _expanded = false;\n\n\tconstructor(\n\t\tmessage: CustomMessage<unknown>,\n\t\tcustomRenderer?: MessageRenderer,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t) {\n\t\tsuper();\n\t\tthis.message = message;\n\t\tthis.customRenderer = customRenderer;\n\t\tthis.markdownTheme = markdownTheme;\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create box with purple background (used for default rendering)\n\t\tthis.box = new Box(1, 1, (t) => theme.bg(\"customMessageBg\", t));\n\n\t\tthis.rebuild();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this._expanded !== expanded) {\n\t\t\tthis._expanded = expanded;\n\t\t\tthis.rebuild();\n\t\t}\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.rebuild();\n\t}\n\n\tprivate rebuild(): void {\n\t\t// Remove previous content component\n\t\tif (this.customComponent) {\n\t\t\tthis.removeChild(this.customComponent);\n\t\t\tthis.customComponent = undefined;\n\t\t}\n\t\tthis.removeChild(this.box);\n\n\t\tconst backgroundSummary = formatBackgroundActivitySummary(this.message);\n\t\tif (backgroundSummary) {\n\t\t\tthis.customComponent = new BackgroundActivitySummaryComponent(backgroundSummary);\n\t\t\tthis.addChild(this.customComponent);\n\t\t\treturn;\n\t\t}\n\n\t\t// Try custom renderer first - it handles its own styling\n\t\tif (this.customRenderer) {\n\t\t\ttry {\n\t\t\t\tconst component = this.customRenderer(this.message, { expanded: this._expanded }, theme);\n\t\t\t\tif (component) {\n\t\t\t\t\t// Custom renderer provides its own styled component\n\t\t\t\t\tthis.customComponent = component;\n\t\t\t\t\tthis.addChild(component);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Fall through to default rendering\n\t\t\t}\n\t\t}\n\n\t\t// Default rendering uses our box\n\t\tthis.addChild(this.box);\n\t\tthis.box.clear();\n\n\t\t// Default rendering: label + content\n\t\tthis.box.addChild(new Text(renderTitleBadge(theme, { label: this.message.customType }), 0, 0));\n\t\tthis.box.addChild(new Spacer(1));\n\n\t\t// Extract text content\n\t\tlet text: string;\n\t\tif (typeof this.message.content === \"string\") {\n\t\t\ttext = this.message.content;\n\t\t} else {\n\t\t\ttext = this.message.content\n\t\t\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tthis.box.addChild(\n\t\t\tnew Markdown(text, 0, 0, this.markdownTheme, {\n\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t}),\n\t\t);\n\t}\n}\n\nfunction boundedIds(ids: readonly string[], totalCount: number): string {\n\tconst shown = ids.slice(0, 4);\n\tconst omitted = Math.max(0, totalCount - shown.length);\n\treturn `[${shown.join(\", \")}${omitted > 0 ? `, +${omitted}` : \"\"}]`;\n}\n\ninterface BackgroundActivitySummary {\n\ttext: string;\n\tstatus: \"success\" | \"warning\" | \"error\";\n}\n\nclass BackgroundActivitySummaryComponent implements Component {\n\tprivate readonly summary: BackgroundActivitySummary;\n\n\tconstructor(summary: BackgroundActivitySummary) {\n\t\tthis.summary = summary;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst line = `${theme.fg(this.summary.status, \"•\")} ${theme.fg(\"muted\", this.summary.text)}`;\n\t\treturn [truncateToWidth(line, Math.max(1, width), \"…\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction noun(count: number, singular: string): string {\n\treturn count === 1 ? singular : `${singular}s`;\n}\n\nfunction formatCountedStatus(\n\tcount: number,\n\tsingularNoun: string,\n\tsingularVerb: string,\n\tpluralVerb: string,\n\tids: readonly string[],\n): string | undefined {\n\tif (count === 0) return undefined;\n\tconst verb = count === 1 ? singularVerb : pluralVerb;\n\tconst idsText = ids.length > 0 ? ` ${boundedIds(ids, count)}` : \"\";\n\treturn `${count} ${noun(count, singularNoun)} ${verb}${idsText}`;\n}\n\nfunction fallbackBackgroundActivitySummary(kind: \"agent\" | \"task\"): BackgroundActivitySummary {\n\tconst singularNoun = kind === \"agent\" ? \"agent\" : \"background task\";\n\treturn {\n\t\ttext: `Background ${singularNoun} activity unavailable`,\n\t\tstatus: \"warning\",\n\t};\n}\n\nfunction recordSummaryItems(\n\tkind: \"agent\" | \"task\",\n\trecords: readonly Record<string, unknown>[],\n): BackgroundActivitySummaryItem[] | undefined {\n\tconst items: BackgroundActivitySummaryItem[] = [];\n\tfor (const record of records) {\n\t\tconst id = kind === \"agent\" ? record.laneId : record.taskId;\n\t\tif (typeof id !== \"string\" || id.length === 0 || typeof record.status !== \"string\") return undefined;\n\t\tif (kind === \"agent\") {\n\t\t\tconst claimNeedsReview = isPlainRecord(record.claim) && record.claim.parentReviewRequired === true;\n\t\t\tconst status =\n\t\t\t\trecord.status === \"failed\" || record.status === \"timeout\" || record.status === \"budget_exhausted\"\n\t\t\t\t\t? \"failed\"\n\t\t\t\t\t: record.status === \"canceled\"\n\t\t\t\t\t\t? \"canceled\"\n\t\t\t\t\t\t: claimNeedsReview || record.status === \"partial\" || record.status === \"blocked\"\n\t\t\t\t\t\t\t? \"attention\"\n\t\t\t\t\t\t\t: record.status === \"succeeded\"\n\t\t\t\t\t\t\t\t? \"success\"\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\tif (!status) return undefined;\n\t\t\titems.push({ id, status });\n\t\t\tcontinue;\n\t\t}\n\t\tif (record.status !== \"completed\" && record.status !== \"failed\" && record.status !== \"canceled\") return undefined;\n\t\titems.push({\n\t\t\tid,\n\t\t\tstatus: record.status === \"failed\" ? \"failed\" : record.status === \"canceled\" ? \"canceled\" : \"success\",\n\t\t});\n\t}\n\treturn items;\n}\n\nfunction readSummaryContract(\n\tmessage: CustomMessage<unknown>,\n\tkind: \"agent\" | \"task\",\n\titems: readonly BackgroundActivitySummaryItem[] | undefined,\n): BackgroundActivitySummaryContract | undefined {\n\tif (isPlainRecord(message.details) && isBackgroundActivitySummaryContract(message.details.summary)) {\n\t\tconst summary = message.details.summary;\n\t\tif (summary.kind !== kind || !items || summary.totalCount < items.length) return undefined;\n\t\tconst includedCounts = {\n\t\t\tattention: items.filter((item) => item.status === \"attention\").length,\n\t\t\tfailed: items.filter((item) => item.status === \"failed\").length,\n\t\t\tcanceled: items.filter((item) => item.status === \"canceled\").length,\n\t\t};\n\t\tif (\n\t\t\tsummary.attentionCount < includedCounts.attention ||\n\t\t\tsummary.failedCount < includedCounts.failed ||\n\t\t\tsummary.canceledCount < includedCounts.canceled\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn summary;\n\t}\n\treturn items && items.length > 0 ? createBackgroundActivitySummaryContract(kind, items) : undefined;\n}\n\nfunction formatBackgroundActivitySummary(message: CustomMessage<unknown>): BackgroundActivitySummary | undefined {\n\tconst supervisionSummary = formatSupervisionActivitySummary(message);\n\tif (supervisionSummary) return supervisionSummary;\n\tconst kind =\n\t\tmessage.customType === \"background-worker-completion\"\n\t\t\t? \"agent\"\n\t\t\t: message.customType === \"background-tool-completion\"\n\t\t\t\t? \"task\"\n\t\t\t\t: undefined;\n\tif (!kind) return undefined;\n\tif (!isPlainRecord(message.details) || !Array.isArray(message.details.records))\n\t\treturn fallbackBackgroundActivitySummary(kind);\n\tif (message.details.records.some((record) => !isPlainRecord(record))) return fallbackBackgroundActivitySummary(kind);\n\tconst records = message.details.records as Record<string, unknown>[];\n\tconst items = recordSummaryItems(kind, records);\n\tconst summary = readSummaryContract(message, kind, items);\n\tif (!summary || !items) return fallbackBackgroundActivitySummary(kind);\n\tconst nounName = kind === \"agent\" ? \"agent\" : \"background task\";\n\tconst attentionIds = items.filter((item) => item.status === \"attention\").map((item) => item.id);\n\tconst failedIds = items.filter((item) => item.status === \"failed\").map((item) => item.id);\n\tconst canceledIds = items.filter((item) => item.status === \"canceled\").map((item) => item.id);\n\tconst text = [\n\t\t`${summary.totalCount} ${noun(summary.totalCount, nounName)} finished`,\n\t\tformatCountedStatus(summary.attentionCount, nounName, \"needs verification\", \"need verification\", attentionIds),\n\t\tformatCountedStatus(summary.failedCount, nounName, \"failed\", \"failed\", failedIds),\n\t\tformatCountedStatus(summary.canceledCount, nounName, \"canceled\", \"canceled\", canceledIds),\n\t]\n\t\t.filter((part): part is string => part !== undefined)\n\t\t.join(\" | \");\n\treturn {\n\t\ttext,\n\t\tstatus:\n\t\t\tsummary.failedCount > 0 ? \"error\" : summary.attentionCount + summary.canceledCount > 0 ? \"warning\" : \"success\",\n\t};\n}\n\n/**\n * Supervision is durable model input, but its raw lifecycle prose is not a second TUI renderer.\n * Keep it in the session/custom-message stream for the model and transcript overlay while the\n * foreground history uses the same one-line activity projection as background completions.\n */\nfunction formatSupervisionActivitySummary(message: CustomMessage<unknown>): BackgroundActivitySummary | undefined {\n\tif (message.customType === \"worktree-sync-notice\") {\n\t\treturn { text: \"Worktree sync activity\", status: \"warning\" };\n\t}\n\tif (message.customType === \"process-matrix-notice\") {\n\t\treturn { text: \"Process supervision activity\", status: \"warning\" };\n\t}\n\treturn undefined;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fitness-role-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/fitness-role-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmE,MAAM,oBAAoB,CAAC;AAShH,+FAA+F;AAC/F,MAAM,MAAM,WAAW,GACpB,SAAS,GACT,UAAU,GACV,OAAO,GACP,cAAc,GACd,eAAe,GACf,kBAAkB,GAClB,OAAO,GACP,UAAU,GACV,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"fitness-role-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/fitness-role-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmE,MAAM,oBAAoB,CAAC;AAShH,+FAA+F;AAC/F,MAAM,MAAM,WAAW,GACpB,SAAS,GACT,UAAU,GACV,OAAO,GACP,cAAc,GACd,eAAe,GACf,kBAAkB,GAClB,OAAO,GACP,UAAU,GACV,MAAM,CAAC;AAqDV,qGAAqG;AACrG,eAAO,MAAM,kBAAkB,EAAE,SAAS,WAAW,EAAgE,CAAC;AAEtH;;;;;GAKG;AACH,qBAAa,4BAA6B,SAAQ,SAAS;IAC1D,OAAO,CAAC,UAAU,CAAa;IAE/B,YACC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,EACrC,QAAQ,EAAE,MAAM,IAAI,EACpB,aAAa,CAAC,EAAE,WAAW,EAoB3B;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9B;CACD"}
|
|
@@ -44,8 +44,8 @@ const FITNESS_ROLE_ITEMS = [
|
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
value: "learning",
|
|
47
|
-
label: "Learning
|
|
48
|
-
description: "
|
|
47
|
+
label: "Learning",
|
|
48
|
+
description: "Explicit/background learning passes; automatic reflection uses the orchestrator's current session turn",
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
value: "none",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fitness-role-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/fitness-role-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,UAAU,EAAgC,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,+BAA+B,GAA4B;IAChE,qBAAqB,EAAE,EAAE;IACzB,qBAAqB,EAAE,EAAE;CACzB,CAAC;AAcF,mGAAmG;AACnG,MAAM,kBAAkB,GAA0B;IACjD;QACC,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,uFAAuF;KACpG;IACD;QACC,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,kGAAkG;KAC/G;IACD;QACC,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACV,sGAAsG;KACvG;IACD;QACC,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,gEAAgE;KAC7E;IACD;QACC,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,6DAA6D;KAC1E;IACD;QACC,KAAK,EAAE,kBAAkB;QACzB,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,gEAAgE;KAC7E;IACD;QACC,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,gEAAgE;KAC7E;IACD;QACC,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"fitness-role-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/fitness-role-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, type SelectItem, SelectList, type SelectListLayoutOptions, Text } from \"@caupulican/pi-tui\";\nimport { getSelectListTheme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\n\nconst FITNESS_ROLE_SELECT_LIST_LAYOUT: SelectListLayoutOptions = {\n\tminPrimaryColumnWidth: 18,\n\tmaxPrimaryColumnWidth: 34,\n};\n\n/** Roles a freshly probed model can be assigned to, mapped to their settings by the caller. */\nexport type FitnessRole =\n\t| \"curator\"\n\t| \"executor\"\n\t| \"scout\"\n\t| \"router-cheap\"\n\t| \"router-medium\"\n\t| \"router-expensive\"\n\t| \"judge\"\n\t| \"learning\"\n\t| \"none\";\n\n/** The role options in presentation order — one source of truth for the list AND pre-selection. */\nconst FITNESS_ROLE_ITEMS: readonly SelectItem[] = [\n\t{\n\t\tvalue: \"curator\",\n\t\tlabel: \"Context curator\",\n\t\tdescription: \"Local brain: digests GC-packed stubs, scores stale-chunk relevance (enables curation)\",\n\t},\n\t{\n\t\tvalue: \"executor\",\n\t\tlabel: \"Toolkit executor\",\n\t\tdescription: \"Owns direct toolkit commands end-to-end (Level-0 exact hits route here; needs tool-call fitness)\",\n\t},\n\t{\n\t\tvalue: \"scout\",\n\t\tlabel: \"Scout (context_scout)\",\n\t\tdescription:\n\t\t\t\"Repository scout role; writes scout.model and enables the scout tool after scout_auto fitness passes\",\n\t},\n\t{\n\t\tvalue: \"router-cheap\",\n\t\tlabel: \"Router: cheap tier\",\n\t\tdescription: \"Handles trivial/read-only routed turns (model router settings)\",\n\t},\n\t{\n\t\tvalue: \"router-medium\",\n\t\tlabel: \"Router: medium tier\",\n\t\tdescription: \"Handles normal implementation turns (model router settings)\",\n\t},\n\t{\n\t\tvalue: \"router-expensive\",\n\t\tlabel: \"Router: expensive tier\",\n\t\tdescription: \"Handles high-impact/architecture turns (model router settings)\",\n\t},\n\t{\n\t\tvalue: \"judge\",\n\t\tlabel: \"Routing judge\",\n\t\tdescription: \"Routing-only tier verdicts; needs strong instruction following\",\n\t},\n\t{\n\t\tvalue: \"learning\",\n\t\tlabel: \"Learning\",\n\t\tdescription:\n\t\t\t\"Explicit/background learning passes; automatic reflection uses the orchestrator's current session turn\",\n\t},\n\t{\n\t\tvalue: \"none\",\n\t\tlabel: \"No role for now\",\n\t\tdescription: \"Keep the result in the fitness store only (assign later from /settings)\",\n\t},\n];\n\n/** The assignable roles in the order the selector presents them (index 0 is the default landing). */\nexport const FITNESS_ROLE_ORDER: readonly FitnessRole[] = FITNESS_ROLE_ITEMS.map((item) => item.value as FitnessRole);\n\n/**\n * Post-probe role assignment: after /fitness measures a model, this selector turns the result\n * into configuration in one step instead of sending the user to hand-edit settings JSON. When a\n * model arrives from a validated suggestion, `preselectRole` lands the shaped role already\n * highlighted so a single keypress confirms it (an unknown/absent role falls back to the default).\n */\nexport class FitnessRoleSelectorComponent extends Container {\n\tprivate selectList: SelectList;\n\n\tconstructor(\n\t\tmodelRef: string,\n\t\tonSelect: (role: FitnessRole) => void,\n\t\tonCancel: () => void,\n\t\tpreselectRole?: FitnessRole,\n\t) {\n\t\tsuper();\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Text(`Assign a role for ${modelRef}:`, 1, 0));\n\t\tthis.selectList = new SelectList(\n\t\t\t[...FITNESS_ROLE_ITEMS],\n\t\t\t8,\n\t\t\tgetSelectListTheme(),\n\t\t\tFITNESS_ROLE_SELECT_LIST_LAYOUT,\n\t\t);\n\t\tthis.selectList.onSelect = (item) => onSelect(item.value as FitnessRole);\n\t\tthis.selectList.onCancel = () => onCancel();\n\t\tif (preselectRole) {\n\t\t\tconst index = FITNESS_ROLE_ORDER.indexOf(preselectRole);\n\t\t\tif (index >= 0) this.selectList.setSelectedIndex(index);\n\t\t}\n\t\tthis.addChild(this.selectList);\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.selectList.handleInput(data);\n\t}\n}\n"]}
|
|
@@ -211,7 +211,7 @@ export class FooterComponent {
|
|
|
211
211
|
// Keep the warning-only guard proactive without duplicating the authoritative
|
|
212
212
|
// CURRENT/TODAY/SUBAGENTS totals rendered above.
|
|
213
213
|
const costGuard = this.session.getLastCostGuardDecision?.();
|
|
214
|
-
if (costGuard?.over) {
|
|
214
|
+
if (this.session.settingsManager.getCostGuardSettings().enabled && costGuard?.over) {
|
|
215
215
|
statsParts.push(theme.fg("warning", `GUARD:$${costGuard.estUsd.toFixed(2)}/turn`));
|
|
216
216
|
}
|
|
217
217
|
// Colorize context percentage based on usage
|