pi-crew 0.9.16 → 0.9.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/README.md +19 -0
- package/dist/build-meta.json +21790 -0
- package/dist/index.mjs +83070 -0
- package/dist/index.mjs.map +7 -0
- package/docs/A +358 -0
- package/docs/M-A +357 -0
- package/docs/REVIEW-FINDINGS-2026-06 +357 -0
- package/docs/Y +357 -0
- package/docs/a +357 -0
- package/docs/aA +358 -0
- package/docs/archive/README.md +91 -0
- package/docs/patterns/command-agent-skill.md +1 -1
- package/docs/skills/REFERENCE.md +0 -17
- package/docs//303/242mmaAAA/303/242 +357 -0
- package/index.bundle.ts +25 -0
- package/index.ts +95 -4
- package/package.json +15 -4
- package/skills/iterative-audit/SKILL.md +0 -1
- package/skills/widget-rendering/SKILL.md +17 -0
- package/src/adapters/claude-adapter.ts +1 -3
- package/src/adapters/export-util.ts +16 -16
- package/src/adapters/index.ts +5 -5
- package/src/agents/agent-config.ts +20 -14
- package/src/agents/agent-serializer.ts +1 -1
- package/src/agents/discover-agents.ts +83 -39
- package/src/benchmark/benchmark-runner.ts +51 -51
- package/src/benchmark/feedback-loop.ts +1 -1
- package/src/config/config.ts +166 -590
- package/src/config/defaults.ts +28 -2
- package/src/config/drift-detector.ts +11 -14
- package/src/config/markers.ts +201 -203
- package/src/config/resilient-parser.ts +14 -6
- package/src/config/role-tools.ts +3 -3
- package/src/config/suggestions.ts +5 -12
- package/src/config/types.ts +9 -25
- package/src/errors.ts +151 -157
- package/src/extension/action-suggestions.ts +54 -9
- package/src/extension/async-notifier.ts +43 -13
- package/src/extension/autonomous-policy.ts +77 -37
- package/src/extension/command-completions.ts +9 -8
- package/src/extension/context-status-injection.ts +14 -12
- package/src/extension/crew-autocomplete.ts +8 -16
- package/src/extension/crew-cleanup.ts +2 -1
- package/src/extension/crew-shortcuts.ts +9 -6
- package/src/extension/cross-extension-rpc.ts +136 -42
- package/src/extension/help.ts +1 -1
- package/src/extension/import-index.ts +10 -5
- package/src/extension/knowledge-injection.ts +88 -15
- package/src/extension/management.ts +89 -349
- package/src/extension/message-renderers.ts +3 -4
- package/src/extension/notification-router.ts +22 -5
- package/src/extension/notification-sink.ts +6 -3
- package/src/extension/pi-api.ts +17 -8
- package/src/extension/plan-orchestrate.ts +8 -27
- package/src/extension/project-init.ts +21 -6
- package/src/extension/register.ts +329 -975
- package/src/extension/registration/artifact-cleanup.ts +9 -4
- package/src/extension/registration/command-utils.ts +5 -1
- package/src/extension/registration/commands.ts +806 -314
- package/src/extension/registration/compaction-guard.ts +15 -15
- package/src/extension/registration/lifecycle.ts +259 -0
- package/src/extension/registration/observability.ts +293 -0
- package/src/extension/registration/subagent-helpers.ts +29 -7
- package/src/extension/registration/subagent-tools.ts +253 -44
- package/src/extension/registration/team-tool.ts +19 -84
- package/src/extension/registration/ui.ts +168 -0
- package/src/extension/registration/viewers.ts +64 -24
- package/src/extension/result-watcher.ts +18 -7
- package/src/extension/run-bundle-schema.ts +21 -6
- package/src/extension/run-export.ts +15 -6
- package/src/extension/run-import.ts +64 -29
- package/src/extension/run-index.ts +28 -9
- package/src/extension/run-maintenance.ts +32 -12
- package/src/extension/session-summary.ts +1 -1
- package/src/extension/team-manager-command.ts +64 -7
- package/src/extension/team-onboard.ts +151 -150
- package/src/extension/team-recommendation.ts +121 -21
- package/src/extension/team-tool/anchor.ts +31 -64
- package/src/extension/team-tool/api.ts +929 -141
- package/src/extension/team-tool/auto-summarize.ts +14 -26
- package/src/extension/team-tool/cache-control.ts +1 -5
- package/src/extension/team-tool/cancel.ts +138 -38
- package/src/extension/team-tool/chain-dispatch.ts +5 -13
- package/src/extension/team-tool/chain-executor.ts +29 -51
- package/src/extension/team-tool/config-patch.ts +1 -1
- package/src/extension/team-tool/context.ts +40 -20
- package/src/extension/team-tool/destructive-gate.ts +10 -5
- package/src/extension/team-tool/doctor.ts +170 -51
- package/src/extension/team-tool/explain.ts +228 -214
- package/src/extension/team-tool/failure-patterns.ts +3 -9
- package/src/extension/team-tool/goal-wrap.ts +71 -29
- package/src/extension/team-tool/goal.ts +185 -35
- package/src/extension/team-tool/handle-schedule.ts +34 -15
- package/src/extension/team-tool/handle-settings.ts +94 -56
- package/src/extension/team-tool/health-monitor.ts +27 -108
- package/src/extension/team-tool/inspect.ts +42 -9
- package/src/extension/team-tool/intent-policy.ts +4 -1
- package/src/extension/team-tool/lifecycle-actions.ts +244 -48
- package/src/extension/team-tool/orchestrate.ts +7 -18
- package/src/extension/team-tool/parallel-dispatch.ts +51 -29
- package/src/extension/team-tool/plan.ts +29 -5
- package/src/extension/team-tool/respond.ts +49 -16
- package/src/extension/team-tool/run-not-found.ts +3 -8
- package/src/extension/team-tool/run.ts +80 -317
- package/src/extension/team-tool/status.ts +135 -43
- package/src/extension/team-tool/workflow-manage.ts +92 -25
- package/src/extension/team-tool-types.ts +8 -1
- package/src/extension/team-tool.ts +142 -551
- package/src/extension/validate-resources.ts +39 -8
- package/src/hooks/registry.ts +66 -17
- package/src/hooks/types.ts +1 -1
- package/src/i18n.ts +25 -11
- package/src/observability/correlation.ts +17 -3
- package/src/observability/event-bus.ts +51 -56
- package/src/observability/event-to-metric.ts +117 -15
- package/src/observability/exporters/otlp-exporter.ts +56 -17
- package/src/observability/exporters/prometheus-exporter.ts +1 -1
- package/src/observability/metric-registry.ts +16 -4
- package/src/observability/metric-retention.ts +8 -2
- package/src/observability/metric-sink.ts +11 -3
- package/src/observability/metrics-primitives.ts +42 -9
- package/src/plugins/plugin-define.ts +2 -2
- package/src/plugins/plugin-registry.ts +25 -25
- package/src/plugins/plugins/index.ts +1 -1
- package/src/plugins/plugins/nextjs.ts +16 -16
- package/src/plugins/plugins/vite.ts +7 -11
- package/src/plugins/plugins/vitest.ts +6 -11
- package/src/runtime/adaptive-plan.ts +225 -40
- package/src/runtime/agent-control.ts +58 -15
- package/src/runtime/agent-memory.ts +15 -9
- package/src/runtime/agent-observability.ts +10 -2
- package/src/runtime/anchor-manager.ts +27 -25
- package/src/runtime/async-marker.ts +7 -1
- package/src/runtime/async-runner.ts +27 -23
- package/src/runtime/auto-summarize.ts +7 -13
- package/src/runtime/background-runner.ts +189 -251
- package/src/runtime/batch-barrier.ts +18 -16
- package/src/runtime/cancellation-token.ts +16 -6
- package/src/runtime/cancellation.ts +46 -8
- package/src/runtime/capability-inventory.ts +6 -4
- package/src/runtime/chain-parser.ts +44 -11
- package/src/runtime/chain-runner.ts +63 -69
- package/src/runtime/checkpoint.ts +12 -56
- package/src/runtime/child-pi.ts +343 -78
- package/src/runtime/coalesce-tasks.ts +268 -0
- package/src/runtime/code-summary.ts +71 -26
- package/src/runtime/compact-stages/index.ts +15 -5
- package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
- package/src/runtime/compact-stages/truncation-stage.ts +4 -1
- package/src/runtime/compaction-summary.ts +17 -10
- package/src/runtime/completion-guard.ts +33 -16
- package/src/runtime/crash-classification.ts +28 -7
- package/src/runtime/crash-recovery.ts +177 -37
- package/src/runtime/crew-agent-records.ts +145 -47
- package/src/runtime/crew-hooks.ts +9 -24
- package/src/runtime/cross-extension-rpc.ts +25 -23
- package/src/runtime/custom-tools/irc-tool.ts +43 -15
- package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
- package/src/runtime/delivery-coordinator.ts +34 -7
- package/src/runtime/delta-conflict.ts +9 -21
- package/src/runtime/deterministic-ast.ts +1 -1
- package/src/runtime/diagnostic-export.ts +53 -20
- package/src/runtime/direct-run.ts +12 -2
- package/src/runtime/dwf-state-store.ts +1 -1
- package/src/runtime/dynamic-workflow-context.ts +186 -58
- package/src/runtime/dynamic-workflow-runner.ts +42 -20
- package/src/runtime/effectiveness.ts +16 -8
- package/src/runtime/errors/crew-errors.ts +7 -11
- package/src/runtime/event-stream-bridge.ts +9 -3
- package/src/runtime/foreground-control.ts +54 -14
- package/src/runtime/foreground-watchdog.ts +9 -6
- package/src/runtime/goal-achievement.ts +27 -10
- package/src/runtime/goal-evaluator.ts +54 -19
- package/src/runtime/goal-loop-runner.ts +280 -99
- package/src/runtime/goal-state-store.ts +27 -17
- package/src/runtime/green-contract.ts +11 -2
- package/src/runtime/group-join.ts +64 -31
- package/src/runtime/handoff-manager.ts +37 -42
- package/src/runtime/heartbeat-gradient.ts +10 -2
- package/src/runtime/heartbeat-watcher.ts +32 -6
- package/src/runtime/hidden-handoff.ts +12 -30
- package/src/runtime/important-line-classifier.ts +12 -2
- package/src/runtime/iteration-hooks.ts +25 -15
- package/src/runtime/live-agent-control.ts +55 -7
- package/src/runtime/live-agent-manager.ts +130 -27
- package/src/runtime/live-control-realtime.ts +23 -3
- package/src/runtime/live-irc.ts +4 -1
- package/src/runtime/live-session-health.ts +12 -4
- package/src/runtime/live-session-runtime.ts +379 -117
- package/src/runtime/manifest-cache.ts +28 -12
- package/src/runtime/mcp-proxy.ts +8 -16
- package/src/runtime/metric-parser.ts +1 -5
- package/src/runtime/model-fallback.ts +55 -18
- package/src/runtime/model-resolver.ts +2 -6
- package/src/runtime/model-scope.ts +19 -3
- package/src/runtime/notebook-helpers.ts +60 -62
- package/src/runtime/orphan-worker-registry.ts +37 -26
- package/src/runtime/output-validator.ts +18 -3
- package/src/runtime/overflow-recovery.ts +5 -4
- package/src/runtime/parallel-research.ts +29 -5
- package/src/runtime/parallel-utils.ts +9 -11
- package/src/runtime/path-overlap.ts +150 -0
- package/src/runtime/peer-dep.ts +12 -17
- package/src/runtime/per-write-validator.ts +1 -3
- package/src/runtime/phase-tracker.ts +342 -330
- package/src/runtime/pi-args.ts +26 -8
- package/src/runtime/pi-json-output.ts +1 -1
- package/src/runtime/pi-spawn.ts +30 -19
- package/src/runtime/pipeline-runner.ts +56 -55
- package/src/runtime/plan-templates.ts +5 -6
- package/src/runtime/policy-engine.ts +43 -7
- package/src/runtime/post-checks.ts +12 -4
- package/src/runtime/post-exit-stdio-guard.ts +2 -2
- package/src/runtime/process-lifecycle.ts +20 -10
- package/src/runtime/process-status.ts +16 -5
- package/src/runtime/progress-event-coalescer.ts +2 -1
- package/src/runtime/progress-tracker.ts +103 -103
- package/src/runtime/prose-compressor.ts +9 -11
- package/src/runtime/recovery-recipes.ts +118 -24
- package/src/runtime/replace.ts +25 -10
- package/src/runtime/resilient-edit.ts +10 -25
- package/src/runtime/result-extractor.ts +1 -2
- package/src/runtime/retry-executor.ts +20 -4
- package/src/runtime/retry-runner.ts +26 -50
- package/src/runtime/role-permission.ts +6 -1
- package/src/runtime/run-coalesced-task-group.ts +256 -0
- package/src/runtime/run-drift.ts +14 -15
- package/src/runtime/run-tracker.ts +6 -28
- package/src/runtime/runtime-policy.ts +1 -6
- package/src/runtime/runtime-resolver.ts +80 -15
- package/src/runtime/scheduler.ts +47 -18
- package/src/runtime/semaphore.ts +5 -7
- package/src/runtime/sensitive-paths.ts +2 -1
- package/src/runtime/session-usage.ts +1 -1
- package/src/runtime/settings-store.ts +16 -12
- package/src/runtime/sidechain-output.ts +6 -2
- package/src/runtime/single-agent-compose.ts +1 -4
- package/src/runtime/skill-effectiveness.ts +29 -97
- package/src/runtime/skill-instructions.ts +40 -83
- package/src/runtime/stale-reconciler.ts +73 -197
- package/src/runtime/stream-preview.ts +1 -1
- package/src/runtime/streaming-output.ts +1 -1
- package/src/runtime/subagent-manager.ts +44 -169
- package/src/runtime/subprocess-tool-registry.ts +4 -1
- package/src/runtime/supervisor-contact.ts +10 -5
- package/src/runtime/task-display.ts +19 -5
- package/src/runtime/task-graph-scheduler.ts +95 -21
- package/src/runtime/task-graph.ts +5 -11
- package/src/runtime/task-health.ts +54 -47
- package/src/runtime/task-id.ts +11 -18
- package/src/runtime/task-output-context.ts +265 -81
- package/src/runtime/task-packet.ts +12 -20
- package/src/runtime/task-quality.ts +6 -14
- package/src/runtime/task-runner/context-retrieval.ts +4 -13
- package/src/runtime/task-runner/live-executor.ts +114 -36
- package/src/runtime/task-runner/output-splitter.ts +152 -0
- package/src/runtime/task-runner/progress.ts +50 -12
- package/src/runtime/task-runner/prompt-builder.ts +31 -7
- package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
- package/src/runtime/task-runner/result-utils.ts +3 -1
- package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
- package/src/runtime/task-runner/run-projection.ts +27 -8
- package/src/runtime/task-runner/state-helpers.ts +29 -8
- package/src/runtime/task-runner/tail-read.ts +2 -6
- package/src/runtime/task-runner.ts +180 -326
- package/src/runtime/team-runner-artifacts.ts +13 -0
- package/src/runtime/team-runner.ts +456 -974
- package/src/runtime/tool-output-pruner.ts +6 -9
- package/src/runtime/tool-progress.ts +11 -21
- package/src/runtime/verification-gates.ts +33 -24
- package/src/runtime/verification-integrity.ts +1 -4
- package/src/runtime/verification-worktree.ts +62 -12
- package/src/runtime/worker-heartbeat.ts +5 -1
- package/src/runtime/worker-startup.ts +29 -5
- package/src/runtime/workflow-state.ts +17 -9
- package/src/runtime/workspace-lock.ts +30 -35
- package/src/runtime/workspace-tree.ts +20 -32
- package/src/runtime/yield-handler.ts +43 -9
- package/src/runtime/zombie-scanner.ts +5 -4
- package/src/schema/config-schema.ts +266 -172
- package/src/schema/team-tool-schema.ts +29 -74
- package/src/schema/validation-types.ts +25 -17
- package/src/skills/discover-skills.ts +35 -10
- package/src/skills/skill-templates.ts +109 -27
- package/src/skills/validate.ts +26 -8
- package/src/state/active-run-registry.ts +87 -28
- package/src/state/artifact-store.ts +9 -5
- package/src/state/atomic-write-v2.ts +85 -63
- package/src/state/atomic-write.ts +105 -26
- package/src/state/blob-store.ts +47 -20
- package/src/state/contracts.ts +20 -5
- package/src/state/crew-init.ts +5 -22
- package/src/state/decision-ledger.ts +19 -73
- package/src/state/event-log-rotation.ts +41 -15
- package/src/state/event-log.ts +168 -53
- package/src/state/event-reconstructor.ts +11 -1
- package/src/state/gitignore-manager.ts +2 -8
- package/src/state/health-store.ts +57 -57
- package/src/state/hook-instinct-bridge.ts +1 -1
- package/src/state/hook-integrations.ts +1 -1
- package/src/state/instinct-store.ts +17 -5
- package/src/state/jsonl-writer.ts +1 -1
- package/src/state/locks.ts +23 -9
- package/src/state/mailbox.ts +151 -28
- package/src/state/observation-store.ts +20 -14
- package/src/state/run-cache.ts +142 -135
- package/src/state/run-graph.ts +6 -15
- package/src/state/run-metrics.ts +5 -18
- package/src/state/schedule.ts +15 -9
- package/src/state/state-store.ts +129 -45
- package/src/state/task-claims.ts +12 -2
- package/src/state/tiered-eval.ts +52 -43
- package/src/state/types-eval.ts +2 -2
- package/src/state/types.ts +24 -20
- package/src/state/usage.ts +20 -4
- package/src/state/worker-atomic-writer.ts +6 -3
- package/src/subagents/index.ts +2 -2
- package/src/teams/discover-teams.ts +21 -6
- package/src/tools/safe-bash-extension.ts +5 -6
- package/src/tools/safe-bash.ts +10 -11
- package/src/types/new-api-types.ts +6 -10
- package/src/ui/agent-management-overlay.ts +52 -40
- package/src/ui/card-colors.ts +13 -4
- package/src/ui/crew-footer.ts +8 -7
- package/src/ui/crew-select-list.ts +1 -1
- package/src/ui/dashboard-panes/agents-pane.ts +41 -25
- package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
- package/src/ui/dashboard-panes/capability-pane.ts +32 -15
- package/src/ui/dashboard-panes/health-pane.ts +2 -1
- package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
- package/src/ui/dashboard-panes/progress-pane.ts +12 -9
- package/src/ui/heartbeat-aggregator.ts +15 -4
- package/src/ui/keybinding-map.ts +40 -7
- package/src/ui/live-conversation-overlay.ts +36 -20
- package/src/ui/live-duration.ts +1 -4
- package/src/ui/live-run-sidebar.ts +88 -25
- package/src/ui/loaders.ts +2 -8
- package/src/ui/mascot.ts +20 -36
- package/src/ui/overlays/agent-picker-overlay.ts +11 -3
- package/src/ui/overlays/confirm-overlay.ts +4 -2
- package/src/ui/overlays/help-overlay.ts +25 -14
- package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
- package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
- package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
- package/src/ui/pi-ui-compat.ts +7 -7
- package/src/ui/powerbar-publisher.ts +120 -42
- package/src/ui/render-diff.ts +10 -3
- package/src/ui/render-scheduler.ts +12 -4
- package/src/ui/run-action-dispatcher.ts +81 -18
- package/src/ui/run-dashboard.ts +172 -76
- package/src/ui/run-event-bus.ts +59 -37
- package/src/ui/run-snapshot-cache.ts +276 -86
- package/src/ui/settings-overlay.ts +361 -74
- package/src/ui/status-colors.ts +12 -1
- package/src/ui/syntax-highlight.ts +1 -1
- package/src/ui/theme-adapter.ts +16 -14
- package/src/ui/theme-discovery.ts +13 -2
- package/src/ui/tool-progress-formatter.ts +7 -7
- package/src/ui/tool-render.ts +128 -56
- package/src/ui/tool-renderers/brief-mode.ts +45 -27
- package/src/ui/tool-renderers/index.ts +109 -43
- package/src/ui/transcript-cache.ts +32 -6
- package/src/ui/transcript-entries.ts +25 -23
- package/src/ui/transcript-viewer.ts +78 -29
- package/src/ui/widget/index.ts +99 -40
- package/src/ui/widget/widget-formatters.ts +13 -6
- package/src/ui/widget/widget-model.ts +19 -8
- package/src/ui/widget/widget-renderer.ts +23 -13
- package/src/ui/widget/widget-types.ts +1 -1
- package/src/utils/bm25-search.ts +199 -199
- package/src/utils/conflict-detect.ts +22 -21
- package/src/utils/env-filter.ts +14 -7
- package/src/utils/file-coalescer.ts +5 -1
- package/src/utils/fingerprint.ts +3 -6
- package/src/utils/frontmatter.ts +3 -1
- package/src/utils/fs-watch.ts +2 -6
- package/src/utils/gh-protocol.ts +119 -44
- package/src/utils/git.ts +13 -15
- package/src/utils/guards.ts +2 -5
- package/src/utils/ids.ts +9 -2
- package/src/utils/incremental-reader.ts +14 -3
- package/src/utils/internal-error.ts +2 -1
- package/src/utils/names.ts +12 -3
- package/src/utils/paths.ts +49 -5
- package/src/utils/project-detector.ts +2 -2
- package/src/utils/redaction.ts +29 -19
- package/src/utils/resolve-shell.ts +9 -7
- package/src/utils/run-watcher-registry.ts +19 -31
- package/src/utils/safe-paths.ts +45 -24
- package/src/utils/scan-cache.ts +9 -2
- package/src/utils/session-utils.ts +2 -4
- package/src/utils/sleep.ts +12 -5
- package/src/utils/sse-parser.ts +5 -17
- package/src/utils/visual.ts +52 -32
- package/src/workflows/discover-workflows.ts +41 -109
- package/src/workflows/intermediate-store.ts +5 -21
- package/src/workflows/preflight-validator.ts +6 -33
- package/src/workflows/topology-analyzer.ts +5 -21
- package/src/workflows/workflow-config.ts +7 -6
- package/src/worktree/branch-freshness.ts +66 -8
- package/src/worktree/cleanup.ts +130 -20
- package/src/worktree/worktree-manager.ts +212 -69
- package/skills/artifact-analysis-loop/SKILL.md +0 -303
- package/skills/detection-pipeline-design/SKILL.md +0 -286
- package/skills/hunting-investigation-loop/SKILL.md +0 -402
- package/skills/incident-playbook-construction/SKILL.md +0 -384
- package/skills/security-review/SKILL.md +0 -561
- package/skills/threat-hypothesis-framework/SKILL.md +0 -176
- package/skills/ui-render-performance/SKILL.md +0 -58
- /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
- /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
- /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
- /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
- /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
- /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
- /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
- /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
- /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
- /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
- /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
- /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
- /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
- /package/docs/{pi-subagents3-deep-analysis.md → archive/pi-subagents3-deep-analysis.md} +0 -0
|
@@ -31,22 +31,38 @@ export function runtimeResolutionState(runtime: CrewRuntimeCapabilities, resolve
|
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export async function isLiveSessionRuntimeAvailable(
|
|
34
|
+
export async function isLiveSessionRuntimeAvailable(
|
|
35
|
+
timeoutMs = 1500,
|
|
36
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
37
|
+
): Promise<{ available: boolean; reason?: string }> {
|
|
35
38
|
if (env.PI_CREW_MOCK_LIVE_SESSION === "success") {
|
|
36
|
-
return {
|
|
39
|
+
return {
|
|
40
|
+
available: true,
|
|
41
|
+
reason: "Mock live-session runtime is enabled.",
|
|
42
|
+
};
|
|
37
43
|
}
|
|
38
|
-
const probe = async (): Promise<{
|
|
44
|
+
const probe = async (): Promise<{
|
|
45
|
+
available: boolean;
|
|
46
|
+
reason?: string;
|
|
47
|
+
}> => {
|
|
39
48
|
try {
|
|
40
49
|
// LAZY: optional peer dependency — probe at runtime to avoid hard dependency.
|
|
41
50
|
const mod = await import("@earendil-works/pi-coding-agent");
|
|
42
51
|
const api = mod as Record<string, unknown>;
|
|
43
52
|
const required = ["createAgentSession", "DefaultResourceLoader", "SessionManager", "SettingsManager"];
|
|
44
53
|
const missing = required.filter((name) => typeof api[name] === "undefined");
|
|
45
|
-
if (missing.length)
|
|
54
|
+
if (missing.length)
|
|
55
|
+
return {
|
|
56
|
+
available: false,
|
|
57
|
+
reason: `Pi SDK live-session exports missing: ${missing.join(", ")}.`,
|
|
58
|
+
};
|
|
46
59
|
return { available: true };
|
|
47
60
|
} catch (error) {
|
|
48
61
|
const message = error instanceof Error ? error.message : String(error);
|
|
49
|
-
return {
|
|
62
|
+
return {
|
|
63
|
+
available: false,
|
|
64
|
+
reason: `Could not load optional Pi SDK live-session runtime: ${message}`,
|
|
65
|
+
};
|
|
50
66
|
}
|
|
51
67
|
};
|
|
52
68
|
let timer: NodeJS.Timeout | undefined;
|
|
@@ -54,7 +70,14 @@ export async function isLiveSessionRuntimeAvailable(timeoutMs = 1500, env: NodeJ
|
|
|
54
70
|
return await Promise.race([
|
|
55
71
|
probe(),
|
|
56
72
|
new Promise<{ available: boolean; reason: string }>((resolve) => {
|
|
57
|
-
timer = setTimeout(
|
|
73
|
+
timer = setTimeout(
|
|
74
|
+
() =>
|
|
75
|
+
resolve({
|
|
76
|
+
available: false,
|
|
77
|
+
reason: `Timed out probing optional Pi SDK live-session runtime after ${timeoutMs}ms.`,
|
|
78
|
+
}),
|
|
79
|
+
timeoutMs,
|
|
80
|
+
);
|
|
58
81
|
timer.unref();
|
|
59
82
|
}),
|
|
60
83
|
]);
|
|
@@ -67,16 +90,25 @@ export async function resolveCrewRuntime(config: PiTeamsConfig, env: NodeJS.Proc
|
|
|
67
90
|
const requestedMode = config.runtime?.mode ?? "auto";
|
|
68
91
|
const workersDisabled = config.executeWorkers === false || env.PI_CREW_EXECUTE_WORKERS === "0" || env.PI_TEAMS_EXECUTE_WORKERS === "0";
|
|
69
92
|
if (requestedMode === "scaffold") return scaffoldCaps(requestedMode, undefined, "explicit_dry_run");
|
|
70
|
-
if (workersDisabled)
|
|
93
|
+
if (workersDisabled)
|
|
94
|
+
return scaffoldCaps(
|
|
95
|
+
requestedMode,
|
|
96
|
+
"Child worker execution disabled by config/env. Set runtime.mode=scaffold or executeWorkers=false only for dry runs.",
|
|
97
|
+
"blocked",
|
|
98
|
+
);
|
|
71
99
|
if (requestedMode === "child-process") return childCaps(requestedMode);
|
|
72
100
|
// When a child-process mock is active (tests), force auto-mode to child-process where the mock is active.
|
|
73
|
-
if (requestedMode === "auto" && env.PI_TEAMS_MOCK_CHILD_PI)
|
|
101
|
+
if (requestedMode === "auto" && env.PI_TEAMS_MOCK_CHILD_PI)
|
|
102
|
+
return childCaps(requestedMode, "PI_TEAMS_MOCK_CHILD_PI mock forces child-process runtime in auto mode.");
|
|
74
103
|
if (requestedMode === "live-session") {
|
|
75
104
|
const live = await isLiveSessionRuntimeAvailable(1500, env);
|
|
76
105
|
if (live.available) return liveCaps(requestedMode);
|
|
77
|
-
if (config.runtime?.allowChildProcessFallback === false)
|
|
78
|
-
|
|
79
|
-
|
|
106
|
+
if (config.runtime?.allowChildProcessFallback === false) return scaffoldCaps(requestedMode, live.reason, "blocked");
|
|
107
|
+
return {
|
|
108
|
+
...childCaps(requestedMode),
|
|
109
|
+
fallback: "child-process",
|
|
110
|
+
reason: live.reason,
|
|
111
|
+
};
|
|
80
112
|
}
|
|
81
113
|
// auto mode: use child-process unless preferLiveSession is explicitly enabled
|
|
82
114
|
if (requestedMode === "auto") {
|
|
@@ -94,14 +126,47 @@ export async function resolveCrewRuntime(config: PiTeamsConfig, env: NodeJS.Proc
|
|
|
94
126
|
return childCaps(requestedMode);
|
|
95
127
|
}
|
|
96
128
|
|
|
97
|
-
function scaffoldCaps(
|
|
98
|
-
|
|
129
|
+
function scaffoldCaps(
|
|
130
|
+
requestedMode: CrewRuntimeMode,
|
|
131
|
+
reason?: string,
|
|
132
|
+
safety: CrewRuntimeSafety = "explicit_dry_run",
|
|
133
|
+
): CrewRuntimeCapabilities {
|
|
134
|
+
return {
|
|
135
|
+
kind: "scaffold",
|
|
136
|
+
requestedMode,
|
|
137
|
+
available: safety !== "blocked",
|
|
138
|
+
steer: false,
|
|
139
|
+
resume: false,
|
|
140
|
+
liveToolActivity: false,
|
|
141
|
+
transcript: false,
|
|
142
|
+
safety,
|
|
143
|
+
...(reason ? { reason } : {}),
|
|
144
|
+
};
|
|
99
145
|
}
|
|
100
146
|
|
|
101
147
|
function childCaps(requestedMode: CrewRuntimeMode, reason?: string): CrewRuntimeCapabilities {
|
|
102
|
-
return {
|
|
148
|
+
return {
|
|
149
|
+
kind: "child-process",
|
|
150
|
+
requestedMode,
|
|
151
|
+
available: true,
|
|
152
|
+
steer: true,
|
|
153
|
+
resume: false,
|
|
154
|
+
liveToolActivity: false,
|
|
155
|
+
transcript: true,
|
|
156
|
+
safety: "trusted",
|
|
157
|
+
...(reason ? { reason } : {}),
|
|
158
|
+
};
|
|
103
159
|
}
|
|
104
160
|
|
|
105
161
|
function liveCaps(requestedMode: CrewRuntimeMode): CrewRuntimeCapabilities {
|
|
106
|
-
return {
|
|
162
|
+
return {
|
|
163
|
+
kind: "live-session",
|
|
164
|
+
requestedMode,
|
|
165
|
+
available: true,
|
|
166
|
+
steer: true,
|
|
167
|
+
resume: true,
|
|
168
|
+
liveToolActivity: true,
|
|
169
|
+
transcript: true,
|
|
170
|
+
safety: "trusted",
|
|
171
|
+
};
|
|
107
172
|
}
|
package/src/runtime/scheduler.ts
CHANGED
|
@@ -34,15 +34,13 @@ export class CrewScheduler {
|
|
|
34
34
|
private finalizer?: (jobId: string, agentId: string) => void;
|
|
35
35
|
private runCancelFn?: (runId: string) => void;
|
|
36
36
|
|
|
37
|
-
start(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
},
|
|
45
|
-
): void {
|
|
37
|
+
start(options: {
|
|
38
|
+
emit: (event: ScheduleChangeEvent) => void;
|
|
39
|
+
executor: (job: ScheduledJob) => string;
|
|
40
|
+
finalizer: (jobId: string, agentId: string) => void;
|
|
41
|
+
/** Optional callback to cancel a spawned run by runId. */
|
|
42
|
+
runCancelFn?: (runId: string) => void;
|
|
43
|
+
}): void {
|
|
46
44
|
this.emit = options.emit;
|
|
47
45
|
this.executor = options.executor;
|
|
48
46
|
this.finalizer = options.finalizer;
|
|
@@ -74,7 +72,11 @@ export class CrewScheduler {
|
|
|
74
72
|
// Cancel all spawned runs that are still active
|
|
75
73
|
if (spawnedRunIds && this.runCancelFn) {
|
|
76
74
|
for (const runId of spawnedRunIds) {
|
|
77
|
-
try {
|
|
75
|
+
try {
|
|
76
|
+
this.runCancelFn(runId);
|
|
77
|
+
} catch {
|
|
78
|
+
/* best-effort */
|
|
79
|
+
}
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
const ok = this.jobs.delete(id);
|
|
@@ -121,7 +123,11 @@ export class CrewScheduler {
|
|
|
121
123
|
this.timers.set(job.id, t);
|
|
122
124
|
} else {
|
|
123
125
|
this.update(job.id, { enabled: false, lastStatus: "error" });
|
|
124
|
-
this.emit?.({
|
|
126
|
+
this.emit?.({
|
|
127
|
+
type: "error",
|
|
128
|
+
jobId: job.id,
|
|
129
|
+
error: `Scheduled time ${job.schedule} is in the past`,
|
|
130
|
+
});
|
|
125
131
|
}
|
|
126
132
|
}
|
|
127
133
|
}
|
|
@@ -149,7 +155,10 @@ export class CrewScheduler {
|
|
|
149
155
|
agentId = this.executor(job);
|
|
150
156
|
} catch (err) {
|
|
151
157
|
const error = err instanceof Error ? err.message : String(err);
|
|
152
|
-
this.update(id, {
|
|
158
|
+
this.update(id, {
|
|
159
|
+
lastRun: new Date().toISOString(),
|
|
160
|
+
lastStatus: "error",
|
|
161
|
+
});
|
|
153
162
|
this.emit?.({ type: "error", jobId: id, error });
|
|
154
163
|
return;
|
|
155
164
|
}
|
|
@@ -157,13 +166,20 @@ export class CrewScheduler {
|
|
|
157
166
|
this.finalizer?.(id, agentId);
|
|
158
167
|
}
|
|
159
168
|
|
|
160
|
-
static detectSchedule(s: string): {
|
|
169
|
+
static detectSchedule(s: string): {
|
|
170
|
+
type: ScheduleType;
|
|
171
|
+
intervalMs?: number;
|
|
172
|
+
normalized: string;
|
|
173
|
+
} {
|
|
161
174
|
const trimmed = s.trim();
|
|
162
175
|
// Relative: +10m
|
|
163
176
|
const rel = trimmed.match(/^\+(\d+)(s|m|h|d)$/);
|
|
164
177
|
if (rel) {
|
|
165
178
|
const ms = parseInt(rel[1], 10) * { s: 1000, m: 60_000, h: 3_600_000, d: 86_400_000 }[rel[2] as "s" | "m" | "h" | "d"];
|
|
166
|
-
return {
|
|
179
|
+
return {
|
|
180
|
+
type: "once",
|
|
181
|
+
normalized: new Date(Date.now() + ms).toISOString(),
|
|
182
|
+
};
|
|
167
183
|
}
|
|
168
184
|
// Interval: 5m
|
|
169
185
|
const ivl = trimmed.match(/^(\d+)(s|m|h|d)$/);
|
|
@@ -196,7 +212,12 @@ export interface ScheduleSpec {
|
|
|
196
212
|
function parseIntervalMs(s: string): number | undefined {
|
|
197
213
|
let ms = 0;
|
|
198
214
|
let remaining = s;
|
|
199
|
-
const unitMs: Record<string, number> = {
|
|
215
|
+
const unitMs: Record<string, number> = {
|
|
216
|
+
s: 1000,
|
|
217
|
+
m: 60_000,
|
|
218
|
+
h: 3_600_000,
|
|
219
|
+
d: 86_400_000,
|
|
220
|
+
};
|
|
200
221
|
while (remaining.length > 0) {
|
|
201
222
|
const m = remaining.match(/^(\d+)(s|m|h|d)/);
|
|
202
223
|
if (!m) return undefined;
|
|
@@ -272,7 +293,9 @@ export function parseSchedule(spec: string): ScheduleSpec | { error: string } {
|
|
|
272
293
|
if (fields.length >= 5) {
|
|
273
294
|
return { kind: "cron", spec: trimmed };
|
|
274
295
|
}
|
|
275
|
-
return {
|
|
296
|
+
return {
|
|
297
|
+
error: `Invalid schedule "${spec}". Use "5m", "+10m", ISO timestamp, or cron expression.`,
|
|
298
|
+
};
|
|
276
299
|
}
|
|
277
300
|
|
|
278
301
|
export function nextRunTime(spec: ScheduleSpec, from: Date = new Date()): Date | { error: string } {
|
|
@@ -298,11 +321,17 @@ export function nextRunTime(spec: ScheduleSpec, from: Date = new Date()): Date |
|
|
|
298
321
|
if (spec.kind === "cron") {
|
|
299
322
|
const next = nextCronDate(spec.spec, from);
|
|
300
323
|
if (!next || !(next instanceof Date)) {
|
|
301
|
-
return (
|
|
324
|
+
return (
|
|
325
|
+
(next as { error: string } | null) ?? {
|
|
326
|
+
error: "Invalid cron expression",
|
|
327
|
+
}
|
|
328
|
+
);
|
|
302
329
|
}
|
|
303
330
|
return next;
|
|
304
331
|
}
|
|
305
|
-
return {
|
|
332
|
+
return {
|
|
333
|
+
error: `Unknown schedule kind: ${(spec as unknown as Record<string, unknown>).kind}`,
|
|
334
|
+
};
|
|
306
335
|
}
|
|
307
336
|
|
|
308
337
|
export function humanizeSchedule(spec: ScheduleSpec): string {
|
package/src/runtime/semaphore.ts
CHANGED
|
@@ -33,13 +33,13 @@ export class Semaphore {
|
|
|
33
33
|
// implementation let #queue grow without bound, risking memory
|
|
34
34
|
// exhaustion under sustained high concurrency with slow releases.
|
|
35
35
|
if (this.#queue.length >= Semaphore.MAX_QUEUE) {
|
|
36
|
-
throw new Error(
|
|
37
|
-
`Semaphore queue full: ${this.#queue.length} waiters (max ${Semaphore.MAX_QUEUE}); cannot acquire slot`,
|
|
38
|
-
);
|
|
36
|
+
throw new Error(`Semaphore queue full: ${this.#queue.length} waiters (max ${Semaphore.MAX_QUEUE}); cannot acquire slot`);
|
|
39
37
|
}
|
|
40
38
|
const { promise, resolve } = (() => {
|
|
41
39
|
let res: () => void;
|
|
42
|
-
const p = new Promise<void>((r) => {
|
|
40
|
+
const p = new Promise<void>((r) => {
|
|
41
|
+
res = r;
|
|
42
|
+
});
|
|
43
43
|
return { promise: p, resolve: res! };
|
|
44
44
|
})();
|
|
45
45
|
this.#queue.push(resolve);
|
|
@@ -101,9 +101,7 @@ async function mapWithFailFast<T, R>(
|
|
|
101
101
|
|
|
102
102
|
// Internal abort controller for fail-fast
|
|
103
103
|
const abortController = new AbortController();
|
|
104
|
-
const workerSignal = signal
|
|
105
|
-
? AbortSignal.any([signal, abortController.signal])
|
|
106
|
-
: abortController.signal;
|
|
104
|
+
const workerSignal = signal ? AbortSignal.any([signal, abortController.signal]) : abortController.signal;
|
|
107
105
|
|
|
108
106
|
// Promise that rejects on first error — used for fail-fast
|
|
109
107
|
let rejectFirst: (error: unknown) => void;
|
|
@@ -12,7 +12,8 @@ import * as path from "node:path";
|
|
|
12
12
|
|
|
13
13
|
/** Basenames that almost certainly hold secrets or PII */
|
|
14
14
|
const SENSITIVE_BASENAMES = /\.(?:env|pem|key|p12|pfx|crt|cer|jks|keystore|asc|gpg)(?:\..+)?$/i;
|
|
15
|
-
const SENSITIVE_EXACT =
|
|
15
|
+
const SENSITIVE_EXACT =
|
|
16
|
+
/^(?:\.env|\.netrc|\.npmrc|\.pypirc|credentials|secrets?|passwords?|id_(?:rsa|dsa|ecdsa|ed25519)(?:\.pub)?|authorized_keys|known_hosts|jwt\.json|session\.cookie|\.token)$/i;
|
|
16
17
|
|
|
17
18
|
/** Path components that indicate sensitive directories */
|
|
18
19
|
const SENSITIVE_DIRS = new Set([".ssh", ".aws", ".gnupg", ".kube", ".docker", ".config/gcloud", ".config/gh"]);
|
|
@@ -2,7 +2,7 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import type { UsageState } from "../state/types.ts";
|
|
3
3
|
|
|
4
4
|
function asRecord(value: unknown): Record<string, unknown> | undefined {
|
|
5
|
-
return value && typeof value === "object" && !Array.isArray(value) ? value as Record<string, unknown> : undefined;
|
|
5
|
+
return value && typeof value === "object" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
function numberField(obj: Record<string, unknown>, keys: string[]): number | undefined {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
2
|
import { homedir } from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
4
|
import { logInternalError } from "../utils/internal-error.ts";
|
|
5
5
|
import type { JoinMode } from "./group-join.ts";
|
|
6
6
|
|
|
@@ -27,9 +27,7 @@ const VALID_JOIN_MODES = new Set<JoinMode>(["async", "group", "smart"]);
|
|
|
27
27
|
function validateScheduledJob(job: unknown): boolean {
|
|
28
28
|
if (!job || typeof job !== "object") return false;
|
|
29
29
|
const obj = job as Record<string, unknown>;
|
|
30
|
-
return typeof obj.id === "string" && obj.id.length > 0
|
|
31
|
-
&& typeof obj.scheduleType === "string"
|
|
32
|
-
&& typeof obj.enabled === "boolean";
|
|
30
|
+
return typeof obj.id === "string" && obj.id.length > 0 && typeof obj.scheduleType === "string" && typeof obj.enabled === "boolean";
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
function sanitizeSettings(raw: unknown): CrewSettings {
|
|
@@ -52,12 +50,7 @@ function sanitizeSettings(raw: unknown): CrewSettings {
|
|
|
52
50
|
) {
|
|
53
51
|
out.defaultMaxTurns = r.defaultMaxTurns;
|
|
54
52
|
}
|
|
55
|
-
if (
|
|
56
|
-
typeof r.graceTurns === "number" &&
|
|
57
|
-
Number.isInteger(r.graceTurns) &&
|
|
58
|
-
r.graceTurns >= 1 &&
|
|
59
|
-
r.graceTurns <= GRACE_TURNS_CEILING
|
|
60
|
-
) {
|
|
53
|
+
if (typeof r.graceTurns === "number" && Number.isInteger(r.graceTurns) && r.graceTurns >= 1 && r.graceTurns <= GRACE_TURNS_CEILING) {
|
|
61
54
|
out.graceTurns = r.graceTurns;
|
|
62
55
|
}
|
|
63
56
|
if (typeof r.defaultJoinMode === "string" && VALID_JOIN_MODES.has(r.defaultJoinMode as JoinMode)) {
|
|
@@ -95,7 +88,10 @@ function readSettingsFile(filePath: string): CrewSettings {
|
|
|
95
88
|
}
|
|
96
89
|
|
|
97
90
|
export function loadCrewSettings(cwd: string = process.cwd()): CrewSettings {
|
|
98
|
-
return {
|
|
91
|
+
return {
|
|
92
|
+
...readSettingsFile(globalPath()),
|
|
93
|
+
...readSettingsFile(projectPath(cwd)),
|
|
94
|
+
};
|
|
99
95
|
}
|
|
100
96
|
|
|
101
97
|
export function saveCrewSettings(s: CrewSettings, cwd: string = process.cwd()): boolean {
|
|
@@ -110,7 +106,15 @@ export function saveCrewSettings(s: CrewSettings, cwd: string = process.cwd()):
|
|
|
110
106
|
}
|
|
111
107
|
|
|
112
108
|
export function applyCrewSettingsToConfig(
|
|
113
|
-
config: {
|
|
109
|
+
config: {
|
|
110
|
+
limits?: { maxConcurrentWorkers?: number };
|
|
111
|
+
runtime?: {
|
|
112
|
+
maxTurns?: number;
|
|
113
|
+
graceTurns?: number;
|
|
114
|
+
groupJoin?: string;
|
|
115
|
+
};
|
|
116
|
+
notifierIntervalMs?: number;
|
|
117
|
+
},
|
|
114
118
|
settings: CrewSettings,
|
|
115
119
|
): void {
|
|
116
120
|
if (settings.maxConcurrent != null && config.limits) config.limits.maxConcurrentWorkers = settings.maxConcurrent;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
-
import { isSafePathId } from "../utils/safe-paths.ts";
|
|
4
3
|
import { redactSecrets } from "../utils/redaction.ts";
|
|
4
|
+
import { isSafePathId } from "../utils/safe-paths.ts";
|
|
5
5
|
|
|
6
6
|
export interface SidechainEntry {
|
|
7
7
|
isSidechain: true;
|
|
@@ -14,7 +14,11 @@ export interface SidechainEntry {
|
|
|
14
14
|
|
|
15
15
|
export function writeSidechainEntry(filePath: string, entry: Omit<SidechainEntry, "isSidechain" | "timestamp">): void {
|
|
16
16
|
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
17
|
-
fs.appendFileSync(
|
|
17
|
+
fs.appendFileSync(
|
|
18
|
+
filePath,
|
|
19
|
+
`${JSON.stringify(redactSecrets({ isSidechain: true, timestamp: new Date().toISOString(), ...entry }))}\n`,
|
|
20
|
+
"utf-8",
|
|
21
|
+
);
|
|
18
22
|
}
|
|
19
23
|
|
|
20
24
|
export function sidechainOutputPath(stateRoot: string, taskId: string): string {
|
|
@@ -49,10 +49,7 @@ function orderSteps(steps: WorkflowStep[]): WorkflowStep[] {
|
|
|
49
49
|
* The agent executes each phase in dependency order, writing outputs to the
|
|
50
50
|
* named artifacts, mimicking what the multi-agent team would produce.
|
|
51
51
|
*/
|
|
52
|
-
export function composeSingleAgentPrompt(
|
|
53
|
-
workflow: WorkflowConfig,
|
|
54
|
-
goal: string,
|
|
55
|
-
): SingleAgentPrompt {
|
|
52
|
+
export function composeSingleAgentPrompt(workflow: WorkflowConfig, goal: string): SingleAgentPrompt {
|
|
56
53
|
const ordered = orderSteps(workflow.steps);
|
|
57
54
|
const lines: string[] = [];
|
|
58
55
|
lines.push(`# Single-agent workflow execution: ${workflow.name}`);
|