pi-crew 0.2.3 → 0.2.5
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/AGENTS.md +57 -32
- package/CHANGELOG.md +466 -448
- package/LICENSE +21 -21
- package/NOTICE.md +16 -16
- package/README.md +323 -323
- package/docs/FEATURE_INTAKE.md +126 -0
- package/docs/HARNESS.md +86 -0
- package/docs/HARNESS_BACKLOG.md +41 -0
- package/docs/TEST_MATRIX.md +49 -0
- package/docs/actions-reference.md +595 -595
- package/docs/architecture.md +180 -180
- package/docs/code-review-2026-05-11.md +592 -592
- package/docs/commands-reference.md +347 -347
- package/docs/comparison-pi-subagents-vs-pi-crew.md +303 -0
- package/docs/decisions/0001-durable-state.md +41 -0
- package/docs/decisions/0002-child-process-for-async.md +42 -0
- package/docs/decisions/0003-depth-guard.md +36 -0
- package/docs/decisions/0004-execfile-over-exec.md +34 -0
- package/docs/decisions/0005-no-parameter-properties.md +49 -0
- package/docs/decisions/0006-publish-bundled-esm.md +63 -0
- package/docs/decisions/0007-active-run-binary-index.md +54 -0
- package/docs/decisions/0008-child-pi-warm-pool.md +61 -0
- package/docs/decisions/README.md +23 -0
- package/docs/followup-review-round4-2026-05-13.md +107 -0
- package/docs/implementation-plan-top3.md +333 -0
- package/docs/live-mailbox-runtime.md +36 -36
- package/docs/next-upgrade-roadmap.md +808 -808
- package/docs/oh-my-pi-research.md +509 -0
- package/docs/perf/baseline-2026-05.md +113 -0
- package/docs/perf/final-report-2026-05.md +206 -0
- package/docs/perf/sprint-1-report.md +71 -0
- package/docs/perf/sprint-2-report.md +81 -0
- package/docs/perf/sprint-2.5-report.md +53 -0
- package/docs/perf/sprint-3-report.md +36 -0
- package/docs/perf/sprint-4-report.md +47 -0
- package/docs/perf/sprint-5-report.md +51 -0
- package/docs/perf/sprint-6-report.md +94 -0
- package/docs/perf/sprint-7-report.md +74 -0
- package/docs/perf/upgrade-plan-2026-05.md +147 -0
- package/docs/pi-subagents3-deep-analysis.md +508 -0
- package/docs/product/README.md +31 -0
- package/docs/product/platform.md +27 -0
- package/docs/product/runtime-safety.md +37 -0
- package/docs/product/team-run.md +39 -0
- package/docs/product/team-tool.md +37 -0
- package/docs/publishing.md +65 -65
- package/docs/resource-formats.md +134 -134
- package/docs/runtime-analysis-child-vs-live.md +171 -0
- package/docs/runtime-flow.md +148 -148
- package/docs/runtime-migration-in-process-analysis.md +250 -0
- package/docs/stories/README.md +30 -0
- package/docs/stories/backlog.md +36 -0
- package/docs/templates/decision.md +27 -0
- package/docs/templates/story.md +44 -0
- package/docs/templates/validation-report.md +32 -0
- package/docs/usage.md +238 -238
- package/index.ts +7 -6
- package/install.mjs +65 -65
- package/package.json +107 -100
- package/schema.json +222 -222
- package/skills/child-pi-spawning/SKILL.md +213 -0
- package/skills/context-artifact-hygiene/SKILL.md +32 -0
- package/skills/event-log-tracing/SKILL.md +299 -0
- package/skills/git-master/SKILL.md +225 -24
- package/skills/live-agent-lifecycle/SKILL.md +192 -0
- package/skills/mailbox-interactive/SKILL.md +300 -19
- package/skills/model-routing-context/SKILL.md +94 -0
- package/skills/multi-perspective-review/SKILL.md +88 -0
- package/skills/read-only-explorer/SKILL.md +250 -26
- package/skills/safe-bash/SKILL.md +307 -21
- package/skills/verification-before-done/SKILL.md +11 -2
- package/skills/widget-rendering/SKILL.md +258 -0
- package/skills/workspace-isolation/SKILL.md +202 -0
- package/skills/worktree-isolation/SKILL.md +202 -18
- package/src/adapters/claude-adapter.ts +25 -25
- package/src/adapters/codex-adapter.ts +21 -21
- package/src/adapters/cursor-adapter.ts +17 -17
- package/src/adapters/export-util.ts +137 -137
- package/src/adapters/index.ts +15 -15
- package/src/adapters/registry.ts +18 -18
- package/src/adapters/types.ts +23 -23
- package/src/agents/agent-config.ts +38 -38
- package/src/agents/agent-serializer.ts +38 -38
- package/src/agents/discover-agents.ts +121 -118
- package/src/config/config.ts +740 -858
- package/src/config/defaults.ts +96 -96
- package/src/config/drift-detector.ts +211 -211
- package/src/config/markers.ts +327 -327
- package/src/config/resilient-parser.ts +109 -108
- package/src/config/suggestions.ts +74 -74
- package/src/config/types.ts +199 -0
- package/src/extension/async-notifier.ts +123 -89
- package/src/extension/autonomous-policy.ts +169 -169
- package/src/extension/cross-extension-rpc.ts +104 -104
- package/src/extension/help.ts +47 -47
- package/src/extension/import-index.ts +69 -69
- package/src/extension/management.ts +395 -382
- package/src/extension/notification-router.ts +116 -116
- package/src/extension/notification-sink.ts +51 -51
- package/src/extension/project-init.ts +168 -168
- package/src/extension/register.ts +859 -668
- package/src/extension/registration/artifact-cleanup.ts +15 -15
- package/src/extension/registration/command-utils.ts +54 -54
- package/src/extension/registration/commands.ts +559 -452
- package/src/extension/registration/compaction-guard.ts +125 -125
- package/src/extension/registration/subagent-helpers.ts +102 -102
- package/src/extension/registration/subagent-tools.ts +220 -159
- package/src/extension/registration/team-tool.ts +159 -99
- package/src/extension/registration/viewers.ts +29 -0
- package/src/extension/result-watcher.ts +128 -128
- package/src/extension/run-bundle-schema.ts +89 -89
- package/src/extension/run-export.ts +73 -73
- package/src/extension/run-import.ts +84 -84
- package/src/extension/run-index.ts +94 -94
- package/src/extension/run-maintenance.ts +142 -142
- package/src/extension/session-summary.ts +8 -8
- package/src/extension/team-manager-command.ts +96 -96
- package/src/extension/team-recommendation.ts +188 -188
- package/src/extension/team-tool/api.ts +5 -2
- package/src/extension/team-tool/cancel.ts +224 -209
- package/src/extension/team-tool/config-patch.ts +36 -36
- package/src/extension/team-tool/context.ts +60 -60
- package/src/extension/team-tool/doctor.ts +242 -242
- package/src/extension/team-tool/handle-settings.ts +421 -195
- package/src/extension/team-tool/inspect.ts +41 -41
- package/src/extension/team-tool/lifecycle-actions.ts +139 -139
- package/src/extension/team-tool/parallel-dispatch.ts +156 -156
- package/src/extension/team-tool/plan.ts +19 -19
- package/src/extension/team-tool/respond.ts +112 -111
- package/src/extension/team-tool/run.ts +246 -229
- package/src/extension/team-tool/status.ts +110 -110
- package/src/extension/team-tool-types.ts +13 -13
- package/src/extension/team-tool.ts +344 -344
- package/src/extension/tool-result.ts +16 -16
- package/src/extension/validate-resources.ts +77 -77
- package/src/hooks/registry.ts +61 -61
- package/src/hooks/types.ts +40 -40
- package/src/i18n.ts +184 -184
- package/src/observability/correlation.ts +35 -35
- package/src/observability/event-to-metric.ts +68 -68
- package/src/observability/exporters/adapter.ts +30 -30
- package/src/observability/exporters/otlp-exporter.ts +106 -92
- package/src/observability/exporters/prometheus-exporter.ts +54 -54
- package/src/observability/metric-registry.ts +87 -87
- package/src/observability/metric-retention.ts +54 -54
- package/src/observability/metric-sink.ts +81 -56
- package/src/observability/metrics-primitives.ts +167 -167
- package/src/prompt/prompt-runtime.ts +72 -72
- package/src/runtime/adaptive-plan.ts +338 -0
- package/src/runtime/agent-control.ts +169 -169
- package/src/runtime/agent-memory.ts +72 -72
- package/src/runtime/agent-observability.ts +114 -114
- package/src/runtime/async-marker.ts +26 -26
- package/src/runtime/async-runner.ts +153 -153
- package/src/runtime/attention-events.ts +28 -28
- package/src/runtime/auto-resume.ts +100 -100
- package/src/runtime/background-runner.ts +122 -89
- package/src/runtime/cancellation.ts +61 -61
- package/src/runtime/capability-inventory.ts +116 -116
- package/src/runtime/child-pi-pool.ts +68 -0
- package/src/runtime/child-pi.ts +541 -461
- package/src/runtime/code-summary.ts +247 -247
- package/src/runtime/compaction-summary.ts +271 -271
- package/src/runtime/concurrency.ts +58 -58
- package/src/runtime/crash-recovery.ts +317 -301
- package/src/runtime/crew-agent-records.ts +379 -281
- package/src/runtime/crew-agent-runtime.ts +60 -60
- package/src/runtime/cross-extension-rpc.ts +72 -0
- package/src/runtime/custom-tools/irc-tool.ts +201 -201
- package/src/runtime/custom-tools/submit-result-tool.ts +90 -90
- package/src/runtime/deadletter.ts +47 -47
- package/src/runtime/delivery-coordinator.ts +176 -176
- package/src/runtime/delta-conflict.ts +360 -360
- package/src/runtime/diagnostic-export.ts +102 -102
- package/src/runtime/direct-run.ts +35 -35
- package/src/runtime/effectiveness.ts +82 -81
- package/src/runtime/errors/crew-errors.ts +166 -0
- package/src/runtime/event-stream-bridge.ts +92 -92
- package/src/runtime/foreground-control.ts +82 -82
- package/src/runtime/green-contract.ts +46 -46
- package/src/runtime/group-join.ts +234 -106
- package/src/runtime/heartbeat-watcher.ts +145 -124
- package/src/runtime/iteration-hooks.ts +267 -267
- package/src/runtime/live-agent-control.ts +88 -88
- package/src/runtime/live-agent-manager.ts +377 -179
- package/src/runtime/live-control-realtime.ts +36 -36
- package/src/runtime/live-session-runtime.ts +676 -600
- package/src/runtime/loop-gates.ts +129 -129
- package/src/runtime/manifest-cache.ts +263 -263
- package/src/runtime/mcp-proxy.ts +113 -113
- package/src/runtime/metric-parser.ts +40 -40
- package/src/runtime/model-fallback.ts +282 -274
- package/src/runtime/model-resolver.ts +118 -0
- package/src/runtime/output-validator.ts +187 -187
- package/src/runtime/overflow-recovery.ts +175 -175
- package/src/runtime/parallel-research.ts +44 -44
- package/src/runtime/parallel-utils.ts +156 -156
- package/src/runtime/parent-guard.ts +80 -80
- package/src/runtime/phase-progress.ts +217 -217
- package/src/runtime/pi-args.ts +165 -165
- package/src/runtime/pi-json-output.ts +111 -111
- package/src/runtime/pi-spawn.ts +167 -167
- package/src/runtime/policy-engine.ts +79 -79
- package/src/runtime/post-checks.ts +125 -125
- package/src/runtime/post-exit-stdio-guard.ts +86 -86
- package/src/runtime/process-status.ts +97 -73
- package/src/runtime/progress-event-coalescer.ts +43 -43
- package/src/runtime/recovery-recipes.ts +74 -74
- package/src/runtime/retry-executor.ts +81 -81
- package/src/runtime/role-permission.ts +39 -39
- package/src/runtime/run-tracker.ts +99 -0
- package/src/runtime/runtime-policy.ts +21 -0
- package/src/runtime/runtime-resolver.ts +94 -91
- package/src/runtime/scheduler.ts +294 -0
- package/src/runtime/semaphore.ts +131 -131
- package/src/runtime/sensitive-paths.ts +92 -92
- package/src/runtime/session-usage.ts +79 -79
- package/src/runtime/settings-store.ts +103 -0
- package/src/runtime/sidechain-output.ts +29 -29
- package/src/runtime/skill-instructions.ts +222 -222
- package/src/runtime/stale-reconciler.ts +198 -189
- package/src/runtime/streaming-output.ts +47 -0
- package/src/runtime/subagent-manager.ts +404 -400
- package/src/runtime/subprocess-tool-registry.ts +67 -67
- package/src/runtime/task-display.ts +38 -38
- package/src/runtime/task-graph-scheduler.ts +122 -122
- package/src/runtime/task-graph.ts +207 -207
- package/src/runtime/task-output-context.ts +177 -177
- package/src/runtime/task-packet.ts +93 -93
- package/src/runtime/task-quality.ts +207 -207
- package/src/runtime/task-runner/capabilities.ts +78 -78
- package/src/runtime/task-runner/live-executor.ts +131 -113
- package/src/runtime/task-runner/progress.ts +119 -119
- package/src/runtime/task-runner/prompt-builder.ts +139 -139
- package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
- package/src/runtime/task-runner/result-utils.ts +14 -14
- package/src/runtime/task-runner/run-projection.ts +103 -103
- package/src/runtime/task-runner/state-helpers.ts +22 -22
- package/src/runtime/task-runner.ts +469 -459
- package/src/runtime/team-runner.ts +693 -945
- package/src/runtime/usage-tracker.ts +71 -0
- package/src/runtime/worker-heartbeat.ts +21 -21
- package/src/runtime/worker-startup.ts +57 -57
- package/src/runtime/workflow-state.ts +187 -187
- package/src/runtime/yield-handler.ts +190 -190
- package/src/schema/config-schema.ts +172 -168
- package/src/schema/team-tool-schema.ts +126 -126
- package/src/schema/validation-types.ts +151 -148
- package/src/skills/discover-skills.ts +67 -67
- package/src/skills/skill-templates.ts +374 -374
- package/src/state/active-run-registry.ts +227 -191
- package/src/state/artifact-store.ts +130 -129
- package/src/state/atomic-write.ts +262 -195
- package/src/state/blob-store.ts +116 -116
- package/src/state/contracts.ts +111 -111
- package/src/state/event-log-rotation.ts +161 -158
- package/src/state/event-log.ts +383 -303
- package/src/state/event-reconstructor.ts +217 -217
- package/src/state/jsonl-writer.ts +82 -82
- package/src/state/locks.ts +146 -146
- package/src/state/mailbox.ts +446 -405
- package/src/state/state-store.ts +364 -351
- package/src/state/task-claims.ts +44 -44
- package/src/state/types.ts +285 -285
- package/src/state/usage.ts +29 -29
- package/src/subagents/async-entry.ts +1 -1
- package/src/subagents/index.ts +3 -3
- package/src/subagents/live/control.ts +1 -1
- package/src/subagents/live/manager.ts +1 -1
- package/src/subagents/live/realtime.ts +1 -1
- package/src/subagents/live/session-runtime.ts +1 -1
- package/src/subagents/manager.ts +1 -1
- package/src/subagents/spawn.ts +1 -1
- package/src/teams/discover-teams.ts +116 -116
- package/src/teams/team-config.ts +27 -27
- package/src/teams/team-serializer.ts +38 -38
- package/src/types/diff.d.ts +18 -18
- package/src/ui/agent-management-overlay.ts +144 -144
- package/src/ui/crew-widget.ts +487 -370
- package/src/ui/dashboard-panes/agents-pane.ts +109 -28
- package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
- package/src/ui/dashboard-panes/capability-pane.ts +59 -59
- package/src/ui/dashboard-panes/health-pane.ts +30 -30
- package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
- package/src/ui/dashboard-panes/progress-pane.ts +30 -30
- package/src/ui/dashboard-panes/transcript-pane.ts +10 -10
- package/src/ui/heartbeat-aggregator.ts +63 -63
- package/src/ui/keybinding-map.ts +97 -94
- package/src/ui/live-conversation-overlay.ts +152 -0
- package/src/ui/live-run-sidebar.ts +180 -180
- package/src/ui/mascot.ts +442 -442
- package/src/ui/overlays/agent-picker-overlay.ts +57 -57
- package/src/ui/overlays/confirm-overlay.ts +58 -58
- package/src/ui/overlays/mailbox-compose-overlay.ts +144 -144
- package/src/ui/overlays/mailbox-compose-preview.ts +63 -63
- package/src/ui/overlays/mailbox-detail-overlay.ts +122 -122
- package/src/ui/pi-ui-compat.ts +57 -57
- package/src/ui/powerbar-publisher.ts +221 -197
- package/src/ui/render-scheduler.ts +216 -143
- package/src/ui/run-action-dispatcher.ts +118 -118
- package/src/ui/run-dashboard.ts +526 -464
- package/src/ui/run-event-bus.ts +208 -208
- package/src/ui/run-snapshot-cache.ts +826 -777
- package/src/ui/settings-overlay.ts +721 -0
- package/src/ui/snapshot-types.ts +86 -70
- package/src/ui/theme-adapter.ts +190 -190
- package/src/ui/tool-progress-formatter.ts +89 -0
- package/src/ui/transcript-cache.ts +94 -94
- package/src/ui/transcript-viewer.ts +335 -335
- package/src/utils/conflict-detect.ts +662 -0
- package/src/utils/file-coalescer.ts +86 -86
- package/src/utils/frontmatter.ts +68 -68
- package/src/utils/fs-watch.ts +88 -31
- package/src/utils/gh-protocol.ts +479 -0
- package/src/utils/ids.ts +17 -17
- package/src/utils/incremental-reader.ts +104 -104
- package/src/utils/internal-error.ts +6 -6
- package/src/utils/names.ts +27 -27
- package/src/utils/paths.ts +102 -63
- package/src/utils/redaction.ts +44 -44
- package/src/utils/safe-paths.ts +47 -47
- package/src/utils/scan-cache.ts +136 -136
- package/src/utils/sse-parser.ts +134 -134
- package/src/utils/task-name-generator.ts +337 -337
- package/src/utils/timings.ts +33 -33
- package/src/utils/visual.ts +243 -198
- package/src/workflows/discover-workflows.ts +139 -139
- package/src/workflows/validate-workflow.ts +40 -40
- package/src/workflows/workflow-config.ts +26 -26
- package/src/workflows/workflow-serializer.ts +32 -32
- package/src/worktree/branch-freshness.ts +45 -45
- package/src/worktree/cleanup.ts +75 -75
- package/src/worktree/worktree-manager.ts +188 -188
- package/teams/default.team.md +12 -12
- package/teams/fast-fix.team.md +11 -11
- package/teams/implementation.team.md +18 -18
- package/teams/parallel-research.team.md +14 -14
- package/teams/research.team.md +11 -11
- package/teams/review.team.md +12 -12
- package/tsconfig.json +19 -19
- package/workflows/default.workflow.md +30 -30
- package/workflows/fast-fix.workflow.md +23 -23
- package/workflows/implementation.workflow.md +43 -43
- package/workflows/parallel-research.workflow.md +46 -46
- package/workflows/research.workflow.md +22 -22
- package/workflows/review.workflow.md +30 -30
- package/skills/task-packet/SKILL.md +0 -28
- package/skills/verify-evidence/SKILL.md +0 -27
package/docs/architecture.md
CHANGED
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
# pi-crew Architecture
|
|
2
|
-
|
|
3
|
-
`pi-crew` is a Pi package for coordinated multi-agent work. It is intentionally durable-first: every run is represented on disk, every task has a state record, and child workers stream progress into JSONL/status files so foreground sessions, background jobs, dashboards, and later restarts all read the same source of truth.
|
|
4
|
-
|
|
5
|
-
## Layers
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
Pi extension layer
|
|
9
|
-
register tools, slash commands, widget/dashboard, notifier, lifecycle cleanup
|
|
10
|
-
|
|
11
|
-
Runtime layer
|
|
12
|
-
team runner, task graph scheduler, child Pi process runner, async runner,
|
|
13
|
-
model fallback, policy engine, worktree manager, live-session experimental path
|
|
14
|
-
|
|
15
|
-
State layer (project root resolves to <crewRoot>:
|
|
16
|
-
- .crew/ when no .pi/ exists in the repo (default)
|
|
17
|
-
- .pi/teams/ when the repo already has .pi/ (legacy reuse))
|
|
18
|
-
<crewRoot>/state/runs/{runId}/manifest.json
|
|
19
|
-
<crewRoot>/state/runs/{runId}/tasks.json
|
|
20
|
-
<crewRoot>/state/runs/{runId}/events.jsonl
|
|
21
|
-
<crewRoot>/state/runs/{runId}/agents/{taskId}/status.json
|
|
22
|
-
<crewRoot>/artifacts/{runId}/...
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Run flow
|
|
26
|
-
|
|
27
|
-
```text
|
|
28
|
-
user/team tool
|
|
29
|
-
│
|
|
30
|
-
▼
|
|
31
|
-
handleTeamTool(action=run)
|
|
32
|
-
├─ discover agents/teams/workflows
|
|
33
|
-
├─ validate team/workflow refs
|
|
34
|
-
├─ create run manifest + task graph
|
|
35
|
-
├─ write goal artifact
|
|
36
|
-
└─ choose foreground/session-bound or async/background mode
|
|
37
|
-
│
|
|
38
|
-
├─ foreground: startForegroundRun() schedules executeTeamRun()
|
|
39
|
-
│
|
|
40
|
-
└─ async: spawnBackgroundTeamRun()
|
|
41
|
-
├─ node --import jiti-register.mjs background-runner.ts
|
|
42
|
-
├─ background-runner writes async.started + async.pid marker
|
|
43
|
-
└─ executeTeamRun()
|
|
44
|
-
├─ resolve ready task batch
|
|
45
|
-
├─ resolveBatchConcurrency() with hard cap
|
|
46
|
-
├─ runTeamTask() per task
|
|
47
|
-
│ ├─ build prompt + dependency context
|
|
48
|
-
│ ├─ choose configured Pi model candidates
|
|
49
|
-
│ ├─ spawn child `pi` worker
|
|
50
|
-
│ ├─ observe JSONL/stdout progress
|
|
51
|
-
│ ├─ persist agent status/events/output
|
|
52
|
-
│ └─ write result/log/transcript artifacts
|
|
53
|
-
├─ merge task updates monotonically
|
|
54
|
-
├─ write progress artifacts
|
|
55
|
-
└─ synthesize policy closeout
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Extension layer
|
|
59
|
-
|
|
60
|
-
`src/extension/register.ts` wires the package into Pi:
|
|
61
|
-
|
|
62
|
-
- `team` tool and management actions.
|
|
63
|
-
- Conflict-safe subagent tools: `crew_agent`, `crew_agent_result`, `crew_agent_steer`.
|
|
64
|
-
- Claude-style aliases: `Agent`, `get_subagent_result`, `steer_subagent` when available.
|
|
65
|
-
- Slash commands including `/team-run`, `/team-status`, `/team-dashboard`, `/team-doctor`, `/team-config`, `/team-summary`.
|
|
66
|
-
- Active-only widget and optional dashboard/sidebar UI.
|
|
67
|
-
- Foreground run scheduling and shutdown cleanup.
|
|
68
|
-
- Async completion notifier and session-start active-run summary.
|
|
69
|
-
|
|
70
|
-
The extension layer should remain thin: user input is normalized into tool parameters, then delegated to runtime/state modules.
|
|
71
|
-
|
|
72
|
-
## Runtime layer
|
|
73
|
-
|
|
74
|
-
### Team runner
|
|
75
|
-
|
|
76
|
-
`src/runtime/team-runner.ts` drives workflow execution. It reads queued tasks, computes the ready set from the task graph, applies concurrency limits, runs a batch, then merges results back into the latest task state. Terminal task states are monotonic: stale parallel snapshots must not regress completed/failed/cancelled/skipped tasks back to queued/running.
|
|
77
|
-
|
|
78
|
-
### Task runner
|
|
79
|
-
|
|
80
|
-
`src/runtime/task-runner.ts` executes one task. It prepares workspace/worktree context, renders a task prompt, chooses model candidates from Pi configuration, launches a child Pi process by default, and writes result artifacts. Scaffold mode is explicit dry-run only.
|
|
81
|
-
|
|
82
|
-
### Child Pi runtime
|
|
83
|
-
|
|
84
|
-
`src/runtime/child-pi.ts` is the default worker runtime. It:
|
|
85
|
-
|
|
86
|
-
- launches real `pi` child processes,
|
|
87
|
-
- hides Windows console windows with `windowsHide: true`,
|
|
88
|
-
- streams JSONL output into transcripts,
|
|
89
|
-
- compacts noisy message updates,
|
|
90
|
-
- isolates observer callback failures so progress persistence cannot kill orchestration,
|
|
91
|
-
- applies post-exit stdio guards for late output.
|
|
92
|
-
|
|
93
|
-
### Async background runner
|
|
94
|
-
|
|
95
|
-
`src/runtime/async-runner.ts` spawns detached background runs. Installed packages use an absolute `jiti-register.mjs` loader path because Node strip-types refuses TypeScript under `node_modules`. The runner fail-fasts if jiti is missing, and writes `async.pid` once startup begins so the parent can distinguish a healthy start from an early import crash.
|
|
96
|
-
|
|
97
|
-
### Concurrency and policy
|
|
98
|
-
|
|
99
|
-
`src/runtime/concurrency.ts` picks batch size from explicit limits, team settings, workflow settings, or built-in defaults. User-provided `limits.maxConcurrentWorkers` is hard-capped by default to prevent local DoS; `limits.allowUnboundedConcurrency=true` is an explicit opt-out and emits an observability event.
|
|
100
|
-
|
|
101
|
-
`src/runtime/policy-engine.ts` applies closeout and safety policy decisions such as limit exceeded, failed task blocking, stale workers, and green-contract failures.
|
|
102
|
-
|
|
103
|
-
### Model routing
|
|
104
|
-
|
|
105
|
-
Model choice is based on Pi's current configuration/model registry, not hardcoded providers. Task and agent records persist model attempts and routing metadata so dashboards/status can show requested model, selected model, fallback chain, and fallback reason.
|
|
106
|
-
|
|
107
|
-
## State layer
|
|
108
|
-
|
|
109
|
-
Run state is under `<crewRoot>` (`.crew/` for new projects, or `.pi/teams/` when the repo already has `.pi/`):
|
|
110
|
-
|
|
111
|
-
```text
|
|
112
|
-
<crewRoot>/state/runs/{runId}/
|
|
113
|
-
manifest.json run metadata/status/artifacts/async pid
|
|
114
|
-
tasks.json task graph and per-task status
|
|
115
|
-
events.jsonl append-only run events
|
|
116
|
-
events.jsonl.seq event sequence cache
|
|
117
|
-
agents.json aggregate agent cache
|
|
118
|
-
async.pid background startup marker
|
|
119
|
-
agents/{taskId}/
|
|
120
|
-
status.json per-agent status source
|
|
121
|
-
events.jsonl per-agent event stream
|
|
122
|
-
output.log compact worker output
|
|
123
|
-
sidechain.output.jsonl
|
|
124
|
-
live-control.jsonl
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
Artifacts are under:
|
|
128
|
-
|
|
129
|
-
```text
|
|
130
|
-
<crewRoot>/artifacts/{runId}/
|
|
131
|
-
goal.md
|
|
132
|
-
prompts/{taskId}.md
|
|
133
|
-
results/{taskId}.txt
|
|
134
|
-
logs/{taskId}.log
|
|
135
|
-
transcripts/{taskId}.jsonl
|
|
136
|
-
metadata/*.json
|
|
137
|
-
progress.md
|
|
138
|
-
summary.md
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
`<crewRoot>` resolution is centralised in `src/utils/paths.ts#projectCrewRoot()`:
|
|
142
|
-
|
|
143
|
-
- if `<repoRoot>/.pi/` already exists, return `<repoRoot>/.pi/teams/` (legacy reuse, no parallel `.crew/`)
|
|
144
|
-
- otherwise return `<repoRoot>/.crew/` (default for fresh projects)
|
|
145
|
-
|
|
146
|
-
User-global fallback (when no project root is detected) lives under `~/.pi/agent/extensions/pi-crew/`.
|
|
147
|
-
|
|
148
|
-
Atomic writes use temp-file replace with retry for transient Windows `EPERM`/`EBUSY`/`EACCES`. JSONL append paths are best-effort where used for observers/progress; write failures must not crash child output parsing.
|
|
149
|
-
|
|
150
|
-
## UI and observability
|
|
151
|
-
|
|
152
|
-
- The persistent widget shows active runs only.
|
|
153
|
-
- Stale async runs with dead background pids are hidden from the active widget.
|
|
154
|
-
- `/team-status` is the canonical detailed state view and can mark stale active async runs failed.
|
|
155
|
-
- `/team-dashboard` provides live history/details from `RunSnapshotCache`, with panes for agents, progress/events, mailbox attention, recent output, health, and metrics.
|
|
156
|
-
- Phase 9 observability uses a per-session `MetricRegistry` (`Counter`, `Gauge`, `Histogram`) wired to `crew.*` events via unsubscribe-returning `events.on()` handlers. The registry is disposed on session shutdown/reload; no global metric singleton is used.
|
|
157
|
-
- Metrics can be inspected with `/team-metrics` or `team api metrics-snapshot`, exported as redacted daily JSONL under `<crewRoot>/state/metrics/` when telemetry is enabled, formatted for Prometheus, or pushed to an opt-in OTLP HTTP endpoint.
|
|
158
|
-
- Heartbeat observability is split between dashboard summaries and a background `HeartbeatWatcher`: healthy/warn/stale/dead gradient metrics are emitted, first-dead detections notify operators, and consecutive dead ticks can append deadletter entries.
|
|
159
|
-
- Powerbar publishing is optional and event-compatible: pi-crew emits `powerbar:register-segment` for `pi-crew-active` / `pi-crew-progress`, emits `powerbar:update` payloads (`id`, `text`, optional `suffix`, `bar`, `color`), and mirrors status through `ctx.ui.setStatus("pi-crew", ...)` when no powerbar listener is detected.
|
|
160
|
-
- Transcript viewer is file-backed so it works for foreground and async runs; it defaults to bounded tail reads and can load full content on demand.
|
|
161
|
-
|
|
162
|
-
## Lifecycle and cleanup
|
|
163
|
-
|
|
164
|
-
Foreground runs are session-bound and should be interrupted on session shutdown or session switch. Only explicit `async: true` runs are allowed to survive the Pi session. Runtime cleanup is registered through Pi lifecycle hooks and a global reload cleanup guard.
|
|
165
|
-
|
|
166
|
-
## Configuration
|
|
167
|
-
|
|
168
|
-
Key config sections:
|
|
169
|
-
|
|
170
|
-
- `runtime`: `auto`, `child-process`, `scaffold`, experimental `live-session`.
|
|
171
|
-
- `limits`: concurrency/task/depth safety controls.
|
|
172
|
-
- `ui`: widget/dashboard/powerbar/model-token display settings.
|
|
173
|
-
- `observability`: in-memory metrics, heartbeat watcher interval, metric file retention.
|
|
174
|
-
- `telemetry`: opt-out switch for local telemetry sinks.
|
|
175
|
-
- `reliability`: opt-in auto-retry/auto-recover defaults and deadletter threshold.
|
|
176
|
-
- `otlp`: opt-in OTLP HTTP metric export.
|
|
177
|
-
- `agents`: builtin overrides for models/fallbacks/tools.
|
|
178
|
-
- `autonomous`: policy injection/profile for proactive team delegation.
|
|
179
|
-
|
|
180
|
-
See `usage.md`, `resource-formats.md`, `runtime-flow.md`, and `live-mailbox-runtime.md` for operational details.
|
|
1
|
+
# pi-crew Architecture
|
|
2
|
+
|
|
3
|
+
`pi-crew` is a Pi package for coordinated multi-agent work. It is intentionally durable-first: every run is represented on disk, every task has a state record, and child workers stream progress into JSONL/status files so foreground sessions, background jobs, dashboards, and later restarts all read the same source of truth.
|
|
4
|
+
|
|
5
|
+
## Layers
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
Pi extension layer
|
|
9
|
+
register tools, slash commands, widget/dashboard, notifier, lifecycle cleanup
|
|
10
|
+
|
|
11
|
+
Runtime layer
|
|
12
|
+
team runner, task graph scheduler, child Pi process runner, async runner,
|
|
13
|
+
model fallback, policy engine, worktree manager, live-session experimental path
|
|
14
|
+
|
|
15
|
+
State layer (project root resolves to <crewRoot>:
|
|
16
|
+
- .crew/ when no .pi/ exists in the repo (default)
|
|
17
|
+
- .pi/teams/ when the repo already has .pi/ (legacy reuse))
|
|
18
|
+
<crewRoot>/state/runs/{runId}/manifest.json
|
|
19
|
+
<crewRoot>/state/runs/{runId}/tasks.json
|
|
20
|
+
<crewRoot>/state/runs/{runId}/events.jsonl
|
|
21
|
+
<crewRoot>/state/runs/{runId}/agents/{taskId}/status.json
|
|
22
|
+
<crewRoot>/artifacts/{runId}/...
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Run flow
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
user/team tool
|
|
29
|
+
│
|
|
30
|
+
▼
|
|
31
|
+
handleTeamTool(action=run)
|
|
32
|
+
├─ discover agents/teams/workflows
|
|
33
|
+
├─ validate team/workflow refs
|
|
34
|
+
├─ create run manifest + task graph
|
|
35
|
+
├─ write goal artifact
|
|
36
|
+
└─ choose foreground/session-bound or async/background mode
|
|
37
|
+
│
|
|
38
|
+
├─ foreground: startForegroundRun() schedules executeTeamRun()
|
|
39
|
+
│
|
|
40
|
+
└─ async: spawnBackgroundTeamRun()
|
|
41
|
+
├─ node --import jiti-register.mjs background-runner.ts
|
|
42
|
+
├─ background-runner writes async.started + async.pid marker
|
|
43
|
+
└─ executeTeamRun()
|
|
44
|
+
├─ resolve ready task batch
|
|
45
|
+
├─ resolveBatchConcurrency() with hard cap
|
|
46
|
+
├─ runTeamTask() per task
|
|
47
|
+
│ ├─ build prompt + dependency context
|
|
48
|
+
│ ├─ choose configured Pi model candidates
|
|
49
|
+
│ ├─ spawn child `pi` worker
|
|
50
|
+
│ ├─ observe JSONL/stdout progress
|
|
51
|
+
│ ├─ persist agent status/events/output
|
|
52
|
+
│ └─ write result/log/transcript artifacts
|
|
53
|
+
├─ merge task updates monotonically
|
|
54
|
+
├─ write progress artifacts
|
|
55
|
+
└─ synthesize policy closeout
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Extension layer
|
|
59
|
+
|
|
60
|
+
`src/extension/register.ts` wires the package into Pi:
|
|
61
|
+
|
|
62
|
+
- `team` tool and management actions.
|
|
63
|
+
- Conflict-safe subagent tools: `crew_agent`, `crew_agent_result`, `crew_agent_steer`.
|
|
64
|
+
- Claude-style aliases: `Agent`, `get_subagent_result`, `steer_subagent` when available.
|
|
65
|
+
- Slash commands including `/team-run`, `/team-status`, `/team-dashboard`, `/team-doctor`, `/team-config`, `/team-summary`.
|
|
66
|
+
- Active-only widget and optional dashboard/sidebar UI.
|
|
67
|
+
- Foreground run scheduling and shutdown cleanup.
|
|
68
|
+
- Async completion notifier and session-start active-run summary.
|
|
69
|
+
|
|
70
|
+
The extension layer should remain thin: user input is normalized into tool parameters, then delegated to runtime/state modules.
|
|
71
|
+
|
|
72
|
+
## Runtime layer
|
|
73
|
+
|
|
74
|
+
### Team runner
|
|
75
|
+
|
|
76
|
+
`src/runtime/team-runner.ts` drives workflow execution. It reads queued tasks, computes the ready set from the task graph, applies concurrency limits, runs a batch, then merges results back into the latest task state. Terminal task states are monotonic: stale parallel snapshots must not regress completed/failed/cancelled/skipped tasks back to queued/running.
|
|
77
|
+
|
|
78
|
+
### Task runner
|
|
79
|
+
|
|
80
|
+
`src/runtime/task-runner.ts` executes one task. It prepares workspace/worktree context, renders a task prompt, chooses model candidates from Pi configuration, launches a child Pi process by default, and writes result artifacts. Scaffold mode is explicit dry-run only.
|
|
81
|
+
|
|
82
|
+
### Child Pi runtime
|
|
83
|
+
|
|
84
|
+
`src/runtime/child-pi.ts` is the default worker runtime. It:
|
|
85
|
+
|
|
86
|
+
- launches real `pi` child processes,
|
|
87
|
+
- hides Windows console windows with `windowsHide: true`,
|
|
88
|
+
- streams JSONL output into transcripts,
|
|
89
|
+
- compacts noisy message updates,
|
|
90
|
+
- isolates observer callback failures so progress persistence cannot kill orchestration,
|
|
91
|
+
- applies post-exit stdio guards for late output.
|
|
92
|
+
|
|
93
|
+
### Async background runner
|
|
94
|
+
|
|
95
|
+
`src/runtime/async-runner.ts` spawns detached background runs. Installed packages use an absolute `jiti-register.mjs` loader path because Node strip-types refuses TypeScript under `node_modules`. The runner fail-fasts if jiti is missing, and writes `async.pid` once startup begins so the parent can distinguish a healthy start from an early import crash.
|
|
96
|
+
|
|
97
|
+
### Concurrency and policy
|
|
98
|
+
|
|
99
|
+
`src/runtime/concurrency.ts` picks batch size from explicit limits, team settings, workflow settings, or built-in defaults. User-provided `limits.maxConcurrentWorkers` is hard-capped by default to prevent local DoS; `limits.allowUnboundedConcurrency=true` is an explicit opt-out and emits an observability event.
|
|
100
|
+
|
|
101
|
+
`src/runtime/policy-engine.ts` applies closeout and safety policy decisions such as limit exceeded, failed task blocking, stale workers, and green-contract failures.
|
|
102
|
+
|
|
103
|
+
### Model routing
|
|
104
|
+
|
|
105
|
+
Model choice is based on Pi's current configuration/model registry, not hardcoded providers. Task and agent records persist model attempts and routing metadata so dashboards/status can show requested model, selected model, fallback chain, and fallback reason.
|
|
106
|
+
|
|
107
|
+
## State layer
|
|
108
|
+
|
|
109
|
+
Run state is under `<crewRoot>` (`.crew/` for new projects, or `.pi/teams/` when the repo already has `.pi/`):
|
|
110
|
+
|
|
111
|
+
```text
|
|
112
|
+
<crewRoot>/state/runs/{runId}/
|
|
113
|
+
manifest.json run metadata/status/artifacts/async pid
|
|
114
|
+
tasks.json task graph and per-task status
|
|
115
|
+
events.jsonl append-only run events
|
|
116
|
+
events.jsonl.seq event sequence cache
|
|
117
|
+
agents.json aggregate agent cache
|
|
118
|
+
async.pid background startup marker
|
|
119
|
+
agents/{taskId}/
|
|
120
|
+
status.json per-agent status source
|
|
121
|
+
events.jsonl per-agent event stream
|
|
122
|
+
output.log compact worker output
|
|
123
|
+
sidechain.output.jsonl
|
|
124
|
+
live-control.jsonl
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Artifacts are under:
|
|
128
|
+
|
|
129
|
+
```text
|
|
130
|
+
<crewRoot>/artifacts/{runId}/
|
|
131
|
+
goal.md
|
|
132
|
+
prompts/{taskId}.md
|
|
133
|
+
results/{taskId}.txt
|
|
134
|
+
logs/{taskId}.log
|
|
135
|
+
transcripts/{taskId}.jsonl
|
|
136
|
+
metadata/*.json
|
|
137
|
+
progress.md
|
|
138
|
+
summary.md
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`<crewRoot>` resolution is centralised in `src/utils/paths.ts#projectCrewRoot()`:
|
|
142
|
+
|
|
143
|
+
- if `<repoRoot>/.pi/` already exists, return `<repoRoot>/.pi/teams/` (legacy reuse, no parallel `.crew/`)
|
|
144
|
+
- otherwise return `<repoRoot>/.crew/` (default for fresh projects)
|
|
145
|
+
|
|
146
|
+
User-global fallback (when no project root is detected) lives under `~/.pi/agent/extensions/pi-crew/`.
|
|
147
|
+
|
|
148
|
+
Atomic writes use temp-file replace with retry for transient Windows `EPERM`/`EBUSY`/`EACCES`. JSONL append paths are best-effort where used for observers/progress; write failures must not crash child output parsing.
|
|
149
|
+
|
|
150
|
+
## UI and observability
|
|
151
|
+
|
|
152
|
+
- The persistent widget shows active runs only.
|
|
153
|
+
- Stale async runs with dead background pids are hidden from the active widget.
|
|
154
|
+
- `/team-status` is the canonical detailed state view and can mark stale active async runs failed.
|
|
155
|
+
- `/team-dashboard` provides live history/details from `RunSnapshotCache`, with panes for agents, progress/events, mailbox attention, recent output, health, and metrics.
|
|
156
|
+
- Phase 9 observability uses a per-session `MetricRegistry` (`Counter`, `Gauge`, `Histogram`) wired to `crew.*` events via unsubscribe-returning `events.on()` handlers. The registry is disposed on session shutdown/reload; no global metric singleton is used.
|
|
157
|
+
- Metrics can be inspected with `/team-metrics` or `team api metrics-snapshot`, exported as redacted daily JSONL under `<crewRoot>/state/metrics/` when telemetry is enabled, formatted for Prometheus, or pushed to an opt-in OTLP HTTP endpoint.
|
|
158
|
+
- Heartbeat observability is split between dashboard summaries and a background `HeartbeatWatcher`: healthy/warn/stale/dead gradient metrics are emitted, first-dead detections notify operators, and consecutive dead ticks can append deadletter entries.
|
|
159
|
+
- Powerbar publishing is optional and event-compatible: pi-crew emits `powerbar:register-segment` for `pi-crew-active` / `pi-crew-progress`, emits `powerbar:update` payloads (`id`, `text`, optional `suffix`, `bar`, `color`), and mirrors status through `ctx.ui.setStatus("pi-crew", ...)` when no powerbar listener is detected.
|
|
160
|
+
- Transcript viewer is file-backed so it works for foreground and async runs; it defaults to bounded tail reads and can load full content on demand.
|
|
161
|
+
|
|
162
|
+
## Lifecycle and cleanup
|
|
163
|
+
|
|
164
|
+
Foreground runs are session-bound and should be interrupted on session shutdown or session switch. Only explicit `async: true` runs are allowed to survive the Pi session. Runtime cleanup is registered through Pi lifecycle hooks and a global reload cleanup guard.
|
|
165
|
+
|
|
166
|
+
## Configuration
|
|
167
|
+
|
|
168
|
+
Key config sections:
|
|
169
|
+
|
|
170
|
+
- `runtime`: `auto`, `child-process`, `scaffold`, experimental `live-session`.
|
|
171
|
+
- `limits`: concurrency/task/depth safety controls.
|
|
172
|
+
- `ui`: widget/dashboard/powerbar/model-token display settings.
|
|
173
|
+
- `observability`: in-memory metrics, heartbeat watcher interval, metric file retention.
|
|
174
|
+
- `telemetry`: opt-out switch for local telemetry sinks.
|
|
175
|
+
- `reliability`: opt-in auto-retry/auto-recover defaults and deadletter threshold.
|
|
176
|
+
- `otlp`: opt-in OTLP HTTP metric export.
|
|
177
|
+
- `agents`: builtin overrides for models/fallbacks/tools.
|
|
178
|
+
- `autonomous`: policy injection/profile for proactive team delegation.
|
|
179
|
+
|
|
180
|
+
See `usage.md`, `resource-formats.md`, `runtime-flow.md`, and `live-mailbox-runtime.md` for operational details.
|