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
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
import type { AgentConfig, ResourceSource } from "../agents/agent-config.ts";
|
|
2
|
-
import { discoverAgents } from "../agents/discover-agents.ts";
|
|
3
|
-
import { discoverTeams } from "../teams/discover-teams.ts";
|
|
4
|
-
import { discoverWorkflows } from "../workflows/discover-workflows.ts";
|
|
5
|
-
import { discoverSkills } from "../skills/discover-skills.ts";
|
|
6
|
-
import type { PiTeamsConfig } from "../config/config.ts";
|
|
7
|
-
|
|
8
|
-
export type CapabilityKind = "team" | "workflow" | "agent" | "skill" | "tool" | "runtime";
|
|
9
|
-
export type CapabilitySource = "builtin" | "project" | "user" | "package" | "git";
|
|
10
|
-
export type CapabilityState = "active" | "disabled" | "shadowed" | "missing";
|
|
11
|
-
|
|
12
|
-
export interface CapabilityItem {
|
|
13
|
-
id: string;
|
|
14
|
-
kind: CapabilityKind;
|
|
15
|
-
name: string;
|
|
16
|
-
description: string;
|
|
17
|
-
source: CapabilitySource;
|
|
18
|
-
path?: string;
|
|
19
|
-
state: CapabilityState;
|
|
20
|
-
disabledReason?: string;
|
|
21
|
-
shadowedBy?: string;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function normalizeAgents(agents: AgentConfig[], source: CapabilitySource, disabledIds: Set<string>): CapabilityItem[] {
|
|
25
|
-
return agents.map((agent) => {
|
|
26
|
-
const id = `agent:${agent.name}`;
|
|
27
|
-
const configDisabled = disabledIds.has(id);
|
|
28
|
-
const agentDisabled = agent.disabled || configDisabled;
|
|
29
|
-
return {
|
|
30
|
-
id,
|
|
31
|
-
kind: "agent" as const,
|
|
32
|
-
name: agent.name,
|
|
33
|
-
description: agent.description,
|
|
34
|
-
source,
|
|
35
|
-
path: agent.filePath,
|
|
36
|
-
state: agentDisabled ? "disabled" : "active",
|
|
37
|
-
disabledReason: configDisabled ? "disabled by policy" : agent.disabled ? "disabled in config" : undefined,
|
|
38
|
-
};
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function normalizeSkills(cwd: string, disabledIds: Set<string>): CapabilityItem[] {
|
|
43
|
-
const skills = discoverSkills(cwd);
|
|
44
|
-
return skills.map((skill) => {
|
|
45
|
-
const id = `skill:${skill.name}`;
|
|
46
|
-
const configDisabled = disabledIds.has(id);
|
|
47
|
-
return {
|
|
48
|
-
id,
|
|
49
|
-
kind: "skill" as const,
|
|
50
|
-
name: skill.name,
|
|
51
|
-
description: skill.description,
|
|
52
|
-
source: skill.source as CapabilitySource,
|
|
53
|
-
path: skill.path,
|
|
54
|
-
state: configDisabled ? "disabled" : "active",
|
|
55
|
-
disabledReason: configDisabled ? "disabled by policy" : undefined,
|
|
56
|
-
};
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function normalizeTeams(cwd: string, disabledIds: Set<string>): CapabilityItem[] {
|
|
61
|
-
const result = discoverTeams(cwd);
|
|
62
|
-
return [...result.builtin, ...result.user, ...result.project].map((team) => {
|
|
63
|
-
const id = `team:${team.name}`;
|
|
64
|
-
const configDisabled = disabledIds.has(id);
|
|
65
|
-
return {
|
|
66
|
-
id,
|
|
67
|
-
kind: "team" as const,
|
|
68
|
-
name: team.name,
|
|
69
|
-
description: team.description,
|
|
70
|
-
source: team.source as CapabilitySource,
|
|
71
|
-
path: team.filePath,
|
|
72
|
-
state: configDisabled ? "disabled" : "active",
|
|
73
|
-
disabledReason: configDisabled ? "disabled by policy" : undefined,
|
|
74
|
-
};
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function normalizeWorkflows(cwd: string, disabledIds: Set<string>): CapabilityItem[] {
|
|
79
|
-
const result = discoverWorkflows(cwd);
|
|
80
|
-
return [...result.builtin, ...result.user, ...result.project].map((workflow) => {
|
|
81
|
-
const id = `workflow:${workflow.name}`;
|
|
82
|
-
const configDisabled = disabledIds.has(id);
|
|
83
|
-
return {
|
|
84
|
-
id,
|
|
85
|
-
kind: "workflow" as const,
|
|
86
|
-
name: workflow.name,
|
|
87
|
-
description: workflow.description,
|
|
88
|
-
source: workflow.source as CapabilitySource,
|
|
89
|
-
path: workflow.filePath,
|
|
90
|
-
state: configDisabled ? "disabled" : "active",
|
|
91
|
-
disabledReason: configDisabled ? "disabled by policy" : undefined,
|
|
92
|
-
};
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export function buildCapabilityInventory(cwd: string, config?: PiTeamsConfig): CapabilityItem[] {
|
|
97
|
-
const disabledIds = new Set<string>(config?.policy?.disabledCapabilities ?? []);
|
|
98
|
-
const agents = discoverAgents(cwd);
|
|
99
|
-
const items = [
|
|
100
|
-
...normalizeTeams(cwd, disabledIds),
|
|
101
|
-
...normalizeWorkflows(cwd, disabledIds),
|
|
102
|
-
...normalizeAgents([...agents.builtin, ...agents.user, ...agents.project], "builtin", disabledIds),
|
|
103
|
-
...normalizeSkills(cwd, disabledIds),
|
|
104
|
-
];
|
|
105
|
-
|
|
106
|
-
// Mark shadowed resources: project/user items with same kind:name as a builtin
|
|
107
|
-
const builtinNames = new Set(items.filter((item) => item.source === "builtin" || item.source === "package").map((item) => `${item.kind}:${item.name}`));
|
|
108
|
-
for (const item of items) {
|
|
109
|
-
if (item.source !== "builtin" && item.source !== "package" && builtinNames.has(`${item.kind}:${item.name}`)) {
|
|
110
|
-
item.state = "shadowed";
|
|
111
|
-
item.shadowedBy = `builtin:${item.kind}:${item.name}`;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return items.sort((a, b) => a.id.localeCompare(b.id));
|
|
116
|
-
}
|
|
1
|
+
import type { AgentConfig, ResourceSource } from "../agents/agent-config.ts";
|
|
2
|
+
import { discoverAgents } from "../agents/discover-agents.ts";
|
|
3
|
+
import { discoverTeams } from "../teams/discover-teams.ts";
|
|
4
|
+
import { discoverWorkflows } from "../workflows/discover-workflows.ts";
|
|
5
|
+
import { discoverSkills } from "../skills/discover-skills.ts";
|
|
6
|
+
import type { PiTeamsConfig } from "../config/config.ts";
|
|
7
|
+
|
|
8
|
+
export type CapabilityKind = "team" | "workflow" | "agent" | "skill" | "tool" | "runtime";
|
|
9
|
+
export type CapabilitySource = "builtin" | "project" | "user" | "package" | "git";
|
|
10
|
+
export type CapabilityState = "active" | "disabled" | "shadowed" | "missing";
|
|
11
|
+
|
|
12
|
+
export interface CapabilityItem {
|
|
13
|
+
id: string;
|
|
14
|
+
kind: CapabilityKind;
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
source: CapabilitySource;
|
|
18
|
+
path?: string;
|
|
19
|
+
state: CapabilityState;
|
|
20
|
+
disabledReason?: string;
|
|
21
|
+
shadowedBy?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function normalizeAgents(agents: AgentConfig[], source: CapabilitySource, disabledIds: Set<string>): CapabilityItem[] {
|
|
25
|
+
return agents.map((agent) => {
|
|
26
|
+
const id = `agent:${agent.name}`;
|
|
27
|
+
const configDisabled = disabledIds.has(id);
|
|
28
|
+
const agentDisabled = agent.disabled || configDisabled;
|
|
29
|
+
return {
|
|
30
|
+
id,
|
|
31
|
+
kind: "agent" as const,
|
|
32
|
+
name: agent.name,
|
|
33
|
+
description: agent.description,
|
|
34
|
+
source,
|
|
35
|
+
path: agent.filePath,
|
|
36
|
+
state: agentDisabled ? "disabled" : "active",
|
|
37
|
+
disabledReason: configDisabled ? "disabled by policy" : agent.disabled ? "disabled in config" : undefined,
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function normalizeSkills(cwd: string, disabledIds: Set<string>): CapabilityItem[] {
|
|
43
|
+
const skills = discoverSkills(cwd);
|
|
44
|
+
return skills.map((skill) => {
|
|
45
|
+
const id = `skill:${skill.name}`;
|
|
46
|
+
const configDisabled = disabledIds.has(id);
|
|
47
|
+
return {
|
|
48
|
+
id,
|
|
49
|
+
kind: "skill" as const,
|
|
50
|
+
name: skill.name,
|
|
51
|
+
description: skill.description,
|
|
52
|
+
source: skill.source as CapabilitySource,
|
|
53
|
+
path: skill.path,
|
|
54
|
+
state: configDisabled ? "disabled" : "active",
|
|
55
|
+
disabledReason: configDisabled ? "disabled by policy" : undefined,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function normalizeTeams(cwd: string, disabledIds: Set<string>): CapabilityItem[] {
|
|
61
|
+
const result = discoverTeams(cwd);
|
|
62
|
+
return [...result.builtin, ...result.user, ...result.project].map((team) => {
|
|
63
|
+
const id = `team:${team.name}`;
|
|
64
|
+
const configDisabled = disabledIds.has(id);
|
|
65
|
+
return {
|
|
66
|
+
id,
|
|
67
|
+
kind: "team" as const,
|
|
68
|
+
name: team.name,
|
|
69
|
+
description: team.description,
|
|
70
|
+
source: team.source as CapabilitySource,
|
|
71
|
+
path: team.filePath,
|
|
72
|
+
state: configDisabled ? "disabled" : "active",
|
|
73
|
+
disabledReason: configDisabled ? "disabled by policy" : undefined,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function normalizeWorkflows(cwd: string, disabledIds: Set<string>): CapabilityItem[] {
|
|
79
|
+
const result = discoverWorkflows(cwd);
|
|
80
|
+
return [...result.builtin, ...result.user, ...result.project].map((workflow) => {
|
|
81
|
+
const id = `workflow:${workflow.name}`;
|
|
82
|
+
const configDisabled = disabledIds.has(id);
|
|
83
|
+
return {
|
|
84
|
+
id,
|
|
85
|
+
kind: "workflow" as const,
|
|
86
|
+
name: workflow.name,
|
|
87
|
+
description: workflow.description,
|
|
88
|
+
source: workflow.source as CapabilitySource,
|
|
89
|
+
path: workflow.filePath,
|
|
90
|
+
state: configDisabled ? "disabled" : "active",
|
|
91
|
+
disabledReason: configDisabled ? "disabled by policy" : undefined,
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function buildCapabilityInventory(cwd: string, config?: PiTeamsConfig): CapabilityItem[] {
|
|
97
|
+
const disabledIds = new Set<string>(config?.policy?.disabledCapabilities ?? []);
|
|
98
|
+
const agents = discoverAgents(cwd);
|
|
99
|
+
const items = [
|
|
100
|
+
...normalizeTeams(cwd, disabledIds),
|
|
101
|
+
...normalizeWorkflows(cwd, disabledIds),
|
|
102
|
+
...normalizeAgents([...agents.builtin, ...agents.user, ...agents.project], "builtin", disabledIds),
|
|
103
|
+
...normalizeSkills(cwd, disabledIds),
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
// Mark shadowed resources: project/user items with same kind:name as a builtin
|
|
107
|
+
const builtinNames = new Set(items.filter((item) => item.source === "builtin" || item.source === "package").map((item) => `${item.kind}:${item.name}`));
|
|
108
|
+
for (const item of items) {
|
|
109
|
+
if (item.source !== "builtin" && item.source !== "package" && builtinNames.has(`${item.kind}:${item.name}`)) {
|
|
110
|
+
item.state = "shadowed";
|
|
111
|
+
item.shadowedBy = `builtin:${item.kind}:${item.name}`;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return items.sort((a, b) => a.id.localeCompare(b.id));
|
|
116
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// 2.6 — Child-pi warm pool skeleton (ADR 0008 Proposed).
|
|
2
|
+
//
|
|
3
|
+
// This module exposes the pool interface that child-pi.ts will consume
|
|
4
|
+
// once Pi gains the wait-for-prompt handshake protocol. Until the Pi-side
|
|
5
|
+
// support lands, the pool is permanently disabled (size=0): callers always
|
|
6
|
+
// receive null from `acquirePooledChild` and fall through to the regular
|
|
7
|
+
// spawn path. This keeps the integration point ready without altering
|
|
8
|
+
// production behaviour.
|
|
9
|
+
//
|
|
10
|
+
// Enabling a real pool requires three pieces in order:
|
|
11
|
+
//
|
|
12
|
+
// 1. Pi runtime: respond to a `PI_CREW_POOL_HEALTH=1` ping on stdin and
|
|
13
|
+
// block in a "wait-for-prompt" state until the parent writes a real
|
|
14
|
+
// prompt. Pi does not currently implement this.
|
|
15
|
+
// 2. This module: replace the `acquirePooledChild` returning null with
|
|
16
|
+
// an actual pool that spawn-and-park N processes.
|
|
17
|
+
// 3. child-pi.ts: prefer pooled children on `runChildPi` entry; fall
|
|
18
|
+
// back to fresh spawn on miss.
|
|
19
|
+
//
|
|
20
|
+
// Disabled by default; opt-in via `runtime.warmPool.size > 0` config or
|
|
21
|
+
// the `PI_CREW_WARM_POOL_SIZE` env var.
|
|
22
|
+
import type { ChildProcess } from "node:child_process";
|
|
23
|
+
|
|
24
|
+
export interface WarmPoolOptions {
|
|
25
|
+
/** Number of warm processes to maintain. 0 disables the pool. */
|
|
26
|
+
size: number;
|
|
27
|
+
/** Drop pooled processes that have been idle longer than this. */
|
|
28
|
+
maxIdleMs: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const DEFAULT_WARM_POOL_OPTIONS: WarmPoolOptions = {
|
|
32
|
+
size: 0,
|
|
33
|
+
maxIdleMs: 5 * 60_000,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/** Resolve the effective pool size from env / config / defaults. */
|
|
37
|
+
export function resolveWarmPoolSize(env: NodeJS.ProcessEnv = process.env, configured?: number): number {
|
|
38
|
+
const fromEnv = Number.parseInt(env.PI_CREW_WARM_POOL_SIZE ?? "", 10);
|
|
39
|
+
if (Number.isFinite(fromEnv) && fromEnv >= 0) return fromEnv;
|
|
40
|
+
if (typeof configured === "number" && Number.isFinite(configured) && configured >= 0) return configured;
|
|
41
|
+
return DEFAULT_WARM_POOL_OPTIONS.size;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Try to acquire a parked child from the pool. Returns null when the pool
|
|
46
|
+
* is disabled or empty; caller should spawn a fresh child instead.
|
|
47
|
+
*
|
|
48
|
+
* Skeleton — currently always returns null. See module docstring.
|
|
49
|
+
*/
|
|
50
|
+
export function acquirePooledChild(_options: Partial<WarmPoolOptions> = {}): ChildProcess | null {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Mark a pooled child as done. Pool processes are single-use: this terminates
|
|
56
|
+
* the child rather than returning it to the pool, because state contamination
|
|
57
|
+
* across runs would be unsafe (file handles, env mutations, mounted FDs).
|
|
58
|
+
*
|
|
59
|
+
* Skeleton — currently a no-op since acquirePooledChild never returns a child.
|
|
60
|
+
*/
|
|
61
|
+
export function releasePooledChild(_child: ChildProcess | null | undefined): void {
|
|
62
|
+
// no-op while the pool is disabled
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Drain and terminate every parked child. Call on cleanupRuntime. */
|
|
66
|
+
export function disposeWarmPool(): void {
|
|
67
|
+
// no-op while the pool is disabled
|
|
68
|
+
}
|