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/src/state/task-claims.ts
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import type { TeamTaskState } from "./types.ts";
|
|
3
|
-
|
|
4
|
-
export interface TaskClaimState {
|
|
5
|
-
owner: string;
|
|
6
|
-
token: string;
|
|
7
|
-
leasedUntil: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function createTaskClaim(owner: string, leaseMs = 5 * 60_000, now = new Date()): TaskClaimState {
|
|
11
|
-
return { owner, token: randomUUID(), leasedUntil: new Date(now.getTime() + leaseMs).toISOString() };
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function isTaskClaimExpired(claim: TaskClaimState | undefined, now = new Date()): boolean {
|
|
15
|
-
if (!claim) return false;
|
|
16
|
-
const parsed = Date.parse(claim.leasedUntil);
|
|
17
|
-
// Corrupt or invalid date strings produce NaN — treat as expired immediately.
|
|
18
|
-
return Number.isFinite(parsed) ? parsed <= now.getTime() : true;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function canUseTaskClaim(task: Pick<TeamTaskState, "claim">, owner: string, token: string, now = new Date()): boolean {
|
|
22
|
-
return task.claim?.owner === owner && task.claim.token === token && !isTaskClaimExpired(task.claim, now);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function claimTask<T extends TeamTaskState>(task: T, owner: string, leaseMs?: number, now = new Date()): T {
|
|
26
|
-
if (task.claim && !isTaskClaimExpired(task.claim, now)) {
|
|
27
|
-
throw new Error(`Task '${task.id}' is already claimed by '${task.claim.owner}'.`);
|
|
28
|
-
}
|
|
29
|
-
return { ...task, claim: createTaskClaim(owner, leaseMs, now) };
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function releaseTaskClaim<T extends TeamTaskState>(task: T, owner: string, token: string, now = new Date()): T {
|
|
33
|
-
if (!canUseTaskClaim(task, owner, token, now)) {
|
|
34
|
-
throw new Error(`Task '${task.id}' claim is not held by '${owner}' or has expired.`);
|
|
35
|
-
}
|
|
36
|
-
return { ...task, claim: undefined };
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function transitionClaimedTaskStatus<T extends TeamTaskState>(task: T, owner: string, token: string, status: T["status"], now = new Date()): T {
|
|
40
|
-
if (!canUseTaskClaim(task, owner, token, now)) {
|
|
41
|
-
throw new Error(`Task '${task.id}' claim is not held by '${owner}' or has expired.`);
|
|
42
|
-
}
|
|
43
|
-
return { ...task, status };
|
|
44
|
-
}
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import type { TeamTaskState } from "./types.ts";
|
|
3
|
+
|
|
4
|
+
export interface TaskClaimState {
|
|
5
|
+
owner: string;
|
|
6
|
+
token: string;
|
|
7
|
+
leasedUntil: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function createTaskClaim(owner: string, leaseMs = 5 * 60_000, now = new Date()): TaskClaimState {
|
|
11
|
+
return { owner, token: randomUUID(), leasedUntil: new Date(now.getTime() + leaseMs).toISOString() };
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function isTaskClaimExpired(claim: TaskClaimState | undefined, now = new Date()): boolean {
|
|
15
|
+
if (!claim) return false;
|
|
16
|
+
const parsed = Date.parse(claim.leasedUntil);
|
|
17
|
+
// Corrupt or invalid date strings produce NaN — treat as expired immediately.
|
|
18
|
+
return Number.isFinite(parsed) ? parsed <= now.getTime() : true;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function canUseTaskClaim(task: Pick<TeamTaskState, "claim">, owner: string, token: string, now = new Date()): boolean {
|
|
22
|
+
return task.claim?.owner === owner && task.claim.token === token && !isTaskClaimExpired(task.claim, now);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function claimTask<T extends TeamTaskState>(task: T, owner: string, leaseMs?: number, now = new Date()): T {
|
|
26
|
+
if (task.claim && !isTaskClaimExpired(task.claim, now)) {
|
|
27
|
+
throw new Error(`Task '${task.id}' is already claimed by '${task.claim.owner}'.`);
|
|
28
|
+
}
|
|
29
|
+
return { ...task, claim: createTaskClaim(owner, leaseMs, now) };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function releaseTaskClaim<T extends TeamTaskState>(task: T, owner: string, token: string, now = new Date()): T {
|
|
33
|
+
if (!canUseTaskClaim(task, owner, token, now)) {
|
|
34
|
+
throw new Error(`Task '${task.id}' claim is not held by '${owner}' or has expired.`);
|
|
35
|
+
}
|
|
36
|
+
return { ...task, claim: undefined };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function transitionClaimedTaskStatus<T extends TeamTaskState>(task: T, owner: string, token: string, status: T["status"], now = new Date()): T {
|
|
40
|
+
if (!canUseTaskClaim(task, owner, token, now)) {
|
|
41
|
+
throw new Error(`Task '${task.id}' claim is not held by '${owner}' or has expired.`);
|
|
42
|
+
}
|
|
43
|
+
return { ...task, status };
|
|
44
|
+
}
|
package/src/state/types.ts
CHANGED
|
@@ -1,285 +1,285 @@
|
|
|
1
|
-
import type { TeamRunStatus, TeamTaskStatus } from "./contracts.ts";
|
|
2
|
-
import type { TaskClaimState } from "./task-claims.ts";
|
|
3
|
-
import type { WorkerHeartbeatState } from "../runtime/worker-heartbeat.ts";
|
|
4
|
-
import type { CrewAgentProgress } from "../runtime/crew-agent-runtime.ts";
|
|
5
|
-
export type { TeamRunStatus, TeamTaskStatus } from "./contracts.ts";
|
|
6
|
-
|
|
7
|
-
export interface ArtifactDescriptor {
|
|
8
|
-
kind: "plan" | "prompt" | "result" | "summary" | "log" | "diff" | "patch" | "progress" | "notepad" | "metadata";
|
|
9
|
-
path: string;
|
|
10
|
-
createdAt: string;
|
|
11
|
-
producer: string;
|
|
12
|
-
sizeBytes?: number;
|
|
13
|
-
contentHash?: string;
|
|
14
|
-
retention: "run" | "project" | "temporary";
|
|
15
|
-
expiresAt?: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type TaskScope = "workspace" | "module" | "single_file" | "custom";
|
|
19
|
-
export type GreenLevel = "none" | "targeted" | "package" | "workspace" | "merge_ready";
|
|
20
|
-
|
|
21
|
-
export interface VerificationCommandResult {
|
|
22
|
-
cmd: string;
|
|
23
|
-
status: "passed" | "failed" | "not_run";
|
|
24
|
-
exitCode?: number | null;
|
|
25
|
-
outputArtifact?: ArtifactDescriptor;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface VerificationContract {
|
|
29
|
-
requiredGreenLevel: GreenLevel;
|
|
30
|
-
commands: string[];
|
|
31
|
-
allowManualEvidence: boolean;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface VerificationEvidence {
|
|
35
|
-
requiredGreenLevel: GreenLevel;
|
|
36
|
-
observedGreenLevel: GreenLevel;
|
|
37
|
-
satisfied: boolean;
|
|
38
|
-
commands: VerificationCommandResult[];
|
|
39
|
-
notes?: string;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface TaskOutputSchema {
|
|
43
|
-
/** Output format expected from the worker */
|
|
44
|
-
format: "json" | "markdown" | "text";
|
|
45
|
-
/** JTD or JSON Schema for validating JSON output (only when format="json") */
|
|
46
|
-
schema?: Record<string, unknown>;
|
|
47
|
-
/** Human-readable description of expected output */
|
|
48
|
-
description?: string;
|
|
49
|
-
/** Example of valid output (for prompt guidance) */
|
|
50
|
-
example?: string;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface TaskPacket {
|
|
54
|
-
objective: string;
|
|
55
|
-
scope: TaskScope;
|
|
56
|
-
scopePath?: string;
|
|
57
|
-
repo: string;
|
|
58
|
-
worktree?: string;
|
|
59
|
-
branchPolicy: string;
|
|
60
|
-
acceptanceTests: string[];
|
|
61
|
-
commitPolicy: string;
|
|
62
|
-
reportingContract: string;
|
|
63
|
-
escalationPolicy: string;
|
|
64
|
-
constraints: string[];
|
|
65
|
-
expectedArtifacts: string[];
|
|
66
|
-
verification: VerificationContract;
|
|
67
|
-
outputSchema?: TaskOutputSchema;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export type PolicyDecisionAction = "retry" | "reassign" | "escalate" | "block" | "notify" | "cleanup" | "closeout" | "fail";
|
|
71
|
-
export type PolicyDecisionReason = "task_failed" | "worker_stale" | "green_unsatisfied" | "limit_exceeded" | "run_complete" | "mailbox_timeout" | "review_rejected" | "branch_stale" | "scope_mismatch" | "ineffective_worker";
|
|
72
|
-
|
|
73
|
-
export interface PolicyDecision {
|
|
74
|
-
action: PolicyDecisionAction;
|
|
75
|
-
reason: PolicyDecisionReason;
|
|
76
|
-
message: string;
|
|
77
|
-
taskId?: string;
|
|
78
|
-
createdAt: string;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export interface TaskGraphNode {
|
|
82
|
-
taskId: string;
|
|
83
|
-
parentId?: string;
|
|
84
|
-
children: string[];
|
|
85
|
-
dependencies: string[];
|
|
86
|
-
queue: "ready" | "blocked" | "running" | "done";
|
|
87
|
-
sessionForkFrom?: string;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export interface AsyncRunState {
|
|
91
|
-
pid?: number;
|
|
92
|
-
logPath: string;
|
|
93
|
-
spawnedAt: string;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export interface RuntimeResolutionState {
|
|
97
|
-
kind: "scaffold" | "child-process" | "live-session";
|
|
98
|
-
requestedMode: "auto" | "scaffold" | "child-process" | "live-session";
|
|
99
|
-
safety: "trusted" | "explicit_dry_run" | "blocked";
|
|
100
|
-
available: boolean;
|
|
101
|
-
fallback?: "scaffold" | "child-process" | "live-session";
|
|
102
|
-
reason?: string;
|
|
103
|
-
resolvedAt: string;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export interface WorkerExitStatus {
|
|
107
|
-
exitCode: number | null;
|
|
108
|
-
cancelled: boolean;
|
|
109
|
-
timedOut: boolean;
|
|
110
|
-
killed: boolean;
|
|
111
|
-
signal?: string;
|
|
112
|
-
cleanupErrors: string[];
|
|
113
|
-
finalDrainMs: number;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export interface OperationTerminalEvidence {
|
|
117
|
-
operation: "worker" | "tool" | "model";
|
|
118
|
-
status: "cancelled" | "failed" | "completed";
|
|
119
|
-
startedAt?: string;
|
|
120
|
-
finishedAt: string;
|
|
121
|
-
attemptId?: string;
|
|
122
|
-
reason?: {
|
|
123
|
-
code: string;
|
|
124
|
-
message: string;
|
|
125
|
-
};
|
|
126
|
-
exitStatus?: WorkerExitStatus;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export interface PlanApprovalState {
|
|
130
|
-
required: boolean;
|
|
131
|
-
status: "pending" | "approved" | "cancelled";
|
|
132
|
-
requestedAt: string;
|
|
133
|
-
updatedAt: string;
|
|
134
|
-
approvedAt?: string;
|
|
135
|
-
cancelledAt?: string;
|
|
136
|
-
planTaskId?: string;
|
|
137
|
-
planArtifactPath?: string;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export type CrewActivityState = "active" | "active_long_running" | "needs_attention" | "stale";
|
|
141
|
-
export type CrewAttentionReason = "idle" | "tool_failures" | "completion_guard" | "heartbeat_stale" | "plan_approval_pending";
|
|
142
|
-
|
|
143
|
-
export interface CrewAttentionEventData {
|
|
144
|
-
activityState: CrewActivityState;
|
|
145
|
-
reason: CrewAttentionReason;
|
|
146
|
-
elapsedMs?: number;
|
|
147
|
-
taskId?: string;
|
|
148
|
-
agentName?: string;
|
|
149
|
-
suggestedAction?: string;
|
|
150
|
-
observedTools?: string[];
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export interface TeamRunManifest {
|
|
154
|
-
schemaVersion: 1;
|
|
155
|
-
runId: string;
|
|
156
|
-
team: string;
|
|
157
|
-
workflow?: string;
|
|
158
|
-
goal: string;
|
|
159
|
-
status: TeamRunStatus;
|
|
160
|
-
workspaceMode: "single" | "worktree";
|
|
161
|
-
createdAt: string;
|
|
162
|
-
updatedAt: string;
|
|
163
|
-
cwd: string;
|
|
164
|
-
stateRoot: string;
|
|
165
|
-
artifactsRoot: string;
|
|
166
|
-
tasksPath: string;
|
|
167
|
-
eventsPath: string;
|
|
168
|
-
artifacts: ArtifactDescriptor[];
|
|
169
|
-
async?: AsyncRunState;
|
|
170
|
-
planApproval?: PlanApprovalState;
|
|
171
|
-
/** Pi session that created the run, when available. Used to prevent cross-session destructive actions. */
|
|
172
|
-
ownerSessionId?: string;
|
|
173
|
-
/** pi-crew skill override selected when the run was created. false disables injected skill instructions. */
|
|
174
|
-
skillOverride?: string[] | false;
|
|
175
|
-
/** Resolved runtime/safety mode used for execution. Optional for backward compatibility with older manifests. */
|
|
176
|
-
runtimeResolution?: RuntimeResolutionState;
|
|
177
|
-
/** Effective run config snapshot used by async background workers. Optional for backward compatibility. */
|
|
178
|
-
runConfig?: unknown;
|
|
179
|
-
summary?: string;
|
|
180
|
-
policyDecisions?: PolicyDecision[];
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
export interface UsageState {
|
|
184
|
-
input?: number;
|
|
185
|
-
output?: number;
|
|
186
|
-
cacheRead?: number;
|
|
187
|
-
cacheWrite?: number;
|
|
188
|
-
cost?: number;
|
|
189
|
-
turns?: number;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export interface ModelAttemptState {
|
|
193
|
-
model: string;
|
|
194
|
-
success: boolean;
|
|
195
|
-
exitCode?: number | null;
|
|
196
|
-
error?: string;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
export interface ModelRoutingState {
|
|
200
|
-
requested?: string;
|
|
201
|
-
resolved: string;
|
|
202
|
-
fallbackChain: string[];
|
|
203
|
-
reason?: string;
|
|
204
|
-
usedAttempt: number;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export interface TaskWorktreeState {
|
|
208
|
-
path: string;
|
|
209
|
-
branch: string;
|
|
210
|
-
reused: boolean;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
export interface TaskCheckpointState {
|
|
214
|
-
phase: "started" | "child-spawned" | "child-stdout-final" | "artifact-written";
|
|
215
|
-
updatedAt: string;
|
|
216
|
-
childPid?: number;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export interface TaskAttemptState {
|
|
220
|
-
attemptId?: string;
|
|
221
|
-
startedAt: string;
|
|
222
|
-
endedAt?: string;
|
|
223
|
-
error?: string;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
export interface TeamTaskState {
|
|
227
|
-
id: string;
|
|
228
|
-
runId: string;
|
|
229
|
-
stepId?: string;
|
|
230
|
-
role: string;
|
|
231
|
-
agent: string;
|
|
232
|
-
title: string;
|
|
233
|
-
displayName?: string;
|
|
234
|
-
status: TeamTaskStatus;
|
|
235
|
-
dependsOn: string[];
|
|
236
|
-
cwd: string;
|
|
237
|
-
worktree?: TaskWorktreeState;
|
|
238
|
-
promptArtifact?: ArtifactDescriptor;
|
|
239
|
-
resultArtifact?: ArtifactDescriptor;
|
|
240
|
-
logArtifact?: ArtifactDescriptor;
|
|
241
|
-
transcriptArtifact?: ArtifactDescriptor;
|
|
242
|
-
startedAt?: string;
|
|
243
|
-
finishedAt?: string;
|
|
244
|
-
exitCode?: number | null;
|
|
245
|
-
model?: string;
|
|
246
|
-
modelAttempts?: ModelAttemptState[];
|
|
247
|
-
modelRouting?: ModelRoutingState;
|
|
248
|
-
usage?: UsageState;
|
|
249
|
-
jsonEvents?: number;
|
|
250
|
-
agentProgress?: CrewAgentProgress;
|
|
251
|
-
error?: string;
|
|
252
|
-
claim?: TaskClaimState;
|
|
253
|
-
heartbeat?: WorkerHeartbeatState;
|
|
254
|
-
checkpoint?: TaskCheckpointState;
|
|
255
|
-
attempts?: TaskAttemptState[];
|
|
256
|
-
workerExitStatus?: WorkerExitStatus;
|
|
257
|
-
terminalEvidence?: OperationTerminalEvidence[];
|
|
258
|
-
taskPacket?: TaskPacket;
|
|
259
|
-
verification?: VerificationEvidence;
|
|
260
|
-
graph?: TaskGraphNode;
|
|
261
|
-
adaptive?: {
|
|
262
|
-
phase: string;
|
|
263
|
-
task: string;
|
|
264
|
-
};
|
|
265
|
-
policy?: {
|
|
266
|
-
retryCount?: number;
|
|
267
|
-
lastDecision?: PolicyDecision;
|
|
268
|
-
};
|
|
269
|
-
controlReservation?: ControlReservation;
|
|
270
|
-
|
|
271
|
-
/** Structured diagnostics per task (ASI pattern from pi-autoresearch). */
|
|
272
|
-
diagnostics?: Record<string, unknown>;
|
|
273
|
-
|
|
274
|
-
/** Segment counter for task retry isolation. Default 0 (first attempt). Incremented on retry. */
|
|
275
|
-
segment?: number;
|
|
276
|
-
|
|
277
|
-
/** Parsed metric key-values from worker output (CREW_METRIC lines). */
|
|
278
|
-
metrics?: Record<string, number>;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
export interface ControlReservation {
|
|
282
|
-
reservedAt: string;
|
|
283
|
-
controllerId: string;
|
|
284
|
-
acceptsControlEvents: boolean;
|
|
285
|
-
}
|
|
1
|
+
import type { TeamRunStatus, TeamTaskStatus } from "./contracts.ts";
|
|
2
|
+
import type { TaskClaimState } from "./task-claims.ts";
|
|
3
|
+
import type { WorkerHeartbeatState } from "../runtime/worker-heartbeat.ts";
|
|
4
|
+
import type { CrewAgentProgress } from "../runtime/crew-agent-runtime.ts";
|
|
5
|
+
export type { TeamRunStatus, TeamTaskStatus } from "./contracts.ts";
|
|
6
|
+
|
|
7
|
+
export interface ArtifactDescriptor {
|
|
8
|
+
kind: "plan" | "prompt" | "result" | "summary" | "log" | "diff" | "patch" | "progress" | "notepad" | "metadata";
|
|
9
|
+
path: string;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
producer: string;
|
|
12
|
+
sizeBytes?: number;
|
|
13
|
+
contentHash?: string;
|
|
14
|
+
retention: "run" | "project" | "temporary";
|
|
15
|
+
expiresAt?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type TaskScope = "workspace" | "module" | "single_file" | "custom";
|
|
19
|
+
export type GreenLevel = "none" | "targeted" | "package" | "workspace" | "merge_ready";
|
|
20
|
+
|
|
21
|
+
export interface VerificationCommandResult {
|
|
22
|
+
cmd: string;
|
|
23
|
+
status: "passed" | "failed" | "not_run";
|
|
24
|
+
exitCode?: number | null;
|
|
25
|
+
outputArtifact?: ArtifactDescriptor;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface VerificationContract {
|
|
29
|
+
requiredGreenLevel: GreenLevel;
|
|
30
|
+
commands: string[];
|
|
31
|
+
allowManualEvidence: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface VerificationEvidence {
|
|
35
|
+
requiredGreenLevel: GreenLevel;
|
|
36
|
+
observedGreenLevel: GreenLevel;
|
|
37
|
+
satisfied: boolean;
|
|
38
|
+
commands: VerificationCommandResult[];
|
|
39
|
+
notes?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface TaskOutputSchema {
|
|
43
|
+
/** Output format expected from the worker */
|
|
44
|
+
format: "json" | "markdown" | "text";
|
|
45
|
+
/** JTD or JSON Schema for validating JSON output (only when format="json") */
|
|
46
|
+
schema?: Record<string, unknown>;
|
|
47
|
+
/** Human-readable description of expected output */
|
|
48
|
+
description?: string;
|
|
49
|
+
/** Example of valid output (for prompt guidance) */
|
|
50
|
+
example?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface TaskPacket {
|
|
54
|
+
objective: string;
|
|
55
|
+
scope: TaskScope;
|
|
56
|
+
scopePath?: string;
|
|
57
|
+
repo: string;
|
|
58
|
+
worktree?: string;
|
|
59
|
+
branchPolicy: string;
|
|
60
|
+
acceptanceTests: string[];
|
|
61
|
+
commitPolicy: string;
|
|
62
|
+
reportingContract: string;
|
|
63
|
+
escalationPolicy: string;
|
|
64
|
+
constraints: string[];
|
|
65
|
+
expectedArtifacts: string[];
|
|
66
|
+
verification: VerificationContract;
|
|
67
|
+
outputSchema?: TaskOutputSchema;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export type PolicyDecisionAction = "retry" | "reassign" | "escalate" | "block" | "notify" | "cleanup" | "closeout" | "fail";
|
|
71
|
+
export type PolicyDecisionReason = "task_failed" | "worker_stale" | "green_unsatisfied" | "limit_exceeded" | "run_complete" | "mailbox_timeout" | "review_rejected" | "branch_stale" | "scope_mismatch" | "ineffective_worker";
|
|
72
|
+
|
|
73
|
+
export interface PolicyDecision {
|
|
74
|
+
action: PolicyDecisionAction;
|
|
75
|
+
reason: PolicyDecisionReason;
|
|
76
|
+
message: string;
|
|
77
|
+
taskId?: string;
|
|
78
|
+
createdAt: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface TaskGraphNode {
|
|
82
|
+
taskId: string;
|
|
83
|
+
parentId?: string;
|
|
84
|
+
children: string[];
|
|
85
|
+
dependencies: string[];
|
|
86
|
+
queue: "ready" | "blocked" | "running" | "done";
|
|
87
|
+
sessionForkFrom?: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface AsyncRunState {
|
|
91
|
+
pid?: number;
|
|
92
|
+
logPath: string;
|
|
93
|
+
spawnedAt: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface RuntimeResolutionState {
|
|
97
|
+
kind: "scaffold" | "child-process" | "live-session";
|
|
98
|
+
requestedMode: "auto" | "scaffold" | "child-process" | "live-session";
|
|
99
|
+
safety: "trusted" | "explicit_dry_run" | "blocked";
|
|
100
|
+
available: boolean;
|
|
101
|
+
fallback?: "scaffold" | "child-process" | "live-session";
|
|
102
|
+
reason?: string;
|
|
103
|
+
resolvedAt: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface WorkerExitStatus {
|
|
107
|
+
exitCode: number | null;
|
|
108
|
+
cancelled: boolean;
|
|
109
|
+
timedOut: boolean;
|
|
110
|
+
killed: boolean;
|
|
111
|
+
signal?: string;
|
|
112
|
+
cleanupErrors: string[];
|
|
113
|
+
finalDrainMs: number;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface OperationTerminalEvidence {
|
|
117
|
+
operation: "worker" | "tool" | "model";
|
|
118
|
+
status: "cancelled" | "failed" | "completed";
|
|
119
|
+
startedAt?: string;
|
|
120
|
+
finishedAt: string;
|
|
121
|
+
attemptId?: string;
|
|
122
|
+
reason?: {
|
|
123
|
+
code: string;
|
|
124
|
+
message: string;
|
|
125
|
+
};
|
|
126
|
+
exitStatus?: WorkerExitStatus;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export interface PlanApprovalState {
|
|
130
|
+
required: boolean;
|
|
131
|
+
status: "pending" | "approved" | "cancelled";
|
|
132
|
+
requestedAt: string;
|
|
133
|
+
updatedAt: string;
|
|
134
|
+
approvedAt?: string;
|
|
135
|
+
cancelledAt?: string;
|
|
136
|
+
planTaskId?: string;
|
|
137
|
+
planArtifactPath?: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export type CrewActivityState = "active" | "active_long_running" | "needs_attention" | "stale";
|
|
141
|
+
export type CrewAttentionReason = "idle" | "tool_failures" | "completion_guard" | "heartbeat_stale" | "plan_approval_pending";
|
|
142
|
+
|
|
143
|
+
export interface CrewAttentionEventData {
|
|
144
|
+
activityState: CrewActivityState;
|
|
145
|
+
reason: CrewAttentionReason;
|
|
146
|
+
elapsedMs?: number;
|
|
147
|
+
taskId?: string;
|
|
148
|
+
agentName?: string;
|
|
149
|
+
suggestedAction?: string;
|
|
150
|
+
observedTools?: string[];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface TeamRunManifest {
|
|
154
|
+
schemaVersion: 1;
|
|
155
|
+
runId: string;
|
|
156
|
+
team: string;
|
|
157
|
+
workflow?: string;
|
|
158
|
+
goal: string;
|
|
159
|
+
status: TeamRunStatus;
|
|
160
|
+
workspaceMode: "single" | "worktree";
|
|
161
|
+
createdAt: string;
|
|
162
|
+
updatedAt: string;
|
|
163
|
+
cwd: string;
|
|
164
|
+
stateRoot: string;
|
|
165
|
+
artifactsRoot: string;
|
|
166
|
+
tasksPath: string;
|
|
167
|
+
eventsPath: string;
|
|
168
|
+
artifacts: ArtifactDescriptor[];
|
|
169
|
+
async?: AsyncRunState;
|
|
170
|
+
planApproval?: PlanApprovalState;
|
|
171
|
+
/** Pi session that created the run, when available. Used to prevent cross-session destructive actions. */
|
|
172
|
+
ownerSessionId?: string;
|
|
173
|
+
/** pi-crew skill override selected when the run was created. false disables injected skill instructions. */
|
|
174
|
+
skillOverride?: string[] | false;
|
|
175
|
+
/** Resolved runtime/safety mode used for execution. Optional for backward compatibility with older manifests. */
|
|
176
|
+
runtimeResolution?: RuntimeResolutionState;
|
|
177
|
+
/** Effective run config snapshot used by async background workers. Optional for backward compatibility. */
|
|
178
|
+
runConfig?: unknown;
|
|
179
|
+
summary?: string;
|
|
180
|
+
policyDecisions?: PolicyDecision[];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export interface UsageState {
|
|
184
|
+
input?: number;
|
|
185
|
+
output?: number;
|
|
186
|
+
cacheRead?: number;
|
|
187
|
+
cacheWrite?: number;
|
|
188
|
+
cost?: number;
|
|
189
|
+
turns?: number;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export interface ModelAttemptState {
|
|
193
|
+
model: string;
|
|
194
|
+
success: boolean;
|
|
195
|
+
exitCode?: number | null;
|
|
196
|
+
error?: string;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export interface ModelRoutingState {
|
|
200
|
+
requested?: string;
|
|
201
|
+
resolved: string;
|
|
202
|
+
fallbackChain: string[];
|
|
203
|
+
reason?: string;
|
|
204
|
+
usedAttempt: number;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export interface TaskWorktreeState {
|
|
208
|
+
path: string;
|
|
209
|
+
branch: string;
|
|
210
|
+
reused: boolean;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export interface TaskCheckpointState {
|
|
214
|
+
phase: "started" | "child-spawned" | "child-stdout-final" | "artifact-written";
|
|
215
|
+
updatedAt: string;
|
|
216
|
+
childPid?: number;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export interface TaskAttemptState {
|
|
220
|
+
attemptId?: string;
|
|
221
|
+
startedAt: string;
|
|
222
|
+
endedAt?: string;
|
|
223
|
+
error?: string;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export interface TeamTaskState {
|
|
227
|
+
id: string;
|
|
228
|
+
runId: string;
|
|
229
|
+
stepId?: string;
|
|
230
|
+
role: string;
|
|
231
|
+
agent: string;
|
|
232
|
+
title: string;
|
|
233
|
+
displayName?: string;
|
|
234
|
+
status: TeamTaskStatus;
|
|
235
|
+
dependsOn: string[];
|
|
236
|
+
cwd: string;
|
|
237
|
+
worktree?: TaskWorktreeState;
|
|
238
|
+
promptArtifact?: ArtifactDescriptor;
|
|
239
|
+
resultArtifact?: ArtifactDescriptor;
|
|
240
|
+
logArtifact?: ArtifactDescriptor;
|
|
241
|
+
transcriptArtifact?: ArtifactDescriptor;
|
|
242
|
+
startedAt?: string;
|
|
243
|
+
finishedAt?: string;
|
|
244
|
+
exitCode?: number | null;
|
|
245
|
+
model?: string;
|
|
246
|
+
modelAttempts?: ModelAttemptState[];
|
|
247
|
+
modelRouting?: ModelRoutingState;
|
|
248
|
+
usage?: UsageState;
|
|
249
|
+
jsonEvents?: number;
|
|
250
|
+
agentProgress?: CrewAgentProgress;
|
|
251
|
+
error?: string;
|
|
252
|
+
claim?: TaskClaimState;
|
|
253
|
+
heartbeat?: WorkerHeartbeatState;
|
|
254
|
+
checkpoint?: TaskCheckpointState;
|
|
255
|
+
attempts?: TaskAttemptState[];
|
|
256
|
+
workerExitStatus?: WorkerExitStatus;
|
|
257
|
+
terminalEvidence?: OperationTerminalEvidence[];
|
|
258
|
+
taskPacket?: TaskPacket;
|
|
259
|
+
verification?: VerificationEvidence;
|
|
260
|
+
graph?: TaskGraphNode;
|
|
261
|
+
adaptive?: {
|
|
262
|
+
phase: string;
|
|
263
|
+
task: string;
|
|
264
|
+
};
|
|
265
|
+
policy?: {
|
|
266
|
+
retryCount?: number;
|
|
267
|
+
lastDecision?: PolicyDecision;
|
|
268
|
+
};
|
|
269
|
+
controlReservation?: ControlReservation;
|
|
270
|
+
|
|
271
|
+
/** Structured diagnostics per task (ASI pattern from pi-autoresearch). */
|
|
272
|
+
diagnostics?: Record<string, unknown>;
|
|
273
|
+
|
|
274
|
+
/** Segment counter for task retry isolation. Default 0 (first attempt). Incremented on retry. */
|
|
275
|
+
segment?: number;
|
|
276
|
+
|
|
277
|
+
/** Parsed metric key-values from worker output (CREW_METRIC lines). */
|
|
278
|
+
metrics?: Record<string, number>;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export interface ControlReservation {
|
|
282
|
+
reservedAt: string;
|
|
283
|
+
controllerId: string;
|
|
284
|
+
acceptsControlEvents: boolean;
|
|
285
|
+
}
|