peaks-loop 4.0.0-beta.9 → 4.0.3
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 +572 -234
- package/README-en.md +67 -30
- package/README.md +67 -30
- package/agents/karpathy-reviewer.md +33 -0
- package/bin/peaks.js +0 -0
- package/dist/cli/cli-helpers.d.ts +31 -6
- package/dist/cli/cli-helpers.js +48 -25
- package/dist/cli/commands/_register.d.ts +3 -0
- package/dist/cli/commands/_register.js +139 -0
- package/dist/cli/commands/_super.d.ts +10 -0
- package/dist/cli/commands/_super.js +97 -0
- package/dist/cli/commands/adapter-commands-s2a.js +1 -1
- package/dist/cli/commands/asset-commands.js +33 -16
- package/dist/cli/commands/audit-commands.js +2 -2
- package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
- package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
- package/dist/cli/commands/bee-commands.js +1 -1
- package/dist/cli/commands/capability-commands.js +1 -1
- package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
- package/dist/cli/commands/changeset-commands.d.ts +13 -0
- package/dist/cli/commands/changeset-commands.js +46 -0
- package/dist/cli/commands/code-commands.d.ts +11 -1
- package/dist/cli/commands/code-commands.js +19 -699
- package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
- package/dist/cli/commands/code-job-shape-commands.js +164 -0
- package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
- package/dist/cli/commands/code-mode-gate-commands.js +223 -0
- package/dist/cli/commands/code-review-commands.js +2 -2
- package/dist/cli/commands/code-run-command.d.ts +12 -0
- package/dist/cli/commands/code-run-command.js +68 -0
- package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
- package/dist/cli/commands/code-runtime-commands.js +391 -0
- package/dist/cli/commands/codegraph-commands.js +1 -1
- package/dist/cli/commands/compact-command.js +53 -1
- package/dist/cli/commands/complexity-commands.js +1 -1
- package/dist/cli/commands/config-commands.js +4 -75
- package/dist/cli/commands/container-commands.d.ts +28 -0
- package/dist/cli/commands/container-commands.js +221 -0
- package/dist/cli/commands/context-commands.js +3 -2
- package/dist/cli/commands/core/artifacts-command.js +1 -1
- package/dist/cli/commands/core/binding-commands.js +1 -1
- package/dist/cli/commands/core/doctor-command.js +63 -3
- package/dist/cli/commands/core/memory-command.js +1 -1
- package/dist/cli/commands/core/profile-command.js +1 -1
- package/dist/cli/commands/core/proxy-command.js +1 -1
- package/dist/cli/commands/core/session-command.js +9 -7
- package/dist/cli/commands/core/skill-command.js +7 -4
- package/dist/cli/commands/core/standards-command.js +1 -1
- package/dist/cli/commands/cron-commands.d.ts +57 -0
- package/dist/cli/commands/cron-commands.js +257 -0
- package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
- package/dist/cli/commands/cron-scheduler-commands.js +284 -0
- package/dist/cli/commands/dashboard-commands.d.ts +4 -0
- package/dist/cli/commands/dashboard-commands.js +10 -0
- package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
- package/dist/cli/commands/dashboard-long-run.js +122 -0
- package/dist/cli/commands/dashboard-summary.d.ts +12 -0
- package/dist/cli/commands/dashboard-summary.js +58 -0
- package/dist/cli/commands/dispatch-commands.d.ts +0 -7
- package/dist/cli/commands/dispatch-commands.js +372 -8
- package/dist/cli/commands/dispatch-from-dag.js +4 -1
- package/dist/cli/commands/doc-commands.js +1 -1
- package/dist/cli/commands/ecc-commands.d.ts +30 -0
- package/dist/cli/commands/ecc-commands.js +119 -0
- package/dist/cli/commands/evolution-commands.js +1 -1
- package/dist/cli/commands/feedback-commands.js +1 -1
- package/dist/cli/commands/final-review-commands.js +1 -1
- package/dist/cli/commands/fixture-commands.js +1 -1
- package/dist/cli/commands/fork-commands.js +1 -1
- package/dist/cli/commands/gate-commands.js +128 -6
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
- package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
- package/dist/cli/commands/heartbeat-commands.js +76 -5
- package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
- package/dist/cli/commands/heartbeat-watch-command.js +146 -0
- package/dist/cli/commands/hook-handle.js +1 -1
- package/dist/cli/commands/hooks-commands.js +126 -10
- package/dist/cli/commands/ide-commands.js +1 -1
- package/dist/cli/commands/impact-commands.js +1 -1
- package/dist/cli/commands/job-commands.js +34 -1
- package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
- package/dist/cli/commands/lease-metrics-commands.js +231 -0
- package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
- package/dist/cli/commands/lease-stats-commands.js +107 -0
- package/dist/cli/commands/legacy-commands.js +1 -1
- package/dist/cli/commands/log-commands.js +1 -1
- package/dist/cli/commands/loop-commands.js +1 -1
- package/dist/cli/commands/loop-eval-commands.js +1 -1
- package/dist/cli/commands/memory-commands.js +1 -1
- package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
- package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
- package/dist/cli/commands/mut-commands.d.ts +1 -1
- package/dist/cli/commands/mut-commands.js +1 -5
- package/dist/cli/commands/observability-commands.js +1 -1
- package/dist/cli/commands/openspec-commands.js +65 -4
- package/dist/cli/commands/perf-audit-commands.js +3 -3
- package/dist/cli/commands/perf-commands.js +1 -1
- package/dist/cli/commands/polyrepo-commands.js +1 -1
- package/dist/cli/commands/prd-blocks-commands.js +1 -1
- package/dist/cli/commands/prd-commands.js +4 -2
- package/dist/cli/commands/preferences-commands.js +23 -3
- package/dist/cli/commands/project-commands.js +1 -1
- package/dist/cli/commands/qa-business-review-commands.js +1 -1
- package/dist/cli/commands/qa-commands.d.ts +1 -1
- package/dist/cli/commands/qa-commands.js +39 -3
- package/dist/cli/commands/release-commands.d.ts +15 -0
- package/dist/cli/commands/release-commands.js +113 -21
- package/dist/cli/commands/request-commands.js +1 -1
- package/dist/cli/commands/retrospective-commands.js +1 -1
- package/dist/cli/commands/reviewer-commands.js +1 -1
- package/dist/cli/commands/role-commands.js +1 -1
- package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
- package/dist/cli/commands/runtime-commands-helpers.js +24 -0
- package/dist/cli/commands/runtime-commands.js +1 -2
- package/dist/cli/commands/sc-commands.js +4 -2
- package/dist/cli/commands/scan-commands.js +1 -1
- package/dist/cli/commands/security-audit-commands.js +3 -3
- package/dist/cli/commands/sediment-commands.js +10 -1
- package/dist/cli/commands/session-24h-mode.d.ts +26 -0
- package/dist/cli/commands/session-24h-mode.js +196 -0
- package/dist/cli/commands/share-commands.d.ts +19 -0
- package/dist/cli/commands/share-commands.js +121 -2
- package/dist/cli/commands/skill-conformance-commands.js +1 -1
- package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
- package/dist/cli/commands/skill-search-commands.js +4 -1
- package/dist/cli/commands/slice-commands.js +1 -1
- package/dist/cli/commands/slice-integrate-commands.js +1 -1
- package/dist/cli/commands/slice-review-commands.js +1 -1
- package/dist/cli/commands/smoke-commands.js +1 -1
- package/dist/cli/commands/sop-commands.js +1 -1
- package/dist/cli/commands/spill-demo-command.d.ts +7 -0
- package/dist/cli/commands/spill-demo-command.js +29 -0
- package/dist/cli/commands/statusline-commands.d.ts +12 -0
- package/dist/cli/commands/statusline-commands.js +79 -17
- package/dist/cli/commands/sub-agent-commands.js +2 -1
- package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
- package/dist/cli/commands/sub-agent-shared.js +24 -1
- package/dist/cli/commands/swarm-commands.d.ts +13 -0
- package/dist/cli/commands/swarm-commands.js +77 -0
- package/dist/cli/commands/tech-commands.d.ts +64 -0
- package/dist/cli/commands/tech-commands.js +195 -0
- package/dist/cli/commands/understand-commands.js +1 -1
- package/dist/cli/commands/upgrade-commands.d.ts +2 -0
- package/dist/cli/commands/upgrade-commands.js +40 -5
- package/dist/cli/commands/user-touchpoint-commands.js +1 -1
- package/dist/cli/commands/verdict-aggregate-command.js +1 -1
- package/dist/cli/commands/vm-commands.d.ts +31 -0
- package/dist/cli/commands/vm-commands.js +274 -0
- package/dist/cli/commands/workflow-commands.js +24 -1
- package/dist/cli/commands/workflow-plan-commands.js +1 -1
- package/dist/cli/commands/workspace/init-command.js +1 -1
- package/dist/cli/commands/workspace/migrate-command.js +1 -1
- package/dist/cli/commands/workspace/reconcile-command.js +1 -1
- package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
- package/dist/cli/commands/worktree-auth-commands.js +652 -0
- package/dist/cli/index.js +58 -13
- package/dist/cli/program.d.ts +2 -2
- package/dist/cli/program.js +86 -281
- package/dist/services/24h-mode/decider.d.ts +103 -0
- package/dist/services/24h-mode/decider.js +144 -0
- package/dist/services/24h-mode/index.d.ts +12 -0
- package/dist/services/24h-mode/index.js +12 -0
- package/dist/services/24h-mode/state.d.ts +48 -0
- package/dist/services/24h-mode/state.js +51 -0
- package/dist/services/24h-mode/store.d.ts +27 -0
- package/dist/services/24h-mode/store.js +119 -0
- package/dist/services/artifacts/artifact-prerequisites.js +1 -1
- package/dist/services/artifacts/request-artifact-service.js +1 -1
- package/dist/services/artifacts/workspace-service.js +1 -1
- package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
- package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
- package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
- package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
- package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
- package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
- package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
- package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
- package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
- package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
- package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
- package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
- package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
- package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
- package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
- package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
- package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
- package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
- package/dist/services/audit/static-service.d.ts +32 -25
- package/dist/services/audit/static-service.js +30 -109
- package/dist/services/audit-independent/index.d.ts +2 -0
- package/dist/services/audit-independent/index.js +2 -0
- package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
- package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
- package/dist/services/changeset/changeset-check-service.d.ts +22 -0
- package/dist/services/changeset/changeset-check-service.js +47 -0
- package/dist/services/code/auto-compact-modes.d.ts +30 -0
- package/dist/services/code/auto-compact-modes.js +38 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
- package/dist/services/code/auto-compact-orchestrator.js +101 -21
- package/dist/services/code/dag-orchestrator.d.ts +30 -1
- package/dist/services/code/dag-orchestrator.js +106 -1
- package/dist/services/code/status-line-renderer.d.ts +2 -0
- package/dist/services/code/status-line-renderer.js +21 -3
- package/dist/services/code-review/ocr-service.d.ts +1 -1
- package/dist/services/code-review/ocr-service.js +6 -3
- package/dist/services/compact-history/compact-history-service.d.ts +41 -0
- package/dist/services/compact-history/compact-history-service.js +62 -0
- package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
- package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
- package/dist/services/config/config-service.d.ts +1 -12
- package/dist/services/config/config-service.js +3 -72
- package/dist/services/config/config-types.d.ts +2 -4
- package/dist/services/config/config-types.js +1 -1
- package/dist/services/container/container-lease.d.ts +67 -0
- package/dist/services/container/container-lease.js +135 -0
- package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
- package/dist/services/context/auto-compact-dispatcher.js +32 -102
- package/dist/services/context/auto-compact-reader.js +1 -1
- package/dist/services/context/auto-compact-types.d.ts +27 -2
- package/dist/services/context/auto-compact-types.js +8 -1
- package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
- package/dist/services/context/build-dispatch-system-prompt.js +117 -0
- package/dist/services/context/collector.d.ts +2 -2
- package/dist/services/context/context-builder.d.ts +4 -4
- package/dist/services/context/context-schema.d.ts +48 -48
- package/dist/services/context/ide-detect.d.ts +4 -0
- package/dist/services/context/ide-detect.js +24 -0
- package/dist/services/context/main-session-monitor.d.ts +1 -4
- package/dist/services/context/main-session-monitor.js +1 -24
- package/dist/services/context/memory-index-reader.d.ts +8 -0
- package/dist/services/context/memory-index-reader.js +57 -0
- package/dist/services/context/memory-lru-cache.d.ts +12 -0
- package/dist/services/context/memory-lru-cache.js +60 -0
- package/dist/services/context/memory-preflight-config.d.ts +19 -0
- package/dist/services/context/memory-preflight-config.js +25 -0
- package/dist/services/context/memory-preflight-service.d.ts +19 -0
- package/dist/services/context/memory-preflight-service.js +120 -0
- package/dist/services/context/spillover-store.d.ts +23 -0
- package/dist/services/context/spillover-store.js +155 -0
- package/dist/services/context/spillover-types.d.ts +18 -0
- package/dist/services/context/spillover-types.js +1 -0
- package/dist/services/crystallization/crystallization-service.d.ts +22 -5
- package/dist/services/crystallization/crystallization-service.js +8 -14
- package/dist/services/crystallization/crystallization-types.d.ts +6 -6
- package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
- package/dist/services/crystallization/index.d.ts +13 -0
- package/dist/services/crystallization/index.js +13 -0
- package/dist/services/dashboard/project-dashboard-service.js +2 -2
- package/dist/services/dispatch/await-batch.d.ts +70 -0
- package/dist/services/dispatch/await-batch.js +272 -0
- package/dist/services/dispatch/batch-counter.js +1 -1
- package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
- package/dist/services/dispatch/dispatch-record-writer.js +239 -9
- package/dist/services/dispatch/slice-dag.d.ts +46 -0
- package/dist/services/dispatch/slice-dag.js +6 -0
- package/dist/services/dispatch/stage-enum.d.ts +27 -0
- package/dist/services/dispatch/stage-enum.js +48 -0
- package/dist/services/dispatch/startup-timeout.d.ts +86 -0
- package/dist/services/dispatch/startup-timeout.js +97 -0
- package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
- package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
- package/dist/services/dispatch/test-tool-detection.js +80 -0
- package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
- package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
- package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
- package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
- package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
- package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
- package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
- package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
- package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
- package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
- package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
- package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
- package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
- package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
- package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
- package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
- package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
- package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
- package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
- package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
- package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
- package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
- package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
- package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
- package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
- package/dist/services/doctor/doctor-service/index.d.ts +48 -0
- package/dist/services/doctor/doctor-service/index.js +254 -0
- package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
- package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
- package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
- package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
- package/dist/services/doctor/doctor-service/types.d.ts +245 -0
- package/dist/services/doctor/doctor-service/types.js +15 -0
- package/dist/services/doctor/doctor-service.d.ts +15 -146
- package/dist/services/doctor/doctor-service.js +22 -926
- package/dist/services/doctor/index.d.ts +22 -0
- package/dist/services/doctor/index.js +22 -0
- package/dist/services/env/shell-probe.d.ts +71 -0
- package/dist/services/env/shell-probe.js +161 -0
- package/dist/services/evolution/evolution-types.d.ts +39 -39
- package/dist/services/final-review/final-review-service.d.ts +11 -1
- package/dist/services/final-review/index.d.ts +2 -0
- package/dist/services/final-review/index.js +1 -0
- package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
- package/dist/services/hooks/auto-compact-hook-install.js +4 -5
- package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
- package/dist/services/hooks/worktree-authorization-gate.js +492 -0
- package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
- package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
- package/dist/services/ide/adapters/qoder-adapter.js +57 -0
- package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
- package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
- package/dist/services/ide/ide-registry.js +6 -0
- package/dist/services/ide/ide-types.d.ts +1 -1
- package/dist/services/job/job-types.d.ts +56 -56
- package/dist/services/job-snapshot/index.d.ts +8 -0
- package/dist/services/job-snapshot/index.js +7 -0
- package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
- package/dist/services/job-snapshot/types.d.ts +7 -0
- package/dist/services/job-snapshot/types.js +1 -0
- package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
- package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
- package/dist/services/log/retention.d.ts +16 -0
- package/dist/services/log/retention.js +17 -0
- package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
- package/dist/services/loop/loop-release-types.d.ts +24 -24
- package/dist/services/loop/monotonic-runner.d.ts +17 -11
- package/dist/services/loop/monotonic-runner.js +118 -79
- package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
- package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
- package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
- package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
- package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
- package/dist/services/memory/project-memory-service/index/search.js +194 -0
- package/dist/services/memory/project-memory-service/index.d.ts +9 -0
- package/dist/services/memory/project-memory-service/index.js +24 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
- package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
- package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
- package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
- package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
- package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
- package/dist/services/memory/project-memory-service/store/paths.js +116 -0
- package/dist/services/memory/project-memory-service/types.d.ts +128 -0
- package/dist/services/memory/project-memory-service/types.js +9 -0
- package/dist/services/memory/project-memory-service.d.ts +1 -167
- package/dist/services/memory/project-memory-service.js +19 -816
- package/dist/services/migrate-skill-name/schema.d.ts +2 -2
- package/dist/services/observability/aggregation.d.ts +27 -0
- package/dist/services/observability/aggregation.js +72 -0
- package/dist/services/observability/observability-service.d.ts +73 -7
- package/dist/services/observability/observability-service.js +87 -1
- package/dist/services/openspec/artifact-boundary.d.ts +138 -0
- package/dist/services/openspec/artifact-boundary.js +150 -0
- package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
- package/dist/services/openspec/coverage-evidence-reader.js +386 -0
- package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
- package/dist/services/openspec/openspec-archive-service.js +320 -8
- package/dist/services/openspec/openspec-bridge-service.js +1 -1
- package/dist/services/openspec/openspec-init-service.js +1 -1
- package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
- package/dist/services/openspec/openspec-render-service.js +7 -4
- package/dist/services/openspec/openspec-scan-service.js +1 -1
- package/dist/services/openspec/openspec-validate-service.js +5 -4
- package/dist/services/preferences/preferences-service.js +10 -0
- package/dist/services/preferences/preferences-types.d.ts +13 -0
- package/dist/services/preferences/preferences-types.js +11 -0
- package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
- package/dist/services/qa/screenshot-archive-service.js +134 -0
- package/dist/services/rd/rd-service.js +10 -11
- package/dist/services/rd/types.d.ts +32 -32
- package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
- package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
- package/dist/services/recommendations/capability-seed-items.js +0 -1
- package/dist/services/recommendations/capability-seed-mappings.js +0 -1
- package/dist/services/recommendations/capability-seed-sources.js +0 -1
- package/dist/services/release/version-precheck-service.d.ts +51 -0
- package/dist/services/release/version-precheck-service.js +257 -0
- package/dist/services/scan/acceptance-coverage-service.js +1 -1
- package/dist/services/scan/archetype-service.js +1 -1
- package/dist/services/scan/existing-system-service.js +1 -1
- package/dist/services/scan/libraries-service.js +1 -1
- package/dist/services/sediment/json-schema.d.ts +40 -40
- package/dist/services/share/bundle-types.d.ts +12 -12
- package/dist/services/share/run-state-contract.d.ts +2 -2
- package/dist/services/skill/skill-search-service.d.ts +12 -7
- package/dist/services/skill/skill-search-service.js +8 -4
- package/dist/services/skillhub/migrations/001-initial.sql +71 -0
- package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
- package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
- package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
- package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
- package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
- package/dist/services/skills/hooks-settings-service.d.ts +75 -0
- package/dist/services/skills/hooks-settings-service.js +230 -2
- package/dist/services/skills/skill-registry.d.ts +1 -0
- package/dist/services/skills/skill-registry.js +6 -4
- package/dist/services/skills/skill-runbook-service.js +1 -1
- package/dist/services/slice/slice-check-service.js +1 -1
- package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
- package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
- package/dist/services/standards/missing-standards-detector.d.ts +25 -0
- package/dist/services/standards/missing-standards-detector.js +43 -12
- package/dist/services/tech/tech-change-id-service.d.ts +82 -0
- package/dist/services/tech/tech-change-id-service.js +117 -0
- package/dist/services/understand/understand-hybrid-service.js +1 -1
- package/dist/services/understand/understand-scan-service.js +2 -2
- package/dist/services/upgrade/upgrade-service.js +4 -3
- package/dist/services/verdict/envelopes.d.ts +2 -2
- package/dist/services/verdict/envelopes.js +2 -2
- package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
- package/dist/services/vm/vm-lease.d.ts +40 -0
- package/dist/services/vm/vm-lease.js +137 -0
- package/dist/services/workflow/autonomous-resume-writer.js +1 -1
- package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
- package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
- package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
- package/dist/services/workflow/pipeline-verify-service.js +42 -218
- package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
- package/dist/services/workflow/pipeline-verify-types.js +10 -0
- package/dist/services/workflow/plan-reader.d.ts +1 -1
- package/dist/services/workflow/plan-reader.js +1 -1
- package/dist/services/workflow/plan-refresher.d.ts +1 -1
- package/dist/services/workflow/plan-refresher.js +1 -1
- package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
- package/dist/services/workflow/plan-trigger-detector.js +1 -1
- package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
- package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
- package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
- package/dist/services/workflow/workflow-autonomous-types.js +21 -0
- package/dist/services/workflow/workflow-router-service.js +18 -16
- package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
- package/dist/services/workflow/workflow-spec-lint.js +75 -0
- package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
- package/dist/services/workflow/workflow-spec-types.js +13 -0
- package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
- package/dist/services/workflow/workflow-spec-yaml.js +88 -0
- package/dist/services/workflow/workflow-spec.d.ts +11 -91
- package/dist/services/workflow/workflow-spec.js +16 -145
- package/dist/services/workspace/migrate-service.js +1 -1
- package/dist/services/workspace/workspace-service.js +1 -1
- package/dist/services/worktree/worktree-lease.d.ts +170 -0
- package/dist/services/worktree/worktree-lease.js +242 -0
- package/package.json +91 -51
- package/scripts/clean-dist.mjs +31 -1
- package/scripts/copy-templates.mjs +16 -0
- package/scripts/sync-version.mjs +53 -2
- package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
- package/skills/bee/peaks-prd/SKILL.md +16 -0
- package/skills/bee/peaks-prd/test-prompts.json +12 -0
- package/skills/bee/peaks-qa/SKILL.md +16 -1
- package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
- package/skills/bee/peaks-qa/test-prompts.json +12 -0
- package/skills/bee/peaks-rd/SKILL.md +29 -20
- package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
- package/skills/bee/peaks-rd/test-prompts.json +12 -0
- package/skills/bee/peaks-reviewer/SKILL.md +17 -0
- package/skills/bee/peaks-sc/SKILL.md +16 -0
- package/skills/bee/peaks-security-audit/SKILL.md +17 -0
- package/skills/bee/peaks-txt/SKILL.md +16 -0
- package/skills/bee/peaks-txt/test-prompts.json +12 -0
- package/skills/bee/peaks-ui/SKILL.md +49 -43
- package/skills/bee/peaks-ui/test-prompts.json +12 -0
- package/skills/peaks-code/SKILL.md +54 -109
- package/skills/peaks-code/references/boundaries.md +15 -1
- package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
- package/skills/peaks-code/references/external-skill-invocation.md +27 -0
- package/skills/peaks-code/references/lease-dashboard.html +224 -0
- package/skills/peaks-code/references/lease-stats.sample.json +26 -0
- package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
- package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
- package/skills/peaks-code/references/runbook.md +63 -1
- package/skills/peaks-code/references/startup-sequence.md +110 -0
- package/skills/peaks-code/references/step-0-8-gate.md +1 -1
- package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
- package/skills/peaks-code/references/worktree-governance.md +123 -0
- package/skills/peaks-code/test-prompts.json +12 -0
- package/skills/peaks-doctor/SKILL.md +1 -1
- package/skills/peaks-ide/SKILL.md +1 -1
- package/skills/peaks-solo/SKILL.md +21 -0
- package/skills/peaks-solo/references/triage-decision-table.md +6 -0
- package/skills/peaks-sop/test-prompts.json +17 -0
- package/dist/cli/commands/agent-commands.d.ts +0 -20
- package/dist/cli/commands/agent-commands.js +0 -48
- package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
- package/dist/cli/commands/classify-classify-commands.js +0 -151
- package/dist/cli/commands/contract-commands.d.ts +0 -26
- package/dist/cli/commands/contract-commands.js +0 -114
- package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
- package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
- package/dist/cli/commands/worker-commands.d.ts +0 -3
- package/dist/cli/commands/worker-commands.js +0 -52
- package/dist/services/agent/ecc-agent-service.d.ts +0 -47
- package/dist/services/agent/ecc-agent-service.js +0 -143
- package/dist/services/config/provider-service.d.ts +0 -48
- package/dist/services/config/provider-service.js +0 -143
- package/dist/services/context/dispatch-context-guard.d.ts +0 -27
- package/dist/services/context/dispatch-context-guard.js +0 -192
- package/dist/services/context/shared-channel.d.ts +0 -93
- package/dist/services/context/shared-channel.js +0 -308
- package/dist/services/filesystem/file-lock.d.ts +0 -11
- package/dist/services/filesystem/file-lock.js +0 -152
- package/dist/services/mut/assert-scanner.d.ts +0 -6
- package/dist/services/mut/assert-scanner.js +0 -116
- package/dist/services/mut/index.d.ts +0 -8
- package/dist/services/mut/index.js +0 -7
- package/dist/services/mut/mut-runner.d.ts +0 -39
- package/dist/services/mut/mut-runner.js +0 -29
- package/dist/services/mut/production-stryker.d.ts +0 -2
- package/dist/services/mut/production-stryker.js +0 -75
- package/dist/services/mut/report-builder.d.ts +0 -11
- package/dist/services/mut/report-builder.js +0 -110
- package/dist/services/mut/report-loader.d.ts +0 -31
- package/dist/services/mut/report-loader.js +0 -78
- package/dist/services/mut/thresholds.d.ts +0 -21
- package/dist/services/mut/thresholds.js +0 -22
- package/dist/services/mut/types.d.ts +0 -336
- package/dist/services/mut/types.js +0 -59
- package/dist/services/providers/minimax-provider-service.d.ts +0 -24
- package/dist/services/providers/minimax-provider-service.js +0 -143
- package/dist/services/providers/minimax-worker-service.d.ts +0 -21
- package/dist/services/providers/minimax-worker-service.js +0 -83
- package/dist/shared/fs.d.ts +0 -4
- package/dist/shared/fs.js +0 -26
- package/dist/shared/paths.d.ts +0 -6
- package/dist/shared/paths.js +0 -50
- package/dist/shared/result.d.ts +0 -22
- package/dist/shared/result.js +0 -46
- package/dist/shared/version.d.ts +0 -1
- package/dist/shared/version.js +0 -1
- package/examples/video-demo/README.md +0 -142
- package/examples/video-demo/out/en-closing-960.png +0 -0
- package/examples/video-demo/out/zh-closing-960.png +0 -0
- package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
- package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
- /package/dist/services/{job/job-resource-snapshot.js → job-snapshot/snapshot.js} +0 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slice 2026-07-29-dispatch-stall-governance / S4 — unified batch
|
|
3
|
+
* awaiter.
|
|
4
|
+
*
|
|
5
|
+
* Pre-S4, `awaitClaudeCodeBatch` and `pollDispatchRecords` were two
|
|
6
|
+
* near-identical poll loops with two subtle differences:
|
|
7
|
+
* - awaitClaudeCodeBatch clamped with `Math.min(deadline, 120_000)`
|
|
8
|
+
* - pollDispatchRecords clamped with
|
|
9
|
+
* `Math.min(Math.max(deadline, 0), 120_000)`
|
|
10
|
+
* and different default-fallback sources. The PRD R4 records the
|
|
11
|
+
* resulting failure shape: a fix applied to one path did not
|
|
12
|
+
* propagate to the other (per
|
|
13
|
+
* .peaks/memory/2026-07-26-peaks-code-concurrent-subagent-coordination.md).
|
|
14
|
+
*
|
|
15
|
+
* This file is the single implementation. Both `awaitClaudeCodeBatch`
|
|
16
|
+
* and `pollDispatchRecords` (kept exported for back-compat with the
|
|
17
|
+
* existing tests) thin-wrap this.
|
|
18
|
+
*
|
|
19
|
+
* S4 also closes the silent-timeout return:
|
|
20
|
+
* - the result shape now includes a typed `outcome` field that is
|
|
21
|
+
* one of 'completed' | 'timed-out' | 'clamped' | 'no-progress'.
|
|
22
|
+
* A caller that asks for `timeoutMs: 600_000` and the loop clamps
|
|
23
|
+
* to the hard cap sees `outcome: 'clamped'` and the requested /
|
|
24
|
+
* effective budgets on the result.
|
|
25
|
+
* - the loop no longer returns a success-shaped result on full
|
|
26
|
+
* timeout. A timed-out slot still appears in the per-dispatch
|
|
27
|
+
* results array, but the *batch* outcome is `timed-out`.
|
|
28
|
+
* - the no-progress watchdog (a new option) raises the `no-progress`
|
|
29
|
+
* outcome before the full deadline elapses if a bounded window
|
|
30
|
+
* passes with no observable progress (e.g. a slot's `lastBeatAt`
|
|
31
|
+
* has not advanced).
|
|
32
|
+
*
|
|
33
|
+
* The de-escalation flag is `PEAKS_DISPATCH_DISABLE_FAILFAST` (read
|
|
34
|
+
* from process.env at module load). When set, the loop falls back to
|
|
35
|
+
* the pre-S4 silent return so a stuck session can be unblocked by
|
|
36
|
+
* flipping the env var rather than rebuilding.
|
|
37
|
+
*/
|
|
38
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
39
|
+
const DEFAULT_HARD_CAP_MS = 120_000;
|
|
40
|
+
const DEFAULT_NO_PROGRESS_MS = 60_000;
|
|
41
|
+
const DEFAULT_POLL_INTERVAL_MS = 50;
|
|
42
|
+
/**
|
|
43
|
+
* Fail-fast de-escalation: the env var is read once at module load
|
|
44
|
+
* (matches the pre-S4 env-var-loading semantics for `peaks`
|
|
45
|
+
* debug). Setting it falls back to the silent-return behavior so a
|
|
46
|
+
* stuck session can be unblocked without a rebuild.
|
|
47
|
+
*/
|
|
48
|
+
const FAILFAST_DISABLED = (() => {
|
|
49
|
+
const v = process.env.PEAKS_DISPATCH_DISABLE_FAILFAST;
|
|
50
|
+
return v === '1' || v === 'true';
|
|
51
|
+
})();
|
|
52
|
+
/**
|
|
53
|
+
* Run one awaitBatch. Pure (no module-level state); the two
|
|
54
|
+
* back-compat wrappers in sub-agent-dispatcher.ts call this.
|
|
55
|
+
*/
|
|
56
|
+
export async function awaitBatch(dispatchCount, recordPaths, timeoutMs, options = { defaultTimeoutMs: 60_000 }) {
|
|
57
|
+
if (dispatchCount <= 0 || recordPaths.length === 0) {
|
|
58
|
+
const requested = timeoutMs ?? options.defaultTimeoutMs;
|
|
59
|
+
return {
|
|
60
|
+
results: [],
|
|
61
|
+
outcome: 'completed',
|
|
62
|
+
requestedTimeoutMs: requested,
|
|
63
|
+
effectiveTimeoutMs: 0,
|
|
64
|
+
hardCapMs: options.hardCapMs ?? DEFAULT_HARD_CAP_MS
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const hardCap = options.hardCapMs ?? DEFAULT_HARD_CAP_MS;
|
|
68
|
+
const requested = timeoutMs ?? options.defaultTimeoutMs;
|
|
69
|
+
// S4 (AC-3.2) — surface the clamp. A caller-supplied timeout above
|
|
70
|
+
// the hard cap is reported as `clamped`; the effective budget is
|
|
71
|
+
// what the loop actually waited.
|
|
72
|
+
const requestedClamped = requested > hardCap;
|
|
73
|
+
const effective = Math.min(Math.max(requested, 0), hardCap);
|
|
74
|
+
const noProgressBudget = options.noProgressMs ?? DEFAULT_NO_PROGRESS_MS;
|
|
75
|
+
const now = options.now ?? (() => Date.now());
|
|
76
|
+
const schedule = options.schedule ?? ((cb, ms) => {
|
|
77
|
+
const t = setTimeout(cb, ms);
|
|
78
|
+
t.unref?.();
|
|
79
|
+
return t;
|
|
80
|
+
});
|
|
81
|
+
const readOutcome = options.readOutcome ?? ((p) => defaultReadOutcome(p).status);
|
|
82
|
+
const readRecord = options.readRecord ?? defaultReadOutcome;
|
|
83
|
+
const startedAt = now();
|
|
84
|
+
const slots = new Map();
|
|
85
|
+
for (let i = 0; i < recordPaths.length; i += 1) {
|
|
86
|
+
const recordPath = recordPaths[i] ?? '';
|
|
87
|
+
slots.set(i, {
|
|
88
|
+
recordPath,
|
|
89
|
+
status: 'timeout',
|
|
90
|
+
note: null,
|
|
91
|
+
finishedAt: null,
|
|
92
|
+
lastProgress: 0
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Track last observed progress per slot to power the no-progress
|
|
96
|
+
// watchdog. The watchdog advances on any per-tick observation
|
|
97
|
+
// change in the slot's progress hint (read from the file's
|
|
98
|
+
// `progress` field when available, else from the `heartbeats`
|
|
99
|
+
// array's last entry).
|
|
100
|
+
const lastProgressAt = new Map();
|
|
101
|
+
for (const [idx] of slots) {
|
|
102
|
+
lastProgressAt.set(idx, startedAt);
|
|
103
|
+
}
|
|
104
|
+
let batchOutcome = 'completed';
|
|
105
|
+
while (slots.size > 0 && now() - startedAt < effective) {
|
|
106
|
+
let allDone = true;
|
|
107
|
+
for (const [idx, slot] of slots) {
|
|
108
|
+
if (slot.finishedAt !== null)
|
|
109
|
+
continue;
|
|
110
|
+
const outcome = readOutcome(slot.recordPath);
|
|
111
|
+
if (outcome === null) {
|
|
112
|
+
allDone = false;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// The default readOutcome returns the on-disk `status`. We map
|
|
116
|
+
// a small set of values to the per-dispatch status union.
|
|
117
|
+
// Slice 2026-07-30-nightshift: also capture the optional
|
|
118
|
+
// `outcome` field so the per-IDE note can surface the human
|
|
119
|
+
// reason (e.g. "mock failure at leaf-2"). The `outcome` is read
|
|
120
|
+
// alongside the `status` via `readRecord` and surfaced into
|
|
121
|
+
// `slot.note` for failed dispatches; for done/cancelled the
|
|
122
|
+
// note is left null (matches the pre-nightshift contract).
|
|
123
|
+
// `stale` is mapped to `timeout` so the per-IDE note preserves
|
|
124
|
+
// the human-readable reason (cursor / claude-code both surface
|
|
125
|
+
// `stale` on the wire but the BatchResult.status union only
|
|
126
|
+
// knows `timeout`).
|
|
127
|
+
const record = readRecord(slot.recordPath);
|
|
128
|
+
if (outcome === 'done' || outcome === 'success') {
|
|
129
|
+
slot.status = 'done';
|
|
130
|
+
slot.note = null;
|
|
131
|
+
slot.finishedAt = now();
|
|
132
|
+
lastProgressAt.set(idx, now());
|
|
133
|
+
}
|
|
134
|
+
else if (outcome === 'failed') {
|
|
135
|
+
slot.status = 'failed';
|
|
136
|
+
slot.note = record.outcome ?? null;
|
|
137
|
+
slot.finishedAt = now();
|
|
138
|
+
lastProgressAt.set(idx, now());
|
|
139
|
+
}
|
|
140
|
+
else if (outcome === 'cancelled') {
|
|
141
|
+
slot.status = 'cancelled';
|
|
142
|
+
slot.note = null;
|
|
143
|
+
slot.finishedAt = now();
|
|
144
|
+
lastProgressAt.set(idx, now());
|
|
145
|
+
}
|
|
146
|
+
else if (outcome === 'stale') {
|
|
147
|
+
slot.status = 'timeout';
|
|
148
|
+
slot.note = 'stale';
|
|
149
|
+
slot.finishedAt = now();
|
|
150
|
+
lastProgressAt.set(idx, now());
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Any other status (queued / running / finalizing /
|
|
154
|
+
// never-started / unreadable) means the dispatch has not
|
|
155
|
+
// reached a terminal state yet.
|
|
156
|
+
allDone = false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (allDone)
|
|
160
|
+
break;
|
|
161
|
+
// No-progress watchdog: if every slot has been without observable
|
|
162
|
+
// progress for `noProgressBudget`, escalate.
|
|
163
|
+
if (now() - startedAt < effective) {
|
|
164
|
+
const allStalled = Array.from(slots.entries()).every(([idx, slot]) => slot.finishedAt !== null || (now() - (lastProgressAt.get(idx) ?? startedAt)) >= noProgressBudget);
|
|
165
|
+
if (allStalled && slots.size > 0) {
|
|
166
|
+
batchOutcome = 'no-progress';
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Sleep a tick.
|
|
171
|
+
await new Promise((resolveSleep) => schedule(() => resolveSleep(), DEFAULT_POLL_INTERVAL_MS));
|
|
172
|
+
}
|
|
173
|
+
// Post-loop batch outcome:
|
|
174
|
+
// - `completed` — every slot reached a terminal state
|
|
175
|
+
// - `timed-out` — at least one slot is still pending and the
|
|
176
|
+
// effective budget elapsed
|
|
177
|
+
// - `clamped` — the caller's `requestedTimeoutMs` exceeded the
|
|
178
|
+
// hard cap (AC-3.2). The loop still ran the effective budget;
|
|
179
|
+
// `clamped` takes precedence over `timed-out` because the
|
|
180
|
+
// caller specifically asked for more than the cap and the
|
|
181
|
+
// caller needs to know the cap was applied (the timeout is
|
|
182
|
+
// secondary information).
|
|
183
|
+
// - `no-progress` — the watchdog fired (AC-3.4)
|
|
184
|
+
if (batchOutcome === 'completed' && slots.size > 0) {
|
|
185
|
+
const allReached = Array.from(slots.values()).every((s) => s.finishedAt !== null);
|
|
186
|
+
if (!allReached) {
|
|
187
|
+
batchOutcome = requestedClamped ? 'clamped' : 'timed-out';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (batchOutcome === 'completed' && requestedClamped) {
|
|
191
|
+
batchOutcome = 'clamped';
|
|
192
|
+
}
|
|
193
|
+
// Build the per-dispatch results in dispatchIndex order.
|
|
194
|
+
// Slice 2026-07-30-nightshift: the per-IDE note construction is
|
|
195
|
+
// rewritten to match the 1.4 dogfood contract:
|
|
196
|
+
// - claude-code (no notePrefix): note = slot.note (the raw
|
|
197
|
+
// outcome, or null when done/cancelled)
|
|
198
|
+
// - other IDEs (notePrefix set):
|
|
199
|
+
// - on timeout: `${notePrefix} (timeout)`
|
|
200
|
+
// - on failed (with outcome): `${notePrefix} — ${outcome}`
|
|
201
|
+
// - on failed (no outcome): `${notePrefix}`
|
|
202
|
+
// - on done / cancelled: `${notePrefix}`
|
|
203
|
+
const results = Array.from(slots.entries())
|
|
204
|
+
.sort(([a], [b]) => a - b)
|
|
205
|
+
.map(([idx, slot]) => {
|
|
206
|
+
const finishedAt = slot.finishedAt ?? startedAt + effective;
|
|
207
|
+
const baseNote = options.notePrefix ?? null;
|
|
208
|
+
let note;
|
|
209
|
+
if (baseNote === null) {
|
|
210
|
+
// Claude-Code path: surface the raw outcome (no per-IDE prefix).
|
|
211
|
+
note = slot.note;
|
|
212
|
+
}
|
|
213
|
+
else if (slot.finishedAt === null) {
|
|
214
|
+
// Timed-out slot: keep the legacy ` (timeout)` suffix.
|
|
215
|
+
note = `${baseNote} (timeout)`;
|
|
216
|
+
}
|
|
217
|
+
else if (slot.status === 'failed' && slot.note !== null && slot.note.length > 0) {
|
|
218
|
+
// Failed with a human reason: `${notePrefix} — ${outcome}`.
|
|
219
|
+
note = `${baseNote} — ${slot.note}`;
|
|
220
|
+
}
|
|
221
|
+
else if (slot.note !== null && slot.note.length > 0) {
|
|
222
|
+
// Non-failed terminal slot with a non-null note (e.g. cursor /
|
|
223
|
+
// claude-code `stale` → status=timeout, note='stale'):
|
|
224
|
+
// `${notePrefix} — ${note}` so the human reason is surfaced.
|
|
225
|
+
// Slice 2026-07-30-nightshift: previously this branch dropped
|
|
226
|
+
// the slot's note entirely (the bare-prefix else swallowed
|
|
227
|
+
// it). The 1.4 dogfood for `stale` flips the contract.
|
|
228
|
+
note = `${baseNote} — ${slot.note}`;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// Done / cancelled / failed-without-reason: bare prefix.
|
|
232
|
+
note = baseNote;
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
dispatchIndex: idx,
|
|
236
|
+
recordPath: slot.recordPath,
|
|
237
|
+
status: slot.status,
|
|
238
|
+
durationMs: finishedAt - startedAt,
|
|
239
|
+
note
|
|
240
|
+
};
|
|
241
|
+
});
|
|
242
|
+
// Fail-fast de-escalation: when the env var is set, surface the
|
|
243
|
+
// typed outcome but do not let it influence the per-dispatch
|
|
244
|
+
// results. This preserves the pre-S4 silent-return shape so a
|
|
245
|
+
// stuck session can be unblocked by flipping the flag.
|
|
246
|
+
if (FAILFAST_DISABLED && (batchOutcome === 'timed-out' || batchOutcome === 'no-progress' || batchOutcome === 'clamped')) {
|
|
247
|
+
batchOutcome = 'completed';
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
results,
|
|
251
|
+
outcome: batchOutcome,
|
|
252
|
+
requestedTimeoutMs: requested,
|
|
253
|
+
effectiveTimeoutMs: effective,
|
|
254
|
+
hardCapMs: hardCap
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
function defaultReadOutcome(recordPath) {
|
|
258
|
+
if (!recordPath)
|
|
259
|
+
return { status: null, outcome: null };
|
|
260
|
+
try {
|
|
261
|
+
if (!existsSync(recordPath))
|
|
262
|
+
return { status: null, outcome: null };
|
|
263
|
+
const raw = readFileSync(recordPath, 'utf8');
|
|
264
|
+
const obj = JSON.parse(raw);
|
|
265
|
+
const status = typeof obj.status === 'string' ? obj.status : null;
|
|
266
|
+
const outcome = typeof obj.outcome === 'string' ? obj.outcome : null;
|
|
267
|
+
return { status, outcome };
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return { status: null, outcome: null };
|
|
271
|
+
}
|
|
272
|
+
}
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
25
25
|
import { dirname, resolve } from 'node:path';
|
|
26
|
-
import { withFileLockSync } from '
|
|
26
|
+
import { withFileLockSync } from 'peaks-loop-shared-channel';
|
|
27
27
|
export const BATCH_LIMIT = 6;
|
|
28
28
|
export const BATCH_OVER_LIMIT_CODE = 'BATCH_OVER_LIMIT';
|
|
29
29
|
/** Build the per-batch counter file path. */
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { SubAgentToolCall } from './sub-agent-dispatcher.js';
|
|
2
|
+
import { type StageLabel } from './stage-enum.js';
|
|
2
3
|
/** G6.3 Heartbeat entry — single update written by a running sub-agent. */
|
|
3
4
|
export interface Heartbeat {
|
|
4
5
|
readonly at: string;
|
|
@@ -6,12 +7,43 @@ export interface Heartbeat {
|
|
|
6
7
|
readonly progress: number;
|
|
7
8
|
readonly note: string | null;
|
|
8
9
|
}
|
|
9
|
-
export type HeartbeatStatus = 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'stale';
|
|
10
|
-
export type DispatchRecordStatus = 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'cancelled' | 'no-execution' | 'stale';
|
|
10
|
+
export type HeartbeatStatus = 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'stale' | 'cancelled' | 'no-execution' | 'never-started' | 'unreadable';
|
|
11
|
+
export type DispatchRecordStatus = 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'cancelled' | 'no-execution' | 'stale' | 'never-started' | 'unreadable';
|
|
11
12
|
export type DispatchOutcome = 'success' | 'failed' | 'timeout' | 'cancelled' | 'no-execution';
|
|
12
13
|
/** G2+G5+G6 dispatch record schema (AC-26 + AC-34). */
|
|
13
14
|
export interface DispatchRecord {
|
|
14
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Slice 2026-07-29-worktree-l2-extended Part 4.C: schema v3 makes
|
|
17
|
+
* `leaseId` a structurally required field (was `leaseId?: string | null`
|
|
18
|
+
* in v2). The v3 upgrade is a "fill in" migration: every dispatch
|
|
19
|
+
* writer knows its lease id at construction time (Part 2.C's
|
|
20
|
+
* --isolation worktree spawns it; non-isolation dispatches stamp
|
|
21
|
+
* `null`). Readers tolerate both v2 and v3 on disk (see
|
|
22
|
+
* `upgradeRecord`); the `?` was a Part 4.A ergonomic concession
|
|
23
|
+
* to keep 4 unit-test literal sites from breaking the build. v3
|
|
24
|
+
* moves the optional off the type and adds the field to the
|
|
25
|
+
* 4 literal sites in one pass.
|
|
26
|
+
*
|
|
27
|
+
* Slice 2026-07-29-worktree-l2-extended Part 7: schema v3.1 adds
|
|
28
|
+
* `isolationStartedAt: string | null` for the L4 isolation
|
|
29
|
+
* bridge (Part 8 container POC). It's the ISO timestamp of
|
|
30
|
+
* when the isolation mode was set up (e.g. when the worktree
|
|
31
|
+
* was spawned). `null` means the dispatch did not request
|
|
32
|
+
* isolation. The `version` field stays at 3 because the
|
|
33
|
+
* v3 → v3.1 transition is additive; the new field is
|
|
34
|
+
* defaulted to `null` on read so v3 records upgrade cleanly.
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* Slice 2026-07-29-rid-prose-only-sweep Part 34: schema v3.1
|
|
38
|
+
* is the explicit minor bump that records the
|
|
39
|
+
* `isolationStartedAt` (Part 7) and `leaseId` (Part 3.A.1 +
|
|
40
|
+
* Part 4.C) fields as part of the canonical schema. v3
|
|
41
|
+
* records on disk upgrade transparently — see `upgradeRecord`
|
|
42
|
+
* in this file. The literal type ('3.1') is the source of
|
|
43
|
+
* truth for "this record is v3.1-form"; readers check
|
|
44
|
+
* `version === '3.1'` for forward-compatible dispatching.
|
|
45
|
+
*/
|
|
46
|
+
readonly version: '3.1';
|
|
15
47
|
readonly createdAt: string;
|
|
16
48
|
readonly completedAt: string | null;
|
|
17
49
|
readonly outcome: DispatchOutcome;
|
|
@@ -29,6 +61,35 @@ export interface DispatchRecord {
|
|
|
29
61
|
readonly heartbeats: readonly Heartbeat[];
|
|
30
62
|
readonly lastBeatAt: string | null;
|
|
31
63
|
readonly status: DispatchRecordStatus;
|
|
64
|
+
readonly stage: string | null;
|
|
65
|
+
/**
|
|
66
|
+
* Slice 2026-07-29-worktree-l2-extended Part 3.A + Part 4.C: the
|
|
67
|
+
* worktree lease id stamped on this dispatch (via `peaks sub-agent
|
|
68
|
+
* dispatch --isolation worktree`). The release hook (see
|
|
69
|
+
* markCompleted + `peaks sub-agent heartbeat --status done`)
|
|
70
|
+
* reads this field to auto-call `peaks worktree release` when
|
|
71
|
+
* the sub-agent finalizes. `null` means the dispatch did not
|
|
72
|
+
* request isolation and no release will fire. Persisted for
|
|
73
|
+
* audit + idempotency so a re-read of an old record still
|
|
74
|
+
* surfaces the lease id even if the on-disk lease file has since
|
|
75
|
+
* been gc'd.
|
|
76
|
+
*
|
|
77
|
+
* v3 (Part 4.C) makes this structurally required. v2 records
|
|
78
|
+
* missing the field upgrade to `null` on read (see
|
|
79
|
+
* `upgradeRecord`).
|
|
80
|
+
*/
|
|
81
|
+
readonly leaseId: string | null;
|
|
82
|
+
/**
|
|
83
|
+
* Slice 2026-07-29-worktree-l2-extended Part 7: ISO timestamp of
|
|
84
|
+
* when the isolation mode was set up. For `--isolation worktree`
|
|
85
|
+
* this is the moment `peaks worktree spawn` returned; for
|
|
86
|
+
* `--isolation container` (Part 8) it's when the container
|
|
87
|
+
* runtime reported the container as running. `null` when the
|
|
88
|
+
* dispatch did not request isolation. Lets the dashboard
|
|
89
|
+
* compute isolation duration (now - isolationStartedAt) without
|
|
90
|
+
* cross-referencing the metrics stream.
|
|
91
|
+
*/
|
|
92
|
+
readonly isolationStartedAt: string | null;
|
|
32
93
|
}
|
|
33
94
|
/** Input for the initial write. */
|
|
34
95
|
export type WriteInitialDispatchInput = {
|
|
@@ -41,6 +102,22 @@ export type WriteInitialDispatchInput = {
|
|
|
41
102
|
batchId: string;
|
|
42
103
|
/** Override the timestamp (testing). */
|
|
43
104
|
now?: () => Date;
|
|
105
|
+
/**
|
|
106
|
+
* Slice 2026-07-29-worktree-l2-extended Part 3.A: the worktree
|
|
107
|
+
* lease id this dispatch owns (set by `peaks sub-agent dispatch
|
|
108
|
+
* --isolation worktree`). Persisted so the finalize-time release
|
|
109
|
+
* hook in `markCompleted` can fire even after the dispatch
|
|
110
|
+
* process exits. Optional; absent when the dispatch did not
|
|
111
|
+
* request isolation.
|
|
112
|
+
*/
|
|
113
|
+
leaseId?: string | null;
|
|
114
|
+
/**
|
|
115
|
+
* Slice 2026-07-29-worktree-l2-extended Part 7: ISO timestamp
|
|
116
|
+
* when the isolation mode was set up. Optional on the input
|
|
117
|
+
* (defaults to `null`); dispatch-commands.ts passes the spawn
|
|
118
|
+
* time when `--isolation` is requested.
|
|
119
|
+
*/
|
|
120
|
+
isolationStartedAt?: string | null;
|
|
44
121
|
};
|
|
45
122
|
/** Heartbeat write input. */
|
|
46
123
|
export type AppendHeartbeatInput = {
|
|
@@ -82,7 +159,7 @@ export interface ActiveDispatchEntry {
|
|
|
82
159
|
readonly role: string;
|
|
83
160
|
readonly batchId: string;
|
|
84
161
|
readonly createdAt: string;
|
|
85
|
-
readonly status: 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'cancelled' | 'stale' | 'no-execution';
|
|
162
|
+
readonly status: 'queued' | 'running' | 'finalizing' | 'done' | 'failed' | 'cancelled' | 'stale' | 'no-execution' | 'never-started' | 'unreadable';
|
|
86
163
|
}
|
|
87
164
|
/**
|
|
88
165
|
* Slice 2026-06-23-audit-4th #A4: read the active-dispatches index
|
|
@@ -118,6 +195,34 @@ export declare function applyTruncation(entries: readonly Heartbeat[]): {
|
|
|
118
195
|
heartbeats: Heartbeat[];
|
|
119
196
|
truncated: boolean;
|
|
120
197
|
};
|
|
198
|
+
/**
|
|
199
|
+
* Slice 2026-07-29-worktree-l2-extended Part 3.A: fire-and-forget
|
|
200
|
+
* auto-release for the lease owned by a dispatch. Called from
|
|
201
|
+
* `markCompleted` (terminal status) and from the heartbeat CLI
|
|
202
|
+
* (`--status done`).
|
|
203
|
+
*
|
|
204
|
+
* Design:
|
|
205
|
+
* - The release subprocess is spawned ASYNC and detached. The
|
|
206
|
+
* finalize-time caller (heartbeat / share / dispatch reducer)
|
|
207
|
+
* does NOT await it; the caller's job is to record the
|
|
208
|
+
* finalization, not to wait for the lease cleanup.
|
|
209
|
+
* - Failures are swallowed (best-effort, same as `git worktree
|
|
210
|
+
* remove` inside `peaks worktree release` itself). The next
|
|
211
|
+
* `peaks worktree gc` pass is the safety net.
|
|
212
|
+
* - Idempotent: re-calling with the same leaseId is a no-op on
|
|
213
|
+
* the release side (the CLI refuses to re-release an already-
|
|
214
|
+
* released lease; see Part 1 release command).
|
|
215
|
+
* - The leaseId MUST be 16-hex (same regex the gate uses). Any
|
|
216
|
+
* other value is silently ignored — we never shell out to
|
|
217
|
+
* `peaks worktree release` with attacker-controlled input.
|
|
218
|
+
*/
|
|
219
|
+
export declare function tryAutoReleaseLease(args: {
|
|
220
|
+
projectRoot: string;
|
|
221
|
+
sessionId: string;
|
|
222
|
+
leaseId: string;
|
|
223
|
+
/** Best-effort logging hook (e.g. logger.writeLogEntry). Returns null on failure. */
|
|
224
|
+
logger?: (line: string) => void;
|
|
225
|
+
}): void;
|
|
121
226
|
/** Mark a record as completed (success / failed / cancelled / no-execution). */
|
|
122
227
|
export declare function markCompleted(input: LifecycleInput): {
|
|
123
228
|
record: DispatchRecord;
|
|
@@ -126,6 +231,23 @@ export declare function markCompleted(input: LifecycleInput): {
|
|
|
126
231
|
export declare function markDisposed(recordPath: string, now?: () => Date): {
|
|
127
232
|
record: DispatchRecord;
|
|
128
233
|
};
|
|
234
|
+
/**
|
|
235
|
+
* Slice 2026-07-29-dispatch-stall-governance / S5 (AC-5.1) — promote
|
|
236
|
+
* the record's `stage` field. Rejects unknown values with
|
|
237
|
+
* `INVALID_STAGE`; the LLM-side runner surfaces the error so the
|
|
238
|
+
* sub-agent can pick from the bounded enum in ./stage-enum.ts.
|
|
239
|
+
*
|
|
240
|
+
* Atomic via the same `withFileLockSync` lock as `appendHeartbeat` /
|
|
241
|
+
* `markCompleted`. `null` is a valid argument ("clear the stage")
|
|
242
|
+
* but unknown strings are not.
|
|
243
|
+
*/
|
|
244
|
+
export declare function setStage(input: {
|
|
245
|
+
recordPath: string;
|
|
246
|
+
stage: StageLabel | null;
|
|
247
|
+
now?: () => Date;
|
|
248
|
+
}): {
|
|
249
|
+
record: DispatchRecord;
|
|
250
|
+
};
|
|
129
251
|
/**
|
|
130
252
|
* Read a dispatch record with backward-compat defaults. Old records
|
|
131
253
|
* missing G5 / G6 fields are upgraded on read (no error, no overwrite).
|