pi-crew 0.9.67 → 0.10.1

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.
Files changed (222) hide show
  1. package/CHANGELOG.md +172 -0
  2. package/agents/analyst.md +1 -1
  3. package/agents/cold-verifier.md +3 -1
  4. package/agents/critic.md +1 -1
  5. package/agents/executor.md +1 -1
  6. package/agents/explorer.md +1 -1
  7. package/agents/planner.md +1 -1
  8. package/agents/reviewer.md +1 -1
  9. package/agents/security-reviewer.md +1 -1
  10. package/agents/test-engineer.md +1 -1
  11. package/agents/verifier.md +1 -1
  12. package/agents/writer.md +1 -1
  13. package/dist/index.mjs +65847 -60331
  14. package/docs/README.md +2 -0
  15. package/docs/actions-reference.md +31 -0
  16. package/docs/commands-reference.md +17 -6
  17. package/docs/resource-formats.md +13 -0
  18. package/package.json +9 -6
  19. package/schema.json +15 -1
  20. package/scripts/resource-sampler.mjs +36 -2
  21. package/skills/requirements-to-task-packet/SKILL.md +26 -0
  22. package/skills/widget-rendering/SKILL.md +7 -7
  23. package/src/agents/agent-config.ts +36 -14
  24. package/src/agents/discover-agents.ts +23 -14
  25. package/src/config/config-merge.ts +183 -0
  26. package/src/config/config-validation.ts +681 -0
  27. package/src/config/config.ts +22 -864
  28. package/src/config/defaults.ts +35 -1
  29. package/src/config/drift-detector.ts +1 -1
  30. package/src/config/env-vars.ts +691 -0
  31. package/src/config/role-tools.ts +8 -8
  32. package/src/config/sanitize-project-config.ts +172 -0
  33. package/src/config/types.ts +30 -0
  34. package/src/extension/async-notifier.ts +25 -2
  35. package/src/extension/crew-vibes/config.ts +2 -1
  36. package/src/extension/plan-orchestrate.ts +132 -0
  37. package/src/extension/registration/commands/dashboard.ts +158 -0
  38. package/src/extension/registration/commands/index.ts +35 -0
  39. package/src/extension/registration/commands/manage.ts +303 -0
  40. package/src/extension/registration/commands/run.ts +214 -0
  41. package/src/extension/registration/commands/shared.ts +631 -0
  42. package/src/extension/registration/commands/status.ts +60 -0
  43. package/src/extension/registration/commands.ts +13 -1224
  44. package/src/extension/registration/lifecycle-handlers.ts +126 -15
  45. package/src/extension/registration/subagent-tools.ts +218 -9
  46. package/src/extension/rpc-hmac.ts +5 -3
  47. package/src/extension/team-tool/api/heartbeat.ts +47 -10
  48. package/src/extension/team-tool/api/plan-approval.ts +9 -0
  49. package/src/extension/team-tool/api/task-claims.ts +109 -40
  50. package/src/extension/team-tool/cancel.ts +84 -50
  51. package/src/extension/team-tool/dispatch/index.ts +1 -0
  52. package/src/extension/team-tool/dispatch/run.ts +4 -1
  53. package/src/extension/team-tool/doctor.ts +103 -1
  54. package/src/extension/team-tool/orchestrate.ts +66 -1
  55. package/src/extension/team-tool/plans.ts +192 -0
  56. package/src/extension/team-tool/respond.ts +197 -65
  57. package/src/extension/team-tool/run-deadline.ts +16 -1
  58. package/src/extension/team-tool/run-intent.ts +63 -0
  59. package/src/extension/team-tool/run.ts +48 -18
  60. package/src/extension/team-tool/status.ts +84 -26
  61. package/src/extension/team-tool.ts +11 -2
  62. package/src/hooks/registry.ts +1 -6
  63. package/src/i18n.ts +9 -0
  64. package/src/prompt/prompt-runtime.ts +521 -2
  65. package/src/prompt/worker-events-channel.ts +173 -0
  66. package/src/runtime/README.md +8 -8
  67. package/src/runtime/async-runner.ts +7 -3
  68. package/src/runtime/background-runner.ts +42 -14
  69. package/src/runtime/broker/broker-issuer.ts +9 -2
  70. package/src/runtime/broker/crew-broker-tokens.ts +43 -6
  71. package/src/runtime/broker/crew-broker.ts +838 -10
  72. package/src/runtime/broker/wait-status-cache.ts +157 -0
  73. package/src/runtime/budget-enforcement.ts +281 -0
  74. package/src/runtime/child-pi/child-pi-spawn.ts +60 -14
  75. package/src/runtime/child-pi/child-pi-timers.ts +324 -0
  76. package/src/runtime/child-pi/child-pi.ts +97 -201
  77. package/src/runtime/child-pi/mock-fixtures.ts +16 -2
  78. package/src/runtime/crew-agent-records.ts +259 -14
  79. package/src/runtime/delegate-spawn.ts +148 -0
  80. package/src/runtime/deterministic-ast.ts +2 -1
  81. package/src/runtime/dispatch-batch.ts +945 -0
  82. package/src/runtime/finalize-run.ts +557 -0
  83. package/src/runtime/goal-workflow/adaptive-plan.ts +87 -13
  84. package/src/runtime/goal-workflow/dynamic-workflow-runner.ts +3 -2
  85. package/src/runtime/goal-workflow/goal-state-store.ts +1 -1
  86. package/src/runtime/group-join.ts +11 -125
  87. package/src/runtime/live-session/live-session-runtime.ts +26 -1
  88. package/src/runtime/merge-gate.ts +7 -1
  89. package/src/runtime/merge-loop.ts +130 -0
  90. package/src/runtime/model/model-budget-summary.ts +53 -0
  91. package/src/runtime/model/model-fallback.ts +32 -2
  92. package/src/runtime/model/pi-args.ts +10 -0
  93. package/src/runtime/model/provider-extensions.ts +10 -0
  94. package/src/runtime/orphan-worker-registry.ts +1 -1
  95. package/src/runtime/output/output-validator.ts +45 -0
  96. package/src/runtime/parent-guard.ts +3 -1
  97. package/src/runtime/peer-dep.ts +2 -1
  98. package/src/runtime/per-write-validator.ts +0 -5
  99. package/src/runtime/pi-spawn.ts +61 -15
  100. package/src/runtime/plan-approval.ts +125 -0
  101. package/src/runtime/plan-replan.ts +151 -0
  102. package/src/runtime/recovery/checkpoint.ts +0 -18
  103. package/src/runtime/recovery/crash-recovery.ts +95 -46
  104. package/src/runtime/scheduler-context.ts +98 -0
  105. package/src/runtime/scheduling/coalesce-tasks.ts +5 -0
  106. package/src/runtime/scheduling/global-worker-cap.ts +2 -1
  107. package/src/runtime/scheduling/nested-slots.ts +70 -0
  108. package/src/runtime/scheduling/run-coalesced-task-group.ts +64 -13
  109. package/src/runtime/scheduling/task-graph-scheduler.ts +0 -10
  110. package/src/runtime/scratchpad/README.md +10 -5
  111. package/src/runtime/scratchpad/guest.ts +103 -2
  112. package/src/runtime/scratchpad/protocol.ts +13 -1
  113. package/src/runtime/scratchpad/transform.ts +206 -12
  114. package/src/runtime/settings-store.ts +219 -0
  115. package/src/runtime/spawn-policy.ts +217 -0
  116. package/src/runtime/stale-reconciler.ts +87 -6
  117. package/src/runtime/subagent-manager.ts +25 -1
  118. package/src/runtime/task-output-context.ts +230 -9
  119. package/src/runtime/task-packet.ts +23 -1
  120. package/src/runtime/task-runner/child-executor.ts +106 -7
  121. package/src/runtime/task-runner/post-execution.ts +125 -1
  122. package/src/runtime/task-runner/pre-execution.ts +39 -1
  123. package/src/runtime/task-runner/prompt-builder.ts +51 -1
  124. package/src/runtime/task-runner/retrieval-orchestrator.ts +72 -18
  125. package/src/runtime/task-runner/spec-evidence.ts +403 -0
  126. package/src/runtime/task-runner/state-helpers.ts +26 -24
  127. package/src/runtime/task-runner.ts +11 -0
  128. package/src/runtime/team-runner.ts +129 -1671
  129. package/src/runtime/verification/spec-sandbox.ts +255 -0
  130. package/src/runtime/verification/verification-gates.ts +3 -2
  131. package/src/runtime/verification/verification-worktree.ts +2 -1
  132. package/src/runtime/workflow-phase-advance.ts +100 -0
  133. package/src/runtime/workspace-tree.ts +9 -0
  134. package/src/schema/config-schema.ts +65 -25
  135. package/src/schema/sensitive-config-paths.ts +64 -0
  136. package/src/schema/team-tool-schema.ts +13 -3
  137. package/src/state/README.md +4 -10
  138. package/src/state/atomic-write.ts +20 -3
  139. package/src/state/contracts.ts +38 -0
  140. package/src/state/coordination/mailbox.ts +12 -2
  141. package/src/state/event-log/cursor.ts +223 -0
  142. package/src/state/event-log/event-log-rotation.ts +12 -4
  143. package/src/state/event-log/event-log.ts +152 -369
  144. package/src/state/event-log/sequence-cache.ts +373 -0
  145. package/src/state/event-log/worker-atomic-writer.ts +2 -1
  146. package/src/state/stores/active-run-registry.ts +3 -2
  147. package/src/state/stores/manifest-io.ts +237 -0
  148. package/src/state/stores/ownership-map.ts +162 -0
  149. package/src/state/stores/plan-store.ts +241 -0
  150. package/src/state/stores/run-cache.ts +0 -90
  151. package/src/state/stores/spec-store.ts +189 -0
  152. package/src/state/stores/state-store.ts +66 -229
  153. package/src/state/types.ts +197 -0
  154. package/src/ui/dashboard-panes/plan-pane.ts +136 -0
  155. package/src/ui/dashboard-panes/progress-pane.ts +6 -0
  156. package/src/ui/dashboard-panes/transcript-pane.ts +31 -0
  157. package/src/ui/heartbeat-aggregator.ts +9 -1
  158. package/src/ui/keybinding-map.ts +54 -13
  159. package/src/ui/powerbar-publisher.ts +52 -1
  160. package/src/ui/run-dashboard.ts +31 -5
  161. package/src/ui/run-snapshot-cache.ts +57 -30
  162. package/src/ui/snapshot-types.ts +6 -1
  163. package/src/ui/widget/widget-renderer.ts +9 -1
  164. package/src/utils/file-coalescer.ts +0 -4
  165. package/src/utils/fs-errno.ts +66 -0
  166. package/src/utils/fs-watch.ts +1 -1
  167. package/src/utils/internal-error.ts +3 -1
  168. package/src/utils/paths.ts +11 -3
  169. package/src/utils/task-name-generator.ts +1 -8
  170. package/src/workflows/discover-workflows.ts +19 -2
  171. package/src/workflows/validate-workflow.ts +7 -1
  172. package/src/workflows/workflow-config.ts +10 -0
  173. package/src/workflows/workflow-serializer.ts +3 -0
  174. package/src/worktree/worktree-manager.ts +22 -0
  175. package/src/agents/agent-search.ts +0 -98
  176. package/src/benchmark/benchmark-runner.ts +0 -313
  177. package/src/benchmark/feedback-loop.ts +0 -73
  178. package/src/config/resilient-parser.ts +0 -117
  179. package/src/extension/crew-vibes/cat-frames.ts +0 -18
  180. package/src/extension/result-watcher.ts +0 -139
  181. package/src/observability/exporters/prometheus-exporter.ts +0 -54
  182. package/src/observability/metric-retention.ts +0 -64
  183. package/src/runtime/compaction/compaction-summary.ts +0 -278
  184. package/src/runtime/errors/crew-errors.ts +0 -162
  185. package/src/runtime/live-session/intercom-bridge.ts +0 -187
  186. package/src/runtime/loop-gates.ts +0 -128
  187. package/src/runtime/metric-parser.ts +0 -36
  188. package/src/runtime/output/stream-preview.ts +0 -184
  189. package/src/runtime/output/tool-progress.ts +0 -278
  190. package/src/runtime/phase-tracker.ts +0 -385
  191. package/src/runtime/pipeline-runner.ts +0 -523
  192. package/src/runtime/process/process-lifecycle.ts +0 -491
  193. package/src/runtime/recovery/retry-runner.ts +0 -330
  194. package/src/runtime/run-drift.ts +0 -219
  195. package/src/runtime/scratchpad/snapshot-hmac.ts +0 -167
  196. package/src/runtime/task-quality.ts +0 -199
  197. package/src/runtime/task-runner/run-projection.ts +0 -128
  198. package/src/runtime/verification/post-checks.ts +0 -142
  199. package/src/state/coordination/schedule.ts +0 -166
  200. package/src/state/event-log/jsonl-writer.ts +0 -115
  201. package/src/state/hook-instinct-bridge.ts +0 -94
  202. package/src/state/hook-integrations.ts +0 -51
  203. package/src/state/session-state-map.ts +0 -51
  204. package/src/state/stores/blob-store.ts +0 -308
  205. package/src/state/stores/instinct-store.ts +0 -275
  206. package/src/state/stores/observation-store.ts +0 -176
  207. package/src/state/tiered-eval.ts +0 -480
  208. package/src/state/types-eval.ts +0 -58
  209. package/src/tools/safe-bash-extension.ts +0 -54
  210. package/src/tools/safe-bash.ts +0 -505
  211. package/src/ui/agent-management-overlay.ts +0 -160
  212. package/src/ui/crew-footer.ts +0 -102
  213. package/src/ui/crew-select-list.ts +0 -114
  214. package/src/ui/dashboard-panes/capability-pane.ts +0 -77
  215. package/src/ui/transcript-entries.ts +0 -256
  216. package/src/utils/conflict-detect.ts +0 -721
  217. package/src/utils/fingerprint.ts +0 -180
  218. package/src/utils/gh-protocol.ts +0 -556
  219. package/src/utils/project-detector.ts +0 -160
  220. package/src/utils/sse-parser.ts +0 -131
  221. package/src/workflows/cost-estimator.ts +0 -34
  222. package/src/workflows/intermediate-store.ts +0 -166
@@ -0,0 +1,183 @@
1
+ import { DANGEROUS_OBJECT_KEYS } from "./config-validation.ts";
2
+ import type { AgentOverrideConfig, PiTeamsConfig } from "./types.ts";
3
+
4
+ function withoutUndefined<T extends Record<string, unknown>>(value: T): Partial<T> {
5
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as Partial<T>;
6
+ }
7
+
8
+ export function mergeConfig(base: PiTeamsConfig, override: PiTeamsConfig): PiTeamsConfig {
9
+ const warnings: string[] = [];
10
+ const merged: PiTeamsConfig = {
11
+ ...base,
12
+ ...withoutUndefined(override as Record<string, unknown>),
13
+ };
14
+ if (base.autonomous || override.autonomous) {
15
+ merged.autonomous = {
16
+ ...(base.autonomous ?? {}),
17
+ ...withoutUndefined((override.autonomous ?? {}) as Record<string, unknown>),
18
+ };
19
+ }
20
+ if (base.broker || override.broker) {
21
+ // WP-2/R2 fix (B1 battery 2026-08-18): `broker` was previously merged by
22
+ // the top-level spread only — a user-side broker object (defaults or a
23
+ // user config file with ANY broker block) replaced the project config's
24
+ // block WHOLESALE, silently dropping keys like waitMethodsEnabled that
25
+ // the user side did not set (enabled:true survived only because it
26
+ // matched DEFAULT_BROKER). Per-key user-wins, same as runtime/ui/….
27
+ merged.broker = {
28
+ ...(base.broker ?? {}),
29
+ ...withoutUndefined((override.broker ?? {}) as Record<string, unknown>),
30
+ };
31
+ }
32
+ if (base.nesting || override.nesting) {
33
+ // ADR-5: per-key user-wins deep merge — a partial user-side nesting block
34
+ // (e.g. just maxSlots) must not erase DEFAULT_NESTING.enabled=false.
35
+ merged.nesting = {
36
+ ...(base.nesting ?? {}),
37
+ ...withoutUndefined((override.nesting ?? {}) as Record<string, unknown>),
38
+ };
39
+ }
40
+ if (base.limits || override.limits) {
41
+ merged.limits = {
42
+ ...(base.limits ?? {}),
43
+ ...withoutUndefined((override.limits ?? {}) as Record<string, unknown>),
44
+ };
45
+ }
46
+ if (base.runtime || override.runtime) {
47
+ merged.runtime = {
48
+ ...(base.runtime ?? {}),
49
+ ...withoutUndefined((override.runtime ?? {}) as Record<string, unknown>),
50
+ };
51
+ // F19-1 (Round 19 parity): deep-merge modelFallback like
52
+ // reliability.retryPolicy so a partial override cannot erase base fields
53
+ // (user-wins precedence per key). Assigned only when a side defines it —
54
+ // unlike retryPolicy we avoid a stray `modelFallback: undefined` key so
55
+ // the merged runtime shape stays byte-identical for configs without it.
56
+ if (base.runtime?.modelFallback || override.runtime?.modelFallback) {
57
+ merged.runtime.modelFallback = {
58
+ ...(base.runtime?.modelFallback ?? {}),
59
+ ...withoutUndefined((override.runtime?.modelFallback ?? {}) as Record<string, unknown>),
60
+ };
61
+ }
62
+ }
63
+ if (base.control || override.control) {
64
+ merged.control = {
65
+ ...(base.control ?? {}),
66
+ ...withoutUndefined((override.control ?? {}) as Record<string, unknown>),
67
+ };
68
+ }
69
+ if (base.worktree || override.worktree) {
70
+ merged.worktree = {
71
+ ...(base.worktree ?? {}),
72
+ ...withoutUndefined((override.worktree ?? {}) as Record<string, unknown>),
73
+ };
74
+ }
75
+ if (base.ui || override.ui) {
76
+ merged.ui = {
77
+ ...(base.ui ?? {}),
78
+ ...withoutUndefined((override.ui ?? {}) as Record<string, unknown>),
79
+ };
80
+ }
81
+ if (base.agents || override.agents) {
82
+ merged.agents = {
83
+ ...(base.agents ?? {}),
84
+ ...withoutUndefined((override.agents ?? {}) as Record<string, unknown>),
85
+ overrides: {
86
+ ...(base.agents?.overrides ?? {}),
87
+ ...(withoutUndefined((override.agents?.overrides ?? {}) as Record<string, unknown>) as Record<string, AgentOverrideConfig>),
88
+ },
89
+ };
90
+ }
91
+ if (base.tools || override.tools) {
92
+ merged.tools = {
93
+ ...(base.tools ?? {}),
94
+ ...withoutUndefined((override.tools ?? {}) as Record<string, unknown>),
95
+ };
96
+ }
97
+ if (base.telemetry || override.telemetry) {
98
+ merged.telemetry = {
99
+ ...(base.telemetry ?? {}),
100
+ ...withoutUndefined((override.telemetry ?? {}) as Record<string, unknown>),
101
+ };
102
+ }
103
+ if (base.policy || override.policy) {
104
+ merged.policy = {
105
+ ...(base.policy ?? {}),
106
+ ...withoutUndefined((override.policy ?? {}) as Record<string, unknown>),
107
+ };
108
+ }
109
+ if (base.notifications || override.notifications) {
110
+ merged.notifications = {
111
+ ...(base.notifications ?? {}),
112
+ ...withoutUndefined((override.notifications ?? {}) as Record<string, unknown>),
113
+ };
114
+ }
115
+ if (base.observability || override.observability) {
116
+ merged.observability = {
117
+ ...(base.observability ?? {}),
118
+ ...withoutUndefined((override.observability ?? {}) as Record<string, unknown>),
119
+ };
120
+ }
121
+ if (base.reliability || override.reliability) {
122
+ merged.reliability = {
123
+ ...(base.reliability ?? {}),
124
+ ...withoutUndefined((override.reliability ?? {}) as Record<string, unknown>),
125
+ retryPolicy:
126
+ base.reliability?.retryPolicy || override.reliability?.retryPolicy
127
+ ? {
128
+ ...(base.reliability?.retryPolicy ?? {}),
129
+ ...withoutUndefined((override.reliability?.retryPolicy ?? {}) as Record<string, unknown>),
130
+ }
131
+ : undefined,
132
+ };
133
+ }
134
+ if (base.otlp || override.otlp) {
135
+ merged.otlp = {
136
+ ...(base.otlp ?? {}),
137
+ ...withoutUndefined((override.otlp ?? {}) as Record<string, unknown>),
138
+ headers: {
139
+ ...(base.otlp?.headers ?? {}),
140
+ ...(override.otlp?.headers ?? {}),
141
+ },
142
+ };
143
+ if (Object.keys(merged.otlp.headers ?? {}).length === 0) delete merged.otlp.headers;
144
+ // Validate OTLP headers for injection attacks:
145
+ // - Check top-level keys for dangerous prototype pollution patterns
146
+ // - Block ALL control characters except tab (0x09) to prevent header
147
+ // injection via CR/LF/zero-byte/etc.
148
+ // BUG (Round 28, CRLF injection): the previous range
149
+ // /[\x00-\x08\x0b\x0c\x0e-\x1f]/ left THREE chars unblocked: tab (0x09,
150
+ // intentionally allowed), LF (0x0A) AND CR (0x0D). The comment claimed to
151
+ // "prevent header injection via CR/LF" but CR was never matched, and LF
152
+ // was explicitly allowed — both are CRLF injection vectors that can split
153
+ // HTTP headers. Fix: block 0x00-0x08 and 0x0A-0x1F, allowing only tab.
154
+ const invalidHeaders: string[] = [];
155
+ for (const [k, v] of Object.entries(merged.otlp.headers ?? {})) {
156
+ // Check top-level key for dangerous names (only top-level keys are checked)
157
+ const checkKey = (key: string): boolean => {
158
+ const lowerKey = key.toLowerCase();
159
+ if (DANGEROUS_OBJECT_KEYS.has(lowerKey)) return true;
160
+ return false;
161
+ };
162
+ if (checkKey(k)) {
163
+ invalidHeaders.push(k);
164
+ continue;
165
+ }
166
+ // Block any control characters except tab (0x09) in values.
167
+ // Round 28 fix: /[\x00-\x08\x0a-\x1f]/ blocks LF (0x0A) and CR (0x0D) too.
168
+ const valStr = String(v);
169
+ if (/[\x00-\x08\x0a-\x1f]/.test(valStr)) {
170
+ invalidHeaders.push(k);
171
+ }
172
+ }
173
+ if (invalidHeaders.length > 0) {
174
+ delete merged.otlp.headers;
175
+ warnings.push(`OTLP headers blocked due to invalid characters: ${invalidHeaders.join(", ")}`);
176
+ }
177
+ }
178
+ if (merged.agents?.overrides && Object.keys(merged.agents.overrides).length === 0) delete merged.agents.overrides;
179
+ return merged;
180
+ }
181
+
182
+ /** @internal — direct-test seam for Phase 2.2 extraction target (refactor-plan step 1.9c). */
183
+ export const __test__mergeConfig = mergeConfig;