pi-crew 0.9.50 → 0.9.52
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 +150 -0
- package/README.md +216 -20
- package/dist/build-meta.json +2222 -1761
- package/dist/index.mjs +18636 -17603
- package/docs/actions-reference.md +431 -1
- package/package.json +19 -9
- package/schema.json +41 -0
- package/scripts/check-bundle-size.mjs +38 -0
- package/scripts/test-runner.mjs +11 -1
- package/skills/distill-software/SKILL.md +24 -1
- package/dist/index.mjs.map +0 -7
- package/docs/FEATURE_INTAKE.md +0 -126
- package/docs/HARNESS.md +0 -87
- package/docs/HARNESS_BACKLOG.md +0 -89
- package/docs/PROJECT_REVIEW.md +0 -270
- package/docs/PROJECT_REVIEW_FIXES.md +0 -342
- package/docs/PROJECT_REVIEW_ROUND4.md +0 -156
- package/docs/PROJECT_REVIEW_ROUND5.md +0 -86
- package/docs/REVIEW-FINDINGS-2026-06 +0 -357
- package/docs/REVIEW-FINDINGS-2026-07-CORE.md +0 -139
- package/docs/REVIEW-FINDINGS-2026-07.md +0 -125
- package/docs/TEST_MATRIX.md +0 -51
- package/docs/archive/README.md +0 -91
- package/docs/archive/followup-review-round3-2026-05-12.md +0 -342
- package/docs/archive/followup-review-round4-2026-05-13.md +0 -107
- package/docs/archive/pi-crew-bugs.md +0 -961
- package/docs/archive/pi-crew-test-final.md +0 -120
- package/docs/archive/pi-crew-test-results.md +0 -260
- package/docs/archive/pi-crew-test-round2.md +0 -136
- package/docs/archive/pi-crew-test-round4.md +0 -100
- package/docs/archive/pi-crew-test-round5.md +0 -70
- package/docs/archive/pi-crew-test-round6.md +0 -110
- package/docs/archive/pi-crew-v0.5.10-audit-fix-plan.md +0 -60
- package/docs/archive/pi-crew-v0.5.11-audit-fix-plan.md +0 -92
- package/docs/archive/pi-crew-v0.5.12-audit-fix-plan.md +0 -76
- package/docs/archive/pi-crew-v0.5.13-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.14-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.16-audit-fix-plan.md +0 -35
- package/docs/archive/pi-crew-v0.5.17-audit-fix-plan.md +0 -80
- package/docs/archive/pi-crew-v0.5.5-audit-fix-plan.md +0 -133
- package/docs/archive/pi-crew-v0.5.9-audit-fix-plan.md +0 -88
- package/docs/archive/pi-mono-opportunities.md +0 -969
- package/docs/archive/pi-mono-review.md +0 -291
- package/docs/archive/pi-subagent4-comparison.md +0 -261
- package/docs/archive/pi-subagents3-deep-analysis.md +0 -508
- package/docs/bugs/bug-021-notification-badge-counter-misleading.md +0 -293
- package/docs/bugs/bug-023-chain-windows-path-resolution.md +0 -106
- package/docs/bugs/bug-quota-display-truncation.md +0 -223
- package/docs/bugs/cross-session-notification-leakage.md +0 -82
- package/docs/code-review-2026-05-11.md +0 -592
- package/docs/coding-agent-optimization.md +0 -268
- package/docs/comparison-pi-subagents-vs-pi-crew.md +0 -303
- package/docs/decisions/0001-durable-state.md +0 -41
- package/docs/decisions/0002-child-process-for-async.md +0 -42
- package/docs/decisions/0003-depth-guard.md +0 -36
- package/docs/decisions/0004-execfile-over-exec.md +0 -34
- package/docs/decisions/0005-no-parameter-properties.md +0 -49
- package/docs/decisions/0006-publish-bundled-esm.md +0 -63
- package/docs/decisions/0007-active-run-binary-index.md +0 -54
- package/docs/decisions/0008-child-pi-warm-pool.md +0 -61
- package/docs/decisions/2026-07-21-broker-phase4-default-on.md +0 -77
- package/docs/decisions/2026-07-21-broker-windows-perms.md +0 -91
- package/docs/decisions/2026-07-22-broker-phase4-gated-on.md +0 -99
- package/docs/decisions/2026-07-24-oidc-trusted-publishing.md +0 -112
- package/docs/decisions/README.md +0 -26
- package/docs/deep-review-report.md +0 -384
- package/docs/distillation/cybersecurity-patterns.md +0 -294
- package/docs/feature-analysis-subagent4.md +0 -305
- package/docs/fix-plan-disabletools-exit-null.md +0 -219
- package/docs/fixes/BATCH_A_H1_H2.md +0 -86
- package/docs/fixes/bug-006-foreground-cancel-concurrent.md +0 -78
- package/docs/fixes/bug-007-async-notifier-stale-ctx.md +0 -112
- package/docs/fixes/bug-008-child-process-silent-timeout.md +0 -100
- package/docs/fixes/bug-009-executor-yield-limit-needs-attention.md +0 -75
- package/docs/fixes/bug-010-child-process-api-key-filtered.md +0 -109
- package/docs/fixes/bug-011-spawn-pi-enoent.md +0 -92
- package/docs/fixes/bug-012-essential-env-stripped.md +0 -89
- package/docs/fixes/bug-013-background-runner-death.md +0 -84
- package/docs/fixes/bug-014-infinite-retry-loop-needs-attention.md +0 -82
- package/docs/fixes/bug-015-background-runner-sigterm.md +0 -65
- package/docs/fixes/bug-017-background-runner-session-shutdown.md +0 -66
- package/docs/fixes/bug-017-background-runner-sigkill-double-fork.md +0 -28
- package/docs/fixes/bug-018-child-pi-worker-stdin-hang.md +0 -61
- package/docs/fixes/bug-019-phantom-runs-temp-workspace.md +0 -52
- package/docs/fixes/bug-020-infinite-retry-loop-needs-attention.md +0 -47
- package/docs/fixes/v0.9.10/locks-fix-verify.md +0 -3
- package/docs/fixes/v0.9.10/smoke-test.md +0 -12
- package/docs/followup-plan-2026-05-12.md +0 -463
- package/docs/followup-review-2026-05-12.md +0 -297
- package/docs/goals.md +0 -59
- package/docs/implementation-plan-top3.md +0 -333
- package/docs/issue-29-analysis.md +0 -189
- package/docs/live-mailbox-runtime.md +0 -36
- package/docs/migration/atomic-write-v2-migration.md +0 -299
- package/docs/next-upgrade-roadmap.md +0 -808
- package/docs/oh-my-pi-research.md +0 -509
- package/docs/optimization-plan-2026-07.md +0 -366
- package/docs/optimization-plan.md +0 -644
- package/docs/patterns/command-agent-skill.md +0 -71
- package/docs/perf/baseline-2026-05.md +0 -113
- package/docs/perf/final-report-2026-05.md +0 -206
- package/docs/perf/optimization-plan-2026-07-verified.md +0 -396
- package/docs/perf/performance-audit-report-2026-07.md +0 -948
- package/docs/perf/performance-review-2026-07.md +0 -287
- package/docs/perf/sprint-1-report.md +0 -71
- package/docs/perf/sprint-2-report.md +0 -81
- package/docs/perf/sprint-2.5-report.md +0 -53
- package/docs/perf/sprint-3-report.md +0 -36
- package/docs/perf/sprint-4-report.md +0 -47
- package/docs/perf/sprint-5-report.md +0 -51
- package/docs/perf/sprint-6-report.md +0 -94
- package/docs/perf/sprint-7-report.md +0 -74
- package/docs/perf/upgrade-plan-2026-05.md +0 -147
- package/docs/performance-optimization-execution-plan.md +0 -520
- package/docs/phase4-triage.md +0 -58
- package/docs/pi-crew-investigation-report.md +0 -411
- package/docs/product/README.md +0 -31
- package/docs/product/platform.md +0 -27
- package/docs/product/runtime-safety.md +0 -37
- package/docs/product/team-run.md +0 -39
- package/docs/product/team-tool.md +0 -37
- package/docs/runtime-analysis-child-vs-live.md +0 -171
- package/docs/runtime-migration-in-process-analysis.md +0 -250
- package/docs/skills/REFERENCE.md +0 -138
- package/docs/stories/README.md +0 -32
- package/docs/stories/US-DEPS-major-upgrade.md +0 -62
- package/docs/stories/backlog.md +0 -36
- package/docs/superpowers/plans/2026-06-09-fallow-patterns-adoption.md +0 -1270
- package/docs/templates/decision.md +0 -27
- package/docs/templates/story.md +0 -44
- package/docs/templates/validation-report.md +0 -32
- package/docs/ui-optimization-plan.md +0 -447
- package/src/adapters/claude-adapter.ts +0 -23
- package/src/adapters/codex-adapter.ts +0 -21
- package/src/adapters/cursor-adapter.ts +0 -17
- package/src/adapters/export-util.ts +0 -143
- package/src/adapters/index.ts +0 -15
- package/src/adapters/registry.ts +0 -18
- package/src/adapters/types.ts +0 -23
- package/src/agents/agent-config.ts +0 -194
- package/src/agents/agent-search.ts +0 -98
- package/src/agents/agent-serializer.ts +0 -38
- package/src/agents/discover-agents.ts +0 -623
- package/src/benchmark/benchmark-runner.ts +0 -313
- package/src/benchmark/feedback-loop.ts +0 -73
- package/src/config/config.ts +0 -1269
- package/src/config/defaults.ts +0 -193
- package/src/config/drift-detector.ts +0 -290
- package/src/config/markers.ts +0 -330
- package/src/config/resilient-parser.ts +0 -117
- package/src/config/role-tools.ts +0 -118
- package/src/config/suggestions.ts +0 -75
- package/src/config/types.ts +0 -278
- package/src/errors.ts +0 -194
- package/src/extension/action-suggestions.ts +0 -117
- package/src/extension/async-notifier.ts +0 -179
- package/src/extension/autonomous-policy.ts +0 -209
- package/src/extension/command-completions.ts +0 -120
- package/src/extension/context-status-injection.ts +0 -185
- package/src/extension/crew-autocomplete.ts +0 -131
- package/src/extension/crew-cleanup.ts +0 -168
- package/src/extension/crew-input-router.ts +0 -93
- package/src/extension/crew-shortcuts.ts +0 -87
- package/src/extension/crew-vibes/cat-frames.ts +0 -18
- package/src/extension/crew-vibes/config.ts +0 -195
- package/src/extension/crew-vibes/figures.ts +0 -101
- package/src/extension/crew-vibes/font-detect.ts +0 -71
- package/src/extension/crew-vibes/footer.ts +0 -292
- package/src/extension/crew-vibes/index.ts +0 -432
- package/src/extension/crew-vibes/provider-usage.ts +0 -396
- package/src/extension/crew-vibes/render.ts +0 -206
- package/src/extension/crew-vibes/speed.ts +0 -286
- package/src/extension/cross-extension-rpc.ts +0 -350
- package/src/extension/help.ts +0 -62
- package/src/extension/import-index.ts +0 -74
- package/src/extension/knowledge-injection.ts +0 -402
- package/src/extension/management.ts +0 -571
- package/src/extension/message-renderers.ts +0 -108
- package/src/extension/notification-router.ts +0 -152
- package/src/extension/notification-sink.ts +0 -54
- package/src/extension/pi-api.ts +0 -56
- package/src/extension/plan-orchestrate.ts +0 -302
- package/src/extension/project-init.ts +0 -170
- package/src/extension/register.ts +0 -113
- package/src/extension/registration/artifact-cleanup.ts +0 -20
- package/src/extension/registration/command-registration.ts +0 -58
- package/src/extension/registration/command-utils.ts +0 -58
- package/src/extension/registration/commands.ts +0 -1228
- package/src/extension/registration/compaction-guard.ts +0 -333
- package/src/extension/registration/context-builder.ts +0 -135
- package/src/extension/registration/crash-recovery-cache.ts +0 -54
- package/src/extension/registration/foreground-run-controller.ts +0 -238
- package/src/extension/registration/hook-registration.ts +0 -119
- package/src/extension/registration/lazy-configurers.ts +0 -124
- package/src/extension/registration/lifecycle-handlers.ts +0 -923
- package/src/extension/registration/lifecycle.ts +0 -259
- package/src/extension/registration/observability.ts +0 -322
- package/src/extension/registration/registration-types.ts +0 -158
- package/src/extension/registration/runtime-cleanup.ts +0 -230
- package/src/extension/registration/subagent-helpers.ts +0 -125
- package/src/extension/registration/subagent-manager-setup.ts +0 -330
- package/src/extension/registration/subagent-tools.ts +0 -456
- package/src/extension/registration/team-tool.ts +0 -220
- package/src/extension/registration/tool-registration.ts +0 -50
- package/src/extension/registration/ui.ts +0 -172
- package/src/extension/registration/viewers.ts +0 -121
- package/src/extension/registration/wire-cross-extension.ts +0 -37
- package/src/extension/result-watcher.ts +0 -139
- package/src/extension/rpc-hmac.ts +0 -256
- package/src/extension/run-bundle-schema.ts +0 -104
- package/src/extension/run-export.ts +0 -97
- package/src/extension/run-import.ts +0 -168
- package/src/extension/run-index.ts +0 -131
- package/src/extension/run-maintenance.ts +0 -190
- package/src/extension/session-summary.ts +0 -18
- package/src/extension/team-manager-command.ts +0 -153
- package/src/extension/team-onboard.ts +0 -177
- package/src/extension/team-recommendation.ts +0 -288
- package/src/extension/team-tool/anchor.ts +0 -172
- package/src/extension/team-tool/api.ts +0 -1244
- package/src/extension/team-tool/auto-summarize.ts +0 -142
- package/src/extension/team-tool/cache-control.ts +0 -19
- package/src/extension/team-tool/cancel.ts +0 -337
- package/src/extension/team-tool/chain-dispatch.ts +0 -95
- package/src/extension/team-tool/chain-executor.ts +0 -379
- package/src/extension/team-tool/config-patch.ts +0 -50
- package/src/extension/team-tool/context.ts +0 -149
- package/src/extension/team-tool/destructive-gate.ts +0 -52
- package/src/extension/team-tool/doctor.ts +0 -431
- package/src/extension/team-tool/explain.ts +0 -282
- package/src/extension/team-tool/failure-patterns.ts +0 -118
- package/src/extension/team-tool/goal-wrap.ts +0 -330
- package/src/extension/team-tool/goal.ts +0 -556
- package/src/extension/team-tool/handle-schedule.ts +0 -332
- package/src/extension/team-tool/handle-settings.ts +0 -520
- package/src/extension/team-tool/health-monitor.ts +0 -481
- package/src/extension/team-tool/inspect.ts +0 -88
- package/src/extension/team-tool/intent-policy.ts +0 -45
- package/src/extension/team-tool/lifecycle-actions.ts +0 -615
- package/src/extension/team-tool/orchestrate.ts +0 -98
- package/src/extension/team-tool/parallel-dispatch.ts +0 -183
- package/src/extension/team-tool/plan.ts +0 -50
- package/src/extension/team-tool/respond.ts +0 -150
- package/src/extension/team-tool/run-not-found.ts +0 -49
- package/src/extension/team-tool/run.ts +0 -1035
- package/src/extension/team-tool/status.ts +0 -260
- package/src/extension/team-tool/workflow-manage.ts +0 -261
- package/src/extension/team-tool-types.ts +0 -26
- package/src/extension/team-tool.ts +0 -1116
- package/src/extension/tool-result.ts +0 -16
- package/src/extension/validate-resources.ts +0 -108
- package/src/hooks/registry.ts +0 -200
- package/src/hooks/types.ts +0 -69
- package/src/i18n.ts +0 -212
- package/src/observability/correlation.ts +0 -50
- package/src/observability/event-bus.ts +0 -86
- package/src/observability/event-to-metric.ts +0 -170
- package/src/observability/exporters/adapter.ts +0 -27
- package/src/observability/exporters/otlp-exporter.ts +0 -356
- package/src/observability/exporters/prometheus-exporter.ts +0 -54
- package/src/observability/metric-registry.ts +0 -100
- package/src/observability/metric-retention.ts +0 -64
- package/src/observability/metric-sink.ts +0 -99
- package/src/observability/metrics-primitives.ts +0 -219
- package/src/plugins/plugin-define.ts +0 -6
- package/src/plugins/plugin-registry.ts +0 -32
- package/src/plugins/plugins/index.ts +0 -3
- package/src/plugins/plugins/nextjs.ts +0 -19
- package/src/plugins/plugins/vite.ts +0 -10
- package/src/plugins/plugins/vitest.ts +0 -9
- package/src/prompt/prompt-runtime.ts +0 -380
- package/src/runtime/adaptive-plan.ts +0 -563
- package/src/runtime/agent-control.ts +0 -215
- package/src/runtime/agent-memory.ts +0 -81
- package/src/runtime/agent-observability.ts +0 -122
- package/src/runtime/anchor-manager.ts +0 -475
- package/src/runtime/async-marker.ts +0 -32
- package/src/runtime/async-runner.ts +0 -381
- package/src/runtime/attention-events.ts +0 -28
- package/src/runtime/auto-summarize.ts +0 -344
- package/src/runtime/background-runner.ts +0 -837
- package/src/runtime/batch-barrier.ts +0 -147
- package/src/runtime/broker-issuer.ts +0 -37
- package/src/runtime/cancellation-token.ts +0 -99
- package/src/runtime/cancellation.ts +0 -99
- package/src/runtime/capability-inventory.ts +0 -137
- package/src/runtime/chain-parser.ts +0 -237
- package/src/runtime/chain-runner.ts +0 -606
- package/src/runtime/checkpoint.ts +0 -291
- package/src/runtime/child-pi-constants.ts +0 -42
- package/src/runtime/child-pi-kill.ts +0 -180
- package/src/runtime/child-pi-pool.ts +0 -68
- package/src/runtime/child-pi-spawn.ts +0 -287
- package/src/runtime/child-pi-steering.ts +0 -128
- package/src/runtime/child-pi-streams.ts +0 -296
- package/src/runtime/child-pi-transcript.ts +0 -169
- package/src/runtime/child-pi.ts +0 -1105
- package/src/runtime/coalesce-tasks.ts +0 -268
- package/src/runtime/code-summary.ts +0 -292
- package/src/runtime/command-trace.ts +0 -105
- package/src/runtime/compact-pipeline.ts +0 -56
- package/src/runtime/compact-stages/ansi-strip-stage.ts +0 -25
- package/src/runtime/compact-stages/blank-collapse-stage.ts +0 -31
- package/src/runtime/compact-stages/deduplicate-stage.ts +0 -34
- package/src/runtime/compact-stages/head-snap-stage.ts +0 -57
- package/src/runtime/compact-stages/index.ts +0 -23
- package/src/runtime/compact-stages/tail-capture-stage.ts +0 -77
- package/src/runtime/compact-stages/truncation-stage.ts +0 -74
- package/src/runtime/compaction-summary.ts +0 -278
- package/src/runtime/completion-guard.ts +0 -207
- package/src/runtime/concurrency.ts +0 -58
- package/src/runtime/crash-classification.ts +0 -229
- package/src/runtime/crash-recovery.ts +0 -577
- package/src/runtime/crew-agent-records.ts +0 -593
- package/src/runtime/crew-agent-runtime.ts +0 -62
- package/src/runtime/crew-broker-child.ts +0 -88
- package/src/runtime/crew-broker-client.ts +0 -673
- package/src/runtime/crew-broker-tokens.ts +0 -84
- package/src/runtime/crew-broker.ts +0 -1276
- package/src/runtime/crew-hooks.ts +0 -227
- package/src/runtime/cross-extension-rpc.ts +0 -143
- package/src/runtime/custom-tools/irc-tool.ts +0 -282
- package/src/runtime/custom-tools/submit-result-tool.ts +0 -102
- package/src/runtime/deadletter.ts +0 -47
- package/src/runtime/delivery-coordinator.ts +0 -211
- package/src/runtime/delta-conflict.ts +0 -348
- package/src/runtime/deterministic-ast.ts +0 -161
- package/src/runtime/diagnostic-export.ts +0 -171
- package/src/runtime/direct-run.ts +0 -45
- package/src/runtime/dwf-state-store.ts +0 -102
- package/src/runtime/dynamic-workflow-context.ts +0 -1016
- package/src/runtime/dynamic-workflow-runner.ts +0 -310
- package/src/runtime/effectiveness.ts +0 -90
- package/src/runtime/errors/crew-errors.ts +0 -162
- package/src/runtime/event-stream-bridge.ts +0 -98
- package/src/runtime/foreground-control.ts +0 -193
- package/src/runtime/foreground-watchdog.ts +0 -132
- package/src/runtime/global-worker-cap.ts +0 -96
- package/src/runtime/goal-achievement.ts +0 -148
- package/src/runtime/goal-evaluator.ts +0 -361
- package/src/runtime/goal-loop-runner.ts +0 -828
- package/src/runtime/goal-state-store.ts +0 -219
- package/src/runtime/green-contract.ts +0 -55
- package/src/runtime/group-join.ts +0 -267
- package/src/runtime/handoff-manager.ts +0 -598
- package/src/runtime/heartbeat-gradient.ts +0 -36
- package/src/runtime/heartbeat-watcher.ts +0 -239
- package/src/runtime/hidden-handoff.ts +0 -407
- package/src/runtime/important-line-classifier.ts +0 -140
- package/src/runtime/intercom-bridge.ts +0 -187
- package/src/runtime/iteration-hooks.ts +0 -305
- package/src/runtime/live-agent-control.ts +0 -136
- package/src/runtime/live-agent-manager.ts +0 -704
- package/src/runtime/live-control-realtime.ts +0 -56
- package/src/runtime/live-extension-bridge.ts +0 -148
- package/src/runtime/live-irc.ts +0 -97
- package/src/runtime/live-session-health.ts +0 -108
- package/src/runtime/live-session-runtime.ts +0 -1139
- package/src/runtime/loop-gates.ts +0 -128
- package/src/runtime/manifest-cache.ts +0 -375
- package/src/runtime/mcp-proxy.ts +0 -105
- package/src/runtime/metric-parser.ts +0 -36
- package/src/runtime/model-fallback.ts +0 -409
- package/src/runtime/model-resolver.ts +0 -126
- package/src/runtime/model-scope.ts +0 -158
- package/src/runtime/orphan-worker-registry.ts +0 -465
- package/src/runtime/output-validator.ts +0 -202
- package/src/runtime/overflow-recovery.ts +0 -206
- package/src/runtime/parallel-research.ts +0 -68
- package/src/runtime/parallel-utils.ts +0 -160
- package/src/runtime/parent-guard.ts +0 -134
- package/src/runtime/path-overlap.ts +0 -150
- package/src/runtime/peer-dep.ts +0 -292
- package/src/runtime/per-write-validator.ts +0 -181
- package/src/runtime/phase-progress.ts +0 -217
- package/src/runtime/phase-tracker.ts +0 -385
- package/src/runtime/pi-args.ts +0 -655
- package/src/runtime/pi-json-output.ts +0 -170
- package/src/runtime/pi-spawn.ts +0 -273
- package/src/runtime/pipeline-runner.ts +0 -523
- package/src/runtime/plan-templates.ts +0 -201
- package/src/runtime/policy-engine.ts +0 -115
- package/src/runtime/post-checks.ts +0 -142
- package/src/runtime/post-exit-stdio-guard.ts +0 -104
- package/src/runtime/process-lifecycle.ts +0 -491
- package/src/runtime/process-status.ts +0 -154
- package/src/runtime/progress-event-coalescer.ts +0 -44
- package/src/runtime/progress-tracker.ts +0 -124
- package/src/runtime/prose-compressor.ts +0 -162
- package/src/runtime/recovery-recipes.ts +0 -203
- package/src/runtime/replace.ts +0 -570
- package/src/runtime/resilient-edit.ts +0 -153
- package/src/runtime/result-extractor.ts +0 -213
- package/src/runtime/retry-executor.ts +0 -100
- package/src/runtime/retry-runner.ts +0 -336
- package/src/runtime/role-permission.ts +0 -59
- package/src/runtime/run-coalesced-task-group.ts +0 -308
- package/src/runtime/run-drift.ts +0 -219
- package/src/runtime/run-tracker.ts +0 -116
- package/src/runtime/runtime-policy.ts +0 -29
- package/src/runtime/runtime-resolver.ts +0 -172
- package/src/runtime/runtime-warmup.ts +0 -160
- package/src/runtime/scheduler.ts +0 -353
- package/src/runtime/semaphore.ts +0 -141
- package/src/runtime/sensitive-paths.ts +0 -93
- package/src/runtime/session-resources.ts +0 -25
- package/src/runtime/session-snapshot.ts +0 -59
- package/src/runtime/session-usage.ts +0 -79
- package/src/runtime/settings-store.ts +0 -155
- package/src/runtime/sidechain-output.ts +0 -35
- package/src/runtime/single-agent-compose.ts +0 -84
- package/src/runtime/skill-effectiveness.ts +0 -524
- package/src/runtime/skill-instructions.ts +0 -391
- package/src/runtime/stale-reconciler.ts +0 -680
- package/src/runtime/stream-preview.ts +0 -184
- package/src/runtime/streaming-output.ts +0 -50
- package/src/runtime/subagent-manager.ts +0 -561
- package/src/runtime/subprocess-tool-registry.ts +0 -70
- package/src/runtime/supervisor-contact.ts +0 -64
- package/src/runtime/task-display.ts +0 -52
- package/src/runtime/task-graph-scheduler.ts +0 -227
- package/src/runtime/task-graph.ts +0 -290
- package/src/runtime/task-health.ts +0 -83
- package/src/runtime/task-id.ts +0 -161
- package/src/runtime/task-output-context.ts +0 -602
- package/src/runtime/task-packet.ts +0 -268
- package/src/runtime/task-quality.ts +0 -199
- package/src/runtime/task-runner/capabilities.ts +0 -78
- package/src/runtime/task-runner/context-retrieval.ts +0 -163
- package/src/runtime/task-runner/live-executor.ts +0 -227
- package/src/runtime/task-runner/output-splitter.ts +0 -152
- package/src/runtime/task-runner/progress.ts +0 -157
- package/src/runtime/task-runner/prompt-builder.ts +0 -278
- package/src/runtime/task-runner/prompt-pipeline.ts +0 -88
- package/src/runtime/task-runner/result-utils.ts +0 -16
- package/src/runtime/task-runner/retrieval-orchestrator.ts +0 -310
- package/src/runtime/task-runner/run-projection.ts +0 -125
- package/src/runtime/task-runner/state-helpers.ts +0 -176
- package/src/runtime/task-runner/tail-read.ts +0 -34
- package/src/runtime/task-runner.ts +0 -1420
- package/src/runtime/team-runner-artifacts.ts +0 -13
- package/src/runtime/team-runner.ts +0 -1993
- package/src/runtime/tool-output-pruner.ts +0 -333
- package/src/runtime/tool-progress.ts +0 -278
- package/src/runtime/usage-tracker.ts +0 -73
- package/src/runtime/verification-gates.ts +0 -571
- package/src/runtime/verification-integrity.ts +0 -105
- package/src/runtime/verification-worktree.ts +0 -186
- package/src/runtime/worker-heartbeat.ts +0 -25
- package/src/runtime/worker-startup.ts +0 -83
- package/src/runtime/workflow-state.ts +0 -195
- package/src/runtime/workspace-lock.ts +0 -443
- package/src/runtime/workspace-tree.ts +0 -312
- package/src/runtime/yield-handler.ts +0 -224
- package/src/runtime/zombie-scanner.ts +0 -298
- package/src/schema/config-schema.ts +0 -327
- package/src/schema/team-tool-schema.ts +0 -415
- package/src/schema/validation-types.ts +0 -159
- package/src/skills/discover-skills.ts +0 -197
- package/src/skills/skill-templates.ts +0 -456
- package/src/skills/validate.ts +0 -285
- package/src/state/active-run-registry.ts +0 -439
- package/src/state/artifact-store.ts +0 -176
- package/src/state/atomic-write.ts +0 -903
- package/src/state/blob-store.ts +0 -308
- package/src/state/contracts.ts +0 -158
- package/src/state/crew-init.ts +0 -269
- package/src/state/decision-ledger.ts +0 -345
- package/src/state/event-log-rotation.ts +0 -342
- package/src/state/event-log.ts +0 -1311
- package/src/state/event-reconstructor.ts +0 -229
- package/src/state/gitignore-manager.ts +0 -46
- package/src/state/health-store.ts +0 -79
- package/src/state/hook-instinct-bridge.ts +0 -94
- package/src/state/hook-integrations.ts +0 -51
- package/src/state/instinct-store.ts +0 -275
- package/src/state/jsonl-writer.ts +0 -107
- package/src/state/locks.ts +0 -562
- package/src/state/mailbox.ts +0 -916
- package/src/state/observation-store.ts +0 -176
- package/src/state/run-cache.ts +0 -193
- package/src/state/run-graph.ts +0 -183
- package/src/state/run-metrics.ts +0 -165
- package/src/state/schedule.ts +0 -166
- package/src/state/session-state-map.ts +0 -51
- package/src/state/state-store.ts +0 -958
- package/src/state/task-claims.ts +0 -61
- package/src/state/tiered-eval.ts +0 -480
- package/src/state/types-eval.ts +0 -58
- package/src/state/types.ts +0 -440
- package/src/state/usage.ts +0 -138
- package/src/state/worker-atomic-writer.ts +0 -194
- package/src/subagents/async-entry.ts +0 -1
- package/src/subagents/index.ts +0 -3
- package/src/subagents/live/control.ts +0 -1
- package/src/subagents/live/manager.ts +0 -1
- package/src/subagents/live/realtime.ts +0 -1
- package/src/subagents/live/session-runtime.ts +0 -1
- package/src/subagents/manager.ts +0 -1
- package/src/subagents/spawn.ts +0 -1
- package/src/teams/discover-teams.ts +0 -187
- package/src/teams/team-config.ts +0 -27
- package/src/teams/team-serializer.ts +0 -38
- package/src/tools/safe-bash-extension.ts +0 -54
- package/src/tools/safe-bash.ts +0 -505
- package/src/types/diff.d.ts +0 -18
- package/src/types/new-api-types.ts +0 -35
- package/src/ui/agent-management-overlay.ts +0 -160
- package/src/ui/card-colors.ts +0 -139
- package/src/ui/crew-footer.ts +0 -102
- package/src/ui/crew-select-list.ts +0 -111
- package/src/ui/dashboard-panes/agents-pane.ts +0 -164
- package/src/ui/dashboard-panes/cancellation-pane.ts +0 -66
- package/src/ui/dashboard-panes/capability-pane.ts +0 -77
- package/src/ui/dashboard-panes/health-pane.ts +0 -31
- package/src/ui/dashboard-panes/mailbox-pane.ts +0 -35
- package/src/ui/dashboard-panes/metrics-pane.ts +0 -37
- package/src/ui/dashboard-panes/progress-pane.ts +0 -38
- package/src/ui/dashboard-panes/transcript-pane.ts +0 -10
- package/src/ui/deploy-bundled-themes.ts +0 -71
- package/src/ui/dwf-phase-display.ts +0 -151
- package/src/ui/dynamic-border.ts +0 -35
- package/src/ui/heartbeat-aggregator.ts +0 -74
- package/src/ui/key-utils.ts +0 -42
- package/src/ui/keybinding-map.ts +0 -248
- package/src/ui/layout-primitives.ts +0 -106
- package/src/ui/live-conversation-overlay.ts +0 -183
- package/src/ui/live-duration.ts +0 -55
- package/src/ui/live-run-sidebar.ts +0 -301
- package/src/ui/loaders.ts +0 -176
- package/src/ui/mascot.ts +0 -436
- package/src/ui/overlays/agent-picker-overlay.ts +0 -65
- package/src/ui/overlays/confirm-overlay.ts +0 -60
- package/src/ui/overlays/help-overlay.ts +0 -177
- package/src/ui/overlays/mailbox-compose-overlay.ts +0 -181
- package/src/ui/overlays/mailbox-compose-preview.ts +0 -78
- package/src/ui/overlays/mailbox-detail-overlay.ts +0 -154
- package/src/ui/pi-ui-compat.ts +0 -68
- package/src/ui/powerbar-publisher.ts +0 -459
- package/src/ui/render-coalescer.ts +0 -101
- package/src/ui/render-diff.ts +0 -160
- package/src/ui/render-scheduler.ts +0 -224
- package/src/ui/run-action-dispatcher.ts +0 -182
- package/src/ui/run-dashboard.ts +0 -913
- package/src/ui/run-event-bus.ts +0 -381
- package/src/ui/run-snapshot-cache.ts +0 -1057
- package/src/ui/settings-overlay.ts +0 -1067
- package/src/ui/snapshot-types.ts +0 -90
- package/src/ui/spinner.ts +0 -17
- package/src/ui/status-colors.ts +0 -143
- package/src/ui/syntax-highlight.ts +0 -136
- package/src/ui/terminal-status.ts +0 -269
- package/src/ui/theme-adapter.ts +0 -271
- package/src/ui/theme-discovery.ts +0 -199
- package/src/ui/tool-progress-formatter.ts +0 -93
- package/src/ui/tool-render.ts +0 -453
- package/src/ui/tool-renderers/brief-mode.ts +0 -225
- package/src/ui/tool-renderers/index.ts +0 -726
- package/src/ui/transcript-cache.ts +0 -128
- package/src/ui/transcript-entries.ts +0 -256
- package/src/ui/transcript-viewer.ts +0 -424
- package/src/ui/widget/index.ts +0 -357
- package/src/ui/widget/widget-formatters.ts +0 -182
- package/src/ui/widget/widget-model.ts +0 -110
- package/src/ui/widget/widget-renderer.ts +0 -182
- package/src/ui/widget/widget-types.ts +0 -36
- package/src/utils/bm25-search.ts +0 -235
- package/src/utils/completion-dedupe.ts +0 -63
- package/src/utils/conflict-detect.ts +0 -668
- package/src/utils/env-allowlist.ts +0 -30
- package/src/utils/env-filter.ts +0 -155
- package/src/utils/file-coalescer.ts +0 -98
- package/src/utils/fingerprint.ts +0 -180
- package/src/utils/frontmatter.ts +0 -70
- package/src/utils/fs-watch.ts +0 -37
- package/src/utils/gh-protocol.ts +0 -556
- package/src/utils/git.ts +0 -260
- package/src/utils/guards.ts +0 -107
- package/src/utils/ids.ts +0 -24
- package/src/utils/incremental-reader.ts +0 -220
- package/src/utils/internal-error.ts +0 -10
- package/src/utils/names.ts +0 -36
- package/src/utils/ndjson.ts +0 -115
- package/src/utils/paths.ts +0 -227
- package/src/utils/project-detector.ts +0 -160
- package/src/utils/redaction.ts +0 -347
- package/src/utils/resolve-shell.ts +0 -36
- package/src/utils/run-watcher-registry.ts +0 -152
- package/src/utils/safe-paths.ts +0 -383
- package/src/utils/scan-cache.ts +0 -144
- package/src/utils/session-utils.ts +0 -110
- package/src/utils/sleep.ts +0 -54
- package/src/utils/socket-path.ts +0 -127
- package/src/utils/sse-parser.ts +0 -129
- package/src/utils/task-name-generator.ts +0 -337
- package/src/utils/timings.ts +0 -33
- package/src/utils/token-counter.ts +0 -200
- package/src/utils/visual.ts +0 -207
- package/src/workflows/cost-estimator.ts +0 -34
- package/src/workflows/discover-workflows.ts +0 -290
- package/src/workflows/intermediate-store.ts +0 -166
- package/src/workflows/preflight-validator.ts +0 -168
- package/src/workflows/topology-analyzer.ts +0 -203
- package/src/workflows/validate-workflow.ts +0 -50
- package/src/workflows/workflow-config.ts +0 -70
- package/src/workflows/workflow-serializer.ts +0 -32
- package/src/worktree/branch-freshness.ts +0 -112
- package/src/worktree/cleanup.ts +0 -341
- package/src/worktree/worktree-manager.ts +0 -1200
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { DEFAULT_PATHS } from "../config/defaults.ts";
|
|
4
|
-
import { projectCrewRoot, userCrewRoot } from "../utils/paths.ts";
|
|
5
|
-
import { isSafePathId, resolveRealContainedPath } from "../utils/safe-paths.ts";
|
|
6
|
-
|
|
7
|
-
export interface ImportedRunIndexEntry {
|
|
8
|
-
runId: string;
|
|
9
|
-
scope: "project" | "user";
|
|
10
|
-
bundlePath: string;
|
|
11
|
-
summaryPath: string;
|
|
12
|
-
importedAt?: string;
|
|
13
|
-
status?: string;
|
|
14
|
-
team?: string;
|
|
15
|
-
workflow?: string;
|
|
16
|
-
goal?: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function readEntry(root: string, scope: "project" | "user", runId: string): ImportedRunIndexEntry | undefined {
|
|
20
|
-
if (!isSafePathId(runId)) return undefined;
|
|
21
|
-
let bundlePath: string;
|
|
22
|
-
let summaryPath: string;
|
|
23
|
-
try {
|
|
24
|
-
const entryRoot = resolveRealContainedPath(root, runId);
|
|
25
|
-
bundlePath = resolveRealContainedPath(root, path.join(runId, "run-export.json"));
|
|
26
|
-
summaryPath = path.join(entryRoot, "README.md");
|
|
27
|
-
} catch {
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
if (!fs.existsSync(bundlePath)) return undefined;
|
|
31
|
-
try {
|
|
32
|
-
const raw = JSON.parse(fs.readFileSync(bundlePath, "utf-8")) as Record<string, unknown>;
|
|
33
|
-
const manifest =
|
|
34
|
-
raw.manifest && typeof raw.manifest === "object" && !Array.isArray(raw.manifest)
|
|
35
|
-
? (raw.manifest as Record<string, unknown>)
|
|
36
|
-
: {};
|
|
37
|
-
return {
|
|
38
|
-
runId,
|
|
39
|
-
scope,
|
|
40
|
-
bundlePath,
|
|
41
|
-
summaryPath,
|
|
42
|
-
importedAt: typeof raw.importedAt === "string" ? raw.importedAt : undefined,
|
|
43
|
-
status: typeof manifest.status === "string" ? manifest.status : undefined,
|
|
44
|
-
team: typeof manifest.team === "string" ? manifest.team : undefined,
|
|
45
|
-
workflow: typeof manifest.workflow === "string" ? manifest.workflow : undefined,
|
|
46
|
-
goal: typeof manifest.goal === "string" ? manifest.goal : undefined,
|
|
47
|
-
};
|
|
48
|
-
} catch {
|
|
49
|
-
return { runId, scope, bundlePath, summaryPath };
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function collect(root: string, scope: "project" | "user"): ImportedRunIndexEntry[] {
|
|
54
|
-
if (!fs.existsSync(root)) return [];
|
|
55
|
-
try {
|
|
56
|
-
if (fs.lstatSync(root).isSymbolicLink()) return [];
|
|
57
|
-
resolveRealContainedPath(path.dirname(root), path.basename(root));
|
|
58
|
-
} catch {
|
|
59
|
-
return [];
|
|
60
|
-
}
|
|
61
|
-
return fs
|
|
62
|
-
.readdirSync(root)
|
|
63
|
-
.filter((entry) => isSafePathId(entry))
|
|
64
|
-
.map((entry) => readEntry(root, scope, entry))
|
|
65
|
-
.filter((entry): entry is ImportedRunIndexEntry => entry !== undefined);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function listImportedRuns(cwd: string): ImportedRunIndexEntry[] {
|
|
69
|
-
const projectRoot = path.join(projectCrewRoot(cwd), DEFAULT_PATHS.state.importsSubdir);
|
|
70
|
-
const userRoot = path.join(userCrewRoot(), DEFAULT_PATHS.state.importsSubdir);
|
|
71
|
-
return [...collect(userRoot, "user"), ...collect(projectRoot, "project")].sort((a, b) =>
|
|
72
|
-
(b.importedAt ?? "").localeCompare(a.importedAt ?? ""),
|
|
73
|
-
);
|
|
74
|
-
}
|
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* knowledge-injection.ts — Project knowledge that accumulates across runs (O4).
|
|
3
|
-
*
|
|
4
|
-
* ROADMAP Phase 1 / T1.3 ("downsized memory"): a deliberately minimal
|
|
5
|
-
* replacement for the deleted 244-LOC MemoryStore. Crews and the main
|
|
6
|
-
* session read `.crew/knowledge.md` and have it injected into the system
|
|
7
|
-
* prompt, so pi-crew "remembers" project context across runs.
|
|
8
|
-
*
|
|
9
|
-
* Philosophy (Round 6 stress-test): radically downsized. Just a Markdown
|
|
10
|
-
* file the user can edit, surfaced into every run. No vector DB, no
|
|
11
|
-
* embeddings, no graph. Simple = trustworthy.
|
|
12
|
-
*
|
|
13
|
-
* B2 section-aware injection (2026-06-28): knowledge.md splits cleanly into
|
|
14
|
-
* CONVENTIONS (always-relevant: Code Style, Environment, Architecture,
|
|
15
|
-
* Testing, Release Process — ~2.5KB) and SESSION-LOG (per-version post-
|
|
16
|
-
* mortems, incidents, fix detail — ~29KB, rarely relevant). Conventions
|
|
17
|
-
* are ALWAYS injected; session-log sections are injected on-demand via
|
|
18
|
-
* header-token IDF scoring against the task/goal, capped at
|
|
19
|
-
* MAX_SESSION_LOG_BYTES. Non-matched session-log is summarized as a section
|
|
20
|
-
* index with a `read` path-hint so the worker can recover any omitted topic.
|
|
21
|
-
* Design doc: research-findings/b2-section-aware-design.md.
|
|
22
|
-
*/
|
|
23
|
-
import * as fs from "node:fs";
|
|
24
|
-
import * as path from "node:path";
|
|
25
|
-
import { logInternalError } from "../utils/internal-error.ts";
|
|
26
|
-
import { projectCrewRoot } from "../utils/paths.ts";
|
|
27
|
-
import type { BeforeAgentStartEvent, ExtensionAPI } from "./pi-api.ts";
|
|
28
|
-
|
|
29
|
-
/** The knowledge file, relative to the project crew root. */
|
|
30
|
-
export const KNOWLEDGE_FILENAME = "knowledge.md";
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Session-log injection cap (B2). Conventions are always injected in full;
|
|
34
|
-
* matched session-log sections are capped here to bound total prompt size.
|
|
35
|
-
* Sized so 2-3 typical sections (~1-2.5KB each) fit, while the largest single
|
|
36
|
-
* outlier (v0.9.10 IN PROGRESS, ~7KB) is excluded from a full-match scenario.
|
|
37
|
-
*/
|
|
38
|
-
const MAX_SESSION_LOG_BYTES = 5_000;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Relevance context for section-aware injection. When omitted (or when goal/
|
|
42
|
-
* taskText are both absent), injection falls back to conventions-only — no
|
|
43
|
-
* IDF computation, no session-log body. This keeps callers without query
|
|
44
|
-
* context (main-session hook, legacy tests) stable.
|
|
45
|
-
*/
|
|
46
|
-
export interface KnowledgeQuery {
|
|
47
|
-
/** The team run goal (broad topic signal). */
|
|
48
|
-
goal?: string;
|
|
49
|
-
/** The step/task instruction text (narrow topic signal). */
|
|
50
|
-
taskText?: string;
|
|
51
|
-
/** The worker role (reserved for future role-floor/boost; not scored yet). */
|
|
52
|
-
role?: string;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Headers of sections always treated as CONVENTIONS (universal project rules).
|
|
57
|
-
* Anything NOT matching these (after the convention run) is SESSION-LOG.
|
|
58
|
-
* Header-matching is prefix + case-insensitive against the H2 title.
|
|
59
|
-
*/
|
|
60
|
-
const CONVENTION_HEADERS = ["Code Style", "Environment", "Architecture", "Testing", "Release Process"];
|
|
61
|
-
|
|
62
|
-
/** Resolve the knowledge file path for a cwd (may not exist yet). */
|
|
63
|
-
export function knowledgePath(cwd: string): string {
|
|
64
|
-
return path.join(projectCrewRoot(cwd), KNOWLEDGE_FILENAME);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
interface KnowledgeSection {
|
|
68
|
-
/** H2 header text (without leading `## `). */
|
|
69
|
-
header: string;
|
|
70
|
-
/** Full section body including the `## ` header line. */
|
|
71
|
-
body: string;
|
|
72
|
-
/** Header tokens (lowercased, stopword-filtered) for IDF scoring. */
|
|
73
|
-
headerTokens: Set<string>;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const STOPWORDS = new Set([
|
|
77
|
-
"the",
|
|
78
|
-
"a",
|
|
79
|
-
"an",
|
|
80
|
-
"is",
|
|
81
|
-
"are",
|
|
82
|
-
"of",
|
|
83
|
-
"to",
|
|
84
|
-
"in",
|
|
85
|
-
"for",
|
|
86
|
-
"and",
|
|
87
|
-
"or",
|
|
88
|
-
"not",
|
|
89
|
-
"with",
|
|
90
|
-
"this",
|
|
91
|
-
"that",
|
|
92
|
-
"it",
|
|
93
|
-
"be",
|
|
94
|
-
"on",
|
|
95
|
-
"at",
|
|
96
|
-
"by",
|
|
97
|
-
"do",
|
|
98
|
-
"does",
|
|
99
|
-
"how",
|
|
100
|
-
"what",
|
|
101
|
-
"when",
|
|
102
|
-
"from",
|
|
103
|
-
"fix",
|
|
104
|
-
"fixes",
|
|
105
|
-
"fixed",
|
|
106
|
-
"v0",
|
|
107
|
-
"v1",
|
|
108
|
-
"released",
|
|
109
|
-
"progress",
|
|
110
|
-
"uncommitted",
|
|
111
|
-
"not",
|
|
112
|
-
"pushed",
|
|
113
|
-
"published",
|
|
114
|
-
"session",
|
|
115
|
-
"post",
|
|
116
|
-
]);
|
|
117
|
-
|
|
118
|
-
/** Tokenize header text into a Set of lowercased non-stopword tokens. */
|
|
119
|
-
function tokenizeHeader(header: string): Set<string> {
|
|
120
|
-
const tokens = new Set<string>();
|
|
121
|
-
for (const raw of header.toLowerCase().split(/[^a-z0-9.]+/)) {
|
|
122
|
-
// keep dot-paths (e.g. "run.lock", "config.ts") and alphanumerics >= 2 chars
|
|
123
|
-
const t = raw.replace(/^\.+|\.+$/g, "");
|
|
124
|
-
if (t.length >= 2 && !STOPWORDS.has(t) && !/^\d+$/.test(t)) tokens.add(t);
|
|
125
|
-
}
|
|
126
|
-
return tokens;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/** Parse knowledge.md into (conventions, sessionLog) sections by H2 header. */
|
|
130
|
-
function parseKnowledgeSections(content: string): {
|
|
131
|
-
conventions: KnowledgeSection[];
|
|
132
|
-
sessionLog: KnowledgeSection[];
|
|
133
|
-
} {
|
|
134
|
-
const lines = content.split(/\r?\n/);
|
|
135
|
-
const sections: KnowledgeSection[] = [];
|
|
136
|
-
let current: { header: string; lines: string[] } | null = null;
|
|
137
|
-
for (const line of lines) {
|
|
138
|
-
const m = /^##\s+(.+?)\s*$/.exec(line);
|
|
139
|
-
if (m) {
|
|
140
|
-
if (current)
|
|
141
|
-
sections.push({
|
|
142
|
-
header: current.header,
|
|
143
|
-
body: current.lines.join("\n"),
|
|
144
|
-
headerTokens: tokenizeHeader(current.header),
|
|
145
|
-
});
|
|
146
|
-
current = { header: m[1]!, lines: [line] };
|
|
147
|
-
} else if (current) {
|
|
148
|
-
current.lines.push(line);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
if (current)
|
|
152
|
-
sections.push({
|
|
153
|
-
header: current.header,
|
|
154
|
-
body: current.lines.join("\n"),
|
|
155
|
-
headerTokens: tokenizeHeader(current.header),
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
// Classify: a section is a CONVENTION if its header starts-with one of the
|
|
159
|
-
// known convention titles. Once we leave the convention run (first non-
|
|
160
|
-
// matching H2 after conventions), everything else is SESSION-LOG. This is
|
|
161
|
-
// self-healing: if knowledge.md is restructured, the classifier adapts.
|
|
162
|
-
const conventions: KnowledgeSection[] = [];
|
|
163
|
-
const sessionLog: KnowledgeSection[] = [];
|
|
164
|
-
let leftConventionRun = false;
|
|
165
|
-
for (const sec of sections) {
|
|
166
|
-
const isConvention = !leftConventionRun && CONVENTION_HEADERS.some((c) => sec.header.toLowerCase().startsWith(c.toLowerCase()));
|
|
167
|
-
if (isConvention) conventions.push(sec);
|
|
168
|
-
else {
|
|
169
|
-
leftConventionRun = true;
|
|
170
|
-
sessionLog.push(sec);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return { conventions, sessionLog };
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/** Compute IDF (inverse document frequency) over session-log header tokens. */
|
|
177
|
-
function computeIdf(sections: KnowledgeSection[]): Map<string, number> {
|
|
178
|
-
const N = sections.length;
|
|
179
|
-
const df = new Map<string, number>();
|
|
180
|
-
for (const s of sections) for (const token of s.headerTokens) df.set(token, (df.get(token) ?? 0) + 1);
|
|
181
|
-
const idf = new Map<string, number>();
|
|
182
|
-
for (const [token, freq] of df) idf.set(token, Math.log(N / freq)); // standard IDF; freq >= 1
|
|
183
|
-
return idf;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/** Tokenize a free-form query (goal/taskText) the same way as headers. */
|
|
187
|
-
function tokenizeQuery(query: string): Set<string> {
|
|
188
|
-
const tokens = new Set<string>();
|
|
189
|
-
for (const raw of query.toLowerCase().split(/[^a-z0-9.]+/)) {
|
|
190
|
-
const t = raw.replace(/^\.+|\.+$/g, "");
|
|
191
|
-
if (t.length >= 2 && !STOPWORDS.has(t) && !/^\d+$/.test(t)) tokens.add(t);
|
|
192
|
-
}
|
|
193
|
-
return tokens;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/** Score a section by summed IDF of query tokens present in its header. */
|
|
197
|
-
function scoreSection(queryTokens: Set<string>, headerTokens: Set<string>, idf: Map<string, number>): number {
|
|
198
|
-
let score = 0;
|
|
199
|
-
for (const token of queryTokens) if (headerTokens.has(token)) score += idf.get(token) ?? 0;
|
|
200
|
-
return score;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Select session-log sections relevant to the query, capped at budgetBytes.
|
|
205
|
-
* Greedy by descending score (then original order), drop-whole policy with a
|
|
206
|
-
* head-slice fallback for the single best match if nothing else fits (so a
|
|
207
|
-
* matched query never returns zero bytes).
|
|
208
|
-
*/
|
|
209
|
-
function selectSessionLog(query: string, sessionLog: KnowledgeSection[], budgetBytes: number): KnowledgeSection[] {
|
|
210
|
-
if (sessionLog.length === 0 || !query.trim()) return [];
|
|
211
|
-
const idf = computeIdf(sessionLog);
|
|
212
|
-
const queryTokens = tokenizeQuery(query);
|
|
213
|
-
// Match = ANY header-token overlap with the query. IDF still drives RANKING
|
|
214
|
-
// (rarer overlap ranks first), but a token that happens to appear in every
|
|
215
|
-
// section (IDF=0) must still count as a match — otherwise a query for a
|
|
216
|
-
// common-but-relevant keyword (e.g. "redaction") would return nothing.
|
|
217
|
-
const scored = sessionLog
|
|
218
|
-
.map((sec, idx) => {
|
|
219
|
-
const overlap = [...queryTokens].filter((t) => sec.headerTokens.has(t));
|
|
220
|
-
return {
|
|
221
|
-
sec,
|
|
222
|
-
score: overlap.reduce((sum, t) => sum + (idf.get(t) ?? 0), 0),
|
|
223
|
-
idx,
|
|
224
|
-
hasOverlap: overlap.length > 0,
|
|
225
|
-
};
|
|
226
|
-
})
|
|
227
|
-
.filter((x) => x.hasOverlap);
|
|
228
|
-
if (scored.length === 0) return [];
|
|
229
|
-
scored.sort((a, b) => b.score - a.score || a.idx - b.idx);
|
|
230
|
-
|
|
231
|
-
const selected: KnowledgeSection[] = [];
|
|
232
|
-
let used = 0;
|
|
233
|
-
let bestMatch: { sec: KnowledgeSection; score: number } | undefined;
|
|
234
|
-
for (const { sec, score } of scored) {
|
|
235
|
-
if (score > (bestMatch?.score ?? -1)) bestMatch = { sec, score };
|
|
236
|
-
if (used + sec.body.length <= budgetBytes) {
|
|
237
|
-
selected.push(sec);
|
|
238
|
-
used += sec.body.length;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
// Head-slice fallback: if the best match didn't fit (or nothing fit), inject
|
|
242
|
-
// a head-sliced copy of the single best match so the query isn't empty.
|
|
243
|
-
if (selected.length === 0 && bestMatch) {
|
|
244
|
-
const sliced = bestMatch.sec.body.slice(0, Math.max(0, budgetBytes));
|
|
245
|
-
selected.push({
|
|
246
|
-
...bestMatch.sec,
|
|
247
|
-
body: `${sliced}\n\n<!-- section truncated (session-log budget ${budgetBytes} bytes). Full file: use \`read\`. -->`,
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
return selected;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/** Read knowledge content. "" if absent/empty. */
|
|
254
|
-
export function readKnowledge(cwd: string, query?: KnowledgeQuery): string {
|
|
255
|
-
try {
|
|
256
|
-
const p = knowledgePath(cwd);
|
|
257
|
-
const stat = tryStat(p);
|
|
258
|
-
if (!stat) {
|
|
259
|
-
sectionCache.delete(p);
|
|
260
|
-
knowledgeCache.delete(p);
|
|
261
|
-
return "";
|
|
262
|
-
}
|
|
263
|
-
// Security: reject symlinks to prevent information disclosure.
|
|
264
|
-
// An attacker could replace knowledge.md with a symlink to /etc/shadow
|
|
265
|
-
// or other sensitive files.
|
|
266
|
-
if (stat.isSymbolicLink) {
|
|
267
|
-
logInternalError("knowledge-injection.symlink", new Error(`Refusing to read symlink: ${p}`));
|
|
268
|
-
return "";
|
|
269
|
-
}
|
|
270
|
-
// P5 (Round 15): mtime+size cache. readKnowledge fires on every agent
|
|
271
|
-
// start (main session + every worker), re-reading the file each time.
|
|
272
|
-
// For a run with N workers this is N redundant readFileSync of the same
|
|
273
|
-
// file. Cache by (mtimeMs, size) and only re-read when the file changes.
|
|
274
|
-
const cacheKey = `${stat.mtimeMs}:${stat.size}`;
|
|
275
|
-
|
|
276
|
-
// B2: when no query context is provided (main-session hook, legacy
|
|
277
|
-
// callers, tests), keep the simple head-only path. This preserves the
|
|
278
|
-
// 4 existing unit tests exactly (they call readKnowledge(cwd)).
|
|
279
|
-
if (!query || (!query.goal && !query.taskText)) {
|
|
280
|
-
const cached = knowledgeCache.get(p);
|
|
281
|
-
if (cached && cached.key === cacheKey) return cached.content;
|
|
282
|
-
let content = fs.readFileSync(p, "utf8").trim();
|
|
283
|
-
if (content.length > MAX_KNOWLEDGE_HEAD_BYTES) {
|
|
284
|
-
content = `${content.slice(0, MAX_KNOWLEDGE_HEAD_BYTES)}\n\n<!-- knowledge.md truncated at ${MAX_KNOWLEDGE_HEAD_BYTES} bytes (head shown). Full file: ${p} — use the \`read\` tool if you need sections beyond the head. -->`;
|
|
285
|
-
}
|
|
286
|
-
knowledgeCache.set(p, { key: cacheKey, content });
|
|
287
|
-
return content;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// Section-aware path: cache parsed sections, select per-query.
|
|
291
|
-
const cachedSections = sectionCache.get(p);
|
|
292
|
-
let parsed: {
|
|
293
|
-
conventions: KnowledgeSection[];
|
|
294
|
-
sessionLog: KnowledgeSection[];
|
|
295
|
-
};
|
|
296
|
-
if (cachedSections && cachedSections.key === cacheKey) {
|
|
297
|
-
parsed = {
|
|
298
|
-
conventions: cachedSections.conventions,
|
|
299
|
-
sessionLog: cachedSections.sessionLog,
|
|
300
|
-
};
|
|
301
|
-
} else {
|
|
302
|
-
const content = fs.readFileSync(p, "utf8").trim();
|
|
303
|
-
parsed = parseKnowledgeSections(content);
|
|
304
|
-
sectionCache.set(p, {
|
|
305
|
-
key: cacheKey,
|
|
306
|
-
conventions: parsed.conventions,
|
|
307
|
-
sessionLog: parsed.sessionLog,
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
const queryText = [query.goal, query.taskText].filter(Boolean).join(" \n ");
|
|
312
|
-
const matchedSessionLog = selectSessionLog(queryText, parsed.sessionLog, MAX_SESSION_LOG_BYTES);
|
|
313
|
-
|
|
314
|
-
const parts: string[] = [];
|
|
315
|
-
// Conventions: always full.
|
|
316
|
-
for (const sec of parsed.conventions) parts.push(sec.body);
|
|
317
|
-
// Matched session-log (drop-whole, budget-capped).
|
|
318
|
-
for (const sec of matchedSessionLog) parts.push(sec.body);
|
|
319
|
-
// Always: section-index of ALL session-log headers (recovery safety net).
|
|
320
|
-
if (parsed.sessionLog.length > 0) {
|
|
321
|
-
const indexLines = parsed.sessionLog.map((s) => ` - ${s.header}`);
|
|
322
|
-
parts.push(
|
|
323
|
-
`<!-- Session-log sections in knowledge.md (not injected unless matched above — use \`read\` for detail):\n${indexLines.join("\n")}\nFull file: ${p} -->`,
|
|
324
|
-
);
|
|
325
|
-
}
|
|
326
|
-
return parts.join("\n").trim();
|
|
327
|
-
} catch {
|
|
328
|
-
return "";
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/** Stat helper returning undefined on error (file missing, perms, etc.). */
|
|
333
|
-
function tryStat(p: string): { mtimeMs: number; size: number; isSymbolicLink: boolean } | undefined {
|
|
334
|
-
try {
|
|
335
|
-
// Use lstatSync to detect symlinks (statSync follows them).
|
|
336
|
-
const s = fs.lstatSync(p);
|
|
337
|
-
return { mtimeMs: s.mtimeMs, size: s.size, isSymbolicLink: s.isSymbolicLink() };
|
|
338
|
-
} catch {
|
|
339
|
-
return undefined;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
interface CachedKnowledge {
|
|
344
|
-
key: string;
|
|
345
|
-
content: string;
|
|
346
|
-
}
|
|
347
|
-
const knowledgeCache = new Map<string, CachedKnowledge>();
|
|
348
|
-
|
|
349
|
-
interface CachedSections {
|
|
350
|
-
key: string;
|
|
351
|
-
conventions: KnowledgeSection[];
|
|
352
|
-
sessionLog: KnowledgeSection[];
|
|
353
|
-
}
|
|
354
|
-
const sectionCache = new Map<string, CachedSections>();
|
|
355
|
-
|
|
356
|
-
/** Head cap for the no-query (legacy / main-session) path. */
|
|
357
|
-
const MAX_KNOWLEDGE_HEAD_BYTES = 2_000;
|
|
358
|
-
|
|
359
|
-
/** Build the injected prompt fragment (empty if no knowledge). */
|
|
360
|
-
export function buildKnowledgeFragment(cwd: string, query?: KnowledgeQuery): string {
|
|
361
|
-
const content = readKnowledge(cwd, query);
|
|
362
|
-
if (!content) return "";
|
|
363
|
-
return [
|
|
364
|
-
"",
|
|
365
|
-
"# Project knowledge (from .crew/knowledge.md)",
|
|
366
|
-
"The following project knowledge was captured by pi-crew from prior runs.",
|
|
367
|
-
"Use it to avoid repeating past mistakes and to respect project conventions.",
|
|
368
|
-
"You may update .crew/knowledge.md when you learn something durable.",
|
|
369
|
-
"",
|
|
370
|
-
content,
|
|
371
|
-
].join("\n");
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Register the knowledge-injection hook. Appends project knowledge to the
|
|
376
|
-
* MAIN session's system prompt on `before_agent_start`. This hook does NOT
|
|
377
|
-
* fire for crew workers: they are spawned with `--no-extensions`, so the
|
|
378
|
-
* extension layer (and this hook) never loads in their process. Workers
|
|
379
|
-
* instead receive knowledge via `buildKnowledgeFragment(task.cwd)` injected
|
|
380
|
-
* into their prompt stablePrefix by `prompt-builder.ts`. Do NOT "fix" this
|
|
381
|
-
* perceived gap by making the hook reach workers — it would cause
|
|
382
|
-
* double-injection. (Verified by research workflow 2026-06-28.)
|
|
383
|
-
*
|
|
384
|
-
* The hook calls buildKnowledgeFragment(cwd) with NO query — so the main
|
|
385
|
-
* session gets conventions-only (no session-log noise), which is the right
|
|
386
|
-
* default for an interactive session that doesn't have a single task focus.
|
|
387
|
-
* Workers (which DO have a task) use the section-aware path via prompt-builder.
|
|
388
|
-
*/
|
|
389
|
-
export function registerKnowledgeInjection(pi: ExtensionAPI): void {
|
|
390
|
-
pi.on("before_agent_start", (event: BeforeAgentStartEvent) => {
|
|
391
|
-
const options =
|
|
392
|
-
(
|
|
393
|
-
event as BeforeAgentStartEvent & {
|
|
394
|
-
systemPromptOptions?: { cwd?: unknown };
|
|
395
|
-
}
|
|
396
|
-
).systemPromptOptions ?? {};
|
|
397
|
-
const cwd = typeof options.cwd === "string" ? options.cwd : process.cwd();
|
|
398
|
-
const fragment = buildKnowledgeFragment(cwd);
|
|
399
|
-
if (!fragment) return undefined;
|
|
400
|
-
return { systemPrompt: `${event.systemPrompt}${fragment}` };
|
|
401
|
-
});
|
|
402
|
-
}
|