@aragon-agent/cli 0.6.47 → 0.6.48
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 +13 -0
- package/README.md +27 -6
- package/dist/agent/coalesce.d.ts +1 -1
- package/dist/agent/controller.d.ts +21 -21
- package/dist/agent/controller.js +13 -13
- package/dist/agent/conversation-reset.d.ts +1 -1
- package/dist/agent/governance-wiring.d.ts +6 -6
- package/dist/agent/governance-wiring.js +4 -4
- package/dist/agent/headless.d.ts +5 -5
- package/dist/agent/headless.js +4 -4
- package/dist/agent/job-notices.d.ts +1 -1
- package/dist/agent/job-notices.js +1 -1
- package/dist/agent/kit-apply.d.ts +3 -3
- package/dist/agent/kit-apply.js +3 -3
- package/dist/agent/model-profile-settings.d.ts +2 -2
- package/dist/agent/model-profile-settings.js +6 -6
- package/dist/agent/prompt-options.d.ts +1 -1
- package/dist/agent/system-prompt.d.ts +1 -1
- package/dist/{ui → app}/App.d.ts +9 -9
- package/dist/{ui → app}/App.js +79 -79
- package/dist/{ui → app}/use-startup-notices.d.ts +1 -1
- package/dist/{ui → app}/use-startup-notices.js +2 -2
- package/dist/cli.js +29 -29
- package/dist/commands/agents-command.js +1 -1
- package/dist/commands/builtins.js +9 -9
- package/dist/commands/governance-command.js +2 -2
- package/dist/commands/governance-runs-table.js +1 -1
- package/dist/commands/kit-command.js +1 -1
- package/dist/commands/perf.d.ts +3 -3
- package/dist/commands/perf.js +1 -1
- package/dist/commands/registry.d.ts +8 -8
- package/dist/commands/skills.js +2 -2
- package/dist/commands/team-command.js +1 -1
- package/dist/compaction/archive.d.ts +1 -1
- package/dist/compaction/archive.js +1 -1
- package/dist/compaction/child.d.ts +3 -3
- package/dist/compaction/child.js +4 -4
- package/dist/compaction/command.js +5 -5
- package/dist/compaction/compactor.d.ts +6 -6
- package/dist/compaction/compactor.js +6 -6
- package/dist/compaction/context-command.js +1 -1
- package/dist/compaction/digest.js +1 -1
- package/dist/compaction/memory-input.js +1 -1
- package/dist/compaction/memory-validation.js +1 -1
- package/dist/compaction/memory.js +1 -1
- package/dist/compaction/summarize-call.js +1 -1
- package/dist/compaction/summary-prompt.js +1 -1
- package/dist/compaction/tail-budget.js +2 -2
- package/dist/compaction/wiring.d.ts +5 -5
- package/dist/compaction/wiring.js +2 -2
- package/dist/config/cli-commands.d.ts +1 -1
- package/dist/config/cli-commands.js +3 -3
- package/dist/config/env.d.ts +1 -1
- package/dist/config/env.js +4 -4
- package/dist/config/load.d.ts +2 -2
- package/dist/config/load.js +6 -6
- package/dist/config/migrate-state-out-of-config.js +1 -1
- package/dist/config/model-profile-store.d.ts +4 -54
- package/dist/config/model-profile-store.js +3 -3
- package/dist/config/prompt-history.js +1 -1
- package/dist/config/store.d.ts +2 -2
- package/dist/config/store.js +3 -3
- package/dist/diagnostics/doctor.js +4 -4
- package/dist/exec/bridge/decisions.d.ts +1 -1
- package/dist/exec/bridge/human-answers.d.ts +1 -1
- package/dist/exec/bridge/human-answers.js +1 -1
- package/dist/exec/bridge/protocol.d.ts +1 -1
- package/dist/exec/bridge/server.js +1 -1
- package/dist/exec/events.d.ts +2 -2
- package/dist/exec/index.d.ts +1 -1
- package/dist/exec/index.js +1 -1
- package/dist/exec/permission.js +1 -1
- package/dist/exec/runner.d.ts +3 -3
- package/dist/exec/runner.js +2 -2
- package/dist/exec/threads/runtime.js +1 -1
- package/dist/fast/digest.d.ts +1 -1
- package/dist/fast/digest.js +1 -1
- package/dist/fast/frames.d.ts +1 -1
- package/dist/fast/frames.js +1 -1
- package/dist/fast/prompt.d.ts +1 -1
- package/dist/fast/prompt.js +1 -1
- package/dist/fast/review-call.js +1 -1
- package/dist/fast/reviewer.d.ts +3 -3
- package/dist/fast/reviewer.js +1 -1
- package/dist/fast/summary-call.d.ts +3 -3
- package/dist/fast/summary-call.js +2 -2
- package/dist/fast/summary-prompt.d.ts +1 -1
- package/dist/fast/summary-prompt.js +1 -1
- package/dist/fast/wiring.d.ts +4 -4
- package/dist/fast/wiring.js +1 -1
- package/dist/governance/card-normalize.d.ts +1 -1
- package/dist/governance/copy.d.ts +1 -1
- package/dist/governance/copy.js +2 -2
- package/dist/governance/engine/artifact-persist.d.ts +1 -1
- package/dist/governance/engine/budget.d.ts +1 -1
- package/dist/governance/engine/budget.js +1 -1
- package/dist/governance/engine/cards.d.ts +1 -1
- package/dist/governance/engine/digest.js +1 -1
- package/dist/governance/engine/engine-core.d.ts +5 -5
- package/dist/governance/engine/engine-core.js +1 -1
- package/dist/governance/engine/engine.d.ts +1 -1
- package/dist/governance/engine/engine.js +1 -1
- package/dist/governance/engine/estimate.d.ts +1 -1
- package/dist/governance/engine/estimate.js +1 -1
- package/dist/governance/engine/inspector.js +2 -2
- package/dist/governance/engine/integration.d.ts +1 -1
- package/dist/governance/engine/lifecycle.d.ts +1 -1
- package/dist/governance/engine/lifecycle.js +1 -1
- package/dist/governance/engine/phase-members.d.ts +1 -1
- package/dist/governance/engine/phase-planner.d.ts +1 -1
- package/dist/governance/engine/phase-planner.js +1 -1
- package/dist/governance/engine/rebuild.d.ts +1 -1
- package/dist/governance/engine/report.d.ts +1 -1
- package/dist/governance/engine/report.js +1 -1
- package/dist/governance/engine/run-digest.d.ts +1 -1
- package/dist/governance/engine/spec-builder.d.ts +2 -2
- package/dist/governance/engine/spec-builder.js +2 -2
- package/dist/governance/engine/stage-runner.js +2 -2
- package/dist/governance/engine/start-input.d.ts +1 -1
- package/dist/governance/engine/start-input.js +1 -1
- package/dist/governance/engine/state-machine.d.ts +1 -1
- package/dist/governance/engine/state-machine.js +3 -3
- package/dist/governance/engine/submission-queries.d.ts +1 -1
- package/dist/governance/engine/submission-render.d.ts +1 -1
- package/dist/governance/engine/submissions.d.ts +1 -1
- package/dist/governance/engine/submissions.js +1 -1
- package/dist/governance/engine/visibility.d.ts +1 -1
- package/dist/governance/engine/visibility.js +1 -1
- package/dist/governance/posture-transition.d.ts +2 -2
- package/dist/governance/posture-transition.js +1 -1
- package/dist/governance/profiles.d.ts +1 -1
- package/dist/governance/prompts/orchestrator-block.d.ts +2 -2
- package/dist/governance/prompts/orchestrator-block.js +2 -2
- package/dist/governance/prompts/plan-addendum.d.ts +1 -1
- package/dist/governance/prompts/plan-addendum.js +1 -1
- package/dist/governance/prompts/role-blocks.d.ts +2 -2
- package/dist/governance/prompts/role-blocks.js +1 -1
- package/dist/governance/report-reader.js +1 -1
- package/dist/governance/roles.d.ts +1 -1
- package/dist/governance/rules/claims.d.ts +1 -1
- package/dist/governance/rules/claims.js +1 -1
- package/dist/governance/rules/elimination.d.ts +1 -1
- package/dist/governance/rules/elimination.js +1 -1
- package/dist/governance/rules/failure-analysis.d.ts +2 -2
- package/dist/governance/rules/failure-analysis.js +1 -1
- package/dist/governance/rules/ledger-replay.d.ts +1 -1
- package/dist/governance/rules/ledger-state.d.ts +1 -1
- package/dist/governance/rules/ledger-state.js +1 -1
- package/dist/governance/rules/ledger.d.ts +2 -2
- package/dist/governance/rules/ledger.js +2 -2
- package/dist/governance/rules/rca.d.ts +1 -1
- package/dist/governance/rules/rca.js +1 -1
- package/dist/governance/rules/settlement.d.ts +2 -2
- package/dist/governance/rules/settlement.js +2 -2
- package/dist/governance/rules/suspicion.d.ts +1 -1
- package/dist/governance/store/artifacts.d.ts +1 -1
- package/dist/governance/store/artifacts.js +1 -1
- package/dist/governance/store/events-log.d.ts +1 -1
- package/dist/governance/store/run-store.d.ts +1 -1
- package/dist/governance/store/run-store.js +1 -1
- package/dist/governance/store/scoreboard-export.d.ts +1 -1
- package/dist/governance/tools/child-tools.d.ts +1 -1
- package/dist/governance/tools/guard.d.ts +1 -1
- package/dist/governance/tools/guard.js +1 -1
- package/dist/governance/tools/inspector-tools.d.ts +2 -2
- package/dist/governance/tools/inspector-tools.js +2 -2
- package/dist/governance/tools/lead-tools.d.ts +1 -1
- package/dist/governance/tools/lead-tools.js +1 -1
- package/dist/governance/tools/normalize-util.js +1 -1
- package/dist/governance/tools/scan-incomplete.js +1 -1
- package/dist/governance/tools/shared-tools.d.ts +1 -1
- package/dist/governance/tools/shared-tools.js +1 -1
- package/dist/governance/tools/submit-normalizers.d.ts +1 -1
- package/dist/governance/tools/submit-normalizers.js +1 -1
- package/dist/governance/tools/submit-tools.d.ts +1 -1
- package/dist/logging/cli-commands.js +1 -1
- package/dist/logging/install.d.ts +1 -1
- package/dist/logging/install.js +3 -3
- package/dist/logging/logger.d.ts +2 -2
- package/dist/logging/logger.js +31 -2
- package/dist/proc/kill-tree.js +1 -1
- package/dist/proc/log-mirror.js +1 -1
- package/dist/proc/log-ring.js +2 -2
- package/dist/proc/notices.d.ts +1 -1
- package/dist/proc/notices.js +2 -2
- package/dist/proc/prompt.d.ts +1 -1
- package/dist/proc/prompt.js +1 -1
- package/dist/proc/readiness.js +1 -1
- package/dist/proc/supervisor.d.ts +1 -1
- package/dist/proc/supervisor.js +3 -3
- package/dist/proc/wait.d.ts +1 -1
- package/dist/proc/wait.js +1 -1
- package/dist/prompts/command.d.ts +1 -1
- package/dist/prompts/command.js +1 -1
- package/dist/prompts/normalize.d.ts +1 -1
- package/dist/prompts/normalize.js +1 -1
- package/dist/prompts/resolve.d.ts +1 -1
- package/dist/prompts/store.d.ts +2 -12
- package/dist/prompts/store.js +6 -60
- package/dist/session/checkpoint.d.ts +2 -2
- package/dist/session/clear-archive.d.ts +2 -2
- package/dist/session/persist.d.ts +2 -2
- package/dist/session/persist.js +1 -1
- package/dist/session/startup-session.d.ts +2 -2
- package/dist/session/validate-session.js +3 -3
- package/dist/skills/service.d.ts +2 -2
- package/dist/team/bus.d.ts +1 -1
- package/dist/team/bus.js +1 -1
- package/dist/team/child-reviewer.d.ts +2 -2
- package/dist/team/child-reviewer.js +1 -1
- package/dist/team/comm-tools.js +1 -1
- package/dist/team/dispatch-gate.js +1 -1
- package/dist/team/forced-dispatch.js +1 -1
- package/dist/team/forced-mode.d.ts +1 -1
- package/dist/team/forced-prompt.d.ts +1 -1
- package/dist/team/forced-prompt.js +1 -1
- package/dist/team/normalize.d.ts +1 -1
- package/dist/team/normalize.js +1 -1
- package/dist/team/overseer.d.ts +3 -3
- package/dist/team/overseer.js +3 -3
- package/dist/team/prompt.d.ts +1 -1
- package/dist/team/prompt.js +1 -1
- package/dist/team/report.d.ts +2 -2
- package/dist/team/report.js +2 -2
- package/dist/team/retry.d.ts +1 -1
- package/dist/team/retry.js +1 -1
- package/dist/team/runtime.d.ts +4 -4
- package/dist/team/runtime.js +2 -2
- package/dist/team/settled.d.ts +2 -2
- package/dist/team/subagent.d.ts +4 -4
- package/dist/team/subagent.js +5 -5
- package/dist/team/task-tool.d.ts +1 -1
- package/dist/team/task-tool.js +1 -1
- package/dist/todo/normalize.d.ts +1 -1
- package/dist/todo/normalize.js +1 -1
- package/dist/todo/prompt.d.ts +1 -1
- package/dist/todo/prompt.js +1 -1
- package/dist/todo/store.d.ts +1 -1
- package/dist/todo/store.js +2 -2
- package/dist/todo/todo-tool.d.ts +1 -1
- package/dist/todo/todo-tool.js +2 -2
- package/dist/tools/bash-tool.d.ts +1 -1
- package/dist/tools/bash-tool.js +2 -2
- package/dist/tools/diff.d.ts +1 -1
- package/dist/tools/diff.js +1 -1
- package/dist/tools/file-change-store.d.ts +1 -1
- package/dist/tools/fs-tools.d.ts +2 -2
- package/dist/tools/fs-tools.js +1 -1
- package/dist/tools/index.d.ts +3 -3
- package/dist/tools/index.js +1 -1
- package/dist/tools/job-tools.d.ts +2 -2
- package/dist/tools/job-tools.js +4 -4
- package/dist/tools/plan-tools.d.ts +1 -1
- package/dist/tools/plan-tools.js +1 -1
- package/dist/tools/proc-tools.d.ts +1 -1
- package/dist/tools/proc-tools.js +2 -2
- package/dist/update/classify-failure.d.ts +1 -1
- package/dist/update/install-lock.js +1 -1
- package/dist/update/install-source.d.ts +1 -1
- package/dist/update/installer.js +2 -2
- package/dist/update/npm-view.d.ts +1 -1
- package/dist/update/npm-view.js +1 -1
- package/dist/update/registry.d.ts +1 -1
- package/dist/update/registry.js +1 -1
- package/dist/update/service.d.ts +2 -2
- package/dist/update/service.js +2 -2
- package/package.json +7 -7
- package/dist/agent/agent-mode.d.ts +0 -108
- package/dist/agent/agent-mode.js +0 -121
- package/dist/agent/entry-limits.d.ts +0 -65
- package/dist/agent/entry-limits.js +0 -133
- package/dist/agent/governance-view.d.ts +0 -40
- package/dist/agent/governance-view.js +0 -40
- package/dist/agent/invocation-card.d.ts +0 -77
- package/dist/agent/invocation-card.js +0 -169
- package/dist/agent/model-probe-limits.d.ts +0 -39
- package/dist/agent/model-probe-limits.js +0 -25
- package/dist/agent/model-probe.d.ts +0 -104
- package/dist/agent/model-probe.js +0 -391
- package/dist/agent/queued-messages.d.ts +0 -23
- package/dist/agent/queued-messages.js +0 -49
- package/dist/agent/reducer.d.ts +0 -857
- package/dist/agent/reducer.js +0 -1646
- package/dist/agent/retry-view.d.ts +0 -68
- package/dist/agent/retry-view.js +0 -95
- package/dist/agent/usage.d.ts +0 -47
- package/dist/agent/usage.js +0 -84
- package/dist/compaction/limits.d.ts +0 -61
- package/dist/compaction/limits.js +0 -64
- package/dist/compaction/meter.d.ts +0 -276
- package/dist/compaction/meter.js +0 -512
- package/dist/compaction/pressure.d.ts +0 -163
- package/dist/compaction/pressure.js +0 -199
- package/dist/compaction/reason-text.d.ts +0 -36
- package/dist/compaction/reason-text.js +0 -78
- package/dist/compaction/types.d.ts +0 -360
- package/dist/compaction/types.js +0 -22
- package/dist/config/governance-config.d.ts +0 -125
- package/dist/config/governance-config.js +0 -164
- package/dist/config/kit-resolution.d.ts +0 -93
- package/dist/config/kit-resolution.js +0 -226
- package/dist/config/model-kits.d.ts +0 -225
- package/dist/config/model-kits.js +0 -302
- package/dist/config/model-profile-resolution.d.ts +0 -28
- package/dist/config/model-profile-resolution.js +0 -88
- package/dist/config/model-profiles.d.ts +0 -103
- package/dist/config/model-profiles.js +0 -188
- package/dist/config/schema.d.ts +0 -1645
- package/dist/config/schema.js +0 -1383
- package/dist/fast/limits.d.ts +0 -152
- package/dist/fast/limits.js +0 -152
- package/dist/fast/resolve.d.ts +0 -44
- package/dist/fast/resolve.js +0 -107
- package/dist/fast/task-summary-types.d.ts +0 -66
- package/dist/fast/task-summary-types.js +0 -17
- package/dist/fast/types.d.ts +0 -141
- package/dist/fast/types.js +0 -14
- package/dist/governance/governed-dispatch.d.ts +0 -19
- package/dist/governance/governed-dispatch.js +0 -17
- package/dist/governance/limits.d.ts +0 -107
- package/dist/governance/limits.js +0 -131
- package/dist/governance/posture.d.ts +0 -35
- package/dist/governance/posture.js +0 -59
- package/dist/governance/rules/events-table.d.ts +0 -46
- package/dist/governance/rules/events-table.js +0 -94
- package/dist/governance/types.d.ts +0 -661
- package/dist/governance/types.js +0 -27
- package/dist/input/control-sequences.d.ts +0 -71
- package/dist/input/control-sequences.js +0 -222
- package/dist/input/csiu-keys.d.ts +0 -66
- package/dist/input/csiu-keys.js +0 -181
- package/dist/input/cursor-report.d.ts +0 -61
- package/dist/input/cursor-report.js +0 -97
- package/dist/input/enter-sequences.d.ts +0 -64
- package/dist/input/enter-sequences.js +0 -153
- package/dist/input/interrupt-gesture.d.ts +0 -18
- package/dist/input/interrupt-gesture.js +0 -19
- package/dist/input/keyboard-enhancement.d.ts +0 -42
- package/dist/input/keyboard-enhancement.js +0 -65
- package/dist/input/keymap.d.ts +0 -20
- package/dist/input/keymap.js +0 -99
- package/dist/input/limits.d.ts +0 -118
- package/dist/input/limits.js +0 -109
- package/dist/input/mouse-events.d.ts +0 -87
- package/dist/input/mouse-events.js +0 -212
- package/dist/input/paste-parse.d.ts +0 -83
- package/dist/input/paste-parse.js +0 -107
- package/dist/input/pointer-router.d.ts +0 -11
- package/dist/input/pointer-router.js +0 -14
- package/dist/input/stdin-filter.d.ts +0 -112
- package/dist/input/stdin-filter.js +0 -657
- package/dist/input/win32-input-mode.d.ts +0 -61
- package/dist/input/win32-input-mode.js +0 -269
- package/dist/logging/levels.d.ts +0 -40
- package/dist/logging/levels.js +0 -59
- package/dist/logging/secret-registry.d.ts +0 -32
- package/dist/logging/secret-registry.js +0 -73
- package/dist/proc/limits.d.ts +0 -214
- package/dist/proc/limits.js +0 -221
- package/dist/proc/progress.d.ts +0 -47
- package/dist/proc/progress.js +0 -163
- package/dist/proc/types.d.ts +0 -269
- package/dist/proc/types.js +0 -15
- package/dist/proc/wait-view.d.ts +0 -65
- package/dist/proc/wait-view.js +0 -66
- package/dist/prompts/copy.d.ts +0 -89
- package/dist/prompts/copy.js +0 -131
- package/dist/prompts/fill.d.ts +0 -51
- package/dist/prompts/fill.js +0 -46
- package/dist/prompts/limits.d.ts +0 -53
- package/dist/prompts/limits.js +0 -53
- package/dist/prompts/search.d.ts +0 -58
- package/dist/prompts/search.js +0 -146
- package/dist/prompts/types.d.ts +0 -204
- package/dist/prompts/types.js +0 -13
- package/dist/team/activity.d.ts +0 -67
- package/dist/team/activity.js +0 -130
- package/dist/team/limits.d.ts +0 -308
- package/dist/team/limits.js +0 -330
- package/dist/team/model.d.ts +0 -104
- package/dist/team/model.js +0 -150
- package/dist/team/panel-rows.d.ts +0 -48
- package/dist/team/panel-rows.js +0 -75
- package/dist/team/timeline.d.ts +0 -74
- package/dist/team/timeline.js +0 -101
- package/dist/team/types.d.ts +0 -354
- package/dist/team/types.js +0 -13
- package/dist/todo/acceptance.d.ts +0 -120
- package/dist/todo/acceptance.js +0 -399
- package/dist/todo/follow-through.d.ts +0 -138
- package/dist/todo/follow-through.js +0 -248
- package/dist/todo/limits.d.ts +0 -152
- package/dist/todo/limits.js +0 -152
- package/dist/todo/panel-rows.d.ts +0 -45
- package/dist/todo/panel-rows.js +0 -70
- package/dist/todo/plan-sections.d.ts +0 -60
- package/dist/todo/plan-sections.js +0 -108
- package/dist/todo/row-window.d.ts +0 -51
- package/dist/todo/row-window.js +0 -107
- package/dist/todo/types.d.ts +0 -124
- package/dist/todo/types.js +0 -12
- package/dist/tools/human-input.d.ts +0 -212
- package/dist/tools/human-input.js +0 -265
- package/dist/tools/patch.d.ts +0 -115
- package/dist/tools/patch.js +0 -453
- package/dist/tools/terminal-output.d.ts +0 -115
- package/dist/tools/terminal-output.js +0 -201
- package/dist/tools/tool-output-store.d.ts +0 -68
- package/dist/tools/tool-output-store.js +0 -102
- package/dist/ui/ActivityLine.d.ts +0 -26
- package/dist/ui/ActivityLine.js +0 -51
- package/dist/ui/AutocompletePopup.d.ts +0 -23
- package/dist/ui/AutocompletePopup.js +0 -17
- package/dist/ui/BottomStatusRow.d.ts +0 -10
- package/dist/ui/BottomStatusRow.js +0 -9
- package/dist/ui/Composer.d.ts +0 -115
- package/dist/ui/Composer.js +0 -64
- package/dist/ui/GovernancePanel.d.ts +0 -50
- package/dist/ui/GovernancePanel.js +0 -77
- package/dist/ui/GovernanceRun.d.ts +0 -18
- package/dist/ui/GovernanceRun.js +0 -11
- package/dist/ui/Header.d.ts +0 -48
- package/dist/ui/Header.js +0 -27
- package/dist/ui/Logo.d.ts +0 -32
- package/dist/ui/Logo.js +0 -65
- package/dist/ui/Markdown.d.ts +0 -29
- package/dist/ui/Markdown.js +0 -116
- package/dist/ui/PromptCaret.d.ts +0 -11
- package/dist/ui/PromptCaret.js +0 -31
- package/dist/ui/PromptInput.d.ts +0 -192
- package/dist/ui/PromptInput.js +0 -689
- package/dist/ui/QueuePanel.d.ts +0 -8
- package/dist/ui/QueuePanel.js +0 -9
- package/dist/ui/QueueStatusRow.d.ts +0 -24
- package/dist/ui/QueueStatusRow.js +0 -51
- package/dist/ui/ScrollbackShell.d.ts +0 -132
- package/dist/ui/ScrollbackShell.js +0 -26
- package/dist/ui/SessionOpener.d.ts +0 -30
- package/dist/ui/SessionOpener.js +0 -12
- package/dist/ui/StatusBar.d.ts +0 -130
- package/dist/ui/StatusBar.js +0 -61
- package/dist/ui/TeamPanel.d.ts +0 -76
- package/dist/ui/TeamPanel.js +0 -103
- package/dist/ui/ToastStack.d.ts +0 -8
- package/dist/ui/ToastStack.js +0 -31
- package/dist/ui/TodoPanel.d.ts +0 -52
- package/dist/ui/TodoPanel.js +0 -214
- package/dist/ui/Transcript.d.ts +0 -105
- package/dist/ui/Transcript.js +0 -258
- package/dist/ui/UpdateLine.d.ts +0 -44
- package/dist/ui/UpdateLine.js +0 -129
- package/dist/ui/activity-phrases.d.ts +0 -33
- package/dist/ui/activity-phrases.js +0 -50
- package/dist/ui/capabilities.d.ts +0 -27
- package/dist/ui/capabilities.js +0 -65
- package/dist/ui/clipboard-task.d.ts +0 -29
- package/dist/ui/clipboard-task.js +0 -66
- package/dist/ui/clipboard.d.ts +0 -31
- package/dist/ui/clipboard.js +0 -157
- package/dist/ui/color-runtime.d.ts +0 -5
- package/dist/ui/color-runtime.js +0 -29
- package/dist/ui/composer-input.d.ts +0 -38
- package/dist/ui/composer-input.js +0 -79
- package/dist/ui/composer-limits.d.ts +0 -30
- package/dist/ui/composer-limits.js +0 -45
- package/dist/ui/composer-rows.d.ts +0 -73
- package/dist/ui/composer-rows.js +0 -129
- package/dist/ui/console-bridge.d.ts +0 -19
- package/dist/ui/console-bridge.js +0 -52
- package/dist/ui/density.d.ts +0 -26
- package/dist/ui/density.js +0 -34
- package/dist/ui/display-tab.d.ts +0 -51
- package/dist/ui/display-tab.js +0 -82
- package/dist/ui/editor-navigation.d.ts +0 -55
- package/dist/ui/editor-navigation.js +0 -96
- package/dist/ui/editor-reducer.d.ts +0 -108
- package/dist/ui/editor-reducer.js +0 -187
- package/dist/ui/enter-frames.d.ts +0 -47
- package/dist/ui/enter-frames.js +0 -117
- package/dist/ui/entries/AssistantEntry.d.ts +0 -37
- package/dist/ui/entries/AssistantEntry.js +0 -43
- package/dist/ui/entries/CompactionCard.d.ts +0 -88
- package/dist/ui/entries/CompactionCard.js +0 -222
- package/dist/ui/entries/DiffView.d.ts +0 -61
- package/dist/ui/entries/DiffView.js +0 -103
- package/dist/ui/entries/EntryFrame.d.ts +0 -23
- package/dist/ui/entries/EntryFrame.js +0 -6
- package/dist/ui/entries/FastCard.d.ts +0 -53
- package/dist/ui/entries/FastCard.js +0 -105
- package/dist/ui/entries/GovernanceCard.d.ts +0 -30
- package/dist/ui/entries/GovernanceCard.js +0 -32
- package/dist/ui/entries/InvocationCard.d.ts +0 -20
- package/dist/ui/entries/InvocationCard.js +0 -32
- package/dist/ui/entries/QueuedEntry.d.ts +0 -27
- package/dist/ui/entries/QueuedEntry.js +0 -33
- package/dist/ui/entries/RetryCard.d.ts +0 -56
- package/dist/ui/entries/RetryCard.js +0 -60
- package/dist/ui/entries/ServiceCard.d.ts +0 -82
- package/dist/ui/entries/ServiceCard.js +0 -151
- package/dist/ui/entries/TeamCard.d.ts +0 -55
- package/dist/ui/entries/TeamCard.js +0 -94
- package/dist/ui/entries/TodoCard.d.ts +0 -54
- package/dist/ui/entries/TodoCard.js +0 -98
- package/dist/ui/entries/ToolCard.d.ts +0 -81
- package/dist/ui/entries/ToolCard.js +0 -169
- package/dist/ui/entries/ToolPreview.d.ts +0 -59
- package/dist/ui/entries/ToolPreview.js +0 -208
- package/dist/ui/entries/UserEntry.d.ts +0 -36
- package/dist/ui/entries/UserEntry.js +0 -57
- package/dist/ui/entries/WaitCard.d.ts +0 -37
- package/dist/ui/entries/WaitCard.js +0 -92
- package/dist/ui/exit-snapshot.d.ts +0 -43
- package/dist/ui/exit-snapshot.js +0 -26
- package/dist/ui/frame-differ.d.ts +0 -166
- package/dist/ui/frame-differ.js +0 -354
- package/dist/ui/frame-observer.d.ts +0 -17
- package/dist/ui/frame-observer.js +0 -94
- package/dist/ui/frame-parser.d.ts +0 -7
- package/dist/ui/frame-parser.js +0 -18
- package/dist/ui/gauge.d.ts +0 -39
- package/dist/ui/gauge.js +0 -55
- package/dist/ui/glyphs.d.ts +0 -178
- package/dist/ui/glyphs.js +0 -165
- package/dist/ui/governance-copy.d.ts +0 -69
- package/dist/ui/governance-copy.js +0 -104
- package/dist/ui/governance-status.d.ts +0 -145
- package/dist/ui/governance-status.js +0 -326
- package/dist/ui/gradient.d.ts +0 -11
- package/dist/ui/gradient.js +0 -50
- package/dist/ui/ink-runtime.d.ts +0 -4
- package/dist/ui/ink-runtime.js +0 -51
- package/dist/ui/interaction-copy.d.ts +0 -84
- package/dist/ui/interaction-copy.js +0 -41
- package/dist/ui/interaction-hints.d.ts +0 -44
- package/dist/ui/interaction-hints.js +0 -97
- package/dist/ui/layout/AppShell.d.ts +0 -17
- package/dist/ui/layout/AppShell.js +0 -6
- package/dist/ui/layout/Gutter.d.ts +0 -67
- package/dist/ui/layout/Gutter.js +0 -42
- package/dist/ui/layout/MeasuredEntry.d.ts +0 -21
- package/dist/ui/layout/MeasuredEntry.js +0 -30
- package/dist/ui/layout/OverlayFrame.d.ts +0 -73
- package/dist/ui/layout/OverlayFrame.js +0 -110
- package/dist/ui/layout/ScrollIndicator.d.ts +0 -32
- package/dist/ui/layout/ScrollIndicator.js +0 -22
- package/dist/ui/layout/ScrollViewport.d.ts +0 -40
- package/dist/ui/layout/ScrollViewport.js +0 -222
- package/dist/ui/layout/agents-board.d.ts +0 -102
- package/dist/ui/layout/agents-board.js +0 -389
- package/dist/ui/layout/autocomplete.d.ts +0 -18
- package/dist/ui/layout/autocomplete.js +0 -26
- package/dist/ui/layout/budget.d.ts +0 -43
- package/dist/ui/layout/budget.js +0 -52
- package/dist/ui/layout/cells.d.ts +0 -61
- package/dist/ui/layout/cells.js +0 -156
- package/dist/ui/layout/document-layout.d.ts +0 -13
- package/dist/ui/layout/document-layout.js +0 -10
- package/dist/ui/layout/follow-state.d.ts +0 -138
- package/dist/ui/layout/follow-state.js +0 -148
- package/dist/ui/layout/frame.d.ts +0 -36
- package/dist/ui/layout/frame.js +0 -39
- package/dist/ui/layout/governance-board.d.ts +0 -121
- package/dist/ui/layout/governance-board.js +0 -382
- package/dist/ui/layout/governance-card.d.ts +0 -53
- package/dist/ui/layout/governance-card.js +0 -134
- package/dist/ui/layout/governance-chip.d.ts +0 -38
- package/dist/ui/layout/governance-chip.js +0 -64
- package/dist/ui/layout/governance-panel.d.ts +0 -85
- package/dist/ui/layout/governance-panel.js +0 -358
- package/dist/ui/layout/governance-roster.d.ts +0 -65
- package/dist/ui/layout/governance-roster.js +0 -275
- package/dist/ui/layout/header-hints.d.ts +0 -90
- package/dist/ui/layout/header-hints.js +0 -110
- package/dist/ui/layout/header-left.d.ts +0 -115
- package/dist/ui/layout/header-left.js +0 -206
- package/dist/ui/layout/invocation-card.d.ts +0 -41
- package/dist/ui/layout/invocation-card.js +0 -91
- package/dist/ui/layout/kit-chip.d.ts +0 -50
- package/dist/ui/layout/kit-chip.js +0 -81
- package/dist/ui/layout/overlay-window.d.ts +0 -43
- package/dist/ui/layout/overlay-window.js +0 -51
- package/dist/ui/layout/queue-layout.d.ts +0 -19
- package/dist/ui/layout/queue-layout.js +0 -26
- package/dist/ui/layout/rail.d.ts +0 -7
- package/dist/ui/layout/rail.js +0 -16
- package/dist/ui/layout/scroll-indicator.d.ts +0 -27
- package/dist/ui/layout/scroll-indicator.js +0 -36
- package/dist/ui/layout/scroll.d.ts +0 -37
- package/dist/ui/layout/scroll.js +0 -99
- package/dist/ui/layout/scrollbar-geometry.d.ts +0 -17
- package/dist/ui/layout/scrollbar-geometry.js +0 -13
- package/dist/ui/layout/session-chip.d.ts +0 -52
- package/dist/ui/layout/session-chip.js +0 -64
- package/dist/ui/layout/shortcut-panel-layout.d.ts +0 -191
- package/dist/ui/layout/shortcut-panel-layout.js +0 -321
- package/dist/ui/layout/status-detail-layout.d.ts +0 -9
- package/dist/ui/layout/status-detail-layout.js +0 -79
- package/dist/ui/layout/status-layout.d.ts +0 -140
- package/dist/ui/layout/status-layout.js +0 -262
- package/dist/ui/layout/task-summary-cell.d.ts +0 -61
- package/dist/ui/layout/task-summary-cell.js +0 -65
- package/dist/ui/layout/team-panel.d.ts +0 -18
- package/dist/ui/layout/team-panel.js +0 -25
- package/dist/ui/layout/team-row.d.ts +0 -139
- package/dist/ui/layout/team-row.js +0 -246
- package/dist/ui/layout/todo-layout.d.ts +0 -62
- package/dist/ui/layout/todo-layout.js +0 -102
- package/dist/ui/layout/useTerminalSize.d.ts +0 -13
- package/dist/ui/layout/useTerminalSize.js +0 -50
- package/dist/ui/layout/viewport-geometry.d.ts +0 -29
- package/dist/ui/layout/viewport-geometry.js +0 -28
- package/dist/ui/layout/virtual-window.d.ts +0 -112
- package/dist/ui/layout/virtual-window.js +0 -494
- package/dist/ui/layout/wait-bar.d.ts +0 -34
- package/dist/ui/layout/wait-bar.js +0 -48
- package/dist/ui/layout/wrap-rows.d.ts +0 -26
- package/dist/ui/layout/wrap-rows.js +0 -88
- package/dist/ui/live-clamp.d.ts +0 -14
- package/dist/ui/live-clamp.js +0 -46
- package/dist/ui/markdown-blocks.d.ts +0 -107
- package/dist/ui/markdown-blocks.js +0 -240
- package/dist/ui/overlays/AgentsBoardOverlay.d.ts +0 -57
- package/dist/ui/overlays/AgentsBoardOverlay.js +0 -183
- package/dist/ui/overlays/ConfirmDialog.d.ts +0 -31
- package/dist/ui/overlays/ConfirmDialog.js +0 -44
- package/dist/ui/overlays/GovernanceBoardOverlay.d.ts +0 -41
- package/dist/ui/overlays/GovernanceBoardOverlay.js +0 -76
- package/dist/ui/overlays/GovernanceSettingsPage.d.ts +0 -48
- package/dist/ui/overlays/GovernanceSettingsPage.js +0 -93
- package/dist/ui/overlays/HelpOverlay.d.ts +0 -29
- package/dist/ui/overlays/HelpOverlay.js +0 -232
- package/dist/ui/overlays/KitEditor.d.ts +0 -23
- package/dist/ui/overlays/KitEditor.js +0 -101
- package/dist/ui/overlays/KitManager.d.ts +0 -23
- package/dist/ui/overlays/KitManager.js +0 -104
- package/dist/ui/overlays/KitPicker.d.ts +0 -49
- package/dist/ui/overlays/KitPicker.js +0 -58
- package/dist/ui/overlays/ModelDiscoveryList.d.ts +0 -23
- package/dist/ui/overlays/ModelDiscoveryList.js +0 -161
- package/dist/ui/overlays/ModelPicker.d.ts +0 -26
- package/dist/ui/overlays/ModelPicker.js +0 -63
- package/dist/ui/overlays/ModelProfileEditor.d.ts +0 -29
- package/dist/ui/overlays/ModelProfileEditor.js +0 -168
- package/dist/ui/overlays/ModelProfilePicker.d.ts +0 -48
- package/dist/ui/overlays/ModelProfilePicker.js +0 -231
- package/dist/ui/overlays/PlanReviewOverlay.d.ts +0 -51
- package/dist/ui/overlays/PlanReviewOverlay.js +0 -132
- package/dist/ui/overlays/PromptEditorPage.d.ts +0 -48
- package/dist/ui/overlays/PromptEditorPage.js +0 -227
- package/dist/ui/overlays/PromptLibraryOverlay.d.ts +0 -37
- package/dist/ui/overlays/PromptLibraryOverlay.js +0 -191
- package/dist/ui/overlays/PromptPicker.d.ts +0 -36
- package/dist/ui/overlays/PromptPicker.js +0 -129
- package/dist/ui/overlays/PromptTextArea.d.ts +0 -86
- package/dist/ui/overlays/PromptTextArea.js +0 -141
- package/dist/ui/overlays/QuestionOverlay.d.ts +0 -39
- package/dist/ui/overlays/QuestionOverlay.js +0 -258
- package/dist/ui/overlays/QueueOverlay.d.ts +0 -22
- package/dist/ui/overlays/QueueOverlay.js +0 -79
- package/dist/ui/overlays/SettingsScreen.d.ts +0 -228
- package/dist/ui/overlays/SettingsScreen.js +0 -1037
- package/dist/ui/overlays/ShortcutPanel.d.ts +0 -39
- package/dist/ui/overlays/ShortcutPanel.js +0 -106
- package/dist/ui/overlays/TeamFanoutPage.d.ts +0 -51
- package/dist/ui/overlays/TeamFanoutPage.js +0 -90
- package/dist/ui/overlays/governance-settings.d.ts +0 -79
- package/dist/ui/overlays/governance-settings.js +0 -140
- package/dist/ui/overlays/kit-picker-state.d.ts +0 -87
- package/dist/ui/overlays/kit-picker-state.js +0 -136
- package/dist/ui/overlays/kit-settings-state.d.ts +0 -129
- package/dist/ui/overlays/kit-settings-state.js +0 -268
- package/dist/ui/overlays/model-probe-view.d.ts +0 -128
- package/dist/ui/overlays/model-probe-view.js +0 -225
- package/dist/ui/overlays/model-profile-state.d.ts +0 -177
- package/dist/ui/overlays/model-profile-state.js +0 -301
- package/dist/ui/overlays/prompt-library-state.d.ts +0 -162
- package/dist/ui/overlays/prompt-library-state.js +0 -335
- package/dist/ui/overlays/prompt-picker-state.d.ts +0 -71
- package/dist/ui/overlays/prompt-picker-state.js +0 -98
- package/dist/ui/overlays/team-fanout-state.d.ts +0 -106
- package/dist/ui/overlays/team-fanout-state.js +0 -155
- package/dist/ui/overlays/use-model-probe.d.ts +0 -30
- package/dist/ui/overlays/use-model-probe.js +0 -109
- package/dist/ui/palettes.d.ts +0 -112
- package/dist/ui/palettes.js +0 -130
- package/dist/ui/paste-frames.d.ts +0 -91
- package/dist/ui/paste-frames.js +0 -117
- package/dist/ui/paste-tokens.d.ts +0 -90
- package/dist/ui/paste-tokens.js +0 -147
- package/dist/ui/render-cache.d.ts +0 -81
- package/dist/ui/render-cache.js +0 -196
- package/dist/ui/render-governor.d.ts +0 -54
- package/dist/ui/render-governor.js +0 -78
- package/dist/ui/run-metrics.d.ts +0 -23
- package/dist/ui/run-metrics.js +0 -27
- package/dist/ui/run-status-row.d.ts +0 -63
- package/dist/ui/run-status-row.js +0 -54
- package/dist/ui/screen.d.ts +0 -107
- package/dist/ui/screen.js +0 -234
- package/dist/ui/scrollback/LiveTail.d.ts +0 -115
- package/dist/ui/scrollback/LiveTail.js +0 -48
- package/dist/ui/scrollback/band.d.ts +0 -114
- package/dist/ui/scrollback/band.js +0 -143
- package/dist/ui/scrollback/budget.d.ts +0 -90
- package/dist/ui/scrollback/budget.js +0 -100
- package/dist/ui/scrollback/canvas.d.ts +0 -100
- package/dist/ui/scrollback/canvas.js +0 -114
- package/dist/ui/scrollback/cursor-probe.d.ts +0 -71
- package/dist/ui/scrollback/cursor-probe.js +0 -133
- package/dist/ui/scrollback/drain.d.ts +0 -32
- package/dist/ui/scrollback/drain.js +0 -64
- package/dist/ui/scrollback/exit-summary.d.ts +0 -23
- package/dist/ui/scrollback/exit-summary.js +0 -25
- package/dist/ui/scrollback/limits.d.ts +0 -98
- package/dist/ui/scrollback/limits.js +0 -98
- package/dist/ui/scrollback/live-preview.d.ts +0 -34
- package/dist/ui/scrollback/live-preview.js +0 -130
- package/dist/ui/scrollback/overflow-print.d.ts +0 -108
- package/dist/ui/scrollback/overflow-print.js +0 -120
- package/dist/ui/scrollback/renderer.d.ts +0 -48
- package/dist/ui/scrollback/renderer.js +0 -186
- package/dist/ui/scrollback/scrollback-writer.d.ts +0 -174
- package/dist/ui/scrollback/scrollback-writer.js +0 -648
- package/dist/ui/scrollback/settled-boundary.d.ts +0 -42
- package/dist/ui/scrollback/settled-boundary.js +0 -109
- package/dist/ui/scrollback/tail-anchor.d.ts +0 -71
- package/dist/ui/scrollback/tail-anchor.js +0 -79
- package/dist/ui/scrollback/tail-window.d.ts +0 -73
- package/dist/ui/scrollback/tail-window.js +0 -89
- package/dist/ui/scrollback/use-scrollback-view.d.ts +0 -139
- package/dist/ui/scrollback/use-scrollback-view.js +0 -601
- package/dist/ui/scrollback/writer-shapes.d.ts +0 -127
- package/dist/ui/scrollback/writer-shapes.js +0 -159
- package/dist/ui/scrollbar-controller.d.ts +0 -30
- package/dist/ui/scrollbar-controller.js +0 -124
- package/dist/ui/selection/highlight.d.ts +0 -39
- package/dist/ui/selection/highlight.js +0 -64
- package/dist/ui/selection/screen-mirror.d.ts +0 -24
- package/dist/ui/selection/screen-mirror.js +0 -35
- package/dist/ui/selection/selection-controller.d.ts +0 -104
- package/dist/ui/selection/selection-controller.js +0 -372
- package/dist/ui/selection/selection.d.ts +0 -90
- package/dist/ui/selection/selection.js +0 -223
- package/dist/ui/shortcuts.d.ts +0 -81
- package/dist/ui/shortcuts.js +0 -221
- package/dist/ui/status-feedback.d.ts +0 -35
- package/dist/ui/status-feedback.js +0 -38
- package/dist/ui/stdout-frame-writer.d.ts +0 -74
- package/dist/ui/stdout-frame-writer.js +0 -155
- package/dist/ui/team-status.d.ts +0 -166
- package/dist/ui/team-status.js +0 -252
- package/dist/ui/terminal-plan.d.ts +0 -52
- package/dist/ui/terminal-plan.js +0 -49
- package/dist/ui/theme.d.ts +0 -96
- package/dist/ui/theme.js +0 -130
- package/dist/ui/transcript-text.d.ts +0 -41
- package/dist/ui/transcript-text.js +0 -282
- package/dist/ui/use-height-store.d.ts +0 -31
- package/dist/ui/use-height-store.js +0 -76
- package/dist/ui/use-render-governor.d.ts +0 -39
- package/dist/ui/use-render-governor.js +0 -57
- package/dist/ui/use-wheel-routing.d.ts +0 -57
- package/dist/ui/use-wheel-routing.js +0 -152
- package/dist/ui/win-vt-force.d.ts +0 -136
- package/dist/ui/win-vt-force.js +0 -237
- package/dist/ui/win-vt-input.d.ts +0 -57
- package/dist/ui/win-vt-input.js +0 -62
- package/dist/update/limits.d.ts +0 -111
- package/dist/update/limits.js +0 -111
- package/dist/update/semver.d.ts +0 -89
- package/dist/update/semver.js +0 -295
- package/dist/update/types.d.ts +0 -169
- package/dist/update/types.js +0 -68
- /package/dist/{ui → app}/session-bridge.d.ts +0 -0
- /package/dist/{ui → app}/session-bridge.js +0 -0
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The acceptance-criteria model (todo-acceptance-criteria §6.2 / §6.3 / §6.6.2).
|
|
3
|
-
*
|
|
4
|
-
* ASCII ONLY: `src/todo/**` is inside the glyph scanner's scope.
|
|
5
|
-
*
|
|
6
|
-
* PURE: no I/O, no timers, no `Date.now()`. The clock is injected where a
|
|
7
|
-
* timestamp is needed, exactly as `TodoStore`'s constructor does (P2-4).
|
|
8
|
-
*
|
|
9
|
-
* ONE PRINCIPLE RUNS THROUGH THE WHOLE FILE, and it is the reason this module
|
|
10
|
-
* exists: **a verdict is evidence, a plan is a belief**. A verdict is never
|
|
11
|
-
* destroyed by omission - not by re-sending the criterion as `pending`, and not
|
|
12
|
-
* by leaving it out of the list altogether - because a full replacement means the
|
|
13
|
-
* model re-sends the whole table on every turn and one lapse would silently erase
|
|
14
|
-
* a conclusion the user was shown. An unchecked criterion, by contrast, IS a
|
|
15
|
-
* plan, so a re-plan is free to drop it.
|
|
16
|
-
*
|
|
17
|
-
* NEVER THROWS, NEVER REJECTS, ONLY REPAIRS (I-9): the same discipline
|
|
18
|
-
* `normalize.ts` records for the todo list itself.
|
|
19
|
-
*/
|
|
20
|
-
import type { AcceptanceItem, AcceptanceSnapshot, PlanPhase, TodoItem, TodoSnapshot } from './types.js';
|
|
21
|
-
export interface NormalizeAcceptanceResult {
|
|
22
|
-
items: AcceptanceItem[];
|
|
23
|
-
/** How many entries the payload contained BEFORE dropping and capping. */
|
|
24
|
-
requested: number;
|
|
25
|
-
/** Human-readable repair notes, already bounded. Empty when nothing was wrong. */
|
|
26
|
-
repairs: string[];
|
|
27
|
-
}
|
|
28
|
-
export interface NormalizeAcceptanceOptions {
|
|
29
|
-
/** `todo.acceptance`, read LIVE (D-11). False short-circuits everything below. */
|
|
30
|
-
enabled: boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Per-lineage dedupe of the restoration note (§6.2.1 step 9 / P2-4).
|
|
33
|
-
*
|
|
34
|
-
* OWNED BY `TodoStore`, not by this module: the note would otherwise be
|
|
35
|
-
* re-printed on every turn, because the model has no way to know the server
|
|
36
|
-
* restored a verdict and would keep sending the same `pending` row. Passing the
|
|
37
|
-
* set in keeps this function pure and keeps the dedupe state in the one object
|
|
38
|
-
* that already owns the plan's lifetime.
|
|
39
|
-
*/
|
|
40
|
-
restoredNotes?: Set<string>;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Repair whatever arrived in the `acceptance` field of a `todo_write` call.
|
|
44
|
-
*
|
|
45
|
-
* ORDER IS SEMANTICS, and one step of that order is load-bearing enough to be a
|
|
46
|
-
* review condition (C-2): `enabled` short-circuits FIRST, then `undefined`, then
|
|
47
|
-
* `Array.isArray`. `undefined` (the key is absent) and `[]` (the model sent an
|
|
48
|
-
* empty array) are NOT the same thing: absent means "I am only updating steps,
|
|
49
|
-
* keep the table", empty means "this plan needs no criteria". This is the one
|
|
50
|
-
* place in the feature where the two differ (§9).
|
|
51
|
-
*/
|
|
52
|
-
export declare function normalizeAcceptance(raw: unknown, previous: readonly AcceptanceItem[], options: NormalizeAcceptanceOptions): NormalizeAcceptanceResult;
|
|
53
|
-
/**
|
|
54
|
-
* The immutable projection of one committed table (§6.2.2).
|
|
55
|
-
*
|
|
56
|
-
* CALLED FROM EXACTLY ONE PLACE PER COMMIT - `TodoStore`'s `write` / `restore` /
|
|
57
|
-
* `clear` / `reopenAll` - and stored, never recomputed on read. `snapshot()` runs
|
|
58
|
-
* on every event; recomputing here would stamp a new `now()` and a new object
|
|
59
|
-
* each frame, invalidating `TodoCard`'s `React.memo` and the transcript's height
|
|
60
|
-
* cache (P1-3).
|
|
61
|
-
*/
|
|
62
|
-
export declare function acceptanceSummary(items: readonly AcceptanceItem[], now: () => number): AcceptanceSnapshot;
|
|
63
|
-
/**
|
|
64
|
-
* The ONE judge of "which phase is this plan in" (I-3 / D-5).
|
|
65
|
-
*
|
|
66
|
-
* Derived rather than stored, so the model, the rail, the transcript card and the
|
|
67
|
-
* machine event stream cannot disagree: a stored field would be a second writer
|
|
68
|
-
* of a fact that two lists already determine. Callers must not invoke this for a
|
|
69
|
-
* `null` plan.
|
|
70
|
-
*/
|
|
71
|
-
export declare function derivePlanPhase(items: readonly TodoItem[], acceptance: readonly AcceptanceItem[] | null): PlanPhase;
|
|
72
|
-
/**
|
|
73
|
-
* "Is there nothing left to do in this plan" - THE single judge (G-4 / I-3).
|
|
74
|
-
*
|
|
75
|
-
* Referenced by follow-through, by `App`'s grace-window re-check and by
|
|
76
|
-
* `TodoStore.beginUserTurn`, because "every step is completed" stopped being the
|
|
77
|
-
* same claim as "the work is done" the moment acceptance criteria existed. Three
|
|
78
|
-
* copies of the old equation is exactly how a plan gets cleared while its last
|
|
79
|
-
* criterion is still unchecked.
|
|
80
|
-
*/
|
|
81
|
-
export declare function planIsResolved(items: readonly TodoItem[], acceptance: readonly AcceptanceItem[] | null): boolean;
|
|
82
|
-
export declare function countUnfinishedSteps(items: readonly TodoItem[]): number;
|
|
83
|
-
export declare function countUncheckedCriteria(acceptance: readonly AcceptanceItem[] | null): number;
|
|
84
|
-
/** What is left in a plan, as the two numbers the notices are written from. */
|
|
85
|
-
export interface Outstanding {
|
|
86
|
-
steps: number;
|
|
87
|
-
checks: number;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* The six follow-through exits all need "how much is left", and after this
|
|
91
|
-
* feature that quantity has two halves (§6.6.1.1). One function decides it, so no
|
|
92
|
-
* exit can print `0 steps left` on a plan whose steps are all done but whose
|
|
93
|
-
* criteria are not - which is what `total - doneCount` would say on every verify
|
|
94
|
-
* turn.
|
|
95
|
-
*/
|
|
96
|
-
export declare function outstandingOf(snapshot: TodoSnapshot): Outstanding;
|
|
97
|
-
/**
|
|
98
|
-
* Singular and plural decided in ONE place (§6.6.1.1): six call sites must not
|
|
99
|
-
* each spell their own.
|
|
100
|
-
*/
|
|
101
|
-
export declare function criteriaPhrase(count: number): string;
|
|
102
|
-
/**
|
|
103
|
-
* A bounded enumeration of what a plan still owes, for the tool result text
|
|
104
|
-
* (§6.3). Ordered `todoFirst` because the tool result is read top-down and the
|
|
105
|
-
* step being worked on is the more urgent of the two when both exist.
|
|
106
|
-
*
|
|
107
|
-
* BOUNDED BY CONSTRUCTION at `VERIFY_MESSAGE_LIMITS.uncheckedItems` rows: this
|
|
108
|
-
* string is paid for on every call (I-11).
|
|
109
|
-
*/
|
|
110
|
-
export declare function planOutstanding(items: readonly TodoItem[], acceptance: readonly AcceptanceItem[] | null, todoFirst: boolean): string[];
|
|
111
|
-
/**
|
|
112
|
-
* The continuation text for the verification phase (§6.6.2).
|
|
113
|
-
*
|
|
114
|
-
* CONSTRUCTIVELY BOUNDED, which is what AC-22 asserts: the unchecked list stops
|
|
115
|
-
* at 5 rows, the failed list at 2, `check` is clipped to 100 characters and
|
|
116
|
-
* `evidence` to 60. Both truncations are deliberate - the full text is already in
|
|
117
|
-
* the model's own previous payload, so re-sending it is paying twice for the same
|
|
118
|
-
* bytes; what the model needs is a reminder of WHICH rows are open.
|
|
119
|
-
*/
|
|
120
|
-
export declare function buildVerifyMessage(snapshot: TodoSnapshot): string;
|
package/dist/todo/acceptance.js
DELETED
|
@@ -1,399 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The acceptance-criteria model (todo-acceptance-criteria §6.2 / §6.3 / §6.6.2).
|
|
3
|
-
*
|
|
4
|
-
* ASCII ONLY: `src/todo/**` is inside the glyph scanner's scope.
|
|
5
|
-
*
|
|
6
|
-
* PURE: no I/O, no timers, no `Date.now()`. The clock is injected where a
|
|
7
|
-
* timestamp is needed, exactly as `TodoStore`'s constructor does (P2-4).
|
|
8
|
-
*
|
|
9
|
-
* ONE PRINCIPLE RUNS THROUGH THE WHOLE FILE, and it is the reason this module
|
|
10
|
-
* exists: **a verdict is evidence, a plan is a belief**. A verdict is never
|
|
11
|
-
* destroyed by omission - not by re-sending the criterion as `pending`, and not
|
|
12
|
-
* by leaving it out of the list altogether - because a full replacement means the
|
|
13
|
-
* model re-sends the whole table on every turn and one lapse would silently erase
|
|
14
|
-
* a conclusion the user was shown. An unchecked criterion, by contrast, IS a
|
|
15
|
-
* plan, so a re-plan is free to drop it.
|
|
16
|
-
*
|
|
17
|
-
* NEVER THROWS, NEVER REJECTS, ONLY REPAIRS (I-9): the same discipline
|
|
18
|
-
* `normalize.ts` records for the todo list itself.
|
|
19
|
-
*/
|
|
20
|
-
import { ACCEPT_LIMITS, VERIFY_MESSAGE_LIMITS } from './limits.js';
|
|
21
|
-
/**
|
|
22
|
-
* Collapse whitespace and clamp.
|
|
23
|
-
*
|
|
24
|
-
* LOCAL RATHER THAN SHARED WITH `normalize.ts`: that module is not in this
|
|
25
|
-
* feature's change plan (§7.2), and the whole helper is four lines. Sanitizing at
|
|
26
|
-
* the store is the argument `normalize.ts::clean` records - a newline inside a
|
|
27
|
-
* rail row breaks the layout - and doing it here means the transcript card, the
|
|
28
|
-
* headless writer and `/todo status` all inherit the guarantee for free.
|
|
29
|
-
*/
|
|
30
|
-
function clean(value, maxChars) {
|
|
31
|
-
if (typeof value !== 'string')
|
|
32
|
-
return '';
|
|
33
|
-
const collapsed = value.replace(/\s+/g, ' ').trim();
|
|
34
|
-
return collapsed.length > maxChars ? collapsed.slice(0, maxChars) : collapsed;
|
|
35
|
-
}
|
|
36
|
-
/** The three states the MODEL may name. `in_progress` is store-owned (P0-1). */
|
|
37
|
-
const MODEL_STATUSES = new Set([
|
|
38
|
-
'pending',
|
|
39
|
-
'passed',
|
|
40
|
-
'failed',
|
|
41
|
-
]);
|
|
42
|
-
const EMPTY = { items: [], requested: 0, repairs: [] };
|
|
43
|
-
/**
|
|
44
|
-
* Repair whatever arrived in the `acceptance` field of a `todo_write` call.
|
|
45
|
-
*
|
|
46
|
-
* ORDER IS SEMANTICS, and one step of that order is load-bearing enough to be a
|
|
47
|
-
* review condition (C-2): `enabled` short-circuits FIRST, then `undefined`, then
|
|
48
|
-
* `Array.isArray`. `undefined` (the key is absent) and `[]` (the model sent an
|
|
49
|
-
* empty array) are NOT the same thing: absent means "I am only updating steps,
|
|
50
|
-
* keep the table", empty means "this plan needs no criteria". This is the one
|
|
51
|
-
* place in the feature where the two differ (§9).
|
|
52
|
-
*/
|
|
53
|
-
export function normalizeAcceptance(raw, previous, options) {
|
|
54
|
-
// 1. The capability is off. STRONGEST SHORT-CIRCUIT: no data may survive it, or
|
|
55
|
-
// `/todo acceptance off` would look like it did nothing while the rail kept
|
|
56
|
-
// drawing an ACCEPT section (P0-2). No repair note either - the model
|
|
57
|
-
// sending an extra field it learned elsewhere is not its mistake, and a note
|
|
58
|
-
// would turn a harmless extra key into a wasted turn.
|
|
59
|
-
if (!options.enabled)
|
|
60
|
-
return { ...EMPTY, items: [] };
|
|
61
|
-
// 2. The key is ABSENT: this turn is about the steps. Keep the table.
|
|
62
|
-
if (raw === undefined) {
|
|
63
|
-
return { items: [...previous], requested: previous.length, repairs: [] };
|
|
64
|
-
}
|
|
65
|
-
// 3. Not an array at all: nothing usable. Same disposition as `normalizeTodos`.
|
|
66
|
-
if (!Array.isArray(raw))
|
|
67
|
-
return { ...EMPTY, items: [] };
|
|
68
|
-
const requested = raw.length;
|
|
69
|
-
const repairs = [];
|
|
70
|
-
const kept = [];
|
|
71
|
-
for (const entry of raw) {
|
|
72
|
-
const item = readItem(entry);
|
|
73
|
-
if (!item)
|
|
74
|
-
continue;
|
|
75
|
-
kept.push(item);
|
|
76
|
-
}
|
|
77
|
-
const dropped = requested - kept.length;
|
|
78
|
-
if (dropped > 0) {
|
|
79
|
-
repairs.push(`${dropped} ${dropped === 1 ? 'criterion was' : 'criteria were'} dropped: each needs a non-empty content string.`);
|
|
80
|
-
}
|
|
81
|
-
const verdicts = applyVerdictRules(kept, previous, options.restoredNotes, repairs);
|
|
82
|
-
// AN EXPLICIT EMPTY ARRAY IS A STATEMENT, NOT AN OMISSION (§9): the model is saying
|
|
83
|
-
// "this plan needs no criteria", so nothing is restored from the previous table.
|
|
84
|
-
// Only a NON-empty replacement can be missing a row it did not mean to drop.
|
|
85
|
-
const restored = requested === 0
|
|
86
|
-
? verdicts
|
|
87
|
-
: restoreOmitted(verdicts, previous, options.restoredNotes, repairs);
|
|
88
|
-
// STEP 11: `reopen` is CONSUMED, not stored. A table carrying it would put an input
|
|
89
|
-
// flag into the snapshot, the session file and the transcript card, where nothing
|
|
90
|
-
// reads it and everything would have to learn to ignore it.
|
|
91
|
-
return { items: cap(restored, requested, repairs).map(withoutReopen), requested, repairs };
|
|
92
|
-
}
|
|
93
|
-
function withoutReopen(item) {
|
|
94
|
-
if (item.reopen === undefined)
|
|
95
|
-
return item;
|
|
96
|
-
const { reopen: _reopen, ...rest } = item;
|
|
97
|
-
return rest;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* One payload entry, repaired. `null` means it is not a criterion at all.
|
|
101
|
-
*
|
|
102
|
-
* `in_progress` IS DOWNGRADED SILENTLY (P0-1): the store owns that state
|
|
103
|
-
* (`TodoStore.write` re-derives it after every commit), the schema never offers
|
|
104
|
-
* it, and a note would be re-printed on every turn for a model that keeps echoing
|
|
105
|
-
* it. Downgrading produces exactly the same result as sending `pending`, which is
|
|
106
|
-
* the idempotence we want.
|
|
107
|
-
*/
|
|
108
|
-
function readItem(entry) {
|
|
109
|
-
if (!entry || typeof entry !== 'object')
|
|
110
|
-
return null;
|
|
111
|
-
const src = entry;
|
|
112
|
-
const content = clean(src.content, ACCEPT_LIMITS.contentChars);
|
|
113
|
-
// The one field with no repair: a criterion with nothing to say is not a
|
|
114
|
-
// criterion.
|
|
115
|
-
if (content.length === 0)
|
|
116
|
-
return null;
|
|
117
|
-
const status = (typeof src.status === 'string' && MODEL_STATUSES.has(src.status) ? src.status : 'pending');
|
|
118
|
-
const item = {
|
|
119
|
-
content,
|
|
120
|
-
check: clean(src.check, ACCEPT_LIMITS.checkChars),
|
|
121
|
-
status,
|
|
122
|
-
evidence: clean(src.evidence, ACCEPT_LIMITS.evidenceChars),
|
|
123
|
-
};
|
|
124
|
-
// Carried just far enough for the verdict rules to see it; stripped again before
|
|
125
|
-
// the table is returned (§6.2.1 step 11: the flag is input, never storage).
|
|
126
|
-
if (src.reopen === true)
|
|
127
|
-
item.reopen = true;
|
|
128
|
-
return item;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* A verdict without evidence is not a verdict (D-3), and a verdict is not undone
|
|
132
|
-
* by re-sending the same criterion as `pending` (D-4, first half).
|
|
133
|
-
*
|
|
134
|
-
* `reopen` is the only door back to `pending`, and it also clears the evidence:
|
|
135
|
-
* re-opening a criterion means giving up what it claimed before.
|
|
136
|
-
*/
|
|
137
|
-
function applyVerdictRules(items, previous, restoredNotes, repairs) {
|
|
138
|
-
const byContent = new Map();
|
|
139
|
-
for (const prior of previous) {
|
|
140
|
-
if (!byContent.has(prior.content))
|
|
141
|
-
byContent.set(prior.content, prior);
|
|
142
|
-
}
|
|
143
|
-
return items.map((item, index) => {
|
|
144
|
-
if (item.status !== 'pending') {
|
|
145
|
-
if (item.evidence.length > 0)
|
|
146
|
-
return item;
|
|
147
|
-
repairs.push(`criterion ${index + 1} had a verdict but no evidence; it is back to unchecked.`);
|
|
148
|
-
return { ...item, status: 'pending', evidence: '' };
|
|
149
|
-
}
|
|
150
|
-
// RE-OPENING IS THE ONE DELIBERATE WAY BACK TO UNCHECKED (D-4), and it also
|
|
151
|
-
// forfeits the old evidence: a criterion being checked again has no verdict yet.
|
|
152
|
-
if (item.reopen === true)
|
|
153
|
-
return { ...item, evidence: '' };
|
|
154
|
-
const prior = byContent.get(item.content);
|
|
155
|
-
if (!prior || prior.status === 'pending')
|
|
156
|
-
return item;
|
|
157
|
-
noteOnce(restoredNotes, item.content, repairs, `criterion ${index + 1} kept its earlier verdict (a verdict is not undone by ` +
|
|
158
|
-
'omission; send reopen: true to re-check it).');
|
|
159
|
-
return { ...item, status: prior.status, evidence: prior.evidence };
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Record a restoration note AT MOST ONCE PER CRITERION (P2-4).
|
|
164
|
-
*
|
|
165
|
-
* The model does not know the server restored anything, so it sends the same row
|
|
166
|
-
* again on the next turn. Without this the identical `Note:` is billed every turn,
|
|
167
|
-
* for as long as the plan lives.
|
|
168
|
-
*/
|
|
169
|
-
function noteOnce(restoredNotes, content, repairs, text) {
|
|
170
|
-
if (!restoredNotes) {
|
|
171
|
-
repairs.push(text);
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
if (restoredNotes.has(content))
|
|
175
|
-
return;
|
|
176
|
-
restoredNotes.add(content);
|
|
177
|
-
repairs.push(text);
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* D-4's OTHER HALF (P0-4): a criterion that is MISSING from a full replacement
|
|
181
|
-
* keeps its verdict too.
|
|
182
|
-
*
|
|
183
|
-
* The commonest shape of "omission" is not a re-sent `pending` row, it is a
|
|
184
|
-
* table that is one row shorter - and without this the criterion, its verdict and
|
|
185
|
-
* its evidence all disappear while `total` silently shrinks (`4/5` becomes
|
|
186
|
-
* `3/4` and nothing says so).
|
|
187
|
-
*
|
|
188
|
-
* Restored rows go to the TAIL, which is also where `cap` starts cutting, so a
|
|
189
|
-
* re-plan that grows past the ceiling loses restored rows rather than the model's
|
|
190
|
-
* newest intent. An UNCHECKED omitted criterion is dropped on purpose: that is a
|
|
191
|
-
* plan, not a verdict.
|
|
192
|
-
*/
|
|
193
|
-
function restoreOmitted(items, previous, restoredNotes, repairs) {
|
|
194
|
-
if (previous.length === 0)
|
|
195
|
-
return items;
|
|
196
|
-
const present = new Set(items.map((item) => item.content));
|
|
197
|
-
const restored = [...items];
|
|
198
|
-
for (const prior of previous) {
|
|
199
|
-
if (present.has(prior.content) || prior.status === 'pending')
|
|
200
|
-
continue;
|
|
201
|
-
present.add(prior.content);
|
|
202
|
-
restored.push({
|
|
203
|
-
content: prior.content,
|
|
204
|
-
check: prior.check,
|
|
205
|
-
status: prior.status,
|
|
206
|
-
evidence: prior.evidence,
|
|
207
|
-
});
|
|
208
|
-
// ALWAYS RESTORED; the NOTE is what is deduped, never the restoration itself.
|
|
209
|
-
noteOnce(restoredNotes, prior.content, repairs, `criterion ${restored.length} was missing from the list but had a verdict; it was kept ` +
|
|
210
|
-
'with its evidence (send reopen: true to re-check it).');
|
|
211
|
-
}
|
|
212
|
-
return restored;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* DROP FIRST AND CAP SECOND would be wrong here, and the ORDER is reversed on
|
|
216
|
-
* purpose: restored rows sit at the tail exactly so that this `slice` takes them
|
|
217
|
-
* before it takes anything the model just sent.
|
|
218
|
-
*/
|
|
219
|
-
function cap(items, requested, repairs) {
|
|
220
|
-
const ceiling = ACCEPT_LIMITS.maxItems;
|
|
221
|
-
if (items.length <= ceiling)
|
|
222
|
-
return items;
|
|
223
|
-
const dropped = items.length - ceiling;
|
|
224
|
-
repairs.push(`${requested} criteria were sent; the last ${dropped} were dropped (maximum ${ceiling}).`);
|
|
225
|
-
return items.slice(0, ceiling);
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* The immutable projection of one committed table (§6.2.2).
|
|
229
|
-
*
|
|
230
|
-
* CALLED FROM EXACTLY ONE PLACE PER COMMIT - `TodoStore`'s `write` / `restore` /
|
|
231
|
-
* `clear` / `reopenAll` - and stored, never recomputed on read. `snapshot()` runs
|
|
232
|
-
* on every event; recomputing here would stamp a new `now()` and a new object
|
|
233
|
-
* each frame, invalidating `TodoCard`'s `React.memo` and the transcript's height
|
|
234
|
-
* cache (P1-3).
|
|
235
|
-
*/
|
|
236
|
-
export function acceptanceSummary(items, now) {
|
|
237
|
-
let passedCount = 0;
|
|
238
|
-
let failedCount = 0;
|
|
239
|
-
for (const item of items) {
|
|
240
|
-
if (item.status === 'passed')
|
|
241
|
-
passedCount += 1;
|
|
242
|
-
else if (item.status === 'failed')
|
|
243
|
-
failedCount += 1;
|
|
244
|
-
}
|
|
245
|
-
return {
|
|
246
|
-
items: [...items],
|
|
247
|
-
total: items.length,
|
|
248
|
-
checkedCount: passedCount + failedCount,
|
|
249
|
-
passedCount,
|
|
250
|
-
failedCount,
|
|
251
|
-
updatedAt: now(),
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* The ONE judge of "which phase is this plan in" (I-3 / D-5).
|
|
256
|
-
*
|
|
257
|
-
* Derived rather than stored, so the model, the rail, the transcript card and the
|
|
258
|
-
* machine event stream cannot disagree: a stored field would be a second writer
|
|
259
|
-
* of a fact that two lists already determine. Callers must not invoke this for a
|
|
260
|
-
* `null` plan.
|
|
261
|
-
*/
|
|
262
|
-
export function derivePlanPhase(items, acceptance) {
|
|
263
|
-
const allStepsDone = items.length > 0 && items.every((item) => item.status === 'completed');
|
|
264
|
-
if (!allStepsDone)
|
|
265
|
-
return 'work';
|
|
266
|
-
if (!acceptance || acceptance.length === 0)
|
|
267
|
-
return 'done';
|
|
268
|
-
// "Unresolved" is `pending` and `in_progress`; the other two states of the
|
|
269
|
-
// four-state model are already verdicts.
|
|
270
|
-
const unresolved = acceptance.some((item) => item.status === 'pending' || item.status === 'in_progress');
|
|
271
|
-
return unresolved ? 'verify' : 'done';
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* "Is there nothing left to do in this plan" - THE single judge (G-4 / I-3).
|
|
275
|
-
*
|
|
276
|
-
* Referenced by follow-through, by `App`'s grace-window re-check and by
|
|
277
|
-
* `TodoStore.beginUserTurn`, because "every step is completed" stopped being the
|
|
278
|
-
* same claim as "the work is done" the moment acceptance criteria existed. Three
|
|
279
|
-
* copies of the old equation is exactly how a plan gets cleared while its last
|
|
280
|
-
* criterion is still unchecked.
|
|
281
|
-
*/
|
|
282
|
-
export function planIsResolved(items, acceptance) {
|
|
283
|
-
return items.length > 0 && derivePlanPhase(items, acceptance) === 'done';
|
|
284
|
-
}
|
|
285
|
-
export function countUnfinishedSteps(items) {
|
|
286
|
-
let count = 0;
|
|
287
|
-
for (const item of items)
|
|
288
|
-
if (item.status !== 'completed')
|
|
289
|
-
count += 1;
|
|
290
|
-
return count;
|
|
291
|
-
}
|
|
292
|
-
export function countUncheckedCriteria(acceptance) {
|
|
293
|
-
if (!acceptance)
|
|
294
|
-
return 0;
|
|
295
|
-
let count = 0;
|
|
296
|
-
for (const item of acceptance) {
|
|
297
|
-
if (item.status === 'pending' || item.status === 'in_progress')
|
|
298
|
-
count += 1;
|
|
299
|
-
}
|
|
300
|
-
return count;
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* The six follow-through exits all need "how much is left", and after this
|
|
304
|
-
* feature that quantity has two halves (§6.6.1.1). One function decides it, so no
|
|
305
|
-
* exit can print `0 steps left` on a plan whose steps are all done but whose
|
|
306
|
-
* criteria are not - which is what `total - doneCount` would say on every verify
|
|
307
|
-
* turn.
|
|
308
|
-
*/
|
|
309
|
-
export function outstandingOf(snapshot) {
|
|
310
|
-
return {
|
|
311
|
-
steps: countUnfinishedSteps(snapshot.items),
|
|
312
|
-
checks: countUncheckedCriteria(snapshot.acceptance?.items ?? null),
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
/**
|
|
316
|
-
* Singular and plural decided in ONE place (§6.6.1.1): six call sites must not
|
|
317
|
-
* each spell their own.
|
|
318
|
-
*/
|
|
319
|
-
export function criteriaPhrase(count) {
|
|
320
|
-
return count === 1 ? '1 acceptance criterion' : `${count} acceptance criteria`;
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* A bounded enumeration of what a plan still owes, for the tool result text
|
|
324
|
-
* (§6.3). Ordered `todoFirst` because the tool result is read top-down and the
|
|
325
|
-
* step being worked on is the more urgent of the two when both exist.
|
|
326
|
-
*
|
|
327
|
-
* BOUNDED BY CONSTRUCTION at `VERIFY_MESSAGE_LIMITS.uncheckedItems` rows: this
|
|
328
|
-
* string is paid for on every call (I-11).
|
|
329
|
-
*/
|
|
330
|
-
export function planOutstanding(items, acceptance, todoFirst) {
|
|
331
|
-
const steps = items
|
|
332
|
-
.map((item, index) => ({ item, index }))
|
|
333
|
-
.filter(({ item }) => item.status !== 'completed')
|
|
334
|
-
.map(({ item, index }) => `${index + 1}. ${item.content}`);
|
|
335
|
-
const checks = (acceptance ?? [])
|
|
336
|
-
.map((item, index) => ({ item, index }))
|
|
337
|
-
.filter(({ item }) => item.status === 'pending' || item.status === 'in_progress')
|
|
338
|
-
.map(({ item, index }) => `${index + 1}. ${item.content}`);
|
|
339
|
-
const limit = VERIFY_MESSAGE_LIMITS.uncheckedItems;
|
|
340
|
-
return (todoFirst ? [...steps, ...checks] : [...checks, ...steps]).slice(0, limit);
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* The continuation text for the verification phase (§6.6.2).
|
|
344
|
-
*
|
|
345
|
-
* CONSTRUCTIVELY BOUNDED, which is what AC-22 asserts: the unchecked list stops
|
|
346
|
-
* at 5 rows, the failed list at 2, `check` is clipped to 100 characters and
|
|
347
|
-
* `evidence` to 60. Both truncations are deliberate - the full text is already in
|
|
348
|
-
* the model's own previous payload, so re-sending it is paying twice for the same
|
|
349
|
-
* bytes; what the model needs is a reminder of WHICH rows are open.
|
|
350
|
-
*/
|
|
351
|
-
export function buildVerifyMessage(snapshot) {
|
|
352
|
-
const criteria = snapshot.acceptance?.items ?? [];
|
|
353
|
-
const unchecked = selectRows(criteria, (item) => item.status === 'pending' || item.status === 'in_progress', VERIFY_MESSAGE_LIMITS.uncheckedItems);
|
|
354
|
-
const failed = selectRows(criteria, (item) => item.status === 'failed', VERIFY_MESSAGE_LIMITS.failedItems);
|
|
355
|
-
const lines = ['Every step is complete. Verify the acceptance criteria one at a time.'];
|
|
356
|
-
if (unchecked.rows.length > 0) {
|
|
357
|
-
lines.push('Unchecked:');
|
|
358
|
-
for (const { item, index } of unchecked.rows) {
|
|
359
|
-
lines.push(`${index + 1}. ${item.content}`);
|
|
360
|
-
const hint = clip(item.check, VERIFY_MESSAGE_LIMITS.checkChars);
|
|
361
|
-
if (hint.length > 0)
|
|
362
|
-
lines.push(` check: ${hint}`);
|
|
363
|
-
}
|
|
364
|
-
if (unchecked.hidden > 0)
|
|
365
|
-
lines.push(` ... and ${unchecked.hidden} more`);
|
|
366
|
-
}
|
|
367
|
-
if (failed.rows.length > 0) {
|
|
368
|
-
lines.push(`${failed.total} failed so far - fix those before claiming the work is done:`);
|
|
369
|
-
for (const { item, index } of failed.rows) {
|
|
370
|
-
lines.push(`${index + 1}. ${item.content}`);
|
|
371
|
-
const seen = clip(item.evidence, VERIFY_MESSAGE_LIMITS.evidenceChars);
|
|
372
|
-
if (seen.length > 0)
|
|
373
|
-
lines.push(` evidence: ${seen}`);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
lines.push('Check ONE, then call todo_write with that verdict and its evidence.');
|
|
377
|
-
return lines.join('\n');
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* The first `limit` matches, each carrying its 1-BASED position in the WHOLE
|
|
381
|
-
* table: "step 5" must mean the same thing here as it does in the rail, which is
|
|
382
|
-
* why the position is read from the full walk rather than from the filtered list.
|
|
383
|
-
*/
|
|
384
|
-
function selectRows(all, keep, limit) {
|
|
385
|
-
const rows = [];
|
|
386
|
-
let total = 0;
|
|
387
|
-
for (let index = 0; index < all.length; index += 1) {
|
|
388
|
-
const item = all[index];
|
|
389
|
-
if (!keep(item))
|
|
390
|
-
continue;
|
|
391
|
-
total += 1;
|
|
392
|
-
if (rows.length < limit)
|
|
393
|
-
rows.push({ item, index });
|
|
394
|
-
}
|
|
395
|
-
return { rows, total, hidden: Math.max(0, total - rows.length) };
|
|
396
|
-
}
|
|
397
|
-
function clip(text, maxChars) {
|
|
398
|
-
return text.length > maxChars ? text.slice(0, maxChars) : text;
|
|
399
|
-
}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* follow-through — what happens when a run ends with unfinished work
|
|
3
|
-
* (todo-plan-followthrough §3.2 / §3.3; todo-acceptance-criteria §6.6).
|
|
4
|
-
*
|
|
5
|
-
* ASCII ONLY: `src/todo/**` is inside the glyph scanner's scope
|
|
6
|
-
* (`glyphs.test.ts`), and every string this module builds is user-visible.
|
|
7
|
-
*
|
|
8
|
-
* PURE. No I/O, no timers, no React, no `Date.now()` — the discipline
|
|
9
|
-
* `TodoStore`'s injected clock already establishes. The TUI (`App.tsx`) and
|
|
10
|
-
* headless mode (`agent/headless.ts`) both call `decideFollowThrough`, which is
|
|
11
|
-
* the only reason the two cannot drift; a second copy of this table in either
|
|
12
|
-
* caller is the defect this file exists to prevent.
|
|
13
|
-
*
|
|
14
|
-
* IT NEVER WRITES TO `TodoStore` (I-1 / C-3). Follow-through reads snapshots and
|
|
15
|
-
* produces a MESSAGE; the plan changes only when the model calls `todo_write`,
|
|
16
|
-
* which keeps the list a projection of what the model believes.
|
|
17
|
-
*
|
|
18
|
-
* "UNFINISHED WORK" HAS TWO HALVES SINCE ACCEPTANCE CRITERIA EXISTED (§6.6.1):
|
|
19
|
-
* steps still to do, and criteria still unchecked. Every exit below reads them
|
|
20
|
-
* from `outstandingOf`, and while ANY step is left the wording is byte-identical
|
|
21
|
-
* to the version without this feature (I-5) - because that is the phase in which
|
|
22
|
-
* the old sentences are already true. In the verification phase, where
|
|
23
|
-
* `total - doneCount` is always 0, saying "0 steps left" would be the exact
|
|
24
|
-
* opposite of the truth at the moment the user most wants reassurance.
|
|
25
|
-
*/
|
|
26
|
-
import type { TodoSnapshot } from './types.js';
|
|
27
|
-
/**
|
|
28
|
-
* `notify` — say something true and stop (the default; round 1's behaviour).
|
|
29
|
-
* `auto` — continue the plan, under the economy below.
|
|
30
|
-
* `off` — say nothing at all.
|
|
31
|
-
*/
|
|
32
|
-
export type FollowThroughMode = 'notify' | 'auto' | 'off';
|
|
33
|
-
/** Carried across runs by the caller. Serializable, comparable, inert. */
|
|
34
|
-
export interface FollowThroughBudget {
|
|
35
|
-
/**
|
|
36
|
-
* Auto-continuations issued against this plan LINEAGE.
|
|
37
|
-
*
|
|
38
|
-
* MONOTONIC UNTIL THE PLAN IS GONE (P0-1 / D-16 / I-8). It is NOT reset by a
|
|
39
|
-
* re-plan: a model that emits a differently-sized plan on every continuation
|
|
40
|
-
* would otherwise zero both counters every turn while `staleTurns` also never
|
|
41
|
-
* fires (it IS writing), which is an unbounded loop reachable by ordinary
|
|
42
|
-
* "re-plan as you learn" behaviour rather than by anything adversarial.
|
|
43
|
-
*
|
|
44
|
-
* A refactor that "simplifies" `advanceBudget` back to returning a zeroed budget
|
|
45
|
-
* on a `total` change re-opens that hole, and the symptom is a bill rather than a
|
|
46
|
-
* test failure. `advanceBudget`'s own test pins it.
|
|
47
|
-
*/
|
|
48
|
-
used: number;
|
|
49
|
-
/** Consecutive auto-continuations after which the PROGRESS POINT did not increase. */
|
|
50
|
-
noProgressStreak: number;
|
|
51
|
-
/**
|
|
52
|
-
* Identity of the plan the budget was opened against: steps PLUS criteria.
|
|
53
|
-
*
|
|
54
|
-
* `todo-acceptance-criteria §6.6.3`: a re-plan that goes from 3 criteria to 4 is
|
|
55
|
-
* a re-plan even when the number of steps is unchanged, and without the second
|
|
56
|
-
* term it would be mistaken for "the same plan made no progress".
|
|
57
|
-
*/
|
|
58
|
-
anchorTotal: number;
|
|
59
|
-
/**
|
|
60
|
-
* The PROGRESS POINT as observed at the PREVIOUS `agent_end` — which is what
|
|
61
|
-
* `advanceBudget` assigns, in every branch, and therefore what the next call
|
|
62
|
-
* compares against.
|
|
63
|
-
*
|
|
64
|
-
* COMPOSITE SINCE todo-acceptance-criteria: it is `doneCount + checkedCount`,
|
|
65
|
-
* not `doneCount`. The name is kept deliberately (Q-6): this object is carried
|
|
66
|
-
* across runs by `App`'s `budgetRef`, so renaming a field changes the shape any
|
|
67
|
-
* external holder - including test fixtures - sees. With only `doneCount`, a
|
|
68
|
-
* verification run that checks one criterion per turn would be recorded as "no
|
|
69
|
-
* progress" and `maxNoProgressContinues` would hand control back after two
|
|
70
|
-
* checks, making it impossible to verify a third criterion automatically.
|
|
71
|
-
*/
|
|
72
|
-
doneAtRunStart: number;
|
|
73
|
-
}
|
|
74
|
-
export interface FollowThroughInput {
|
|
75
|
-
mode: FollowThroughMode;
|
|
76
|
-
snapshot: TodoSnapshot | null;
|
|
77
|
-
/**
|
|
78
|
-
* Why the run ended. Derived by the caller, never carried by `AgentEndEvent`
|
|
79
|
-
* (C-2): core's event has `messages` and nothing else, and this round does not
|
|
80
|
-
* change core to make it otherwise.
|
|
81
|
-
*/
|
|
82
|
-
runEnd: {
|
|
83
|
-
aborted: boolean;
|
|
84
|
-
errored: boolean;
|
|
85
|
-
};
|
|
86
|
-
budget: FollowThroughBudget;
|
|
87
|
-
/**
|
|
88
|
-
* `false` in headless: no grace window (there is nobody to use it), and a
|
|
89
|
-
* different notice verb, because `-p` writes `[todo] ...` lines rather than
|
|
90
|
-
* transcript notices.
|
|
91
|
-
*/
|
|
92
|
-
interactive: boolean;
|
|
93
|
-
}
|
|
94
|
-
export type FollowThroughDecision = {
|
|
95
|
-
kind: 'none';
|
|
96
|
-
} | {
|
|
97
|
-
kind: 'notify';
|
|
98
|
-
level: 'info' | 'warn';
|
|
99
|
-
text: string;
|
|
100
|
-
} | {
|
|
101
|
-
kind: 'continue';
|
|
102
|
-
message: string;
|
|
103
|
-
graceMs: number;
|
|
104
|
-
notice: string;
|
|
105
|
-
};
|
|
106
|
-
/** The zero budget. A fresh App, a fresh headless run, and every cleared plan. */
|
|
107
|
-
export declare function emptyBudget(): FollowThroughBudget;
|
|
108
|
-
export declare function decideFollowThrough(input: FollowThroughInput): FollowThroughDecision;
|
|
109
|
-
/**
|
|
110
|
-
* Fold a finished run into the budget. Called BEFORE `decideFollowThrough`, on
|
|
111
|
-
* every `agent_end` (and on every resolved `prompt()` in headless).
|
|
112
|
-
*
|
|
113
|
-
* `used` is NOT incremented here — a decision that is never acted on costs
|
|
114
|
-
* nothing. Both fire points charge it themselves (I-5): the TUI's grace timer and
|
|
115
|
-
* the headless loop, and BOTH are required. An uncharged counter in `-p` is an
|
|
116
|
-
* uncapped loop in the one environment with no human to press Esc (P1-2).
|
|
117
|
-
*/
|
|
118
|
-
export declare function advanceBudget(prev: FollowThroughBudget, snapshot: TodoSnapshot | null, wasAutoContinuation: boolean): FollowThroughBudget;
|
|
119
|
-
/**
|
|
120
|
-
* The text an auto-continuation — or `/todo continue` — submits.
|
|
121
|
-
*
|
|
122
|
-
* IT ENUMERATES RATHER THAN REFERRING (D-11). Round 1 submitted the fixed string
|
|
123
|
-
* "Continue with the remaining todo items.", which is a reference to a
|
|
124
|
-
* `todo_write` call that in a long session may have scrolled far enough back that
|
|
125
|
-
* the model reconstructs it wrong — and reconstructing it wrong is SILENT, because
|
|
126
|
-
* whatever it writes next is a full replacement and becomes the new truth.
|
|
127
|
-
*
|
|
128
|
-
* IN THE VERIFICATION PHASE IT BRANCHES TO `buildVerifyMessage` (§6.6.2): with
|
|
129
|
-
* every step completed, the old body would emit "These steps are not done yet:"
|
|
130
|
-
* followed by nothing at all, which is what `/todo continue` and auto-continue
|
|
131
|
-
* would both submit at exactly the moment the plan needs its criteria checked.
|
|
132
|
-
*
|
|
133
|
-
* `content` and never `activeForm`: the imperative is what an instruction wants.
|
|
134
|
-
* Numbers are the item's 1-based position in the WHOLE plan, so "step 5" means the
|
|
135
|
-
* same thing here as it does in the rail. Completed items are omitted.
|
|
136
|
-
* `TODO_LIMITS.maxItems` bounds the whole message at roughly 1.8 kB.
|
|
137
|
-
*/
|
|
138
|
-
export declare function buildContinuationMessage(snapshot: TodoSnapshot): string;
|