pi-crew 0.9.53 → 0.9.55
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 +45 -0
- package/package.json +6 -3
- package/scripts/clean-strip-types.mjs +60 -0
- package/src/adapters/claude-adapter.ts +23 -0
- package/src/adapters/codex-adapter.ts +21 -0
- package/src/adapters/cursor-adapter.ts +17 -0
- package/src/adapters/export-util.ts +143 -0
- package/src/adapters/index.ts +15 -0
- package/src/adapters/registry.ts +18 -0
- package/src/adapters/types.ts +23 -0
- package/src/agents/agent-config.ts +194 -0
- package/src/agents/agent-search.ts +98 -0
- package/src/agents/agent-serializer.ts +38 -0
- package/src/agents/discover-agents.ts +623 -0
- package/src/benchmark/benchmark-runner.ts +313 -0
- package/src/benchmark/feedback-loop.ts +73 -0
- package/src/config/config.ts +1270 -0
- package/src/config/defaults.ts +193 -0
- package/src/config/drift-detector.ts +290 -0
- package/src/config/markers.ts +330 -0
- package/src/config/resilient-parser.ts +117 -0
- package/src/config/role-tools.ts +118 -0
- package/src/config/suggestions.ts +75 -0
- package/src/config/types.ts +280 -0
- package/src/errors.ts +194 -0
- package/src/extension/action-suggestions.ts +117 -0
- package/src/extension/async-notifier.ts +179 -0
- package/src/extension/autonomous-policy.ts +209 -0
- package/src/extension/command-completions.ts +120 -0
- package/src/extension/context-status-injection.ts +185 -0
- package/src/extension/crew-autocomplete.ts +131 -0
- package/src/extension/crew-cleanup.ts +168 -0
- package/src/extension/crew-input-router.ts +93 -0
- package/src/extension/crew-shortcuts.ts +87 -0
- package/src/extension/crew-vibes/cat-frames.ts +18 -0
- package/src/extension/crew-vibes/config.ts +195 -0
- package/src/extension/crew-vibes/figures.ts +101 -0
- package/src/extension/crew-vibes/font-detect.ts +71 -0
- package/src/extension/crew-vibes/footer.ts +292 -0
- package/src/extension/crew-vibes/index.ts +432 -0
- package/src/extension/crew-vibes/provider-usage.ts +396 -0
- package/src/extension/crew-vibes/render.ts +206 -0
- package/src/extension/crew-vibes/speed.ts +286 -0
- package/src/extension/cross-extension-rpc.ts +350 -0
- package/src/extension/help.ts +62 -0
- package/src/extension/import-index.ts +74 -0
- package/src/extension/knowledge-injection.ts +402 -0
- package/src/extension/management.ts +571 -0
- package/src/extension/message-renderers.ts +108 -0
- package/src/extension/notification-router.ts +152 -0
- package/src/extension/notification-sink.ts +54 -0
- package/src/extension/pi-api.ts +56 -0
- package/src/extension/plan-orchestrate.ts +302 -0
- package/src/extension/project-init.ts +170 -0
- package/src/extension/register.ts +113 -0
- package/src/extension/registration/artifact-cleanup.ts +20 -0
- package/src/extension/registration/command-registration.ts +58 -0
- package/src/extension/registration/command-utils.ts +58 -0
- package/src/extension/registration/commands.ts +1228 -0
- package/src/extension/registration/compaction-guard.ts +333 -0
- package/src/extension/registration/context-builder.ts +135 -0
- package/src/extension/registration/crash-recovery-cache.ts +54 -0
- package/src/extension/registration/foreground-run-controller.ts +238 -0
- package/src/extension/registration/hook-registration.ts +119 -0
- package/src/extension/registration/lazy-configurers.ts +124 -0
- package/src/extension/registration/lifecycle-handlers.ts +923 -0
- package/src/extension/registration/lifecycle.ts +259 -0
- package/src/extension/registration/observability.ts +322 -0
- package/src/extension/registration/registration-types.ts +158 -0
- package/src/extension/registration/runtime-cleanup.ts +230 -0
- package/src/extension/registration/subagent-helpers.ts +125 -0
- package/src/extension/registration/subagent-manager-setup.ts +330 -0
- package/src/extension/registration/subagent-tools.ts +456 -0
- package/src/extension/registration/team-tool.ts +225 -0
- package/src/extension/registration/tool-registration.ts +50 -0
- package/src/extension/registration/ui.ts +172 -0
- package/src/extension/registration/viewers.ts +121 -0
- package/src/extension/registration/wire-cross-extension.ts +37 -0
- package/src/extension/result-watcher.ts +139 -0
- package/src/extension/rpc-hmac.ts +256 -0
- package/src/extension/run-bundle-schema.ts +104 -0
- package/src/extension/run-export.ts +97 -0
- package/src/extension/run-import.ts +168 -0
- package/src/extension/run-index.ts +131 -0
- package/src/extension/run-maintenance.ts +190 -0
- package/src/extension/session-summary.ts +18 -0
- package/src/extension/team-manager-command.ts +153 -0
- package/src/extension/team-onboard.ts +180 -0
- package/src/extension/team-recommendation.ts +288 -0
- package/src/extension/team-tool/anchor.ts +172 -0
- package/src/extension/team-tool/api.ts +1244 -0
- package/src/extension/team-tool/auto-summarize.ts +142 -0
- package/src/extension/team-tool/cache-control.ts +19 -0
- package/src/extension/team-tool/cancel.ts +337 -0
- package/src/extension/team-tool/chain-dispatch.ts +95 -0
- package/src/extension/team-tool/chain-executor.ts +379 -0
- package/src/extension/team-tool/config-patch.ts +50 -0
- package/src/extension/team-tool/context.ts +149 -0
- package/src/extension/team-tool/destructive-gate.ts +52 -0
- package/src/extension/team-tool/dispatch/automate.ts +80 -0
- package/src/extension/team-tool/dispatch/control.ts +42 -0
- package/src/extension/team-tool/dispatch/index.ts +95 -0
- package/src/extension/team-tool/dispatch/manage.ts +161 -0
- package/src/extension/team-tool/dispatch/run.ts +53 -0
- package/src/extension/team-tool/dispatch/status.ts +187 -0
- package/src/extension/team-tool/doctor.ts +431 -0
- package/src/extension/team-tool/explain.ts +282 -0
- package/src/extension/team-tool/failure-patterns.ts +118 -0
- package/src/extension/team-tool/goal-wrap.ts +330 -0
- package/src/extension/team-tool/goal.ts +556 -0
- package/src/extension/team-tool/handle-schedule.ts +332 -0
- package/src/extension/team-tool/handle-settings.ts +520 -0
- package/src/extension/team-tool/health-monitor.ts +481 -0
- package/src/extension/team-tool/inspect.ts +88 -0
- package/src/extension/team-tool/intent-policy.ts +45 -0
- package/src/extension/team-tool/lifecycle-actions.ts +615 -0
- package/src/extension/team-tool/orchestrate.ts +98 -0
- package/src/extension/team-tool/parallel-dispatch.ts +183 -0
- package/src/extension/team-tool/plan.ts +50 -0
- package/src/extension/team-tool/respond.ts +150 -0
- package/src/extension/team-tool/run-deadline.ts +66 -0
- package/src/extension/team-tool/run-not-found.ts +49 -0
- package/src/extension/team-tool/run.ts +1051 -0
- package/src/extension/team-tool/status.ts +260 -0
- package/src/extension/team-tool/workflow-manage.ts +261 -0
- package/src/extension/team-tool-types.ts +26 -0
- package/src/extension/team-tool.ts +750 -0
- package/src/extension/tool-result.ts +16 -0
- package/src/extension/validate-resources.ts +108 -0
- package/src/hooks/registry.ts +200 -0
- package/src/hooks/types.ts +69 -0
- package/src/i18n.ts +212 -0
- package/src/observability/correlation.ts +50 -0
- package/src/observability/event-bus.ts +86 -0
- package/src/observability/event-to-metric.ts +170 -0
- package/src/observability/exporters/adapter.ts +27 -0
- package/src/observability/exporters/otlp-exporter.ts +356 -0
- package/src/observability/exporters/prometheus-exporter.ts +54 -0
- package/src/observability/metric-registry.ts +100 -0
- package/src/observability/metric-retention.ts +64 -0
- package/src/observability/metric-sink.ts +99 -0
- package/src/observability/metrics-primitives.ts +219 -0
- package/src/plugins/plugin-define.ts +6 -0
- package/src/plugins/plugin-registry.ts +32 -0
- package/src/plugins/plugins/index.ts +3 -0
- package/src/plugins/plugins/nextjs.ts +19 -0
- package/src/plugins/plugins/vite.ts +10 -0
- package/src/plugins/plugins/vitest.ts +9 -0
- package/src/prompt/prompt-runtime.ts +380 -0
- package/src/runtime/adaptive-plan.ts +563 -0
- package/src/runtime/agent-control.ts +215 -0
- package/src/runtime/agent-memory.ts +81 -0
- package/src/runtime/agent-observability.ts +122 -0
- package/src/runtime/anchor-manager.ts +475 -0
- package/src/runtime/async-marker.ts +32 -0
- package/src/runtime/async-runner.ts +381 -0
- package/src/runtime/attention-events.ts +28 -0
- package/src/runtime/auto-summarize.ts +344 -0
- package/src/runtime/background-runner.ts +840 -0
- package/src/runtime/batch-barrier.ts +147 -0
- package/src/runtime/broker-issuer.ts +39 -0
- package/src/runtime/cancellation-token.ts +99 -0
- package/src/runtime/cancellation.ts +99 -0
- package/src/runtime/capability-inventory.ts +137 -0
- package/src/runtime/chain-parser.ts +237 -0
- package/src/runtime/chain-runner.ts +606 -0
- package/src/runtime/checkpoint.ts +291 -0
- package/src/runtime/child-pi-constants.ts +42 -0
- package/src/runtime/child-pi-kill.ts +180 -0
- package/src/runtime/child-pi-pool.ts +68 -0
- package/src/runtime/child-pi-spawn.ts +287 -0
- package/src/runtime/child-pi-steering.ts +128 -0
- package/src/runtime/child-pi-streams.ts +296 -0
- package/src/runtime/child-pi-transcript.ts +169 -0
- package/src/runtime/child-pi.ts +1105 -0
- package/src/runtime/coalesce-tasks.ts +268 -0
- package/src/runtime/code-summary.ts +292 -0
- package/src/runtime/command-trace.ts +105 -0
- package/src/runtime/compact-pipeline.ts +56 -0
- package/src/runtime/compact-stages/ansi-strip-stage.ts +25 -0
- package/src/runtime/compact-stages/blank-collapse-stage.ts +31 -0
- package/src/runtime/compact-stages/deduplicate-stage.ts +34 -0
- package/src/runtime/compact-stages/head-snap-stage.ts +57 -0
- package/src/runtime/compact-stages/index.ts +23 -0
- package/src/runtime/compact-stages/tail-capture-stage.ts +77 -0
- package/src/runtime/compact-stages/truncation-stage.ts +74 -0
- package/src/runtime/compaction-summary.ts +278 -0
- package/src/runtime/completion-guard.ts +207 -0
- package/src/runtime/concurrency.ts +58 -0
- package/src/runtime/crash-classification.ts +229 -0
- package/src/runtime/crash-recovery.ts +594 -0
- package/src/runtime/crew-agent-records.ts +595 -0
- package/src/runtime/crew-agent-runtime.ts +62 -0
- package/src/runtime/crew-broker-child.ts +88 -0
- package/src/runtime/crew-broker-client.ts +673 -0
- package/src/runtime/crew-broker-tokens.ts +159 -0
- package/src/runtime/crew-broker.ts +1304 -0
- package/src/runtime/crew-hooks.ts +227 -0
- package/src/runtime/cross-extension-rpc.ts +143 -0
- package/src/runtime/custom-tools/irc-tool.ts +282 -0
- package/src/runtime/custom-tools/submit-result-tool.ts +102 -0
- package/src/runtime/deadletter.ts +47 -0
- package/src/runtime/delivery-coordinator.ts +211 -0
- package/src/runtime/delta-conflict.ts +348 -0
- package/src/runtime/deterministic-ast.ts +161 -0
- package/src/runtime/diagnostic-export.ts +171 -0
- package/src/runtime/direct-run.ts +45 -0
- package/src/runtime/dwf-state-store.ts +102 -0
- package/src/runtime/dynamic-workflow-context.ts +1013 -0
- package/src/runtime/dynamic-workflow-runner.ts +325 -0
- package/src/runtime/effectiveness.ts +90 -0
- package/src/runtime/errors/crew-errors.ts +162 -0
- package/src/runtime/event-stream-bridge.ts +98 -0
- package/src/runtime/foreground-control.ts +193 -0
- package/src/runtime/foreground-watchdog.ts +132 -0
- package/src/runtime/global-worker-cap.ts +96 -0
- package/src/runtime/goal-achievement.ts +148 -0
- package/src/runtime/goal-evaluator.ts +365 -0
- package/src/runtime/goal-loop-runner.ts +825 -0
- package/src/runtime/goal-state-store.ts +219 -0
- package/src/runtime/green-contract.ts +55 -0
- package/src/runtime/group-join.ts +267 -0
- package/src/runtime/handoff-manager.ts +598 -0
- package/src/runtime/heartbeat-gradient.ts +36 -0
- package/src/runtime/heartbeat-watcher.ts +239 -0
- package/src/runtime/hidden-handoff.ts +407 -0
- package/src/runtime/important-line-classifier.ts +140 -0
- package/src/runtime/intercom-bridge.ts +187 -0
- package/src/runtime/iteration-hooks.ts +305 -0
- package/src/runtime/live-agent-control.ts +136 -0
- package/src/runtime/live-agent-manager.ts +704 -0
- package/src/runtime/live-control-realtime.ts +56 -0
- package/src/runtime/live-extension-bridge.ts +148 -0
- package/src/runtime/live-irc.ts +97 -0
- package/src/runtime/live-session-health.ts +108 -0
- package/src/runtime/live-session-runtime.ts +1146 -0
- package/src/runtime/loop-gates.ts +128 -0
- package/src/runtime/manifest-cache.ts +375 -0
- package/src/runtime/mcp-proxy.ts +105 -0
- package/src/runtime/metric-parser.ts +36 -0
- package/src/runtime/model-fallback.ts +409 -0
- package/src/runtime/model-resolver.ts +126 -0
- package/src/runtime/model-scope.ts +158 -0
- package/src/runtime/orphan-worker-registry.ts +465 -0
- package/src/runtime/output-validator.ts +202 -0
- package/src/runtime/overflow-recovery.ts +206 -0
- package/src/runtime/parallel-research.ts +68 -0
- package/src/runtime/parallel-utils.ts +160 -0
- package/src/runtime/parent-guard.ts +134 -0
- package/src/runtime/path-overlap.ts +150 -0
- package/src/runtime/peer-dep.ts +292 -0
- package/src/runtime/per-write-validator.ts +181 -0
- package/src/runtime/phase-progress.ts +217 -0
- package/src/runtime/phase-tracker.ts +385 -0
- package/src/runtime/pi-args.ts +655 -0
- package/src/runtime/pi-json-output.ts +170 -0
- package/src/runtime/pi-spawn.ts +273 -0
- package/src/runtime/pipeline-runner.ts +523 -0
- package/src/runtime/plan-templates.ts +201 -0
- package/src/runtime/policy-engine.ts +115 -0
- package/src/runtime/post-checks.ts +142 -0
- package/src/runtime/post-exit-stdio-guard.ts +109 -0
- package/src/runtime/process-lifecycle.ts +491 -0
- package/src/runtime/process-status.ts +154 -0
- package/src/runtime/progress-event-coalescer.ts +44 -0
- package/src/runtime/progress-tracker.ts +124 -0
- package/src/runtime/prose-compressor.ts +162 -0
- package/src/runtime/recovery-recipes.ts +203 -0
- package/src/runtime/replace.ts +570 -0
- package/src/runtime/resilient-edit.ts +153 -0
- package/src/runtime/result-extractor.ts +217 -0
- package/src/runtime/retry-executor.ts +109 -0
- package/src/runtime/retry-runner.ts +336 -0
- package/src/runtime/role-permission.ts +59 -0
- package/src/runtime/run-coalesced-task-group.ts +308 -0
- package/src/runtime/run-drift.ts +219 -0
- package/src/runtime/run-tracker.ts +116 -0
- package/src/runtime/run-worker.ts +78 -0
- package/src/runtime/runtime-policy.ts +29 -0
- package/src/runtime/runtime-resolver.ts +172 -0
- package/src/runtime/runtime-warmup.ts +160 -0
- package/src/runtime/scheduler.ts +353 -0
- package/src/runtime/semaphore.ts +141 -0
- package/src/runtime/sensitive-paths.ts +93 -0
- package/src/runtime/session-resources.ts +25 -0
- package/src/runtime/session-snapshot.ts +59 -0
- package/src/runtime/session-usage.ts +79 -0
- package/src/runtime/settings-store.ts +155 -0
- package/src/runtime/sidechain-output.ts +35 -0
- package/src/runtime/single-agent-compose.ts +84 -0
- package/src/runtime/skill-effectiveness.ts +524 -0
- package/src/runtime/skill-instructions.ts +394 -0
- package/src/runtime/stale-reconciler.ts +680 -0
- package/src/runtime/stream-preview.ts +184 -0
- package/src/runtime/streaming-output.ts +50 -0
- package/src/runtime/subagent-manager.ts +561 -0
- package/src/runtime/subprocess-tool-registry.ts +70 -0
- package/src/runtime/supervisor-contact.ts +64 -0
- package/src/runtime/task-display.ts +52 -0
- package/src/runtime/task-graph-scheduler.ts +227 -0
- package/src/runtime/task-graph.ts +290 -0
- package/src/runtime/task-health.ts +83 -0
- package/src/runtime/task-id.ts +161 -0
- package/src/runtime/task-output-context.ts +602 -0
- package/src/runtime/task-packet.ts +268 -0
- package/src/runtime/task-quality.ts +199 -0
- package/src/runtime/task-runner/capabilities.ts +78 -0
- package/src/runtime/task-runner/child-executor.ts +790 -0
- package/src/runtime/task-runner/context-retrieval.ts +163 -0
- package/src/runtime/task-runner/live-executor.ts +227 -0
- package/src/runtime/task-runner/output-splitter.ts +152 -0
- package/src/runtime/task-runner/post-execution.ts +480 -0
- package/src/runtime/task-runner/pre-execution.ts +365 -0
- package/src/runtime/task-runner/progress.ts +157 -0
- package/src/runtime/task-runner/prompt-builder.ts +278 -0
- package/src/runtime/task-runner/prompt-pipeline.ts +88 -0
- package/src/runtime/task-runner/result-utils.ts +16 -0
- package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
- package/src/runtime/task-runner/run-projection.ts +125 -0
- package/src/runtime/task-runner/scaffold-executor.ts +25 -0
- package/src/runtime/task-runner/state-helpers.ts +176 -0
- package/src/runtime/task-runner/tail-read.ts +34 -0
- package/src/runtime/task-runner.ts +216 -0
- package/src/runtime/team-runner-artifacts.ts +13 -0
- package/src/runtime/team-runner.ts +2396 -0
- package/src/runtime/tool-output-pruner.ts +333 -0
- package/src/runtime/tool-progress.ts +278 -0
- package/src/runtime/usage-tracker.ts +73 -0
- package/src/runtime/verification-gates.ts +579 -0
- package/src/runtime/verification-integrity.ts +108 -0
- package/src/runtime/verification-worktree.ts +186 -0
- package/src/runtime/worker-heartbeat.ts +25 -0
- package/src/runtime/worker-startup.ts +83 -0
- package/src/runtime/workflow-state.ts +195 -0
- package/src/runtime/workspace-lock.ts +443 -0
- package/src/runtime/workspace-tree.ts +312 -0
- package/src/runtime/yield-handler.ts +224 -0
- package/src/runtime/zombie-scanner.ts +298 -0
- package/src/schema/config-schema.ts +327 -0
- package/src/schema/team-tool-schema.ts +492 -0
- package/src/schema/validation-types.ts +159 -0
- package/src/skills/discover-skills.ts +203 -0
- package/src/skills/skill-templates.ts +456 -0
- package/src/skills/validate.ts +285 -0
- package/src/state/active-run-registry.ts +439 -0
- package/src/state/artifact-store.ts +176 -0
- package/src/state/atomic-write.ts +970 -0
- package/src/state/blob-store.ts +308 -0
- package/src/state/contracts.ts +160 -0
- package/src/state/crew-init.ts +269 -0
- package/src/state/decision-ledger.ts +372 -0
- package/src/state/event-log-rotation.ts +399 -0
- package/src/state/event-log.ts +1465 -0
- package/src/state/event-reconstructor.ts +229 -0
- package/src/state/gitignore-manager.ts +46 -0
- package/src/state/health-store.ts +79 -0
- package/src/state/hook-instinct-bridge.ts +94 -0
- package/src/state/hook-integrations.ts +51 -0
- package/src/state/instinct-store.ts +275 -0
- package/src/state/jsonl-writer.ts +107 -0
- package/src/state/locks.ts +562 -0
- package/src/state/mailbox.ts +916 -0
- package/src/state/observation-store.ts +176 -0
- package/src/state/run-cache.ts +193 -0
- package/src/state/run-graph.ts +183 -0
- package/src/state/run-metrics.ts +165 -0
- package/src/state/schedule.ts +166 -0
- package/src/state/session-state-map.ts +51 -0
- package/src/state/state-store.ts +973 -0
- package/src/state/task-claims.ts +61 -0
- package/src/state/tiered-eval.ts +480 -0
- package/src/state/types-eval.ts +58 -0
- package/src/state/types.ts +447 -0
- package/src/state/usage.ts +138 -0
- package/src/state/worker-atomic-writer.ts +198 -0
- package/src/subagents/async-entry.ts +1 -0
- package/src/subagents/index.ts +3 -0
- package/src/subagents/live/control.ts +1 -0
- package/src/subagents/live/manager.ts +1 -0
- package/src/subagents/live/realtime.ts +1 -0
- package/src/subagents/live/session-runtime.ts +1 -0
- package/src/subagents/manager.ts +1 -0
- package/src/subagents/spawn.ts +1 -0
- package/src/teams/discover-teams.ts +187 -0
- package/src/teams/team-config.ts +27 -0
- package/src/teams/team-serializer.ts +38 -0
- package/src/tools/safe-bash-extension.ts +54 -0
- package/src/tools/safe-bash.ts +505 -0
- package/src/types/diff.d.ts +18 -0
- package/src/types/new-api-types.ts +35 -0
- package/src/ui/agent-management-overlay.ts +160 -0
- package/src/ui/card-colors.ts +139 -0
- package/src/ui/crew-footer.ts +102 -0
- package/src/ui/crew-select-list.ts +112 -0
- package/src/ui/dashboard-panes/agents-pane.ts +164 -0
- package/src/ui/dashboard-panes/cancellation-pane.ts +66 -0
- package/src/ui/dashboard-panes/capability-pane.ts +77 -0
- package/src/ui/dashboard-panes/health-pane.ts +31 -0
- package/src/ui/dashboard-panes/mailbox-pane.ts +35 -0
- package/src/ui/dashboard-panes/metrics-pane.ts +37 -0
- package/src/ui/dashboard-panes/progress-pane.ts +38 -0
- package/src/ui/dashboard-panes/transcript-pane.ts +10 -0
- package/src/ui/deploy-bundled-themes.ts +71 -0
- package/src/ui/dwf-phase-display.ts +151 -0
- package/src/ui/dynamic-border.ts +35 -0
- package/src/ui/format-helpers.ts +31 -0
- package/src/ui/heartbeat-aggregator.ts +74 -0
- package/src/ui/key-utils.ts +42 -0
- package/src/ui/keybinding-map.ts +248 -0
- package/src/ui/layout-primitives.ts +106 -0
- package/src/ui/live-conversation-overlay.ts +183 -0
- package/src/ui/live-duration.ts +55 -0
- package/src/ui/live-run-sidebar.ts +293 -0
- package/src/ui/loaders.ts +6 -0
- package/src/ui/mascot.ts +449 -0
- package/src/ui/overlays/agent-picker-overlay.ts +66 -0
- package/src/ui/overlays/confirm-overlay.ts +60 -0
- package/src/ui/overlays/help-overlay.ts +177 -0
- package/src/ui/overlays/mailbox-compose-overlay.ts +181 -0
- package/src/ui/overlays/mailbox-compose-preview.ts +78 -0
- package/src/ui/overlays/mailbox-detail-overlay.ts +155 -0
- package/src/ui/pi-ui-compat.ts +68 -0
- package/src/ui/powerbar-publisher.ts +459 -0
- package/src/ui/render-coalescer.ts +101 -0
- package/src/ui/render-diff.ts +160 -0
- package/src/ui/render-scheduler.ts +278 -0
- package/src/ui/run-action-dispatcher.ts +182 -0
- package/src/ui/run-dashboard.ts +910 -0
- package/src/ui/run-event-bus.ts +381 -0
- package/src/ui/run-snapshot-cache.ts +1057 -0
- package/src/ui/settings-overlay.ts +1067 -0
- package/src/ui/shared-overlay-scheduler.ts +96 -0
- package/src/ui/snapshot-types.ts +90 -0
- package/src/ui/spinner.ts +17 -0
- package/src/ui/status-colors.ts +143 -0
- package/src/ui/syntax-highlight.ts +136 -0
- package/src/ui/terminal-status.ts +269 -0
- package/src/ui/theme-adapter.ts +271 -0
- package/src/ui/theme-discovery.ts +199 -0
- package/src/ui/tool-progress-formatter.ts +93 -0
- package/src/ui/tool-renderers/brief-mode.ts +225 -0
- package/src/ui/tool-renderers/index.ts +726 -0
- package/src/ui/transcript-cache.ts +128 -0
- package/src/ui/transcript-entries.ts +256 -0
- package/src/ui/transcript-viewer.ts +424 -0
- package/src/ui/widget/index.ts +418 -0
- package/src/ui/widget/widget-formatters.ts +182 -0
- package/src/ui/widget/widget-model.ts +110 -0
- package/src/ui/widget/widget-renderer.ts +182 -0
- package/src/ui/widget/widget-types.ts +36 -0
- package/src/utils/bm25-search.ts +235 -0
- package/src/utils/completion-dedupe.ts +63 -0
- package/src/utils/conflict-detect.ts +668 -0
- package/src/utils/env-allowlist.ts +30 -0
- package/src/utils/env-filter.ts +155 -0
- package/src/utils/file-coalescer.ts +98 -0
- package/src/utils/fingerprint.ts +180 -0
- package/src/utils/frontmatter.ts +70 -0
- package/src/utils/fs-watch.ts +37 -0
- package/src/utils/gh-protocol.ts +556 -0
- package/src/utils/git.ts +260 -0
- package/src/utils/guards.ts +107 -0
- package/src/utils/ids.ts +24 -0
- package/src/utils/incremental-reader.ts +220 -0
- package/src/utils/internal-error.ts +10 -0
- package/src/utils/names.ts +36 -0
- package/src/utils/ndjson.ts +115 -0
- package/src/utils/paths.ts +227 -0
- package/src/utils/project-detector.ts +160 -0
- package/src/utils/redaction.ts +370 -0
- package/src/utils/resolve-shell.ts +36 -0
- package/src/utils/run-watcher-registry.ts +152 -0
- package/src/utils/safe-paths.ts +393 -0
- package/src/utils/scan-cache.ts +144 -0
- package/src/utils/session-utils.ts +110 -0
- package/src/utils/sleep.ts +54 -0
- package/src/utils/socket-path.ts +164 -0
- package/src/utils/sse-parser.ts +131 -0
- package/src/utils/task-name-generator.ts +337 -0
- package/src/utils/timings.ts +33 -0
- package/src/utils/token-counter.ts +200 -0
- package/src/utils/visual.ts +207 -0
- package/src/workflows/cost-estimator.ts +34 -0
- package/src/workflows/discover-workflows.ts +308 -0
- package/src/workflows/intermediate-store.ts +166 -0
- package/src/workflows/preflight-validator.ts +168 -0
- package/src/workflows/topology-analyzer.ts +203 -0
- package/src/workflows/validate-workflow.ts +50 -0
- package/src/workflows/workflow-config.ts +75 -0
- package/src/workflows/workflow-serializer.ts +32 -0
- package/src/worktree/branch-freshness.ts +112 -0
- package/src/worktree/cleanup.ts +341 -0
- package/src/worktree/worktree-manager.ts +1204 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool registration installer for pi-crew.
|
|
3
|
+
*
|
|
4
|
+
* Single entry point that wires every `pi.registerTool(...)` call site
|
|
5
|
+
* in the extension. Today that means two heavy tools:
|
|
6
|
+
* • `team` — the multi-agent orchestration tool (team-tool.ts).
|
|
7
|
+
* • subagent tools — agent spawn tool + result-join helpers
|
|
8
|
+
* (subagent-tools.ts).
|
|
9
|
+
*
|
|
10
|
+
* The actual tool handlers live in `registration/team-tool.ts` and
|
|
11
|
+
* `registration/subagent-tools.ts` (already extracted); this file is
|
|
12
|
+
* the orchestrator-level wrapper that calls them with the right deps.
|
|
13
|
+
*/
|
|
14
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
15
|
+
import type { RegistrationContext } from "./registration-types.ts";
|
|
16
|
+
import { registerSubagentTools } from "./subagent-tools.ts";
|
|
17
|
+
import { registerTeamTool } from "./team-tool.ts";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Register all pi-crew tools on the ExtensionAPI.
|
|
21
|
+
*
|
|
22
|
+
* Pulls every dependency the underlying tools need off `ctx`. The
|
|
23
|
+
* orchestrator guarantees those fields are populated before this call
|
|
24
|
+
* (see registerPiTeams in ../register.ts).
|
|
25
|
+
*/
|
|
26
|
+
export function registerPiTools(pi: ExtensionAPI, ctx: RegistrationContext): void {
|
|
27
|
+
registerTeamTool(pi, {
|
|
28
|
+
foregroundControllers: ctx.foregroundControllers,
|
|
29
|
+
startForegroundRun: ctx.startForegroundRun,
|
|
30
|
+
abortForegroundRun: ctx.abortForegroundRun,
|
|
31
|
+
openLiveSidebar: ctx.openLiveSidebar,
|
|
32
|
+
getManifestCache: ctx.getManifestCache,
|
|
33
|
+
getRunSnapshotCache: ctx.getRunSnapshotCache,
|
|
34
|
+
getMetricRegistry: () => ctx.observabilityState.metricRegistry,
|
|
35
|
+
widgetState: ctx.widgetState,
|
|
36
|
+
onJsonEvent: (taskId, runId, event) => {
|
|
37
|
+
const record = event as Record<string, unknown>;
|
|
38
|
+
const eventType = typeof record.type === "string" ? record.type : undefined;
|
|
39
|
+
if (eventType) ctx.lifecycleState.overflowTracker?.feedEvent(taskId, runId, eventType);
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
registerSubagentTools(pi, ctx.subagentManager, {
|
|
43
|
+
ownerSessionGeneration: ctx.captureSessionGeneration,
|
|
44
|
+
// Subagent options only type-check against `unknown` for ctx; cast
|
|
45
|
+
// back to ExtensionContext since the subagent tool re-validates.
|
|
46
|
+
startForegroundRun: (subCtx, runner, runId) =>
|
|
47
|
+
ctx.startForegroundRun(subCtx as Parameters<typeof ctx.startForegroundRun>[0], runner, runId),
|
|
48
|
+
batchBarrier: ctx.batchBarrier,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI installer (H3 + L2 — Phase 4 of cleanup plan).
|
|
3
|
+
*
|
|
4
|
+
* Owns the dashboard / sidebar / powerbar overlay logic that is gated on
|
|
5
|
+
* the user actually opening the dashboard (autoOpenDashboard flag) or a
|
|
6
|
+
* foreground run starting.
|
|
7
|
+
*
|
|
8
|
+
* Extracted from src/extension/register.ts. State holder is `UiState`;
|
|
9
|
+
* installer is `installLiveSidebar(ctx, runId, state, deps)`.
|
|
10
|
+
*
|
|
11
|
+
* Lazy by construction: the LiveRunSidebar class (and its transcript-viewer
|
|
12
|
+
* dependency tree) is only loaded when the user opens a sidebar overlay.
|
|
13
|
+
*/
|
|
14
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
15
|
+
import { loadConfig } from "../../config/config.ts";
|
|
16
|
+
import { DEFAULT_UI } from "../../config/defaults.ts";
|
|
17
|
+
import type { LiveRunSidebar as LiveRunSidebarType } from "../../ui/live-run-sidebar.ts";
|
|
18
|
+
import { requestRender, setExtensionWidget, showCustom } from "../../ui/pi-ui-compat.ts";
|
|
19
|
+
import {
|
|
20
|
+
clearPiCrewPowerbar,
|
|
21
|
+
registerPiCrewPowerbarSegments,
|
|
22
|
+
requestPowerbarUpdate,
|
|
23
|
+
resetPowerbarDedupState,
|
|
24
|
+
updatePiCrewPowerbar,
|
|
25
|
+
} from "../../ui/powerbar-publisher.ts";
|
|
26
|
+
import type { CrewWidgetState } from "../../ui/widget/index.ts";
|
|
27
|
+
import { stopCrewWidget, updateCrewWidget } from "../../ui/widget/index.ts";
|
|
28
|
+
import { logInternalError } from "../../utils/internal-error.ts";
|
|
29
|
+
|
|
30
|
+
/** Cached live-run-sidebar constructor (lazy-loaded on first overlay open). */
|
|
31
|
+
let _cachedLiveRunSidebar: typeof LiveRunSidebarType | undefined;
|
|
32
|
+
async function importLiveRunSidebar(): Promise<typeof LiveRunSidebarType> {
|
|
33
|
+
if (!_cachedLiveRunSidebar) {
|
|
34
|
+
// LAZY: defer LiveRunSidebar import until the user opens a sidebar overlay.
|
|
35
|
+
const mod = await import("../../ui/live-run-sidebar.ts");
|
|
36
|
+
_cachedLiveRunSidebar = mod.LiveRunSidebar;
|
|
37
|
+
}
|
|
38
|
+
return _cachedLiveRunSidebar;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Mutable state owned by register.ts. */
|
|
42
|
+
export interface UiState {
|
|
43
|
+
liveSidebarRunId: string | undefined;
|
|
44
|
+
dashboardOpened: boolean;
|
|
45
|
+
/** True while the full RunDashboard overlay (/team-dashboard) is open.
|
|
46
|
+
* Checked by the global renderTick to skip crew-widget updates while the
|
|
47
|
+
* dashboard obscures the widget (mirrors the liveSidebarRunId gate). */
|
|
48
|
+
dashboardOpen?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Dependencies passed in by register.ts. */
|
|
52
|
+
export interface UiDeps {
|
|
53
|
+
pi: ExtensionAPI;
|
|
54
|
+
widgetState: CrewWidgetState;
|
|
55
|
+
getManifestCache: (cwd: string) => ReturnType<typeof import("../../runtime/manifest-cache.ts").createManifestCache>;
|
|
56
|
+
getRunSnapshotCache: (cwd: string) => ReturnType<typeof import("../../ui/run-snapshot-cache.ts").createRunSnapshotCache>;
|
|
57
|
+
isCleanedUp: () => boolean;
|
|
58
|
+
getCurrentCtx: () => ExtensionContext | undefined;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Open the live-run sidebar overlay if autoOpenDashboard is enabled. Gated by
|
|
63
|
+
* ui.autoOpenDashboard / autoOpenDashboardForForegroundRuns / placement.
|
|
64
|
+
*
|
|
65
|
+
* Returns true if the sidebar was opened (or was already open for this runId),
|
|
66
|
+
* false if gated off.
|
|
67
|
+
*/
|
|
68
|
+
export async function installLiveSidebar(ctx: ExtensionContext, runId: string, state: UiState, deps: UiDeps): Promise<boolean> {
|
|
69
|
+
const uiConfig = loadConfig(ctx.cwd).config.ui;
|
|
70
|
+
const autoOpen = uiConfig?.autoOpenDashboard === true;
|
|
71
|
+
const foregroundAutoOpen = uiConfig?.autoOpenDashboardForForegroundRuns ?? DEFAULT_UI.autoOpenDashboardForForegroundRuns;
|
|
72
|
+
if (!ctx.hasUI || !autoOpen || !foregroundAutoOpen || (uiConfig?.dashboardPlacement ?? DEFAULT_UI.dashboardPlacement) !== "right") {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
if (state.liveSidebarRunId === runId) return true;
|
|
76
|
+
state.liveSidebarRunId = runId;
|
|
77
|
+
state.dashboardOpened = true;
|
|
78
|
+
const widgetPlacement = uiConfig?.widgetPlacement ?? DEFAULT_UI.widgetPlacement;
|
|
79
|
+
setExtensionWidget(ctx, "pi-crew", undefined, { placement: widgetPlacement });
|
|
80
|
+
setExtensionWidget(ctx, "pi-crew-active", undefined, { placement: widgetPlacement });
|
|
81
|
+
deps.widgetState.lastVisibility = "hidden";
|
|
82
|
+
deps.widgetState.lastPlacement = widgetPlacement;
|
|
83
|
+
deps.widgetState.lastKey = "pi-crew-active";
|
|
84
|
+
deps.widgetState.model = undefined;
|
|
85
|
+
const width = Math.min(90, Math.max(40, uiConfig?.dashboardWidth ?? DEFAULT_UI.dashboardWidth));
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
const LiveRunSidebar = await importLiveRunSidebar();
|
|
89
|
+
if (deps.isCleanedUp() || !deps.getCurrentCtx()) return false;
|
|
90
|
+
void showCustom<undefined>(
|
|
91
|
+
ctx,
|
|
92
|
+
(_tui, theme, _keybindings, done) =>
|
|
93
|
+
new LiveRunSidebar({
|
|
94
|
+
cwd: ctx.cwd,
|
|
95
|
+
runId,
|
|
96
|
+
done,
|
|
97
|
+
theme,
|
|
98
|
+
config: uiConfig,
|
|
99
|
+
snapshotCache: deps.getRunSnapshotCache(ctx.cwd),
|
|
100
|
+
}),
|
|
101
|
+
{
|
|
102
|
+
overlay: true,
|
|
103
|
+
overlayOptions: {
|
|
104
|
+
width,
|
|
105
|
+
minWidth: 40,
|
|
106
|
+
maxHeight: "100%",
|
|
107
|
+
anchor: "top-right",
|
|
108
|
+
offsetX: 0,
|
|
109
|
+
offsetY: 0,
|
|
110
|
+
margin: { top: 0, right: 0, bottom: 0, left: 0 },
|
|
111
|
+
visible: (termWidth: number) => termWidth >= 100,
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
).finally(() => {
|
|
115
|
+
if (state.liveSidebarRunId === runId) state.liveSidebarRunId = undefined;
|
|
116
|
+
const c = deps.getCurrentCtx();
|
|
117
|
+
if (!c) return;
|
|
118
|
+
updateCrewWidget(
|
|
119
|
+
c,
|
|
120
|
+
deps.widgetState,
|
|
121
|
+
loadConfig(c.cwd).config.ui,
|
|
122
|
+
deps.getManifestCache(c.cwd),
|
|
123
|
+
deps.getRunSnapshotCache(c.cwd),
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
return true;
|
|
127
|
+
} catch (error) {
|
|
128
|
+
logInternalError("register.live-sidebar-lazy-import", error);
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Clear the powerbar (called on session switch). */
|
|
134
|
+
export function clearDashboardPowerbar(state: UiState, deps: UiDeps): void {
|
|
135
|
+
const c = deps.getCurrentCtx();
|
|
136
|
+
if (c) stopCrewWidget(c, deps.widgetState, loadConfig(c.cwd).config.ui);
|
|
137
|
+
clearPiCrewPowerbar(deps.pi.events);
|
|
138
|
+
resetPowerbarDedupState();
|
|
139
|
+
state.dashboardOpened = false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Register powerbar segments for a session. Idempotent. */
|
|
143
|
+
export function registerPowerbarSegments(deps: UiDeps, uiConfig: unknown): void {
|
|
144
|
+
registerPiCrewPowerbarSegments(deps.pi.events, uiConfig as Parameters<typeof registerPiCrewPowerbarSegments>[1]);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Push a powerbar update with current run state. */
|
|
148
|
+
export function pushPowerbarUpdate(ctx: ExtensionContext, deps: UiDeps, notificationCount: number): void {
|
|
149
|
+
const config = loadConfig(ctx.cwd).config.ui;
|
|
150
|
+
requestPowerbarUpdate(
|
|
151
|
+
deps.pi.events,
|
|
152
|
+
ctx.cwd,
|
|
153
|
+
config,
|
|
154
|
+
deps.getManifestCache(ctx.cwd),
|
|
155
|
+
deps.getRunSnapshotCache(ctx.cwd),
|
|
156
|
+
ctx,
|
|
157
|
+
notificationCount,
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Initial powerbar update after session_start. */
|
|
162
|
+
export function primePowerbarAndWidget(ctx: ExtensionContext, deps: UiDeps, notificationCount: number): void {
|
|
163
|
+
const uiConfig = loadConfig(ctx.cwd).config.ui;
|
|
164
|
+
const cache = deps.getManifestCache(ctx.cwd);
|
|
165
|
+
updateCrewWidget(ctx, deps.widgetState, uiConfig, cache, deps.getRunSnapshotCache(ctx.cwd));
|
|
166
|
+
updatePiCrewPowerbar(deps.pi.events, ctx.cwd, uiConfig, cache, deps.getRunSnapshotCache(ctx.cwd), ctx, notificationCount);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Force-render the current context (used by sidebar open path). */
|
|
170
|
+
export function requestUiRender(ctx: ExtensionContext): void {
|
|
171
|
+
requestRender(ctx);
|
|
172
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { loadConfig } from "../../config/config.ts";
|
|
3
|
+
import { readCrewAgents } from "../../runtime/crew-agent-records.ts";
|
|
4
|
+
import { listLiveAgents } from "../../runtime/live-agent-manager.ts";
|
|
5
|
+
import { loadRunManifestById } from "../../state/state-store.ts";
|
|
6
|
+
import { LiveConversationOverlay } from "../../ui/live-conversation-overlay.ts";
|
|
7
|
+
import { asCrewTheme } from "../../ui/theme-adapter.ts";
|
|
8
|
+
// Lazy-loaded: DurableTranscriptViewer is 658ms — only needed for /crew transcript command
|
|
9
|
+
import type { DurableTranscriptViewer as DurableTranscriptViewerType } from "../../ui/transcript-viewer.ts";
|
|
10
|
+
|
|
11
|
+
let _cachedViewer: typeof DurableTranscriptViewerType | undefined;
|
|
12
|
+
let _viewerPromise: Promise<typeof DurableTranscriptViewerType> | undefined;
|
|
13
|
+
async function getViewer(): Promise<typeof DurableTranscriptViewerType> {
|
|
14
|
+
if (_cachedViewer) return _cachedViewer;
|
|
15
|
+
if (!_viewerPromise) {
|
|
16
|
+
_viewerPromise = import("../../ui/transcript-viewer.ts").then((mod) => {
|
|
17
|
+
_cachedViewer = mod.DurableTranscriptViewer;
|
|
18
|
+
return mod.DurableTranscriptViewer;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return _viewerPromise;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function selectAgentTask(
|
|
25
|
+
ctx: ExtensionCommandContext,
|
|
26
|
+
runId: string | undefined,
|
|
27
|
+
taskId?: string,
|
|
28
|
+
): Promise<{ runId: string; taskId?: string } | undefined> {
|
|
29
|
+
if (!runId) return undefined;
|
|
30
|
+
if (taskId) return { runId, taskId };
|
|
31
|
+
const loaded = loadRunManifestById(ctx.cwd, runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
|
|
32
|
+
if (!loaded) return { runId };
|
|
33
|
+
const agents = readCrewAgents(loaded.manifest);
|
|
34
|
+
if (ctx.hasUI && agents.length > 1) {
|
|
35
|
+
const choice = await ctx.ui.select(
|
|
36
|
+
"Select pi-crew agent",
|
|
37
|
+
agents.map((agent) => `${agent.taskId} ${agent.role}→${agent.agent} [${agent.status}]`),
|
|
38
|
+
);
|
|
39
|
+
return { runId, taskId: choice?.split(" ")[0] };
|
|
40
|
+
}
|
|
41
|
+
return { runId, taskId: agents[0]?.taskId };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function openTranscriptViewer(
|
|
45
|
+
ctx: ExtensionCommandContext,
|
|
46
|
+
initialRunId: string | undefined,
|
|
47
|
+
initialTaskId?: string,
|
|
48
|
+
): Promise<boolean> {
|
|
49
|
+
const selected = await selectAgentTask(ctx, initialRunId, initialTaskId);
|
|
50
|
+
if (!selected) return false;
|
|
51
|
+
const runId = selected.runId;
|
|
52
|
+
const taskId = selected.taskId;
|
|
53
|
+
if (!runId || !ctx.hasUI) return false;
|
|
54
|
+
const loaded = loadRunManifestById(ctx.cwd, runId); // NOTE: no withRunLock - best-effort only; concurrent writes may cause inconsistency
|
|
55
|
+
if (!loaded) return false;
|
|
56
|
+
const uiConfig = loadConfig(ctx.cwd).config.ui;
|
|
57
|
+
const DurableTranscriptViewer = await getViewer();
|
|
58
|
+
await ctx.ui.custom<undefined>(
|
|
59
|
+
(_tui, theme, _keybindings, done) =>
|
|
60
|
+
new DurableTranscriptViewer(loaded.manifest, theme, done, taskId, {
|
|
61
|
+
maxTailBytes: uiConfig?.transcriptTailBytes,
|
|
62
|
+
}),
|
|
63
|
+
{
|
|
64
|
+
overlay: true,
|
|
65
|
+
overlayOptions: {
|
|
66
|
+
width: "90%",
|
|
67
|
+
maxHeight: "85%",
|
|
68
|
+
anchor: "center",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** R2: Open live conversation overlay for a running live-session agent. */
|
|
76
|
+
export async function openLiveConversation(
|
|
77
|
+
ctx: ExtensionCommandContext,
|
|
78
|
+
initialRunId: string | undefined,
|
|
79
|
+
initialTaskId?: string,
|
|
80
|
+
): Promise<boolean> {
|
|
81
|
+
const selected = await selectAgentTask(ctx, initialRunId, initialTaskId);
|
|
82
|
+
if (!selected || !ctx.hasUI) return false;
|
|
83
|
+
const liveAgents = listLiveAgents();
|
|
84
|
+
const handle = liveAgents.find((h) => h.runId === selected.runId && (selected.taskId ? h.taskId === selected.taskId : true));
|
|
85
|
+
if (!handle) return false;
|
|
86
|
+
const theme = asCrewTheme({});
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
await ctx.ui.custom<undefined>(
|
|
89
|
+
(tui: any, _theme: any, _keybindings: any, done: (result: undefined) => void) => {
|
|
90
|
+
const columns = tui?.terminal?.columns ?? 80;
|
|
91
|
+
const rows = tui?.terminal?.rows ?? 24;
|
|
92
|
+
const overlay = new LiveConversationOverlay(handle, theme, columns, rows);
|
|
93
|
+
return {
|
|
94
|
+
render(width: number) {
|
|
95
|
+
return overlay.render(width);
|
|
96
|
+
},
|
|
97
|
+
handleInput(data: string) {
|
|
98
|
+
if (data === "\x1b" || data === "q") {
|
|
99
|
+
overlay.close();
|
|
100
|
+
done(undefined);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
invalidate() {
|
|
104
|
+
/* overlay polls */
|
|
105
|
+
},
|
|
106
|
+
dispose() {
|
|
107
|
+
overlay.dispose();
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
overlay: true,
|
|
113
|
+
overlayOptions: {
|
|
114
|
+
width: "90%",
|
|
115
|
+
maxHeight: "85%",
|
|
116
|
+
anchor: "center",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
);
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-extension wiring helper.
|
|
3
|
+
*
|
|
4
|
+
* Two small wires:
|
|
5
|
+
* • wireRpc — the in-process pi-crew RPC handle (other modules in
|
|
6
|
+
* the same extension can subscribe via `pi.events`).
|
|
7
|
+
* • wireGlobalRegistry — the cross-extension crew global registry,
|
|
8
|
+
* lazily loaded from team-tool.ts (heavy module) and installed under
|
|
9
|
+
* `globalThis[Symbol.for("pi-crew:registry")]` so peer extensions
|
|
10
|
+
* (e.g., pi-subagents3) can discover pi-crew at runtime.
|
|
11
|
+
*/
|
|
12
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
13
|
+
import { registerPiCrewRpc } from "../cross-extension-rpc.ts";
|
|
14
|
+
import type { RegistrationContext } from "./registration-types.ts";
|
|
15
|
+
|
|
16
|
+
/** Install both wires on the registration context. */
|
|
17
|
+
export function installCrossExtensionWiring(pi: ExtensionAPI, ctx: RegistrationContext): void {
|
|
18
|
+
// Wire the in-process RPC handle.
|
|
19
|
+
const getPiEvents = (): Parameters<typeof registerPiCrewRpc>[0] | undefined => {
|
|
20
|
+
if (pi && typeof pi === "object" && "events" in pi) {
|
|
21
|
+
return (pi as { events?: Parameters<typeof registerPiCrewRpc>[0] }).events;
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
};
|
|
25
|
+
ctx.rpcHandle = registerPiCrewRpc(getPiEvents(), () => ctx.currentCtx);
|
|
26
|
+
|
|
27
|
+
// Install the cross-extension crew global registry. Lazy import keeps
|
|
28
|
+
// team-tool.ts (which pulls in the entire runtime chain) out of the
|
|
29
|
+
// cold-start module graph.
|
|
30
|
+
void import("../team-tool.ts").then(({ installCrewGlobalRegistry }) => {
|
|
31
|
+
const manifestCacheForRegistry = ctx.getManifestCache(ctx.currentCtx?.cwd ?? process.cwd());
|
|
32
|
+
installCrewGlobalRegistry({
|
|
33
|
+
manifestCache: manifestCacheForRegistry,
|
|
34
|
+
cwdProvider: () => ctx.currentCtx?.cwd ?? process.cwd(),
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { buildCompletionKey, getGlobalSeenMap, markSeenWithTtl } from "../utils/completion-dedupe.ts";
|
|
4
|
+
import { createFileCoalescer } from "../utils/file-coalescer.ts";
|
|
5
|
+
import { closeWatcher, watchWithErrorHandler } from "../utils/fs-watch.ts";
|
|
6
|
+
import { logInternalError } from "../utils/internal-error.ts";
|
|
7
|
+
|
|
8
|
+
export interface ResultWatcherEvents {
|
|
9
|
+
emit(event: string, data: unknown): void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ResultWatcherHandle {
|
|
13
|
+
start(): void;
|
|
14
|
+
prime(): void;
|
|
15
|
+
stop(): void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface ResultWatcherDependencies {
|
|
19
|
+
watch?: typeof watchWithErrorHandler;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ResultWatcherOptions extends ResultWatcherDependencies {
|
|
23
|
+
eventName?: string;
|
|
24
|
+
completionTtlMs?: number;
|
|
25
|
+
isCurrent?: () => boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const RESULT_WATCHER_RESTART_MS = 3000;
|
|
29
|
+
const RESULT_WATCHER_POLL_MS = 1000;
|
|
30
|
+
|
|
31
|
+
function shouldFallBackToPolling(error: unknown): boolean {
|
|
32
|
+
const code = error && typeof error === "object" ? (error as { code?: unknown }).code : undefined;
|
|
33
|
+
return code === "EMFILE" || code === "ENOSPC" || code === "EPERM";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function readJson(filePath: string): unknown | undefined {
|
|
37
|
+
try {
|
|
38
|
+
return JSON.parse(fs.readFileSync(filePath, "utf-8")) as unknown;
|
|
39
|
+
} catch (error) {
|
|
40
|
+
logInternalError("result-watcher.parse", error, `filePath=${filePath}`);
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function createResultWatcher(
|
|
46
|
+
events: ResultWatcherEvents,
|
|
47
|
+
resultsDir: string,
|
|
48
|
+
eventNameOrOptions: string | ResultWatcherOptions = "pi-crew:run-result",
|
|
49
|
+
): ResultWatcherHandle {
|
|
50
|
+
const options: ResultWatcherOptions = typeof eventNameOrOptions === "string" ? { eventName: eventNameOrOptions } : eventNameOrOptions;
|
|
51
|
+
const eventName = options.eventName ?? "pi-crew:run-result";
|
|
52
|
+
const completionTtlMs = options.completionTtlMs ?? 5 * 60_000;
|
|
53
|
+
const watch = options.watch ?? watchWithErrorHandler;
|
|
54
|
+
const isCurrent = options.isCurrent ?? (() => true);
|
|
55
|
+
const seen = getGlobalSeenMap("pi-crew.result-watcher");
|
|
56
|
+
let watcher: fs.FSWatcher | null | undefined;
|
|
57
|
+
let restartTimer: ReturnType<typeof setTimeout> | undefined;
|
|
58
|
+
let pollTimer: ReturnType<typeof setInterval> | undefined;
|
|
59
|
+
const coalescer = createFileCoalescer((file) => {
|
|
60
|
+
if (!isCurrent()) return;
|
|
61
|
+
const filePath = path.join(resultsDir, file);
|
|
62
|
+
if (!file.endsWith(".json") || !fs.existsSync(filePath)) return;
|
|
63
|
+
const payload = readJson(filePath);
|
|
64
|
+
if (payload === undefined) {
|
|
65
|
+
coalescer.schedule(file, RESULT_WATCHER_POLL_MS);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const key = buildCompletionKey(
|
|
69
|
+
payload && typeof payload === "object" && !Array.isArray(payload) ? (payload as Record<string, unknown>) : {},
|
|
70
|
+
`file:${file}`,
|
|
71
|
+
);
|
|
72
|
+
if (!markSeenWithTtl(seen, key, Date.now(), completionTtlMs)) {
|
|
73
|
+
events.emit(eventName, payload);
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
fs.unlinkSync(filePath);
|
|
77
|
+
} catch (error) {
|
|
78
|
+
logInternalError("result-watcher.unlink", error, `filePath=${filePath}`);
|
|
79
|
+
}
|
|
80
|
+
}, 50);
|
|
81
|
+
const poll = () => {
|
|
82
|
+
if (!isCurrent() || !fs.existsSync(resultsDir)) return;
|
|
83
|
+
for (const file of fs.readdirSync(resultsDir).filter((entry) => entry.endsWith(".json"))) coalescer.schedule(file, 0);
|
|
84
|
+
};
|
|
85
|
+
const startPolling = () => {
|
|
86
|
+
if (pollTimer) return;
|
|
87
|
+
pollTimer = setInterval(poll, RESULT_WATCHER_POLL_MS);
|
|
88
|
+
pollTimer.unref();
|
|
89
|
+
poll();
|
|
90
|
+
};
|
|
91
|
+
const stopPolling = () => {
|
|
92
|
+
if (pollTimer) clearInterval(pollTimer);
|
|
93
|
+
pollTimer = undefined;
|
|
94
|
+
};
|
|
95
|
+
const scheduleRestart = (error?: unknown) => {
|
|
96
|
+
if (shouldFallBackToPolling(error)) startPolling();
|
|
97
|
+
if (restartTimer) clearTimeout(restartTimer);
|
|
98
|
+
restartTimer = setTimeout(() => {
|
|
99
|
+
restartTimer = undefined;
|
|
100
|
+
try {
|
|
101
|
+
if (!isCurrent()) return;
|
|
102
|
+
fs.mkdirSync(resultsDir, { recursive: true });
|
|
103
|
+
handle.start();
|
|
104
|
+
} catch (error) {
|
|
105
|
+
logInternalError("result-watcher.restart", error, `resultsDir=${resultsDir}`);
|
|
106
|
+
}
|
|
107
|
+
}, RESULT_WATCHER_RESTART_MS);
|
|
108
|
+
restartTimer.unref();
|
|
109
|
+
};
|
|
110
|
+
const handle: ResultWatcherHandle = {
|
|
111
|
+
start() {
|
|
112
|
+
if (!isCurrent()) return;
|
|
113
|
+
fs.mkdirSync(resultsDir, { recursive: true });
|
|
114
|
+
if (watcher) closeWatcher(watcher);
|
|
115
|
+
watcher = watch(
|
|
116
|
+
resultsDir,
|
|
117
|
+
(event, fileName) => {
|
|
118
|
+
if (event !== "rename" || !fileName) return;
|
|
119
|
+
coalescer.schedule(fileName.toString());
|
|
120
|
+
},
|
|
121
|
+
scheduleRestart,
|
|
122
|
+
);
|
|
123
|
+
if (watcher) stopPolling();
|
|
124
|
+
watcher?.unref();
|
|
125
|
+
},
|
|
126
|
+
prime() {
|
|
127
|
+
poll();
|
|
128
|
+
},
|
|
129
|
+
stop() {
|
|
130
|
+
if (restartTimer) clearTimeout(restartTimer);
|
|
131
|
+
restartTimer = undefined;
|
|
132
|
+
closeWatcher(watcher);
|
|
133
|
+
watcher = undefined;
|
|
134
|
+
stopPolling();
|
|
135
|
+
coalescer.clear();
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
return handle;
|
|
139
|
+
}
|