@mjasnikovs/pi-task 0.38.29 → 0.38.31
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/dist/config/config.d.ts +70 -70
- package/dist/config/config.js +26 -35
- package/dist/config/extension-list.d.ts +6 -5
- package/dist/config/extension-list.js +3 -2
- package/dist/config/reasoning-args.d.ts +9 -7
- package/dist/config/reasoning-args.js +12 -10
- package/dist/config/reasoning.d.ts +44 -105
- package/dist/config/reasoning.js +27 -704
- package/dist/config/register.d.ts +34 -48
- package/dist/config/register.js +41 -51
- package/dist/config/tool-list.d.ts +16 -16
- package/dist/config/tool-list.js +1 -1
- package/dist/index.js +2 -0
- package/dist/remote/bridge.d.ts +19 -10
- package/dist/remote/bridge.js +3 -2
- package/dist/remote/broadcast.js +3 -1
- package/dist/remote/events.js +12 -11
- package/dist/remote/history.d.ts +1 -1
- package/dist/remote/protocol.d.ts +6 -3
- package/dist/remote/protocol.js +2 -1
- package/dist/remote/push.d.ts +16 -16
- package/dist/remote/push.js +27 -27
- package/dist/remote/register.d.ts +3 -3
- package/dist/remote/register.js +17 -19
- package/dist/remote/server.d.ts +9 -8
- package/dist/remote/server.js +15 -14
- package/dist/remote/session-state.d.ts +5 -4
- package/dist/remote/session-state.js +8 -5
- package/dist/remote/sw.d.ts +7 -6
- package/dist/remote/sw.js +7 -6
- package/dist/remote/tailscale.d.ts +4 -2
- package/dist/remote/tailscale.js +4 -2
- package/dist/remote/ui-highlight.js +6 -5
- package/dist/remote/ui-render.js +4 -4
- package/dist/remote/ui-script.js +24 -24
- package/dist/remote/ui-styles.d.ts +1 -1
- package/dist/remote/ui-styles.js +10 -13
- package/dist/remote/ui-tools.js +9 -6
- package/dist/shared/child-extensions.d.ts +29 -17
- package/dist/shared/child-extensions.js +29 -17
- package/dist/shared/child-output.d.ts +30 -24
- package/dist/shared/child-output.js +25 -17
- package/dist/shared/child-process.d.ts +47 -40
- package/dist/shared/child-process.js +50 -59
- package/dist/shared/command-watchdog.d.ts +85 -16
- package/dist/shared/command-watchdog.js +115 -21
- package/dist/shared/fs-text.d.ts +16 -10
- package/dist/shared/fs-text.js +16 -10
- package/dist/shared/git-runner.d.ts +25 -25
- package/dist/shared/git-runner.js +25 -25
- package/dist/shared/leaked-tool-call.d.ts +17 -11
- package/dist/shared/leaked-tool-call.js +23 -15
- package/dist/shared/model-endpoint.d.ts +29 -16
- package/dist/shared/model-endpoint.js +33 -21
- package/dist/shared/pi-invocation.d.ts +7 -4
- package/dist/shared/pi-invocation.js +12 -7
- package/dist/shared/pkg-version.d.ts +13 -5
- package/dist/shared/pkg-version.js +13 -5
- package/dist/shared/reasoning-capability.d.ts +35 -24
- package/dist/shared/reasoning-capability.js +35 -24
- package/dist/shared/stream-watchdog.d.ts +60 -44
- package/dist/shared/stream-watchdog.js +62 -45
- package/dist/task/accept-debt.d.ts +41 -43
- package/dist/task/accept-debt.js +73 -65
- package/dist/task/api-synthesis.d.ts +24 -21
- package/dist/task/api-synthesis.js +32 -26
- package/dist/task/apis-contract.d.ts +32 -64
- package/dist/task/apis-contract.js +32 -64
- package/dist/task/artifact-closure.d.ts +27 -13
- package/dist/task/artifact-closure.js +95 -67
- package/dist/task/auto-commit.d.ts +46 -35
- package/dist/task/auto-commit.js +51 -38
- package/dist/task/auto-io.d.ts +45 -25
- package/dist/task/auto-io.js +57 -29
- package/dist/task/auto-orchestrator.d.ts +26 -24
- package/dist/task/auto-orchestrator.js +192 -165
- package/dist/task/auto-prompts.d.ts +36 -24
- package/dist/task/auto-prompts.js +40 -26
- package/dist/task/autofix-ledger.d.ts +27 -25
- package/dist/task/autofix-ledger.js +29 -26
- package/dist/task/batch-test-task.d.ts +20 -12
- package/dist/task/batch-test-task.js +67 -60
- package/dist/task/boot-probe.d.ts +60 -44
- package/dist/task/boot-probe.js +91 -72
- package/dist/task/cancel-input.d.ts +30 -16
- package/dist/task/cancel-input.js +20 -11
- package/dist/task/cancel-points.d.ts +27 -20
- package/dist/task/cancel-points.js +30 -22
- package/dist/task/child-runner.d.ts +124 -55
- package/dist/task/child-runner.js +298 -90
- package/dist/task/child-status.d.ts +23 -16
- package/dist/task/child-status.js +23 -16
- package/dist/task/clamp-output.js +12 -5
- package/dist/task/command-run.d.ts +31 -28
- package/dist/task/command-run.js +44 -35
- package/dist/task/command-shrink.d.ts +25 -18
- package/dist/task/command-shrink.js +37 -31
- package/dist/task/command-watchdog.d.ts +9 -6
- package/dist/task/command-watchdog.js +21 -15
- package/dist/task/context-attribution.d.ts +34 -26
- package/dist/task/context-attribution.js +34 -26
- package/dist/task/context-silence.d.ts +39 -29
- package/dist/task/context-silence.js +35 -25
- package/dist/task/context-usage.d.ts +16 -9
- package/dist/task/context-usage.js +16 -9
- package/dist/task/contracts.d.ts +8 -4
- package/dist/task/contracts.js +25 -17
- package/dist/task/coverage-loop.d.ts +22 -18
- package/dist/task/coverage-loop.js +35 -30
- package/dist/task/critique-probes.d.ts +13 -14
- package/dist/task/critique-probes.js +50 -39
- package/dist/task/debug-log.d.ts +13 -5
- package/dist/task/debug-log.js +32 -20
- package/dist/task/decompose-fidelity.d.ts +11 -9
- package/dist/task/decompose-fidelity.js +38 -33
- package/dist/task/decompose-granularity.d.ts +41 -38
- package/dist/task/decompose-granularity.js +41 -38
- package/dist/task/deep-render-check.d.ts +22 -14
- package/dist/task/deep-render-check.js +40 -31
- package/dist/task/dropped-input.d.ts +12 -7
- package/dist/task/dropped-input.js +5 -2
- package/dist/task/enforce-attribution.d.ts +38 -47
- package/dist/task/enforce-attribution.js +46 -52
- package/dist/task/enforce-guidelines.d.ts +31 -20
- package/dist/task/enforce-guidelines.js +32 -21
- package/dist/task/enrichment.d.ts +7 -2
- package/dist/task/enrichment.js +26 -14
- package/dist/task/env-notes.d.ts +16 -7
- package/dist/task/env-notes.js +48 -31
- package/dist/task/env-template-closure.d.ts +4 -4
- package/dist/task/env-template-closure.js +42 -34
- package/dist/task/external-context.d.ts +28 -21
- package/dist/task/external-context.js +17 -12
- package/dist/task/failure-classifier.d.ts +4 -5
- package/dist/task/failure-classifier.js +30 -8
- package/dist/task/file-inventory.d.ts +15 -11
- package/dist/task/file-inventory.js +25 -22
- package/dist/task/final-gate-fix.d.ts +74 -86
- package/dist/task/final-gate-fix.js +97 -116
- package/dist/task/final-gate-progress.d.ts +29 -46
- package/dist/task/final-gate-progress.js +40 -51
- package/dist/task/final-gate.d.ts +64 -97
- package/dist/task/final-gate.js +192 -199
- package/dist/task/fix-child.d.ts +21 -27
- package/dist/task/fix-child.js +21 -27
- package/dist/task/foreign-path.d.ts +6 -5
- package/dist/task/foreign-path.js +0 -0
- package/dist/task/frozen-conflict.d.ts +9 -10
- package/dist/task/frozen-conflict.js +61 -64
- package/dist/task/frozen-path-guard.d.ts +35 -14
- package/dist/task/frozen-path-guard.js +56 -39
- package/dist/task/gate-child.d.ts +27 -28
- package/dist/task/gate-child.js +36 -35
- package/dist/task/gate-deps.d.ts +34 -27
- package/dist/task/gate-deps.js +169 -159
- package/dist/task/gate-tally.d.ts +77 -80
- package/dist/task/gate-tally.js +65 -68
- package/dist/task/git-state-guard.d.ts +15 -11
- package/dist/task/git-state-guard.js +76 -66
- package/dist/task/impl-widget.d.ts +25 -16
- package/dist/task/impl-widget.js +27 -17
- package/dist/task/implementation-guards.d.ts +26 -0
- package/dist/task/implementation-guards.js +177 -0
- package/dist/task/implementation-thinking.d.ts +33 -31
- package/dist/task/implementation-thinking.js +5 -6
- package/dist/task/implementation-turn.d.ts +39 -31
- package/dist/task/implementation-turn.js +41 -28
- package/dist/task/inline-markdown.d.ts +20 -7
- package/dist/task/inline-markdown.js +15 -6
- package/dist/task/launch-config-gap.js +25 -39
- package/dist/task/launch-contract.d.ts +18 -21
- package/dist/task/launch-contract.js +28 -30
- package/dist/task/launch-manifest.d.ts +6 -2
- package/dist/task/launch-manifest.js +35 -34
- package/dist/task/ledger.js +16 -14
- package/dist/task/lint-fix.d.ts +6 -8
- package/dist/task/lint-fix.js +67 -69
- package/dist/task/loop-detector.d.ts +27 -8
- package/dist/task/loop-detector.js +38 -14
- package/dist/task/mid-run-input.d.ts +17 -15
- package/dist/task/mid-run-input.js +17 -15
- package/dist/task/orchestrator.d.ts +24 -28
- package/dist/task/orchestrator.js +89 -66
- package/dist/task/orientation.d.ts +18 -23
- package/dist/task/orientation.js +24 -31
- package/dist/task/owned-freeze-conflict.d.ts +21 -20
- package/dist/task/owned-freeze-conflict.js +52 -85
- package/dist/task/owned-freeze-reassign.d.ts +40 -60
- package/dist/task/owned-freeze-reassign.js +41 -61
- package/dist/task/parsers.d.ts +4 -2
- package/dist/task/parsers.js +4 -4
- package/dist/task/phases.d.ts +41 -48
- package/dist/task/phases.js +196 -252
- package/dist/task/plan-io.d.ts +6 -7
- package/dist/task/plan-io.js +6 -7
- package/dist/task/plan-orchestrator.d.ts +10 -8
- package/dist/task/plan-orchestrator.js +14 -10
- package/dist/task/plan-prompts.d.ts +6 -5
- package/dist/task/plan-prompts.js +6 -5
- package/dist/task/plan-readonly.d.ts +4 -5
- package/dist/task/plan-readonly.js +4 -5
- package/dist/task/plan-rounds.d.ts +17 -29
- package/dist/task/plan-rounds.js +21 -34
- package/dist/task/plan-session.d.ts +58 -72
- package/dist/task/plan-session.js +61 -83
- package/dist/task/probe-gaming.d.ts +28 -27
- package/dist/task/probe-gaming.js +0 -0
- package/dist/task/prohibition-probe.d.ts +14 -16
- package/dist/task/prompts.d.ts +3 -4
- package/dist/task/prompts.js +17 -26
- package/dist/task/qa-transcript.d.ts +15 -22
- package/dist/task/qa-transcript.js +15 -21
- package/dist/task/question-box.d.ts +17 -13
- package/dist/task/question-box.js +19 -15
- package/dist/task/question-dedup.d.ts +6 -7
- package/dist/task/question-dedup.js +13 -14
- package/dist/task/question-dialog.d.ts +22 -32
- package/dist/task/question-dialog.js +22 -32
- package/dist/task/question-source.d.ts +18 -44
- package/dist/task/question-source.js +22 -51
- package/dist/task/refuted-constraint.d.ts +11 -31
- package/dist/task/refuted-constraint.js +27 -51
- package/dist/task/regenerable-artifacts.d.ts +12 -31
- package/dist/task/regenerable-artifacts.js +12 -31
- package/dist/task/render-check.d.ts +11 -22
- package/dist/task/render-check.js +33 -46
- package/dist/task/repo-health-check.d.ts +10 -14
- package/dist/task/repo-health-check.js +17 -23
- package/dist/task/requirements.d.ts +38 -71
- package/dist/task/requirements.js +78 -126
- package/dist/task/research-fanout-budget.d.ts +51 -88
- package/dist/task/research-fanout-budget.js +51 -88
- package/dist/task/research-worker.d.ts +29 -39
- package/dist/task/research-worker.js +37 -61
- package/dist/task/resume-gap.d.ts +14 -15
- package/dist/task/root-cause-repair.d.ts +9 -9
- package/dist/task/root-cause-repair.js +28 -40
- package/dist/task/run-bracket.d.ts +10 -13
- package/dist/task/run-end.d.ts +12 -22
- package/dist/task/run-end.js +8 -16
- package/dist/task/run-final-gate.d.ts +19 -21
- package/dist/task/run-final-gate.js +62 -80
- package/dist/task/runner-globs.d.ts +12 -13
- package/dist/task/runner-globs.js +12 -13
- package/dist/task/runner-resolve.d.ts +9 -9
- package/dist/task/runner-resolve.js +22 -23
- package/dist/task/script-escape.d.ts +10 -12
- package/dist/task/script-escape.js +13 -14
- package/dist/task/serve-entry.d.ts +1 -1
- package/dist/task/serve-entry.js +22 -25
- package/dist/task/service-blocks.js +4 -2
- package/dist/task/shipped-source.d.ts +11 -29
- package/dist/task/shipped-source.js +11 -29
- package/dist/task/skip-escape.js +10 -14
- package/dist/task/spec-urls.d.ts +26 -65
- package/dist/task/spec-urls.js +26 -65
- package/dist/task/spec-validation.d.ts +17 -20
- package/dist/task/spec-validation.js +17 -20
- package/dist/task/stall-detector.d.ts +23 -30
- package/dist/task/stall-detector.js +23 -30
- package/dist/task/stream-watchdog.d.ts +14 -12
- package/dist/task/stream-watchdog.js +14 -12
- package/dist/task/substitution-probe.d.ts +17 -20
- package/dist/task/substitution-probe.js +17 -20
- package/dist/task/task-gates.d.ts +36 -41
- package/dist/task/task-gates.js +95 -106
- package/dist/task/task-io.d.ts +4 -4
- package/dist/task/task-io.js +4 -4
- package/dist/task/task-parsers.js +4 -3
- package/dist/task/task-provenance.d.ts +2 -2
- package/dist/task/task-provenance.js +11 -13
- package/dist/task/task-types.d.ts +4 -3
- package/dist/task/terminal-outcome.d.ts +14 -16
- package/dist/task/terminal-outcome.js +12 -14
- package/dist/task/test-assembly.d.ts +13 -20
- package/dist/task/test-assembly.js +13 -20
- package/dist/task/timings.d.ts +5 -3
- package/dist/task/timings.js +5 -3
- package/dist/task/title-label.d.ts +9 -4
- package/dist/task/title-label.js +9 -4
- package/dist/task/type-only-answer.d.ts +44 -52
- package/dist/task/type-only-answer.js +44 -52
- package/dist/task/unfailable-command.d.ts +18 -24
- package/dist/task/unfailable-command.js +21 -27
- package/dist/task/unknown-routing.d.ts +10 -4
- package/dist/task/unknown-routing.js +10 -4
- package/dist/task/user-directives.d.ts +5 -8
- package/dist/task/user-directives.js +5 -8
- package/dist/task/verify-quality.d.ts +18 -22
- package/dist/task/verify-quality.js +45 -46
- package/dist/task/verify-reconcile.d.ts +15 -10
- package/dist/task/verify-reconcile.js +45 -43
- package/dist/task/verify-resolution.d.ts +24 -20
- package/dist/task/verify-resolution.js +51 -50
- package/dist/task/verify-work.d.ts +59 -66
- package/dist/task/verify-work.js +101 -138
- package/dist/task/widget.d.ts +15 -14
- package/dist/task/widget.js +22 -17
- package/dist/task/wiring-claims.d.ts +25 -32
- package/dist/task/wiring-claims.js +30 -35
- package/dist/task/write-guard.d.ts +39 -39
- package/dist/task/write-guard.js +48 -51
- package/dist/task/yolo.d.ts +34 -30
- package/dist/task/yolo.js +42 -37
- package/dist/workers/abstention.d.ts +21 -41
- package/dist/workers/abstention.js +27 -48
- package/dist/workers/brave-search.d.ts +4 -3
- package/dist/workers/brave-search.js +5 -2
- package/dist/workers/brave-warning.d.ts +7 -4
- package/dist/workers/brave-warning.js +19 -7
- package/dist/workers/ddg-search.d.ts +6 -6
- package/dist/workers/ddg-search.js +18 -12
- package/dist/workers/docs-cache.js +5 -2
- package/dist/workers/docs-chunk.d.ts +30 -37
- package/dist/workers/docs-chunk.js +37 -41
- package/dist/workers/docs-core.d.ts +28 -44
- package/dist/workers/docs-core.js +25 -44
- package/dist/workers/docs-index.js +4 -3
- package/dist/workers/docs-lookup.d.ts +15 -22
- package/dist/workers/docs-lookup.js +12 -21
- package/dist/workers/docs-project.d.ts +15 -9
- package/dist/workers/docs-project.js +17 -10
- package/dist/workers/docs-resolve.d.ts +19 -20
- package/dist/workers/docs-resolve.js +35 -32
- package/dist/workers/docs-retrieve.d.ts +5 -6
- package/dist/workers/docs-retrieve.js +18 -15
- package/dist/workers/exa-search.d.ts +9 -6
- package/dist/workers/exa-search.js +23 -12
- package/dist/workers/fetch-core.d.ts +13 -16
- package/dist/workers/fetch-core.js +23 -23
- package/dist/workers/focused-extractor.d.ts +13 -12
- package/dist/workers/focused-extractor.js +27 -19
- package/dist/workers/html-clean.js +24 -14
- package/dist/workers/http-request.d.ts +28 -20
- package/dist/workers/http-request.js +22 -17
- package/dist/workers/npm-version.d.ts +28 -11
- package/dist/workers/npm-version.js +24 -15
- package/dist/workers/phantom-imports.d.ts +15 -12
- package/dist/workers/phantom-imports.js +30 -24
- package/dist/workers/pi-worker-core.d.ts +65 -96
- package/dist/workers/pi-worker-core.js +93 -181
- package/dist/workers/pi-worker-docs.d.ts +24 -19
- package/dist/workers/pi-worker-docs.js +67 -76
- package/dist/workers/pi-worker-fetch.d.ts +7 -3
- package/dist/workers/pi-worker-fetch.js +27 -19
- package/dist/workers/pi-worker-search.js +12 -8
- package/dist/workers/pi-worker.d.ts +9 -4
- package/dist/workers/pi-worker.js +21 -14
- package/dist/workers/reasoning-warning.d.ts +18 -17
- package/dist/workers/reasoning-warning.js +22 -20
- package/dist/workers/research-cache.js +50 -78
- package/dist/workers/search-core.js +7 -5
- package/dist/workers/search-types.d.ts +10 -9
- package/dist/workers/search-types.js +9 -8
- package/dist/workers/session-hint.d.ts +13 -14
- package/dist/workers/session-hint.js +8 -9
- package/dist/workers/shared.d.ts +21 -25
- package/dist/workers/shared.js +0 -0
- package/dist/workers/single-read-extension.d.ts +14 -7
- package/dist/workers/single-read-extension.js +14 -7
- package/dist/workers/single-read-guard.d.ts +27 -30
- package/dist/workers/single-read-guard.js +36 -36
- package/dist/workers/typeonly-log.d.ts +12 -9
- package/dist/workers/typeonly-log.js +29 -33
- package/dist/workers/worker-channels.d.ts +15 -23
- package/dist/workers/worker-channels.js +15 -23
- package/dist/workers/worker-failure.d.ts +38 -46
- package/dist/workers/worker-failure.js +31 -39
- package/dist/workers/worker-kill.d.ts +25 -26
- package/dist/workers/worker-kill.js +16 -19
- package/dist/workers/worker-profiles.d.ts +54 -56
- package/dist/workers/worker-profiles.js +63 -39
- package/package.json +10 -8
|
@@ -2,25 +2,30 @@
|
|
|
2
2
|
* Model-stream watchdog — the inactivity machine for a stream that goes SILENT
|
|
3
3
|
* without erroring.
|
|
4
4
|
*
|
|
5
|
-
* WHY
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* - the connection-error retry
|
|
10
|
-
*
|
|
11
|
-
* - the command watchdog never fires: it
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
5
|
+
* WHY: a turn can die mid-stream — the last thing recorded is an ordinary
|
|
6
|
+
* assistant message, then nothing, while the model server stays healthy. A hung
|
|
7
|
+
* or silently-dropped stream throws NOTHING, so none of the three guards that
|
|
8
|
+
* already exist can see it:
|
|
9
|
+
* - the connection-error retry never fires. child-runner reaches it only
|
|
10
|
+
* inside `if (r.modelError)`, and a silent hang reports no error at all.
|
|
11
|
+
* - the command watchdog never fires: it arms per tool call and covers only
|
|
12
|
+
* TOOL executions.
|
|
13
|
+
* - the child stall guard never fires: it kills only when a probe finds the
|
|
14
|
+
* endpoint UNREACHABLE, and here the endpoint answers fine. The stream is
|
|
15
|
+
* what died, not the server.
|
|
15
16
|
*
|
|
16
|
-
* WHAT THIS MEASURES: time since the
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* WHAT THIS MEASURES: time since the last sign of life, NOT wall-clock and NOT
|
|
18
|
+
* time-to-first-token. What counts as a sign differs by surface — for the main
|
|
19
|
+
* session it is any of six pi events (`before_provider_request`,
|
|
20
|
+
* `after_provider_response`, `turn_start`, `message_start`, `message_update`,
|
|
21
|
+
* `message_end`), with every text, thinking and tool-call delta arriving as
|
|
22
|
+
* `message_update`; for a child it is any stdout or stderr CHUNK. A slow model
|
|
23
|
+
* that emits something occasionally is working and must never be killed. Zero
|
|
24
|
+
* for the whole window is a hang.
|
|
20
25
|
*
|
|
21
|
-
* WHY THE DEFAULT IS GENEROUS:
|
|
22
|
-
*
|
|
23
|
-
*
|
|
26
|
+
* WHY THE DEFAULT IS GENEROUS: prompt processing legitimately emits nothing
|
|
27
|
+
* while it runs, so a tight ceiling would kill honest long prompts. This guard
|
|
28
|
+
* exists to bound dead air, not to police slowness. See
|
|
24
29
|
* DEFAULT_STREAM_INACTIVITY_MS.
|
|
25
30
|
*
|
|
26
31
|
* TWO SURFACES, one machine (same split as command-watchdog.ts):
|
|
@@ -36,20 +41,25 @@
|
|
|
36
41
|
* blind re-send of a half-executed turn).
|
|
37
42
|
*/
|
|
38
43
|
/**
|
|
39
|
-
* Default inactivity ceiling
|
|
40
|
-
*
|
|
41
|
-
*
|
|
44
|
+
* Default inactivity ceiling. Sized by the constraint that a local model's first
|
|
45
|
+
* token can legitimately be a long way off, so the number has to clear honest
|
|
46
|
+
* prompt processing rather than sit close to it.
|
|
42
47
|
*/
|
|
43
48
|
export const DEFAULT_STREAM_INACTIVITY_MS = 10 * 60_000;
|
|
44
|
-
/** Whole minutes
|
|
49
|
+
/** Whole minutes for the human-facing window in every message: rounded to
|
|
50
|
+
* nearest, then floored at 1 so a sub-minute window never reads "0 minutes". */
|
|
45
51
|
function minutes(ms) {
|
|
46
52
|
const mins = Math.max(1, Math.round(ms / 60_000));
|
|
47
53
|
return `${mins} minute${mins === 1 ? '' : 's'}`;
|
|
48
54
|
}
|
|
49
55
|
/**
|
|
50
|
-
* How often the machine checks the idle clock. A poll
|
|
51
|
-
* timeout on every token
|
|
52
|
-
*
|
|
56
|
+
* How often the machine checks the idle clock. A poll, rather than re-arming a
|
|
57
|
+
* timeout on every token, keeps the cost per window constant instead of per
|
|
58
|
+
* event — and "thousands of events" is not a figure of speech: one captured turn
|
|
59
|
+
* emitted over two thousand, nearly all of them `message_update`.
|
|
60
|
+
*
|
|
61
|
+
* A quarter of the window, clamped: never tighter than 50ms, never looser than
|
|
62
|
+
* 30s. The child stall guard polls with the same shape and its own divisor.
|
|
53
63
|
*/
|
|
54
64
|
export function pollIntervalMs(timeoutMs) {
|
|
55
65
|
return Math.max(50, Math.min(Math.floor(timeoutMs / 4), 30_000));
|
|
@@ -64,12 +74,14 @@ export class StreamWatchdog {
|
|
|
64
74
|
* legitimately idle, and that window belongs to the command watchdog, not to
|
|
65
75
|
* this one — without it a 10-minute build looks identical to a hung stream.
|
|
66
76
|
*
|
|
67
|
-
* A SET, not a boolean
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
77
|
+
* A SET, not a boolean, and pi's own loop is why. `executeToolCallsParallel`
|
|
78
|
+
* in agent-loop.js emits EVERY `tool_execution_start` up front, before any
|
|
79
|
+
* call is prepared; a call that prepares "immediate" gets its end emitted
|
|
80
|
+
* inline right there, while the rest are deferred as closures and settle
|
|
81
|
+
* through a `Promise.all`. So an end can arrive while earlier siblings are
|
|
82
|
+
* still running. A boolean would be cleared by that first end and leave the
|
|
83
|
+
* long build exposed to a false fire. Same per-toolCallId idiom the command
|
|
84
|
+
* watchdog uses.
|
|
73
85
|
*/
|
|
74
86
|
active = new Set();
|
|
75
87
|
/** Nesting depth for callers that cannot supply an id, counted so an unkeyed
|
|
@@ -152,18 +164,20 @@ export class StreamWatchdog {
|
|
|
152
164
|
* cancels it on stop/fire, and runChild's cleanup() stops the watchdog on every
|
|
153
165
|
* settle path (close, error, abort), so it cannot outlive the child it watches.
|
|
154
166
|
*
|
|
155
|
-
* The poll is REF'd, deliberately.
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
167
|
+
* The poll is REF'd, deliberately. Unref'd reads better — a pending watchdog poll
|
|
168
|
+
* should never keep the process alive at exit — but an unref'd timer is only
|
|
169
|
+
* guaranteed to fire while something ref'd is still pending, and that guarantee
|
|
170
|
+
* is not the platform-independent thing it looks like.
|
|
171
|
+
*
|
|
172
|
+
* Measured here, on both runtimes: with nothing else pending an unref'd timer
|
|
173
|
+
* never fires at all, the process just exits; with a spawned child holding its
|
|
174
|
+
* stdout and stderr pipes open it fires on schedule throughout. A silent child
|
|
175
|
+
* is the SECOND case — its pipes are still ref'd work — so on this platform the
|
|
176
|
+
* unref would not have broken the child guard. The reason to keep it ref'd is
|
|
177
|
+
* that this machine also runs in the main session, where no such handle is
|
|
178
|
+
* guaranteed, and the failure mode is silent: a watchdog that never fires looks
|
|
179
|
+
* exactly like a stream that never hung.
|
|
161
180
|
*
|
|
162
|
-
* That state — no ref'd work outstanding — is EXACTLY the state this watchdog
|
|
163
|
-
* exists to police: a child whose model stream has gone silent. So the unref
|
|
164
|
-
* disabled the guard precisely when it was needed, and every stream-stall
|
|
165
|
-
* integration test hung forever on windows (CI runs 30476786365, 30477802633,
|
|
166
|
-
* 30478455402 — it hangs at v0.24.1 too, so this predates that release).
|
|
167
181
|
* A poll that can delay exit by one interval is the cheaper failure.
|
|
168
182
|
*/
|
|
169
183
|
export const realStreamTimerDeps = {
|
|
@@ -173,10 +187,13 @@ export const realStreamTimerDeps = {
|
|
|
173
187
|
};
|
|
174
188
|
/**
|
|
175
189
|
* The cause string a CHILD's stream stall is reported as. Phrased so
|
|
176
|
-
* {@link isConnectionError} (child-runner.ts) matches it —
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
190
|
+
* {@link isConnectionError} (child-runner.ts) matches it — checked by running the
|
|
191
|
+
* round-trip, and it does. The whole point is to route a silent hang into the
|
|
192
|
+
* retry path that already exists for a LOUD connection failure rather than
|
|
193
|
+
* inventing a second one, so the phrase "connection lost" is load-bearing, not
|
|
194
|
+
* decoration: reword it past that predicate and stream stalls stop retrying.
|
|
195
|
+
* Honest about who killed it, too — pi-task aborted the request, the provider
|
|
196
|
+
* reported nothing.
|
|
180
197
|
*/
|
|
181
198
|
export function streamStallCause(idleMs) {
|
|
182
199
|
return (`model stream inactivity: no stream events for ${minutes(idleMs)} — `
|
|
@@ -3,19 +3,17 @@ import { type CommandRunner } from './command-run.js';
|
|
|
3
3
|
* Provenance of a recorded defect:
|
|
4
4
|
* - 'accepted' — the user chose ACCEPT despite a verify-FAIL (the original class).
|
|
5
5
|
* - 'enforce-revert' — an enforce-pass re-verify FAILED and the enforce edits were
|
|
6
|
-
* reverted
|
|
7
|
-
* server entry point … the Hono server cannot be started"), so the terminal defect
|
|
6
|
+
* reverted, but the FAIL indicted the ORIGINAL work, so the terminal defect
|
|
8
7
|
* was FOUND and then erased by the very mechanism that found it. Persisted here so
|
|
9
8
|
* the final gate re-checks and surfaces it instead of letting it die with the revert.
|
|
10
9
|
* - 'enforce-kept' — the same enforce re-verify FAIL, but the failing check named
|
|
11
10
|
* only files the ENFORCE COMMIT does not touch, so reverting that commit could not
|
|
12
|
-
* possibly repair it
|
|
13
|
-
*
|
|
14
|
-
* final gate re-made the identical change 5 minutes later). The edits are KEPT and
|
|
11
|
+
* possibly repair it — reverting a change in one file over a failure in a file
|
|
12
|
+
* it cannot reach only loses the change. The edits are KEPT and
|
|
15
13
|
* the defect is recorded here — keeping the work must never mean losing the finding.
|
|
16
14
|
* - 'frozen-blocked' — a repo-health verify-FAIL whose only fix is an edit to a path
|
|
17
|
-
* THIS task's spec froze
|
|
18
|
-
* created
|
|
15
|
+
* THIS task's spec froze — a lint left permanently red because the files it
|
|
16
|
+
* created need a registration every spec forbids editing. Cross-task
|
|
19
17
|
* contradiction: no unattended re-run can converge, so the gate loop records the
|
|
20
18
|
* defect and routes to the human picker instead of burning AUTOFIX rounds.
|
|
21
19
|
* - 'yolo-accepted' — YOLO MODE (unattended auto-pick, see yolo.ts) took the
|
|
@@ -24,16 +22,16 @@ import { type CommandRunner } from './command-run.js';
|
|
|
24
22
|
* weighed this failing artifact and blessed it, which is exactly the assurance
|
|
25
23
|
* an auto-pick cannot give. Same re-check treatment, honest provenance.
|
|
26
24
|
* - 'cross-task-deletion' — the task's work DELETED a sibling task's committed
|
|
27
|
-
* deliverable
|
|
28
|
-
*
|
|
25
|
+
* deliverable — a fix child deleting a sibling's test files to green a lint —
|
|
26
|
+
* and the user ACCEPTed the verify-FAIL anyway, so the
|
|
29
27
|
* deletion ships in the next commit. Recorded so the final gate re-checks it:
|
|
30
28
|
* resolved iff the named file is back in the tree (a later task restored it),
|
|
31
29
|
* otherwise surfaced.
|
|
32
30
|
* - 'final-gate' — the final integration gate DEMOTED one of its own checks to
|
|
33
|
-
* UNOBSERVED
|
|
31
|
+
* UNOBSERVED: two fix attempts that both changed the tree and
|
|
34
32
|
* re-ran the gate produced a byte-identical ranked-first failure, so the check
|
|
35
|
-
* is unfalsifiable in this environment
|
|
36
|
-
*
|
|
33
|
+
* is unfalsifiable in this environment — the boot probe needing a tool the
|
|
34
|
+
* sandbox does not have, say — and no further attempt can move it. The
|
|
37
35
|
* run is allowed to converge on the REMAINING checks, carrying this one here
|
|
38
36
|
* so the next run's gate re-checks and re-surfaces it rather than losing it.
|
|
39
37
|
* Also recorded for the ZERO-OBSERVATION verdict (final-gate.ts
|
|
@@ -42,13 +40,13 @@ import { type CommandRunner } from './command-run.js';
|
|
|
42
40
|
* completed on statics alone. Same treatment for the same reason: unprovable
|
|
43
41
|
* here, so carry it forward rather than let a silent PASS bury it.
|
|
44
42
|
* - 'root-cause' — the task's verify FAILed because of a PRE-EXISTING defect in a
|
|
45
|
-
* file a DIFFERENT task created, which this task's own work never touched
|
|
46
|
-
*
|
|
47
|
-
*
|
|
43
|
+
* file a DIFFERENT task created, which this task's own work never touched. One
|
|
44
|
+
* such defect can FAIL several later tasks in a row. The current task is not
|
|
45
|
+
* at fault, so its work — and, at the
|
|
48
46
|
* enforce site, the enforce pass's edits — are KEPT rather than reverted; the
|
|
49
47
|
* defect is recorded here and a scoped repair task is queued into the plan
|
|
50
|
-
* (root-cause-repair.ts).
|
|
51
|
-
*
|
|
48
|
+
* (root-cause-repair.ts). Recording without queuing would let the same root
|
|
49
|
+
* cause be re-recorded by each task it fails, with nothing ever fixing it.
|
|
52
50
|
*/
|
|
53
51
|
export type DebtOrigin = 'accepted' | 'enforce-revert' | 'enforce-kept' | 'frozen-blocked' | 'cross-task-deletion' | 'yolo-accepted' | 'final-gate' | 'root-cause';
|
|
54
52
|
/** One recorded defect: the task, why its VERIFY failed, and how it was recorded. */
|
|
@@ -61,16 +59,15 @@ export interface AcceptDebt {
|
|
|
61
59
|
* Set (never serialized) when the recorded reason CONFLICTS with the run itself:
|
|
62
60
|
* it asserts a file's existence is the failure, but that file is another task's
|
|
63
61
|
* committed deliverable (see annotateDebtConflicts). A conflicting debt is a
|
|
64
|
-
* PLAN defect to surface, never an instruction to act on
|
|
65
|
-
*
|
|
62
|
+
* PLAN defect to surface, never an instruction to act on. An autofix child
|
|
63
|
+
* seeded with such a claim will delete the file to satisfy it.
|
|
66
64
|
*/
|
|
67
65
|
conflict?: string;
|
|
68
66
|
/**
|
|
69
67
|
* The ONE command this debt's own reason NAMES, quoted verbatim in backticks and
|
|
70
|
-
* present byte-identically in the owning task's VERIFY block
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* PROJECT-pool debts, `scripts/debt-verify-class-baserate.ts`).
|
|
68
|
+
* present byte-identically in the owning task's VERIFY block. Set at record
|
|
69
|
+
* time by classifyVerifyCommand, and absent whenever the reason names no such
|
|
70
|
+
* command — which is the common case, since most FAIL reasons are prose.
|
|
74
71
|
*
|
|
75
72
|
* It exists so the run-end re-check can settle the debt the way the debt was
|
|
76
73
|
* created: by RUNNING the command and reading its exit status. Never
|
|
@@ -105,17 +102,16 @@ export declare function readAcceptDebts(cwd: string): Promise<AcceptDebt[]>;
|
|
|
105
102
|
* Best-effort by construction (appendDebt swallows its own faults): the ledger is an
|
|
106
103
|
* auditing aid and must never break the gate sequence that calls it.
|
|
107
104
|
*
|
|
108
|
-
* `origin` is REQUIRED and deliberately has no default.
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* Making it explicit turns that whole class of slip into a compile error.
|
|
105
|
+
* `origin` is REQUIRED and deliberately has no default. A default of 'accepted'
|
|
106
|
+
* would be the tempting one, since that is the legacy 2-field on-disk shape — and
|
|
107
|
+
* that is exactly what makes it dangerous. A dropped argument would then be
|
|
108
|
+
* absorbed in silence, stamping a run-level 'final-gate' demotion as a human
|
|
109
|
+
* 'accepted': the one confusion this type exists to prevent. Requiring it turns
|
|
110
|
+
* that slip into a compile error instead.
|
|
115
111
|
*/
|
|
116
112
|
export declare function recordDebt(cwd: string, taskId: string, reason: string, origin: DebtOrigin): Promise<void>;
|
|
117
113
|
/**
|
|
118
|
-
* The reason text a CROSS-TASK DELETION debt stores
|
|
114
|
+
* The reason text a CROSS-TASK DELETION debt stores: the task's
|
|
119
115
|
* work deleted a file a DIFFERENT task's commit introduced, verify FAILed, and the
|
|
120
116
|
* user ACCEPTed — so the deletion survives into the next commit. The shape is fixed
|
|
121
117
|
* and machine-parseable so the final gate's re-check can extract the path and prove
|
|
@@ -151,9 +147,9 @@ export declare function isStaticClassDebt(reason: string): boolean;
|
|
|
151
147
|
* VERIFY fence, or a reason that quotes nothing all yield null, and null simply
|
|
152
148
|
* means the debt keeps today's behaviour (surfaced, never auto-closed).
|
|
153
149
|
*
|
|
154
|
-
* The STRICT parse matters here.
|
|
155
|
-
*
|
|
156
|
-
*
|
|
150
|
+
* The STRICT parse matters here. A spec that opens ```sh and never closes it
|
|
151
|
+
* makes the lenient parser hand back the phase-timings table and every appended
|
|
152
|
+
* gate-trail line as "VERIFY commands" — including sentences that quote
|
|
157
153
|
* `bun run lint`. Matching a reason against that would mint a stored, re-runnable
|
|
158
154
|
* command with fabricated provenance, which is the one thing this class may not do.
|
|
159
155
|
*/
|
|
@@ -176,7 +172,7 @@ export interface VerifyRerunResult {
|
|
|
176
172
|
* task or a human restored it, so the deletion no longer holds); every other debt
|
|
177
173
|
* stays OPEN (unprovable ⇒ surface, never re-hide) — unless it carries a stored
|
|
178
174
|
* `verifyCommand` and `rerunVerify` re-runs that command to a ZERO exit, which is the
|
|
179
|
-
* third class
|
|
175
|
+
* third class: the debt named a command, the command was run, and it
|
|
180
176
|
* passed. FP-safe: the only auto-closes are ones a deterministic check can stand
|
|
181
177
|
* behind, and here the check is the task spec's own command.
|
|
182
178
|
*/
|
|
@@ -184,7 +180,7 @@ export declare function recheckAcceptDebts(debts: AcceptDebt[], opts: {
|
|
|
184
180
|
staticOk: boolean;
|
|
185
181
|
fileExists?: (rel: string) => boolean;
|
|
186
182
|
/**
|
|
187
|
-
* Re-run a debt's stored VERIFY command
|
|
183
|
+
* Re-run a debt's stored VERIFY command. Absent ⇒ the class is
|
|
188
184
|
* inert and every debt behaves exactly as it did before it existed. Only
|
|
189
185
|
* `pass` may close a debt; `fail` and `gap` both leave it open, and the
|
|
190
186
|
* caller is expected to have made `pass` mean "ran, exited 0, and changed
|
|
@@ -201,7 +197,7 @@ export declare function recheckAcceptDebts(debts: AcceptDebt[], opts: {
|
|
|
201
197
|
* token immediately followed by "exists" / "still exists", or by "must/should not
|
|
202
198
|
* exist". Only this narrow shape qualifies: a reason that merely MENTIONS a path
|
|
203
199
|
* (a prohibition violation, a broken import) is an ordinary defect claim, not an
|
|
204
|
-
* existence assertion, and must never be flagged (
|
|
200
|
+
* existence assertion, and must never be flagged (such debts name paths
|
|
205
201
|
* this way and are genuine).
|
|
206
202
|
*/
|
|
207
203
|
export declare function extractExistenceClaims(reason: string): string[];
|
|
@@ -228,7 +224,7 @@ export declare function buildAcceptDebtNote(open: AcceptDebt[]): string;
|
|
|
228
224
|
*/
|
|
229
225
|
export declare function describeDebt(d: AcceptDebt): string;
|
|
230
226
|
/**
|
|
231
|
-
* ACCEPT-debt re-check
|
|
227
|
+
* ACCEPT-debt re-check: read the ledger of tasks
|
|
232
228
|
* the user accepted despite a verify-FAIL and re-check each against the CURRENT
|
|
233
229
|
* tree. A static-class debt whose statics now pass is provably RESOLVED (a later
|
|
234
230
|
* task fixed it) and pruned from the ledger; every other debt cannot be proven
|
|
@@ -237,9 +233,9 @@ export declare function describeDebt(d: AcceptDebt): string;
|
|
|
237
233
|
* accept-debt.ts). Best-effort: a ledger read/write failure must never break the
|
|
238
234
|
* caller.
|
|
239
235
|
*
|
|
240
|
-
* FACTORED OUT of runFinalIntegrationGate
|
|
236
|
+
* FACTORED OUT of runFinalIntegrationGate: the derivation has to be
|
|
241
237
|
* runnable at a SECOND moment — after a converged final-gate autofix, where the
|
|
242
|
-
* orchestrator
|
|
238
|
+
* orchestrator rebuilds its gate outcome as a bare `{ok, reason}` and drops
|
|
243
239
|
* `openDebts` entirely. The report a run ends on has to be derived from the tree
|
|
244
240
|
* the run ends with, not from the tree as it was before the fix pass.
|
|
245
241
|
*
|
|
@@ -263,9 +259,11 @@ run?: CommandRunner, signal?: AbortSignal): Promise<{
|
|
|
263
259
|
* a passing tree and have that count as the debt being fixed — the run would then be
|
|
264
260
|
* certifying its own side effect. So tracked state is captured before and after, and
|
|
265
261
|
* a pass that came with a tracked change is downgraded to INCONCLUSIVE with the
|
|
266
|
-
* change named. Untracked output is left alone
|
|
267
|
-
*
|
|
268
|
-
*
|
|
262
|
+
* change named. Untracked output is left alone because the guard asks git not to
|
|
263
|
+
* report it: `--untracked-files=no` is doing that work, NOT the project's ignore
|
|
264
|
+
* rules. Checked both ways — with and without a matching `.gitignore`, the flag
|
|
265
|
+
* returns an empty status for a fresh untracked build directory, while plain
|
|
266
|
+
* `--porcelain` reports it when it is not ignored.
|
|
269
267
|
*
|
|
270
268
|
* A repository the guard cannot read (no git, git absent) is not a licence to skip
|
|
271
269
|
* the guard: the re-run is INCONCLUSIVE there, because "nothing changed" would be an
|