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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Auto-compact orchestrator (v2.13.0 AC-2 + AC-3 + AC-4).
|
|
3
3
|
*
|
|
4
|
-
* Closes the loop between `peaks
|
|
4
|
+
* Closes the loop between `peaks compact auto` (AC-1) and the IDE's
|
|
5
5
|
* native compact capability (AC-3). peaks-loop is project-aware: it
|
|
6
6
|
* knows the current plan, open questions, recent decisions, in-flight
|
|
7
7
|
* batches, todo state, git status, and active skills. That context is
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* 3. If 0.85 ≤ ratio < 0.95 (pre-compact zone): peaks-loop prepares
|
|
17
17
|
* the convergence toolkit (checkpoint + auto-decisions log +
|
|
18
18
|
* IDE-dispatch handle) and surfaces it to the LLM. The LLM
|
|
19
|
-
* DECIDES when to fire `peaks
|
|
19
|
+
* DECIDES when to fire `peaks compact auto --execute`;
|
|
20
20
|
* peaks-loop does NOT auto-fire. The toolkit is ready so the
|
|
21
21
|
* LLM doesn't lose context to a last-second `/compact` panic.
|
|
22
22
|
* 4. If ratio < 0.85: skip — return a one-line info row.
|
|
@@ -28,43 +28,69 @@
|
|
|
28
28
|
* the LLM-runner keeps working with context < 95% without human
|
|
29
29
|
* intervention.
|
|
30
30
|
*/
|
|
31
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
31
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync } from 'node:fs';
|
|
32
32
|
import { dirname, join } from 'node:path';
|
|
33
33
|
import { getSessionIdCanonical } from '../session/session-manager.js';
|
|
34
|
-
import {
|
|
34
|
+
import { AUTO_COMPACT_THRESHOLD_RATIO } from '../context/auto-compact-types.js';
|
|
35
|
+
import { describeMode, thresholdFor } from './auto-compact-modes.js';
|
|
36
|
+
import { read24hState } from '../24h-mode/store.js';
|
|
35
37
|
const PRE_COMPACT_REASON = 'pre-compact-auto';
|
|
36
38
|
/**
|
|
37
39
|
* Map a context ratio to a `CompactTrigger` action. Pure; the side
|
|
38
40
|
* effects (checkpoint + IDE dispatch) live in `runAutoCompact`. Two
|
|
39
|
-
* tiers:
|
|
41
|
+
* tiers (standard mode; partial mode shifts both thresholds):
|
|
40
42
|
*
|
|
41
|
-
* - ratio <
|
|
42
|
-
* - ratio ≥
|
|
43
|
-
* - ratio ≥
|
|
43
|
+
* - ratio < preCompact → 'none' or 'soft-warn'
|
|
44
|
+
* - ratio ≥ preCompact → 'pre-compact' (async-friendly path)
|
|
45
|
+
* - ratio ≥ redLine → 'red-line' (synchronous gate)
|
|
46
|
+
*
|
|
47
|
+
* Slice 2026-07-28 (rid-027): `mode` selects the threshold table.
|
|
48
|
+
* Default `'standard'` (0.85/0.95). `'partial'` (0.70/0.85) is used
|
|
49
|
+
* when 24h long-run mode is active or `--mode partial` is passed.
|
|
44
50
|
*/
|
|
45
|
-
export function evaluateCompactTrigger(ratio) {
|
|
46
|
-
|
|
51
|
+
export function evaluateCompactTrigger(ratio, mode = 'standard') {
|
|
52
|
+
const autoFire = thresholdFor(mode, 'autoFire');
|
|
53
|
+
const preCompact = thresholdFor(mode, 'preCompact');
|
|
54
|
+
const redLine = thresholdFor(mode, 'redLine');
|
|
55
|
+
if (ratio < autoFire) {
|
|
47
56
|
return ratio < 0.5
|
|
48
57
|
? { kind: 'none' }
|
|
49
58
|
: {
|
|
50
59
|
kind: 'soft-warn',
|
|
51
60
|
ratio,
|
|
52
|
-
message: `Context at ${(ratio * 100).toFixed(1)}%; below the
|
|
61
|
+
message: `Context at ${(ratio * 100).toFixed(1)}%; below the ${(autoFire * 100).toFixed(0)}% auto-fire threshold (mode=${mode}).`
|
|
53
62
|
};
|
|
54
63
|
}
|
|
55
|
-
if (ratio >=
|
|
64
|
+
if (ratio >= redLine) {
|
|
56
65
|
return {
|
|
57
66
|
kind: 'red-line',
|
|
58
67
|
ratio,
|
|
59
|
-
message: `Context at ${(ratio * 100).toFixed(1)}% ≥
|
|
68
|
+
message: `Context at ${(ratio * 100).toFixed(1)}% ≥ ${(redLine * 100).toFixed(0)}% red line (mode=${mode}). Synchronous compact REQUIRED (LLM cannot opt out).`
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (ratio < preCompact) {
|
|
72
|
+
// Part 22: auto-fire zone (0.80 ≤ ratio < 0.85). peaks-loop
|
|
73
|
+
// preempts and runs `peaks compact auto --execute` itself
|
|
74
|
+
// without LLM involvement. The LLM is not asked to "decide";
|
|
75
|
+
// the toolkit is applied synchronously. Closes the
|
|
76
|
+
// LLM-misjudges-context window that previously let the
|
|
77
|
+
// ratio drift to 0.95 before the auto-fire kicked in.
|
|
78
|
+
return {
|
|
79
|
+
kind: 'auto-fire',
|
|
80
|
+
ratio,
|
|
81
|
+
message: `Context at ${(ratio * 100).toFixed(1)}% in auto-fire zone (≥${(autoFire * 100).toFixed(0)}% / <${(preCompact * 100).toFixed(0)}%, mode=${mode}). peaks-loop will fire compact without LLM confirmation.`
|
|
60
82
|
};
|
|
61
83
|
}
|
|
62
|
-
// 0.85 ≤ ratio < 0.95:
|
|
84
|
+
// pre-compact zone (0.85 ≤ ratio < 0.95): kept for backward
|
|
85
|
+
// compat with operators who configured the higher threshold.
|
|
86
|
+
// In practice peaks-loop already auto-fired at the lower
|
|
87
|
+
// threshold; the pre-compact zone today is the "already fired"
|
|
88
|
+
// zone.
|
|
63
89
|
return {
|
|
64
90
|
kind: 'pre-compact',
|
|
65
91
|
ratio,
|
|
66
92
|
toolkitReady: true,
|
|
67
|
-
message: `Context at ${(ratio * 100).toFixed(1)}% in pre-compact zone (0.
|
|
93
|
+
message: `Context at ${(ratio * 100).toFixed(1)}% in pre-compact zone (≥${(preCompact * 100).toFixed(0)}% / <${(redLine * 100).toFixed(0)}%, mode=${mode}). peaks-loop already fired the auto-compact pathway at the auto-fire threshold; the LLM does not need to act.`
|
|
68
94
|
};
|
|
69
95
|
}
|
|
70
96
|
/**
|
|
@@ -80,7 +106,7 @@ export function evaluateCompactTrigger(ratio) {
|
|
|
80
106
|
* regardless of in-flight batch.
|
|
81
107
|
*/
|
|
82
108
|
export function evaluateAutoCompactDecision(input) {
|
|
83
|
-
const trigger = evaluateCompactTrigger(input.ratio);
|
|
109
|
+
const trigger = evaluateCompactTrigger(input.ratio, input.mode ?? 'standard');
|
|
84
110
|
if (trigger.kind === 'none' || trigger.kind === 'soft-warn') {
|
|
85
111
|
return { shouldCompact: false, reason: 'below-threshold', trigger };
|
|
86
112
|
}
|
|
@@ -206,6 +232,22 @@ function writePreCompactCheckpoint(input) {
|
|
|
206
232
|
writeFileSync(path, JSON.stringify(content, null, 2), 'utf8');
|
|
207
233
|
return path;
|
|
208
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Slice 2026-07-28 (rid-027): resolve the auto-compact mode from
|
|
237
|
+
* 24h-mode awareness. Returns `'partial'` when the session is
|
|
238
|
+
* `24H_ACTIVE`, otherwise `'standard'`. The CLI flag `--mode` takes
|
|
239
|
+
* precedence (caller passes `input.mode` directly), so this helper is
|
|
240
|
+
* only consulted when the flag is absent.
|
|
241
|
+
*/
|
|
242
|
+
function resolveAutoCompactMode(projectRoot, sessionId) {
|
|
243
|
+
try {
|
|
244
|
+
const snap = read24hState(projectRoot, sessionId);
|
|
245
|
+
return snap.state === '24H_ACTIVE' ? 'partial' : 'standard';
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return 'standard';
|
|
249
|
+
}
|
|
250
|
+
}
|
|
209
251
|
/**
|
|
210
252
|
* Execute the auto-compact flow.
|
|
211
253
|
*
|
|
@@ -235,6 +277,10 @@ export async function runAutoCompact(input) {
|
|
|
235
277
|
nextActions: ['Run `peaks workspace init --change-id <id>` to bind a session']
|
|
236
278
|
};
|
|
237
279
|
}
|
|
280
|
+
// Slice 2026-07-28 (rid-027): resolve mode. CLI flag `--mode` wins;
|
|
281
|
+
// 24h-mode awareness yields 'partial' when 24h_ACTIVE; default
|
|
282
|
+
// 'standard' preserves v2.13.0 zero-pause contract.
|
|
283
|
+
const mode = input.mode ?? resolveAutoCompactMode(input.projectRoot, sessionId);
|
|
238
284
|
// Lazy import to avoid the AC-1 module depending on the orchestrator.
|
|
239
285
|
const { readContextPercent } = await import('../context/auto-compact-reader.js');
|
|
240
286
|
const probe = readContextPercent({
|
|
@@ -246,7 +292,8 @@ export async function runAutoCompact(input) {
|
|
|
246
292
|
ratio: probe.ratio,
|
|
247
293
|
inFlightBatch: input.inFlightBatch,
|
|
248
294
|
force: input.force,
|
|
249
|
-
bypassRedLine: input.bypassRedLine
|
|
295
|
+
bypassRedLine: input.bypassRedLine,
|
|
296
|
+
mode
|
|
250
297
|
});
|
|
251
298
|
if (!decision.shouldCompact) {
|
|
252
299
|
return {
|
|
@@ -277,12 +324,12 @@ export async function runAutoCompact(input) {
|
|
|
277
324
|
? [
|
|
278
325
|
'RED-LINE compact dispatched — further sub-agent dispatch BLOCKED until ratio < 0.85',
|
|
279
326
|
'Post-compact resume picks up the convergence plan from auto-decisions.md',
|
|
280
|
-
'Next `peaks
|
|
327
|
+
'Next `peaks compact auto` probe will confirm ratio dropped below 0.85'
|
|
281
328
|
]
|
|
282
329
|
: [
|
|
283
330
|
'Pre-compact dispatched — IDE compact in progress (async)',
|
|
284
331
|
'Post-compact resume picks up the convergence plan from auto-decisions.md',
|
|
285
|
-
'Next `peaks
|
|
332
|
+
'Next `peaks compact auto` probe will confirm ratio dropped below 0.85'
|
|
286
333
|
];
|
|
287
334
|
const plan = buildConvergencePlan({
|
|
288
335
|
sessionId,
|
|
@@ -316,6 +363,31 @@ export async function runAutoCompact(input) {
|
|
|
316
363
|
env: input.env,
|
|
317
364
|
target
|
|
318
365
|
});
|
|
366
|
+
// Slice 2026-07-30-compact-visibility: append a compact-history
|
|
367
|
+
// event so the new 'peaks compact history' CLI and the
|
|
368
|
+
// 'peaks statusline compact' indicator have a record. The
|
|
369
|
+
// append is best-effort: a write failure must NOT block the
|
|
370
|
+
// compact return envelope.
|
|
371
|
+
try {
|
|
372
|
+
appendCompactHistoryEvent({
|
|
373
|
+
projectRoot: input.projectRoot,
|
|
374
|
+
sessionId,
|
|
375
|
+
event: {
|
|
376
|
+
schemaVersion: 1,
|
|
377
|
+
ts: now.toISOString(),
|
|
378
|
+
target,
|
|
379
|
+
mode,
|
|
380
|
+
ide: dispatch.ide,
|
|
381
|
+
pathway: dispatch.pathway,
|
|
382
|
+
beforeRatio: probe.ratio,
|
|
383
|
+
redLine: isRedLine,
|
|
384
|
+
ok: dispatch.ok,
|
|
385
|
+
checkpointPath,
|
|
386
|
+
dispatchMessage: dispatch.message,
|
|
387
|
+
},
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
catch { /* best-effort; do not fail the compact return */ }
|
|
319
391
|
return {
|
|
320
392
|
ok: dispatch.ok,
|
|
321
393
|
code: dispatch.ok
|
|
@@ -323,8 +395,8 @@ export async function runAutoCompact(input) {
|
|
|
323
395
|
: 'AUTO_COMPACT_DISPATCH_FAILED',
|
|
324
396
|
message: dispatch.ok
|
|
325
397
|
? isRedLine
|
|
326
|
-
? `RED-LINE compact dispatched (${dispatch.ide} / ${dispatch.pathway} / target=${target}); checkpoint at ${checkpointPath}. Further sub-agent dispatch is BLOCKED until ratio < 0.85.`
|
|
327
|
-
: `Auto-compact dispatched (${dispatch.ide} / ${dispatch.pathway} / target=${target}); checkpoint at ${checkpointPath}.`
|
|
398
|
+
? `RED-LINE compact dispatched (${dispatch.ide} / ${dispatch.pathway} / target=${target} / mode=${mode} — ${describeMode(mode)}); checkpoint at ${checkpointPath}. Further sub-agent dispatch is BLOCKED until ratio < 0.85.`
|
|
399
|
+
: `Auto-compact dispatched (${dispatch.ide} / ${dispatch.pathway} / target=${target} / mode=${mode} — ${describeMode(mode)}); checkpoint at ${checkpointPath}.`
|
|
328
400
|
: `Auto-compact checkpoint written but IDE dispatch failed: ${dispatch.message}`,
|
|
329
401
|
data: {
|
|
330
402
|
sessionId,
|
|
@@ -334,10 +406,18 @@ export async function runAutoCompact(input) {
|
|
|
334
406
|
convergencePlan: plan,
|
|
335
407
|
dispatch,
|
|
336
408
|
target,
|
|
409
|
+
mode,
|
|
337
410
|
redLineGated: isRedLine
|
|
338
411
|
}
|
|
339
412
|
};
|
|
340
413
|
}
|
|
414
|
+
export function appendCompactHistoryEvent(input) {
|
|
415
|
+
const dir = join(input.projectRoot, '.peaks', '_runtime', input.sessionId);
|
|
416
|
+
if (!existsSync(dir))
|
|
417
|
+
mkdirSync(dir, { recursive: true });
|
|
418
|
+
const path = join(dir, 'compact-history.jsonl');
|
|
419
|
+
appendFileSync(path, JSON.stringify(input.event) + '\n', 'utf8');
|
|
420
|
+
}
|
|
341
421
|
// Keep dirname import live for symmetry with sibling services that
|
|
342
422
|
// use it for path joins; tree-shaking removes it in builds.
|
|
343
423
|
void dirname;
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* dispatch --from-dag`) consumes the planner's output but the planner
|
|
26
26
|
* itself is a library.
|
|
27
27
|
*/
|
|
28
|
-
import { type SliceDag } from '../dispatch/slice-dag.js';
|
|
28
|
+
import { type SliceDag, type Wave, type WaveArtifact, type WaveOptions } from '../dispatch/slice-dag.js';
|
|
29
29
|
import { type SliceContract } from '../dispatch/contract-store.js';
|
|
30
30
|
export interface DispatchSpec {
|
|
31
31
|
readonly sliceId: string;
|
|
@@ -126,3 +126,32 @@ export declare function runDag(dag: SliceDag, opts: RunDagOptions): Promise<DagR
|
|
|
126
126
|
* peaks-code LLM) executes the per-IDE tool calls.
|
|
127
127
|
*/
|
|
128
128
|
export declare function runLayeredDag(dag: SliceDag, opts: RunDagOptions): Promise<DagRunResult>;
|
|
129
|
+
/**
|
|
130
|
+
* Plan a slice DAG into ordered dispatch Waves.
|
|
131
|
+
*
|
|
132
|
+
* Each topological level is split into chunks of at most
|
|
133
|
+
* `opts.maxConcurrency` slice IDs (default 6). Wave ordering follows
|
|
134
|
+
* topological level order; within each level, slices preserve
|
|
135
|
+
* `topologicalLevels`'s foundation / upstreamSync / id-asc priority sort.
|
|
136
|
+
*/
|
|
137
|
+
export declare function planDispatchWaves(dag: SliceDag, opts?: WaveOptions): readonly Wave[];
|
|
138
|
+
/**
|
|
139
|
+
* Backward-compat wrapper: flatten `planDispatchWaves(dag)` into a flat
|
|
140
|
+
* sequence of stub `DispatchSpec`s. The original `runDag` /
|
|
141
|
+
* `runLayeredDag` do NOT consume this; the wrapper exists only so
|
|
142
|
+
* external callers that imported `planDispatch(dag)` keep their shape.
|
|
143
|
+
*/
|
|
144
|
+
export declare function planDispatch(dag: SliceDag): readonly DispatchSpec[];
|
|
145
|
+
/**
|
|
146
|
+
* Run a single Wave: dispatch `wave.slices` in parallel, return a
|
|
147
|
+
* `WaveArtifact` envelope on success. On any per-slice failure or
|
|
148
|
+
* cancellation, REJECTS with `DagPlanError` — caller treats the
|
|
149
|
+
* rejection as a barrier violation and rolls back siblings.
|
|
150
|
+
*
|
|
151
|
+
* `passArtifacts`: when true, the returned envelope includes each
|
|
152
|
+
* slice's public surface (callers splice into downstream Wave prompts).
|
|
153
|
+
*
|
|
154
|
+
* `priorArtifacts` is reserved for future artifact-injection. This MVP
|
|
155
|
+
* accepts the shape but does not yet splice it into the prompt.
|
|
156
|
+
*/
|
|
157
|
+
export declare function runWaveWithArtifacts(dag: SliceDag, wave: Wave, runner: (spec: DispatchSpec) => Promise<SliceOutcome>, priorArtifacts?: readonly WaveArtifact[], opts?: WaveOptions): Promise<WaveArtifact>;
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* dispatch --from-dag`) consumes the planner's output but the planner
|
|
26
26
|
* itself is a library.
|
|
27
27
|
*/
|
|
28
|
-
import { hashDag, InvalidSliceDagError, topologicalLevels, validateDag } from '../dispatch/slice-dag.js';
|
|
28
|
+
import { hashDag, InvalidSliceDagError, topologicalLevels, validateDag, DEFAULT_WAVE_OPTIONS } from '../dispatch/slice-dag.js';
|
|
29
29
|
import { formatContractInjection, writeContract } from '../dispatch/contract-store.js';
|
|
30
30
|
import { formatTestToolDetection } from '../dispatch/test-tool-detection.js';
|
|
31
31
|
/** Thrown when the DAG has no feasible plan (validation error). */
|
|
@@ -302,3 +302,108 @@ export async function runLayeredDag(dag, opts) {
|
|
|
302
302
|
contracts
|
|
303
303
|
};
|
|
304
304
|
}
|
|
305
|
+
/* ──────────────────────────────────────────────────────────────────────────
|
|
306
|
+
* Slice 2026-07-28 — DAG wave + barrier (rid-029 E direction).
|
|
307
|
+
*
|
|
308
|
+
* The original `runDag` + `runLayeredDag` above dispatch an ENTIRE
|
|
309
|
+
* topological level in one `Promise.all` burst. For 24-hour scenarios
|
|
310
|
+
* with >=20 sub-agents this saturates the host. The wave planner below
|
|
311
|
+
* chunks each level into Waves of at most `maxConcurrency` slice IDs,
|
|
312
|
+
* and `runWaveWithArtifacts` runs one Wave at a time, returning a
|
|
313
|
+
* `WaveArtifact` envelope that downstream Waves can consume.
|
|
314
|
+
*
|
|
315
|
+
* Backward-compat: the original flat-dispatch APIs above are untouched;
|
|
316
|
+
* `planDispatchWaves` + `runWaveWithArtifacts` are purely additive.
|
|
317
|
+
* ────────────────────────────────────────────────────────────────────────── */
|
|
318
|
+
/**
|
|
319
|
+
* Plan a slice DAG into ordered dispatch Waves.
|
|
320
|
+
*
|
|
321
|
+
* Each topological level is split into chunks of at most
|
|
322
|
+
* `opts.maxConcurrency` slice IDs (default 6). Wave ordering follows
|
|
323
|
+
* topological level order; within each level, slices preserve
|
|
324
|
+
* `topologicalLevels`'s foundation / upstreamSync / id-asc priority sort.
|
|
325
|
+
*/
|
|
326
|
+
export function planDispatchWaves(dag, opts = DEFAULT_WAVE_OPTIONS) {
|
|
327
|
+
validateDag(dag);
|
|
328
|
+
if (opts.maxConcurrency <= 0) {
|
|
329
|
+
throw new DagPlanError(`WaveOptions.maxConcurrency must be > 0 (got ${opts.maxConcurrency})`);
|
|
330
|
+
}
|
|
331
|
+
const levels = topologicalLevels(dag);
|
|
332
|
+
const waves = [];
|
|
333
|
+
let waveIndex = 0;
|
|
334
|
+
for (const level of levels) {
|
|
335
|
+
for (let i = 0; i < level.length; i += opts.maxConcurrency) {
|
|
336
|
+
const chunk = level.slice(i, i + opts.maxConcurrency);
|
|
337
|
+
waves.push({ waveIndex, slices: chunk });
|
|
338
|
+
waveIndex += 1;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return waves;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Backward-compat wrapper: flatten `planDispatchWaves(dag)` into a flat
|
|
345
|
+
* sequence of stub `DispatchSpec`s. The original `runDag` /
|
|
346
|
+
* `runLayeredDag` do NOT consume this; the wrapper exists only so
|
|
347
|
+
* external callers that imported `planDispatch(dag)` keep their shape.
|
|
348
|
+
*/
|
|
349
|
+
export function planDispatch(dag) {
|
|
350
|
+
const waves = planDispatchWaves(dag);
|
|
351
|
+
const out = [];
|
|
352
|
+
for (const w of waves) {
|
|
353
|
+
for (const sliceId of w.slices) {
|
|
354
|
+
out.push({ sliceId, role: '', label: null, prompt: '', contractBlock: '' });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return out;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Run a single Wave: dispatch `wave.slices` in parallel, return a
|
|
361
|
+
* `WaveArtifact` envelope on success. On any per-slice failure or
|
|
362
|
+
* cancellation, REJECTS with `DagPlanError` — caller treats the
|
|
363
|
+
* rejection as a barrier violation and rolls back siblings.
|
|
364
|
+
*
|
|
365
|
+
* `passArtifacts`: when true, the returned envelope includes each
|
|
366
|
+
* slice's public surface (callers splice into downstream Wave prompts).
|
|
367
|
+
*
|
|
368
|
+
* `priorArtifacts` is reserved for future artifact-injection. This MVP
|
|
369
|
+
* accepts the shape but does not yet splice it into the prompt.
|
|
370
|
+
*/
|
|
371
|
+
export async function runWaveWithArtifacts(dag, wave, runner, priorArtifacts = [], opts = DEFAULT_WAVE_OPTIONS) {
|
|
372
|
+
validateDag(dag);
|
|
373
|
+
if (wave.slices.length === 0) {
|
|
374
|
+
throw new DagPlanError(`runWaveWithArtifacts: wave ${wave.waveIndex} has no slices`);
|
|
375
|
+
}
|
|
376
|
+
const collectedContracts = {};
|
|
377
|
+
const completedLeaves = [];
|
|
378
|
+
const settled = await Promise.all(wave.slices.map(async (sliceId) => {
|
|
379
|
+
const spec = buildDispatchSpec(dag, sliceId, []);
|
|
380
|
+
try {
|
|
381
|
+
const outcome = await runner(spec);
|
|
382
|
+
return { sliceId, outcome };
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
return {
|
|
386
|
+
sliceId,
|
|
387
|
+
outcome: { status: 'failed', reason: err.message }
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
}));
|
|
391
|
+
for (const { sliceId, outcome } of settled) {
|
|
392
|
+
if (outcome.status === 'done') {
|
|
393
|
+
completedLeaves.push(sliceId);
|
|
394
|
+
if (opts.passArtifacts) {
|
|
395
|
+
collectedContracts[sliceId] = outcome.publicSurface;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
void priorArtifacts;
|
|
400
|
+
throw new DagPlanError(`wave ${wave.waveIndex} aborted on slice ${sliceId}: ${outcome.status === 'failed' ? outcome.reason : outcome.status}`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return {
|
|
404
|
+
waveIndex: wave.waveIndex,
|
|
405
|
+
completedLeaves,
|
|
406
|
+
contracts: collectedContracts,
|
|
407
|
+
passedAt: new Date().toISOString()
|
|
408
|
+
};
|
|
409
|
+
}
|
|
@@ -18,6 +18,8 @@ export type SubAgentLiveView = {
|
|
|
18
18
|
readonly progress: number | null;
|
|
19
19
|
readonly lastBeatAgoSec: number | null;
|
|
20
20
|
readonly isStale: boolean;
|
|
21
|
+
readonly isNeverStarted: boolean;
|
|
22
|
+
readonly stage: string | null;
|
|
21
23
|
};
|
|
22
24
|
export type SwarmSummary = {
|
|
23
25
|
readonly total: number;
|
|
@@ -6,12 +6,23 @@ export function viewSubAgent(record, now = () => new Date()) {
|
|
|
6
6
|
? Math.max(0, Math.floor((now().getTime() - new Date(record.lastBeatAt).getTime()) / 1000))
|
|
7
7
|
: null;
|
|
8
8
|
const isStale = lastBeatAgo !== null && lastBeatAgo > STALE_THRESHOLD_SEC;
|
|
9
|
+
// Slice 2026-07-29-dispatch-stall-governance / S2 (AC-2.3) — never-
|
|
10
|
+
// started: no heartbeat ever landed (lastBeatAgo is null AND the
|
|
11
|
+
// record has not been promoted by a startup-timeout marker).
|
|
12
|
+
const isNeverStarted = lastBeatAgo === null && record.status === 'queued';
|
|
9
13
|
return {
|
|
10
14
|
role: record.role,
|
|
11
15
|
status: record.status,
|
|
12
16
|
progress: latest ? latest.progress : null,
|
|
13
17
|
lastBeatAgoSec: lastBeatAgo,
|
|
14
|
-
isStale
|
|
18
|
+
isStale,
|
|
19
|
+
isNeverStarted,
|
|
20
|
+
// S5 — surface the optional stage label so a long-running agent is
|
|
21
|
+
// legible. Reads from the record's `stage` field (added in the
|
|
22
|
+
// same slice); undefined on legacy records degrades to null.
|
|
23
|
+
stage: typeof record.stage === 'string'
|
|
24
|
+
? (record.stage ?? null)
|
|
25
|
+
: null
|
|
15
26
|
};
|
|
16
27
|
}
|
|
17
28
|
/** Aggregate swarm summary. */
|
|
@@ -50,6 +61,13 @@ function renderOne(record, now) {
|
|
|
50
61
|
const view = viewSubAgent(record, now);
|
|
51
62
|
const pct = view.progress !== null ? `${view.progress}%` : '?%';
|
|
52
63
|
const ago = view.lastBeatAgoSec !== null ? `${view.lastBeatAgoSec}s ago` : 'no beat';
|
|
53
|
-
|
|
54
|
-
|
|
64
|
+
// Slice 2026-07-29-dispatch-stall-governance / S2 (AC-2.3) — render
|
|
65
|
+
// never-started distinctly from stale so the orchestrator's eye can
|
|
66
|
+
// tell a sub-agent that never picked up the work apart from one that
|
|
67
|
+
// has gone quiet after starting.
|
|
68
|
+
const marker = view.isNeverStarted ? ' ⚠ never-started' : view.isStale ? ' ⚠ stale' : '';
|
|
69
|
+
// S5 (AC-5.2) — surface the optional stage label inline so a long-
|
|
70
|
+
// `running` agent is legible. Empty stage is omitted silently.
|
|
71
|
+
const stageSuffix = view.stage && view.stage.length > 0 ? ` [${view.stage}]` : '';
|
|
72
|
+
return `${view.role} ${pct} (${ago})${marker}${stageSuffix}`;
|
|
55
73
|
}
|
|
@@ -52,7 +52,7 @@ export interface SubprocessRunner {
|
|
|
52
52
|
* present (peaks-loop was installed but its dependency tree is
|
|
53
53
|
* corrupt, or the user removed it).
|
|
54
54
|
*
|
|
55
|
-
* Walks up from this file (dist/
|
|
55
|
+
* Walks up from this file (dist/services/code-review/) to
|
|
56
56
|
* find the project root, then checks node_modules.
|
|
57
57
|
*/
|
|
58
58
|
export declare function resolveOcrLauncher(searchRoots: readonly string[]): string | null;
|
|
@@ -101,7 +101,7 @@ const DEFAULT_RUNNER = {
|
|
|
101
101
|
* present (peaks-loop was installed but its dependency tree is
|
|
102
102
|
* corrupt, or the user removed it).
|
|
103
103
|
*
|
|
104
|
-
* Walks up from this file (dist/
|
|
104
|
+
* Walks up from this file (dist/services/code-review/) to
|
|
105
105
|
* find the project root, then checks node_modules.
|
|
106
106
|
*/
|
|
107
107
|
export function resolveOcrLauncher(searchRoots) {
|
|
@@ -122,8 +122,11 @@ export function resolveOcrLauncher(searchRoots) {
|
|
|
122
122
|
* (2) the user's cwd.
|
|
123
123
|
*/
|
|
124
124
|
export function defaultOcrSearchRoots(currentDirPath, cwd) {
|
|
125
|
-
// currentDirPath is dist/
|
|
126
|
-
|
|
125
|
+
// currentDirPath is dist/services/code-review/ under tsc rootDir=src;
|
|
126
|
+
// walk up 3 to repo root. If tsconfig.build.json#rootDir ever reverts
|
|
127
|
+
// to "." (emits dist/src/services/code-review/), this must become
|
|
128
|
+
// walk-4 — keep these two in lockstep.
|
|
129
|
+
const peaksRoot = join(currentDirPath, '..', '..', '..');
|
|
127
130
|
return [peaksRoot, cwd];
|
|
128
131
|
}
|
|
129
132
|
/**
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface CompactHistoryEvent {
|
|
2
|
+
readonly schemaVersion: 1;
|
|
3
|
+
readonly ts: string;
|
|
4
|
+
readonly target: 'main' | 'sub-agent' | 'worker';
|
|
5
|
+
readonly mode: 'standard' | 'partial' | 'aggressive';
|
|
6
|
+
readonly ide: string;
|
|
7
|
+
readonly pathway: string;
|
|
8
|
+
readonly beforeRatio: number;
|
|
9
|
+
readonly redLine: boolean;
|
|
10
|
+
readonly ok: boolean;
|
|
11
|
+
readonly checkpointPath: string;
|
|
12
|
+
readonly dispatchMessage: string;
|
|
13
|
+
}
|
|
14
|
+
export type CompactHistoryReadResult = {
|
|
15
|
+
readonly kind: 'file-missing';
|
|
16
|
+
readonly path: string;
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: 'empty';
|
|
19
|
+
readonly path: string;
|
|
20
|
+
} | {
|
|
21
|
+
readonly kind: 'ok';
|
|
22
|
+
readonly path: string;
|
|
23
|
+
readonly events: ReadonlyArray<CompactHistoryEvent>;
|
|
24
|
+
readonly parseErrors: ReadonlyArray<{
|
|
25
|
+
readonly line: number;
|
|
26
|
+
readonly raw: string;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
export declare function readCompactHistory(input: {
|
|
30
|
+
readonly projectRoot: string;
|
|
31
|
+
readonly sessionId: string;
|
|
32
|
+
}): CompactHistoryReadResult;
|
|
33
|
+
export interface CompactHistorySummary {
|
|
34
|
+
readonly totalCompacts: number;
|
|
35
|
+
readonly lastTs: string | null;
|
|
36
|
+
readonly lastBeforeRatio: number | null;
|
|
37
|
+
readonly lastRedLine: boolean;
|
|
38
|
+
readonly redLineCount: number;
|
|
39
|
+
readonly failedCount: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function summarizeCompactHistory(events: ReadonlyArray<CompactHistoryEvent>): CompactHistorySummary;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// src/services/compact-history/compact-history-service.ts
|
|
2
|
+
//
|
|
3
|
+
// Slice 2026-07-30-compact-visibility (slice 1/4). Pure-function
|
|
4
|
+
// reader for the .peaks/_runtime/<sessionId>/compact-history.jsonl
|
|
5
|
+
// file that auto-compact-orchestrator now appends to on every
|
|
6
|
+
// dispatch. The CLI surface `peaks compact history` and the
|
|
7
|
+
// statusline indicator both consume this service.
|
|
8
|
+
//
|
|
9
|
+
// The file is one JSON event per line. Malformed lines are
|
|
10
|
+
// surfaced as { kind: 'parse-error', line, raw } records so the
|
|
11
|
+
// caller (CLI / statusline) can warn without aborting the whole
|
|
12
|
+
// read.
|
|
13
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
export function readCompactHistory(input) {
|
|
16
|
+
const path = join(input.projectRoot, '.peaks', '_runtime', input.sessionId, 'compact-history.jsonl');
|
|
17
|
+
if (!existsSync(path)) {
|
|
18
|
+
return { kind: 'file-missing', path };
|
|
19
|
+
}
|
|
20
|
+
const raw = readFileSync(path, 'utf8');
|
|
21
|
+
const lines = raw.split(/\r?\n/).filter((l) => l.length > 0);
|
|
22
|
+
if (lines.length === 0) {
|
|
23
|
+
return { kind: 'empty', path };
|
|
24
|
+
}
|
|
25
|
+
const events = [];
|
|
26
|
+
const parseErrors = [];
|
|
27
|
+
lines.forEach((line, idx) => {
|
|
28
|
+
try {
|
|
29
|
+
const parsed = JSON.parse(line);
|
|
30
|
+
if (typeof parsed.beforeRatio !== 'number' || typeof parsed.ts !== 'string') {
|
|
31
|
+
parseErrors.push({ line: idx + 1, raw: line });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
events.push(parsed);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
parseErrors.push({ line: idx + 1, raw: line });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return { kind: 'ok', path, events, parseErrors };
|
|
41
|
+
}
|
|
42
|
+
export function summarizeCompactHistory(events) {
|
|
43
|
+
if (events.length === 0) {
|
|
44
|
+
return {
|
|
45
|
+
totalCompacts: 0,
|
|
46
|
+
lastTs: null,
|
|
47
|
+
lastBeforeRatio: null,
|
|
48
|
+
lastRedLine: false,
|
|
49
|
+
redLineCount: 0,
|
|
50
|
+
failedCount: 0,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const last = events[events.length - 1];
|
|
54
|
+
return {
|
|
55
|
+
totalCompacts: events.length,
|
|
56
|
+
lastTs: last.ts,
|
|
57
|
+
lastBeforeRatio: last.beforeRatio,
|
|
58
|
+
lastRedLine: last.redLine,
|
|
59
|
+
redLineCount: events.filter((e) => e.redLine).length,
|
|
60
|
+
failedCount: events.filter((e) => !e.ok).length,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface CompactStatuslineState {
|
|
2
|
+
readonly kind: 'missing' | 'idle' | 'pending' | 'red-line' | 'just-compacted';
|
|
3
|
+
readonly label: string;
|
|
4
|
+
readonly detail?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function decideCompactStatusline(input: {
|
|
7
|
+
readonly projectRoot: string;
|
|
8
|
+
readonly sessionId: string | null;
|
|
9
|
+
readonly now: number;
|
|
10
|
+
}): CompactStatuslineState;
|
|
11
|
+
/**
|
|
12
|
+
* Plain-text render: just the label. The LLM embeds this in
|
|
13
|
+
* the Claude Code statusline. Pure: no side effects, no I/O
|
|
14
|
+
* beyond the two file reads.
|
|
15
|
+
*/
|
|
16
|
+
export declare function renderCompactStatusline(state: CompactStatuslineState): string;
|