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,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pi UI theme discovery and selection.
|
|
3
|
+
*
|
|
4
|
+
* Exposes:
|
|
5
|
+
* - Pi UI theme discovery (builtins + custom ~/.pi/agent/themes/*.json)
|
|
6
|
+
* - The active Pi theme
|
|
7
|
+
* - setPiTheme() to persist a choice in ~/.pi/agent/settings.json
|
|
8
|
+
*
|
|
9
|
+
* Wired into the `team-settings themes` / `theme` subcommands.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export interface PiThemeInfo {
|
|
13
|
+
/** Theme name (filename stem or builtin id). */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Where it comes from. */
|
|
16
|
+
source: "builtin" | "custom";
|
|
17
|
+
/** Absolute path to the .json file, if applicable. */
|
|
18
|
+
path?: string;
|
|
19
|
+
/** Human-friendly display name from the JSON `name` field, if present. */
|
|
20
|
+
displayName?: string;
|
|
21
|
+
/** "dark" or "light" — derived from background luminance. */
|
|
22
|
+
mode?: "dark" | "light";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Builtin Pi themes shipped with the pi-coding-agent package. */
|
|
26
|
+
const BUILTIN_PI_THEMES = ["dark", "light"];
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Detect whether a theme is dark or light based on its background luminance.
|
|
30
|
+
* Reads vars.bg or export.pageBg or a resolved colors ref. Returns undefined
|
|
31
|
+
* if it can't be determined.
|
|
32
|
+
*/
|
|
33
|
+
function detectThemeMode(json: Record<string, unknown>): "dark" | "light" | undefined {
|
|
34
|
+
const vars = json.vars as Record<string, string> | undefined;
|
|
35
|
+
const bgRaw = vars?.bg;
|
|
36
|
+
if (!bgRaw || !/^#[0-9a-fA-F]{6}$/.test(bgRaw)) return undefined;
|
|
37
|
+
const r = parseInt(bgRaw.slice(1, 3), 16);
|
|
38
|
+
const g = parseInt(bgRaw.slice(3, 5), 16);
|
|
39
|
+
const b = parseInt(bgRaw.slice(5, 7), 16);
|
|
40
|
+
// Relative luminance (ITU-R BT.709)
|
|
41
|
+
const lum = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;
|
|
42
|
+
return lum < 0.5 ? "dark" : "light";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function customThemesDir(): string {
|
|
46
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
47
|
+
return home ? `${home}/.pi/agent/themes` : "";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function settingsPath(): string {
|
|
51
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
52
|
+
return home ? `${home}/.pi/agent/settings.json` : "";
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Discover all available Pi UI themes (builtins + custom). */
|
|
56
|
+
export function discoverPiThemes(): PiThemeInfo[] {
|
|
57
|
+
const out: PiThemeInfo[] = [];
|
|
58
|
+
const seen = new Set<string>();
|
|
59
|
+
|
|
60
|
+
// Builtins
|
|
61
|
+
for (const name of BUILTIN_PI_THEMES) {
|
|
62
|
+
if (seen.has(name)) continue;
|
|
63
|
+
seen.add(name);
|
|
64
|
+
out.push({
|
|
65
|
+
name,
|
|
66
|
+
source: "builtin",
|
|
67
|
+
displayName: name,
|
|
68
|
+
mode: name === "light" ? "light" : "dark",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Custom themes from ~/.pi/agent/themes/
|
|
73
|
+
const dir = customThemesDir();
|
|
74
|
+
try {
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
76
|
+
const fs = require("node:fs");
|
|
77
|
+
if (dir && fs.existsSync(dir)) {
|
|
78
|
+
for (const file of fs.readdirSync(dir) as string[]) {
|
|
79
|
+
if (!file.endsWith(".json")) continue;
|
|
80
|
+
const name = file.slice(0, -5);
|
|
81
|
+
if (seen.has(name)) continue;
|
|
82
|
+
const fullPath = `${dir}/${file}`;
|
|
83
|
+
let displayName: string | undefined;
|
|
84
|
+
let mode: "dark" | "light" | undefined;
|
|
85
|
+
try {
|
|
86
|
+
const json = JSON.parse(fs.readFileSync(fullPath, "utf8"));
|
|
87
|
+
displayName = typeof json.name === "string" ? json.name : undefined;
|
|
88
|
+
mode = detectThemeMode(json);
|
|
89
|
+
} catch {
|
|
90
|
+
// keep undefined
|
|
91
|
+
}
|
|
92
|
+
seen.add(name);
|
|
93
|
+
out.push({
|
|
94
|
+
name,
|
|
95
|
+
source: "custom",
|
|
96
|
+
path: fullPath,
|
|
97
|
+
displayName,
|
|
98
|
+
mode,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
} catch {
|
|
103
|
+
// directory unreadable — skip
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Read the currently active Pi theme from ~/.pi/agent/settings.json. */
|
|
110
|
+
export function getActivePiTheme(): string | undefined {
|
|
111
|
+
try {
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
113
|
+
const fs = require("node:fs");
|
|
114
|
+
const p = settingsPath();
|
|
115
|
+
if (!p || !fs.existsSync(p)) return undefined;
|
|
116
|
+
const json = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
117
|
+
return typeof json.theme === "string" ? json.theme : undefined;
|
|
118
|
+
} catch {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Persist a Pi theme choice in ~/.pi/agent/settings.json. Returns the path or throws. */
|
|
124
|
+
export function setPiTheme(name: string): string {
|
|
125
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
126
|
+
const fs = require("node:fs");
|
|
127
|
+
const p = settingsPath();
|
|
128
|
+
if (!p) throw new Error("Could not determine settings path (no HOME).");
|
|
129
|
+
let settings: Record<string, unknown> = {};
|
|
130
|
+
try {
|
|
131
|
+
if (fs.existsSync(p)) {
|
|
132
|
+
settings = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
133
|
+
}
|
|
134
|
+
} catch {
|
|
135
|
+
// corrupt settings — start fresh
|
|
136
|
+
settings = {};
|
|
137
|
+
}
|
|
138
|
+
settings.theme = name;
|
|
139
|
+
fs.writeFileSync(p, JSON.stringify(settings, null, 2) + "\n", "utf8");
|
|
140
|
+
return p;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// Formatted listing for `team-settings themes`
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Build the full formatted listing of Pi UI themes for display.
|
|
149
|
+
* Shows available themes, the active selection, and switching instructions.
|
|
150
|
+
*/
|
|
151
|
+
export function formatThemesListing(): string {
|
|
152
|
+
const piThemes = discoverPiThemes();
|
|
153
|
+
const activePi = getActivePiTheme();
|
|
154
|
+
const lines: string[] = [];
|
|
155
|
+
|
|
156
|
+
const darkThemes = piThemes.filter((t) => t.mode !== "light");
|
|
157
|
+
const lightThemes = piThemes.filter((t) => t.mode === "light");
|
|
158
|
+
|
|
159
|
+
lines.push("═══ Theme Gallery ═══");
|
|
160
|
+
lines.push("");
|
|
161
|
+
|
|
162
|
+
// ── Dark themes ──
|
|
163
|
+
if (darkThemes.length) {
|
|
164
|
+
lines.push("Dark themes:");
|
|
165
|
+
lines.push("");
|
|
166
|
+
for (const t of darkThemes) {
|
|
167
|
+
lines.push(themeLine(t, activePi));
|
|
168
|
+
}
|
|
169
|
+
lines.push("");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// ── Light themes ──
|
|
173
|
+
if (lightThemes.length) {
|
|
174
|
+
lines.push("Light themes:");
|
|
175
|
+
lines.push("");
|
|
176
|
+
for (const t of lightThemes) {
|
|
177
|
+
lines.push(themeLine(t, activePi));
|
|
178
|
+
}
|
|
179
|
+
lines.push("");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
lines.push(" Switch (live, no restart): team-settings theme <name>");
|
|
183
|
+
lines.push(" Browse interactively: /team-settings → Themes tab");
|
|
184
|
+
lines.push("");
|
|
185
|
+
|
|
186
|
+
lines.push("Notes:");
|
|
187
|
+
lines.push(" • Switching applies live via ctx.ui.setTheme() (Pi redraws immediately).");
|
|
188
|
+
lines.push(" • Bundled crew-* themes deploy to ~/.pi/agent/themes/ on startup.");
|
|
189
|
+
lines.push(` • ${piThemes.length} themes available (${darkThemes.length} dark, ${lightThemes.length} light).`);
|
|
190
|
+
|
|
191
|
+
return lines.join("\n");
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function themeLine(t: PiThemeInfo, active: string | undefined): string {
|
|
195
|
+
const isActive = t.name === active;
|
|
196
|
+
const tag = isActive ? " ← active" : "";
|
|
197
|
+
const src = t.source === "builtin" ? " (builtin)" : "";
|
|
198
|
+
return ` ${isActive ? "●" : "○"} ${t.name}${src}${tag}`;
|
|
199
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { CrewAgentRecord } from "../runtime/crew-agent-runtime.ts";
|
|
2
|
+
import type { TeamRunManifest, TeamTaskState } from "../state/types.ts";
|
|
3
|
+
|
|
4
|
+
export interface ToolProgressInput {
|
|
5
|
+
/** Subagent record id or synthetic agent label shown in the header. */
|
|
6
|
+
agentId?: string;
|
|
7
|
+
/** Subagent/run status string ("queued", "running", "blocked", ...). */
|
|
8
|
+
status: string;
|
|
9
|
+
/** Optional run id once the underlying team run has been created. */
|
|
10
|
+
runId?: string;
|
|
11
|
+
/** Timestamp (ms) when the parent tool call started. */
|
|
12
|
+
startedAt: number;
|
|
13
|
+
/** Optional manifest snapshot for richer detail. */
|
|
14
|
+
manifest?: TeamRunManifest;
|
|
15
|
+
/** Optional materialized task list for waiting/running counts. */
|
|
16
|
+
tasks?: TeamTaskState[];
|
|
17
|
+
/** Optional crew agent records to surface the currently active worker. */
|
|
18
|
+
agents?: CrewAgentRecord[];
|
|
19
|
+
/** Optional last error to surface (e.g. spawn failure). */
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const MAX_OUTPUT_LINE = 80;
|
|
24
|
+
|
|
25
|
+
function pickActiveAgent(agents: CrewAgentRecord[] | undefined): CrewAgentRecord | undefined {
|
|
26
|
+
if (!agents || agents.length === 0) return undefined;
|
|
27
|
+
return (
|
|
28
|
+
agents.find((agent) => agent.status === "running") ??
|
|
29
|
+
agents.find((agent) => agent.status === "waiting") ??
|
|
30
|
+
agents.find((agent) => agent.status === "queued") ??
|
|
31
|
+
agents[agents.length - 1]
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function totalTokens(agent: CrewAgentRecord): number {
|
|
36
|
+
const fromProgress = agent.progress?.tokens;
|
|
37
|
+
if (typeof fromProgress === "number" && fromProgress > 0) return fromProgress;
|
|
38
|
+
const usage = agent.usage;
|
|
39
|
+
if (!usage) return 0;
|
|
40
|
+
const input = typeof usage.input === "number" ? usage.input : 0;
|
|
41
|
+
const output = typeof usage.output === "number" ? usage.output : 0;
|
|
42
|
+
return input + output;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function trimLine(value: string): string {
|
|
46
|
+
const oneLine = value.replace(/\s+/g, " ").trim();
|
|
47
|
+
if (oneLine.length <= MAX_OUTPUT_LINE) return oneLine;
|
|
48
|
+
return `${oneLine.slice(0, MAX_OUTPUT_LINE - 3)}...`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function taskCounts(tasks: TeamTaskState[] | undefined): string | undefined {
|
|
52
|
+
if (!tasks || tasks.length === 0) return undefined;
|
|
53
|
+
const total = tasks.length;
|
|
54
|
+
const completed = tasks.filter((t) => t.status === "completed").length;
|
|
55
|
+
const buckets = new Map<string, number>();
|
|
56
|
+
for (const task of tasks) buckets.set(task.status, (buckets.get(task.status) ?? 0) + 1);
|
|
57
|
+
const summary = [...buckets.entries()].map(([status, count]) => `${status}=${count}`).join(" ");
|
|
58
|
+
return `tasks ${completed}/${total} done ${summary}`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Format a compact 3-4 line progress block used as streaming `onUpdate`
|
|
63
|
+
* content for the `Agent` and `team` tool calls. Keeps each line short so
|
|
64
|
+
* the chat widget overlay does not jitter.
|
|
65
|
+
*/
|
|
66
|
+
export function formatCompactToolProgress(input: ToolProgressInput): string {
|
|
67
|
+
const elapsedSec = Math.max(0, Math.round((Date.now() - input.startedAt) / 1000));
|
|
68
|
+
const head = input.agentId ? `agent=${input.agentId}` : "agent";
|
|
69
|
+
const lines: string[] = [`${head} status=${input.status} elapsed=${elapsedSec}s`];
|
|
70
|
+
|
|
71
|
+
const counts = taskCounts(input.tasks);
|
|
72
|
+
if (counts) lines.push(` ${counts}`);
|
|
73
|
+
|
|
74
|
+
const active = pickActiveAgent(input.agents);
|
|
75
|
+
if (active) {
|
|
76
|
+
const turns = active.progress?.turns ?? 0;
|
|
77
|
+
const tokens = totalTokens(active);
|
|
78
|
+
lines.push(` ${active.role}->${active.agent} turn=${turns} tokens=${tokens}`);
|
|
79
|
+
if (active.progress?.currentTool) {
|
|
80
|
+
const count = active.progress.toolCount ? ` (#${active.progress.toolCount})` : "";
|
|
81
|
+
lines.push(` tool: ${active.progress.currentTool}${count}`);
|
|
82
|
+
}
|
|
83
|
+
const recent = active.progress?.recentOutput?.at(-1);
|
|
84
|
+
if (recent?.trim()) lines.push(` ${trimLine(recent)}`);
|
|
85
|
+
} else if (input.runId && !counts) {
|
|
86
|
+
lines.push(` run=${input.runId} (starting)`);
|
|
87
|
+
} else if (input.error) {
|
|
88
|
+
lines.push(` error: ${trimLine(input.error)}`);
|
|
89
|
+
} else if (!counts) {
|
|
90
|
+
lines.push(" waiting for run to start");
|
|
91
|
+
}
|
|
92
|
+
return lines.join("\n");
|
|
93
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brief mode for tool result display.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by @ayulab/pi-brief — shows one-line summaries instead of
|
|
5
|
+
* full output. Toggled via /crew-brief on|off, state persists across
|
|
6
|
+
* session reloads via pi.appendEntry().
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { CrewAgentRecord } from "../../runtime/crew-agent-runtime.ts";
|
|
10
|
+
import { formatDuration, formatTokens, truncLine } from "../format-helpers.ts";
|
|
11
|
+
import type { CrewTheme } from "../theme-adapter.ts";
|
|
12
|
+
|
|
13
|
+
// ── State ──────────────────────────────────────────────────────────────
|
|
14
|
+
|
|
15
|
+
const BRIEF_ENTRY_TYPE = "pi-crew.brief-state";
|
|
16
|
+
let briefEnabled = false;
|
|
17
|
+
|
|
18
|
+
export function isBrief(): boolean {
|
|
19
|
+
return briefEnabled;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function setBrief(on: boolean): void {
|
|
23
|
+
briefEnabled = on;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Entry type for persisting brief state across session reloads. */
|
|
27
|
+
export interface BriefStateEntry {
|
|
28
|
+
readonly type: "custom";
|
|
29
|
+
readonly customType: typeof BRIEF_ENTRY_TYPE;
|
|
30
|
+
readonly data: { enabled: boolean };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function makeBriefEntry(enabled: boolean): BriefStateEntry {
|
|
34
|
+
return { type: "custom", customType: BRIEF_ENTRY_TYPE, data: { enabled } };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function restoreBriefState(entries: Iterable<unknown>): void {
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
if (
|
|
40
|
+
typeof entry === "object" &&
|
|
41
|
+
entry !== null &&
|
|
42
|
+
"type" in entry &&
|
|
43
|
+
(entry as Record<string, unknown>).type === "custom" &&
|
|
44
|
+
"customType" in entry &&
|
|
45
|
+
(entry as Record<string, unknown>).customType === BRIEF_ENTRY_TYPE &&
|
|
46
|
+
"data" in entry
|
|
47
|
+
) {
|
|
48
|
+
const data = (entry as Record<string, unknown>).data;
|
|
49
|
+
if (typeof data === "object" && data !== null && "enabled" in data) {
|
|
50
|
+
briefEnabled = !!(data as Record<string, unknown>).enabled;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { BRIEF_ENTRY_TYPE };
|
|
57
|
+
|
|
58
|
+
// ── Brief renderers ────────────────────────────────────────────────────
|
|
59
|
+
|
|
60
|
+
/** Brief summary for a single tool result. */
|
|
61
|
+
export function briefToolResult(toolName: string, result: { content?: unknown[] }, theme: CrewTheme): string {
|
|
62
|
+
const text = extractText(result?.content);
|
|
63
|
+
switch (toolName) {
|
|
64
|
+
case "read":
|
|
65
|
+
return briefRead(text, theme);
|
|
66
|
+
case "bash":
|
|
67
|
+
return briefBash(text, theme);
|
|
68
|
+
case "edit":
|
|
69
|
+
return briefEdit(text, theme);
|
|
70
|
+
case "write":
|
|
71
|
+
return briefWrite(text, theme);
|
|
72
|
+
case "find":
|
|
73
|
+
return briefFind(text, theme);
|
|
74
|
+
case "grep":
|
|
75
|
+
return briefGrep(text, theme);
|
|
76
|
+
case "ls":
|
|
77
|
+
return briefLs(text, theme);
|
|
78
|
+
case "team":
|
|
79
|
+
return briefTeam(result, theme);
|
|
80
|
+
case "agent":
|
|
81
|
+
return briefAgent(result, theme);
|
|
82
|
+
default:
|
|
83
|
+
return briefDefault(text, theme);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function briefRead(text: string, theme: CrewTheme): string {
|
|
88
|
+
if (!text) return theme.fg("dim", "→ empty");
|
|
89
|
+
const count = text.trim().split("\n").filter(Boolean).length;
|
|
90
|
+
return theme.fg("muted", `→ ${count} lines`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function briefBash(text: string, theme: CrewTheme): string {
|
|
94
|
+
if (!text?.trim()) return theme.fg("dim", "→ done");
|
|
95
|
+
const lines = text.trim().split("\n");
|
|
96
|
+
if (lines.length === 1 && lines[0]!.length < 40) {
|
|
97
|
+
return theme.fg("muted", `→ ${lines[0]}`);
|
|
98
|
+
}
|
|
99
|
+
return theme.fg("muted", `→ ${lines.length} lines`);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function briefEdit(text: string, theme: CrewTheme): string {
|
|
103
|
+
if (!text) return theme.fg("dim", "→ edited");
|
|
104
|
+
if (text.includes("Error") || text.includes("error")) {
|
|
105
|
+
return theme.fg("error", "→ failed");
|
|
106
|
+
}
|
|
107
|
+
const added = (text.match(/^\+ /gm) ?? []).length;
|
|
108
|
+
const removed = (text.match(/^- /gm) ?? []).length;
|
|
109
|
+
if (added === 0 && removed === 0) {
|
|
110
|
+
return theme.fg("success", "→ edited");
|
|
111
|
+
}
|
|
112
|
+
return theme.fg("success", "→ edited ") + theme.fg("toolDiffAdded", `+${added} `) + theme.fg("toolDiffRemoved", `-${removed}`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function briefWrite(text: string, theme: CrewTheme): string {
|
|
116
|
+
if (text) return theme.fg("error", `→ ${text}`);
|
|
117
|
+
return theme.fg("success", "→ written");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function briefFind(text: string, theme: CrewTheme): string {
|
|
121
|
+
if (!text) return theme.fg("dim", "→ none");
|
|
122
|
+
const count = text.trim().split("\n").filter(Boolean).length;
|
|
123
|
+
return theme.fg("muted", `→ ${count} files`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function briefGrep(text: string, theme: CrewTheme): string {
|
|
127
|
+
if (!text) return theme.fg("dim", "→ none");
|
|
128
|
+
const count = text.trim().split("\n").filter(Boolean).length;
|
|
129
|
+
return theme.fg("muted", `→ ${count} matches`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function briefLs(text: string, theme: CrewTheme): string {
|
|
133
|
+
if (!text) return theme.fg("dim", "→ empty");
|
|
134
|
+
const count = text.trim().split("\n").filter(Boolean).length;
|
|
135
|
+
return theme.fg("muted", `→ ${count} entries`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function briefTeam(result: { content?: unknown[] }, theme: CrewTheme): string {
|
|
139
|
+
// Try to extract structured details
|
|
140
|
+
const details = (result as Record<string, unknown>).details ?? result;
|
|
141
|
+
const d = typeof details === "object" && details !== null ? (details as Record<string, unknown>) : {};
|
|
142
|
+
const status = typeof d.status === "string" ? d.status : "";
|
|
143
|
+
const runId = typeof d.runId === "string" ? d.runId : "";
|
|
144
|
+
const icon =
|
|
145
|
+
status === "completed"
|
|
146
|
+
? theme.fg("success", "✓")
|
|
147
|
+
: status === "failed"
|
|
148
|
+
? theme.fg("error", "✗")
|
|
149
|
+
: status === "running"
|
|
150
|
+
? theme.fg("warning", "⟳")
|
|
151
|
+
: theme.fg("dim", "○");
|
|
152
|
+
|
|
153
|
+
// Agent records summary
|
|
154
|
+
const records = (d.agentRecords ?? d.results) as CrewAgentRecord[] | undefined;
|
|
155
|
+
if (records?.length) {
|
|
156
|
+
const completed = records.filter((r) => r.status === "completed").length;
|
|
157
|
+
const total = records.length;
|
|
158
|
+
const duration = computeTotalDuration(records);
|
|
159
|
+
const tokens = computeTotalTokens(records);
|
|
160
|
+
return `${icon} ${completed}/${total} tasks · ${formatDuration(duration)} · ${formatTokens(tokens)} tok`;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Fallback: compact status line
|
|
164
|
+
const parts: string[] = [];
|
|
165
|
+
if (status) parts.push(status);
|
|
166
|
+
if (runId) parts.push(runId.slice(-8));
|
|
167
|
+
return `${icon} ${parts.join(" · ") || "done"}`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function briefAgent(result: { content?: unknown[] }, theme: CrewTheme): string {
|
|
171
|
+
const d = (result as Record<string, unknown>).details ?? result;
|
|
172
|
+
const data = typeof d === "object" && d !== null ? (d as Record<string, unknown>) : {};
|
|
173
|
+
const status = typeof data.status === "string" ? data.status : "";
|
|
174
|
+
const agentId = typeof data.agentId === "string" ? data.agentId : "agent";
|
|
175
|
+
const icon =
|
|
176
|
+
status === "completed"
|
|
177
|
+
? theme.fg("success", "\u2713")
|
|
178
|
+
: status === "failed"
|
|
179
|
+
? theme.fg("error", "\u2717")
|
|
180
|
+
: theme.fg("dim", "\u25CB");
|
|
181
|
+
// P3: Show duration and tokens when available
|
|
182
|
+
const parts: string[] = [agentId];
|
|
183
|
+
if (data.durationMs) parts.push(formatDuration(data.durationMs as number));
|
|
184
|
+
if (data.totalTokens) parts.push(`${formatTokens(data.totalTokens as number)} tok`);
|
|
185
|
+
return `${icon} ${parts.join(" \u00B7 ")}`;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function briefDefault(text: string, theme: CrewTheme): string {
|
|
189
|
+
if (!text) return theme.fg("dim", "→ done");
|
|
190
|
+
const first = text.split("\n")[0] ?? "";
|
|
191
|
+
return theme.fg("muted", `→ ${truncLine(first, 60)}`);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
195
|
+
|
|
196
|
+
function extractText(content: unknown[] | undefined): string {
|
|
197
|
+
if (!content) return "";
|
|
198
|
+
if (!Array.isArray(content)) return String(content);
|
|
199
|
+
return content
|
|
200
|
+
.filter((c): c is Record<string, unknown> => typeof c === "object" && c !== null && (c as Record<string, unknown>).type === "text")
|
|
201
|
+
.map((c) => String((c as Record<string, unknown>).text ?? ""))
|
|
202
|
+
.join("\n");
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function computeTotalDuration(records: CrewAgentRecord[]): number {
|
|
206
|
+
let total = 0;
|
|
207
|
+
for (const r of records) {
|
|
208
|
+
if (r.startedAt) {
|
|
209
|
+
const start = new Date(r.startedAt).getTime();
|
|
210
|
+
const end = r.completedAt ? new Date(r.completedAt).getTime() : Date.now();
|
|
211
|
+
if (Number.isFinite(start) && Number.isFinite(end)) total += Math.max(0, end - start);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return total;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function computeTotalTokens(records: CrewAgentRecord[]): number {
|
|
218
|
+
let total = 0;
|
|
219
|
+
for (const r of records) {
|
|
220
|
+
if (r.usage) {
|
|
221
|
+
total += (r.usage.input ?? 0) + (r.usage.output ?? 0) + (r.usage.cacheWrite ?? 0);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return total;
|
|
225
|
+
}
|