pi-crew 0.9.16 → 0.9.18
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 +130 -0
- package/README.md +19 -0
- package/dist/build-meta.json +21784 -0
- package/dist/index.mjs +83169 -0
- package/dist/index.mjs.map +7 -0
- package/docs/A +358 -0
- package/docs/M-A +357 -0
- package/docs/REVIEW-FINDINGS-2026-06 +357 -0
- package/docs/Y +357 -0
- package/docs/a +357 -0
- package/docs/aA +358 -0
- package/docs/archive/README.md +91 -0
- package/docs/migration/atomic-write-v2-migration.md +297 -0
- package/docs/patterns/command-agent-skill.md +1 -1
- package/docs/perf/performance-review-2026-07.md +287 -0
- package/docs/skills/REFERENCE.md +0 -17
- package/docs//303/242mmaAAA/303/242 +357 -0
- package/index.bundle.ts +25 -0
- package/index.ts +95 -4
- package/package.json +15 -4
- package/skills/iterative-audit/SKILL.md +0 -1
- package/skills/widget-rendering/SKILL.md +17 -0
- package/src/adapters/claude-adapter.ts +1 -3
- package/src/adapters/export-util.ts +16 -16
- package/src/adapters/index.ts +5 -5
- package/src/agents/agent-config.ts +20 -14
- package/src/agents/agent-serializer.ts +1 -1
- package/src/agents/discover-agents.ts +83 -39
- package/src/benchmark/benchmark-runner.ts +51 -51
- package/src/benchmark/feedback-loop.ts +1 -1
- package/src/config/config.ts +303 -591
- package/src/config/defaults.ts +28 -2
- package/src/config/drift-detector.ts +11 -14
- package/src/config/markers.ts +201 -203
- package/src/config/resilient-parser.ts +14 -6
- package/src/config/role-tools.ts +3 -3
- package/src/config/suggestions.ts +5 -12
- package/src/config/types.ts +9 -25
- package/src/errors.ts +151 -157
- package/src/extension/action-suggestions.ts +54 -9
- package/src/extension/async-notifier.ts +43 -13
- package/src/extension/autonomous-policy.ts +77 -37
- package/src/extension/command-completions.ts +9 -8
- package/src/extension/context-status-injection.ts +14 -12
- package/src/extension/crew-autocomplete.ts +8 -16
- package/src/extension/crew-cleanup.ts +2 -1
- package/src/extension/crew-shortcuts.ts +9 -6
- package/src/extension/cross-extension-rpc.ts +136 -42
- package/src/extension/help.ts +1 -1
- package/src/extension/import-index.ts +10 -5
- package/src/extension/knowledge-injection.ts +88 -15
- package/src/extension/management.ts +89 -349
- package/src/extension/message-renderers.ts +3 -4
- package/src/extension/notification-router.ts +22 -5
- package/src/extension/notification-sink.ts +6 -3
- package/src/extension/pi-api.ts +17 -8
- package/src/extension/plan-orchestrate.ts +8 -27
- package/src/extension/project-init.ts +21 -6
- package/src/extension/register.ts +329 -975
- package/src/extension/registration/artifact-cleanup.ts +9 -4
- package/src/extension/registration/command-utils.ts +5 -1
- package/src/extension/registration/commands.ts +806 -314
- package/src/extension/registration/compaction-guard.ts +15 -15
- package/src/extension/registration/lifecycle.ts +259 -0
- package/src/extension/registration/observability.ts +293 -0
- package/src/extension/registration/subagent-helpers.ts +29 -7
- package/src/extension/registration/subagent-tools.ts +253 -44
- package/src/extension/registration/team-tool.ts +19 -84
- package/src/extension/registration/ui.ts +168 -0
- package/src/extension/registration/viewers.ts +64 -24
- package/src/extension/result-watcher.ts +18 -7
- package/src/extension/run-bundle-schema.ts +21 -6
- package/src/extension/run-export.ts +15 -6
- package/src/extension/run-import.ts +64 -29
- package/src/extension/run-index.ts +28 -9
- package/src/extension/run-maintenance.ts +32 -12
- package/src/extension/session-summary.ts +1 -1
- package/src/extension/team-manager-command.ts +64 -7
- package/src/extension/team-onboard.ts +149 -150
- package/src/extension/team-recommendation.ts +121 -21
- package/src/extension/team-tool/anchor.ts +31 -64
- package/src/extension/team-tool/api.ts +929 -141
- package/src/extension/team-tool/auto-summarize.ts +14 -26
- package/src/extension/team-tool/cache-control.ts +1 -5
- package/src/extension/team-tool/cancel.ts +138 -38
- package/src/extension/team-tool/chain-dispatch.ts +5 -13
- package/src/extension/team-tool/chain-executor.ts +29 -51
- package/src/extension/team-tool/config-patch.ts +1 -1
- package/src/extension/team-tool/context.ts +40 -20
- package/src/extension/team-tool/destructive-gate.ts +10 -5
- package/src/extension/team-tool/doctor.ts +170 -51
- package/src/extension/team-tool/explain.ts +228 -214
- package/src/extension/team-tool/failure-patterns.ts +3 -9
- package/src/extension/team-tool/goal-wrap.ts +71 -29
- package/src/extension/team-tool/goal.ts +185 -35
- package/src/extension/team-tool/handle-schedule.ts +34 -15
- package/src/extension/team-tool/handle-settings.ts +94 -56
- package/src/extension/team-tool/health-monitor.ts +27 -108
- package/src/extension/team-tool/inspect.ts +42 -9
- package/src/extension/team-tool/intent-policy.ts +4 -1
- package/src/extension/team-tool/lifecycle-actions.ts +244 -48
- package/src/extension/team-tool/orchestrate.ts +7 -18
- package/src/extension/team-tool/parallel-dispatch.ts +51 -29
- package/src/extension/team-tool/plan.ts +29 -5
- package/src/extension/team-tool/respond.ts +49 -16
- package/src/extension/team-tool/run-not-found.ts +3 -8
- package/src/extension/team-tool/run.ts +80 -317
- package/src/extension/team-tool/status.ts +135 -43
- package/src/extension/team-tool/workflow-manage.ts +92 -25
- package/src/extension/team-tool-types.ts +8 -1
- package/src/extension/team-tool.ts +142 -551
- package/src/extension/validate-resources.ts +39 -8
- package/src/hooks/registry.ts +66 -17
- package/src/hooks/types.ts +1 -1
- package/src/i18n.ts +25 -11
- package/src/observability/correlation.ts +17 -3
- package/src/observability/event-bus.ts +51 -56
- package/src/observability/event-to-metric.ts +117 -15
- package/src/observability/exporters/otlp-exporter.ts +56 -17
- package/src/observability/exporters/prometheus-exporter.ts +1 -1
- package/src/observability/metric-registry.ts +16 -4
- package/src/observability/metric-retention.ts +8 -2
- package/src/observability/metric-sink.ts +11 -3
- package/src/observability/metrics-primitives.ts +42 -9
- package/src/plugins/plugin-define.ts +2 -2
- package/src/plugins/plugin-registry.ts +25 -25
- package/src/plugins/plugins/index.ts +1 -1
- package/src/plugins/plugins/nextjs.ts +16 -16
- package/src/plugins/plugins/vite.ts +7 -11
- package/src/plugins/plugins/vitest.ts +6 -11
- package/src/runtime/adaptive-plan.ts +225 -40
- package/src/runtime/agent-control.ts +58 -15
- package/src/runtime/agent-memory.ts +15 -9
- package/src/runtime/agent-observability.ts +10 -2
- package/src/runtime/anchor-manager.ts +27 -25
- package/src/runtime/async-marker.ts +7 -1
- package/src/runtime/async-runner.ts +39 -24
- package/src/runtime/auto-summarize.ts +7 -13
- package/src/runtime/background-runner.ts +189 -251
- package/src/runtime/batch-barrier.ts +18 -16
- package/src/runtime/cancellation-token.ts +16 -6
- package/src/runtime/cancellation.ts +46 -8
- package/src/runtime/capability-inventory.ts +6 -4
- package/src/runtime/chain-parser.ts +44 -11
- package/src/runtime/chain-runner.ts +63 -69
- package/src/runtime/checkpoint.ts +12 -56
- package/src/runtime/child-pi.ts +344 -79
- package/src/runtime/coalesce-tasks.ts +268 -0
- package/src/runtime/code-summary.ts +71 -26
- package/src/runtime/compact-stages/index.ts +15 -5
- package/src/runtime/compact-stages/tail-capture-stage.ts +7 -2
- package/src/runtime/compact-stages/truncation-stage.ts +4 -1
- package/src/runtime/compaction-summary.ts +17 -10
- package/src/runtime/completion-guard.ts +33 -16
- package/src/runtime/crash-classification.ts +28 -7
- package/src/runtime/crash-recovery.ts +177 -37
- package/src/runtime/crew-agent-records.ts +145 -47
- package/src/runtime/crew-hooks.ts +9 -24
- package/src/runtime/cross-extension-rpc.ts +25 -23
- package/src/runtime/custom-tools/irc-tool.ts +43 -15
- package/src/runtime/custom-tools/submit-result-tool.ts +16 -5
- package/src/runtime/delivery-coordinator.ts +34 -7
- package/src/runtime/delta-conflict.ts +9 -21
- package/src/runtime/deterministic-ast.ts +1 -1
- package/src/runtime/diagnostic-export.ts +53 -20
- package/src/runtime/direct-run.ts +12 -2
- package/src/runtime/dwf-state-store.ts +1 -1
- package/src/runtime/dynamic-workflow-context.ts +187 -59
- package/src/runtime/dynamic-workflow-runner.ts +42 -20
- package/src/runtime/effectiveness.ts +16 -8
- package/src/runtime/errors/crew-errors.ts +7 -11
- package/src/runtime/event-stream-bridge.ts +9 -3
- package/src/runtime/foreground-control.ts +54 -14
- package/src/runtime/foreground-watchdog.ts +9 -6
- package/src/runtime/goal-achievement.ts +27 -10
- package/src/runtime/goal-evaluator.ts +54 -19
- package/src/runtime/goal-loop-runner.ts +280 -99
- package/src/runtime/goal-state-store.ts +27 -17
- package/src/runtime/green-contract.ts +11 -2
- package/src/runtime/group-join.ts +64 -31
- package/src/runtime/handoff-manager.ts +37 -42
- package/src/runtime/heartbeat-gradient.ts +10 -2
- package/src/runtime/heartbeat-watcher.ts +32 -6
- package/src/runtime/hidden-handoff.ts +13 -31
- package/src/runtime/important-line-classifier.ts +12 -2
- package/src/runtime/iteration-hooks.ts +25 -15
- package/src/runtime/live-agent-control.ts +55 -7
- package/src/runtime/live-agent-manager.ts +130 -27
- package/src/runtime/live-control-realtime.ts +23 -3
- package/src/runtime/live-irc.ts +4 -1
- package/src/runtime/live-session-health.ts +12 -4
- package/src/runtime/live-session-runtime.ts +379 -117
- package/src/runtime/manifest-cache.ts +28 -12
- package/src/runtime/mcp-proxy.ts +10 -18
- package/src/runtime/metric-parser.ts +1 -5
- package/src/runtime/model-fallback.ts +55 -18
- package/src/runtime/model-resolver.ts +2 -6
- package/src/runtime/model-scope.ts +19 -3
- package/src/runtime/notebook-helpers.ts +60 -62
- package/src/runtime/orphan-worker-registry.ts +37 -26
- package/src/runtime/output-validator.ts +18 -3
- package/src/runtime/overflow-recovery.ts +5 -4
- package/src/runtime/parallel-research.ts +29 -5
- package/src/runtime/parallel-utils.ts +9 -11
- package/src/runtime/path-overlap.ts +150 -0
- package/src/runtime/peer-dep.ts +12 -17
- package/src/runtime/per-write-validator.ts +1 -3
- package/src/runtime/phase-tracker.ts +342 -330
- package/src/runtime/pi-args.ts +26 -8
- package/src/runtime/pi-json-output.ts +1 -1
- package/src/runtime/pi-spawn.ts +30 -19
- package/src/runtime/pipeline-runner.ts +56 -55
- package/src/runtime/plan-templates.ts +5 -6
- package/src/runtime/policy-engine.ts +43 -7
- package/src/runtime/post-checks.ts +12 -4
- package/src/runtime/post-exit-stdio-guard.ts +2 -2
- package/src/runtime/process-lifecycle.ts +20 -10
- package/src/runtime/process-status.ts +16 -5
- package/src/runtime/progress-event-coalescer.ts +2 -1
- package/src/runtime/progress-tracker.ts +103 -103
- package/src/runtime/prose-compressor.ts +9 -11
- package/src/runtime/recovery-recipes.ts +118 -24
- package/src/runtime/replace.ts +25 -10
- package/src/runtime/resilient-edit.ts +10 -25
- package/src/runtime/result-extractor.ts +2 -6
- package/src/runtime/retry-executor.ts +20 -4
- package/src/runtime/retry-runner.ts +27 -51
- package/src/runtime/role-permission.ts +6 -1
- package/src/runtime/run-coalesced-task-group.ts +256 -0
- package/src/runtime/run-drift.ts +14 -15
- package/src/runtime/run-tracker.ts +6 -28
- package/src/runtime/runtime-policy.ts +1 -6
- package/src/runtime/runtime-resolver.ts +80 -15
- package/src/runtime/scheduler.ts +47 -18
- package/src/runtime/semaphore.ts +5 -7
- package/src/runtime/sensitive-paths.ts +2 -1
- package/src/runtime/session-usage.ts +1 -1
- package/src/runtime/settings-store.ts +16 -12
- package/src/runtime/sidechain-output.ts +6 -2
- package/src/runtime/single-agent-compose.ts +1 -4
- package/src/runtime/skill-effectiveness.ts +29 -97
- package/src/runtime/skill-instructions.ts +40 -83
- package/src/runtime/stale-reconciler.ts +73 -197
- package/src/runtime/stream-preview.ts +1 -1
- package/src/runtime/streaming-output.ts +1 -1
- package/src/runtime/subagent-manager.ts +44 -169
- package/src/runtime/subprocess-tool-registry.ts +4 -1
- package/src/runtime/supervisor-contact.ts +10 -5
- package/src/runtime/task-display.ts +19 -5
- package/src/runtime/task-graph-scheduler.ts +95 -21
- package/src/runtime/task-graph.ts +5 -11
- package/src/runtime/task-health.ts +54 -47
- package/src/runtime/task-id.ts +12 -19
- package/src/runtime/task-output-context.ts +265 -81
- package/src/runtime/task-packet.ts +12 -20
- package/src/runtime/task-quality.ts +6 -14
- package/src/runtime/task-runner/context-retrieval.ts +4 -13
- package/src/runtime/task-runner/live-executor.ts +114 -36
- package/src/runtime/task-runner/output-splitter.ts +152 -0
- package/src/runtime/task-runner/progress.ts +50 -12
- package/src/runtime/task-runner/prompt-builder.ts +31 -7
- package/src/runtime/task-runner/prompt-pipeline.ts +31 -7
- package/src/runtime/task-runner/result-utils.ts +3 -1
- package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
- package/src/runtime/task-runner/run-projection.ts +27 -8
- package/src/runtime/task-runner/state-helpers.ts +50 -14
- package/src/runtime/task-runner/tail-read.ts +2 -6
- package/src/runtime/task-runner.ts +180 -326
- package/src/runtime/team-runner-artifacts.ts +13 -0
- package/src/runtime/team-runner.ts +456 -974
- package/src/runtime/tool-output-pruner.ts +6 -9
- package/src/runtime/tool-progress.ts +11 -21
- package/src/runtime/verification-gates.ts +33 -24
- package/src/runtime/verification-integrity.ts +2 -7
- package/src/runtime/verification-worktree.ts +62 -12
- package/src/runtime/worker-heartbeat.ts +5 -1
- package/src/runtime/worker-startup.ts +29 -5
- package/src/runtime/workflow-state.ts +17 -9
- package/src/runtime/workspace-lock.ts +30 -35
- package/src/runtime/workspace-tree.ts +20 -32
- package/src/runtime/yield-handler.ts +43 -9
- package/src/runtime/zombie-scanner.ts +5 -4
- package/src/schema/config-schema.ts +266 -172
- package/src/schema/team-tool-schema.ts +29 -74
- package/src/schema/validation-types.ts +25 -17
- package/src/skills/discover-skills.ts +35 -10
- package/src/skills/skill-templates.ts +109 -27
- package/src/skills/validate.ts +26 -8
- package/src/state/active-run-registry.ts +87 -28
- package/src/state/artifact-store.ts +9 -5
- package/src/state/atomic-write-v2.ts +85 -63
- package/src/state/atomic-write.ts +106 -27
- package/src/state/blob-store.ts +47 -20
- package/src/state/contracts.ts +20 -5
- package/src/state/crew-init.ts +5 -22
- package/src/state/decision-ledger.ts +19 -73
- package/src/state/event-log-rotation.ts +41 -15
- package/src/state/event-log.ts +168 -53
- package/src/state/event-reconstructor.ts +11 -1
- package/src/state/gitignore-manager.ts +2 -8
- package/src/state/health-store.ts +57 -57
- package/src/state/hook-instinct-bridge.ts +1 -1
- package/src/state/hook-integrations.ts +1 -1
- package/src/state/instinct-store.ts +17 -5
- package/src/state/jsonl-writer.ts +1 -1
- package/src/state/locks.ts +23 -9
- package/src/state/mailbox.ts +151 -28
- package/src/state/observation-store.ts +20 -14
- package/src/state/run-cache.ts +142 -135
- package/src/state/run-graph.ts +6 -15
- package/src/state/run-metrics.ts +5 -18
- package/src/state/schedule.ts +15 -9
- package/src/state/state-store.ts +137 -47
- package/src/state/task-claims.ts +12 -2
- package/src/state/tiered-eval.ts +52 -43
- package/src/state/types-eval.ts +2 -2
- package/src/state/types.ts +24 -20
- package/src/state/usage.ts +20 -4
- package/src/state/worker-atomic-writer.ts +6 -3
- package/src/subagents/index.ts +2 -2
- package/src/teams/discover-teams.ts +21 -6
- package/src/tools/safe-bash-extension.ts +5 -6
- package/src/tools/safe-bash.ts +10 -11
- package/src/types/new-api-types.ts +6 -10
- package/src/ui/agent-management-overlay.ts +52 -40
- package/src/ui/card-colors.ts +13 -4
- package/src/ui/crew-footer.ts +8 -7
- package/src/ui/crew-select-list.ts +1 -1
- package/src/ui/dashboard-panes/agents-pane.ts +41 -25
- package/src/ui/dashboard-panes/cancellation-pane.ts +1 -1
- package/src/ui/dashboard-panes/capability-pane.ts +32 -15
- package/src/ui/dashboard-panes/health-pane.ts +2 -1
- package/src/ui/dashboard-panes/metrics-pane.ts +4 -1
- package/src/ui/dashboard-panes/progress-pane.ts +12 -9
- package/src/ui/heartbeat-aggregator.ts +15 -4
- package/src/ui/keybinding-map.ts +40 -7
- package/src/ui/live-conversation-overlay.ts +36 -20
- package/src/ui/live-duration.ts +1 -4
- package/src/ui/live-run-sidebar.ts +88 -25
- package/src/ui/loaders.ts +2 -8
- package/src/ui/mascot.ts +20 -36
- package/src/ui/overlays/agent-picker-overlay.ts +11 -3
- package/src/ui/overlays/confirm-overlay.ts +4 -2
- package/src/ui/overlays/help-overlay.ts +25 -14
- package/src/ui/overlays/mailbox-compose-overlay.ts +48 -11
- package/src/ui/overlays/mailbox-compose-preview.ts +20 -5
- package/src/ui/overlays/mailbox-detail-overlay.ts +27 -6
- package/src/ui/pi-ui-compat.ts +7 -7
- package/src/ui/powerbar-publisher.ts +120 -42
- package/src/ui/render-diff.ts +10 -3
- package/src/ui/render-scheduler.ts +12 -4
- package/src/ui/run-action-dispatcher.ts +81 -18
- package/src/ui/run-dashboard.ts +172 -76
- package/src/ui/run-event-bus.ts +59 -37
- package/src/ui/run-snapshot-cache.ts +276 -86
- package/src/ui/settings-overlay.ts +361 -74
- package/src/ui/status-colors.ts +12 -1
- package/src/ui/syntax-highlight.ts +1 -1
- package/src/ui/terminal-status.ts +1 -3
- package/src/ui/theme-adapter.ts +16 -14
- package/src/ui/theme-discovery.ts +13 -2
- package/src/ui/tool-progress-formatter.ts +7 -7
- package/src/ui/tool-render.ts +128 -56
- package/src/ui/tool-renderers/brief-mode.ts +45 -27
- package/src/ui/tool-renderers/index.ts +109 -43
- package/src/ui/transcript-cache.ts +32 -6
- package/src/ui/transcript-entries.ts +25 -23
- package/src/ui/transcript-viewer.ts +78 -29
- package/src/ui/widget/index.ts +99 -40
- package/src/ui/widget/widget-formatters.ts +13 -6
- package/src/ui/widget/widget-model.ts +19 -8
- package/src/ui/widget/widget-renderer.ts +23 -13
- package/src/ui/widget/widget-types.ts +1 -1
- package/src/utils/bm25-search.ts +199 -199
- package/src/utils/conflict-detect.ts +22 -21
- package/src/utils/env-filter.ts +14 -7
- package/src/utils/file-coalescer.ts +5 -1
- package/src/utils/fingerprint.ts +3 -6
- package/src/utils/frontmatter.ts +3 -1
- package/src/utils/fs-watch.ts +2 -6
- package/src/utils/gh-protocol.ts +119 -44
- package/src/utils/git.ts +13 -15
- package/src/utils/guards.ts +2 -5
- package/src/utils/ids.ts +9 -2
- package/src/utils/incremental-reader.ts +14 -3
- package/src/utils/internal-error.ts +2 -1
- package/src/utils/names.ts +12 -3
- package/src/utils/paths.ts +49 -5
- package/src/utils/project-detector.ts +2 -2
- package/src/utils/redaction.ts +29 -19
- package/src/utils/resolve-shell.ts +9 -7
- package/src/utils/run-watcher-registry.ts +19 -31
- package/src/utils/safe-paths.ts +46 -29
- package/src/utils/scan-cache.ts +9 -2
- package/src/utils/session-utils.ts +2 -4
- package/src/utils/sleep.ts +12 -5
- package/src/utils/sse-parser.ts +5 -17
- package/src/utils/visual.ts +52 -32
- package/src/workflows/discover-workflows.ts +41 -109
- package/src/workflows/intermediate-store.ts +5 -21
- package/src/workflows/preflight-validator.ts +6 -33
- package/src/workflows/topology-analyzer.ts +5 -21
- package/src/workflows/workflow-config.ts +7 -6
- package/src/worktree/branch-freshness.ts +66 -8
- package/src/worktree/cleanup.ts +130 -20
- package/src/worktree/worktree-manager.ts +212 -69
- package/skills/artifact-analysis-loop/SKILL.md +0 -303
- package/skills/detection-pipeline-design/SKILL.md +0 -286
- package/skills/hunting-investigation-loop/SKILL.md +0 -402
- package/skills/incident-playbook-construction/SKILL.md +0 -384
- package/skills/security-review/SKILL.md +0 -561
- package/skills/threat-hypothesis-framework/SKILL.md +0 -176
- package/skills/ui-render-performance/SKILL.md +0 -58
- /package/docs/{followup-review-round3-2026-05-12.md → archive/followup-review-round3-2026-05-12.md} +0 -0
- /package/docs/{followup-review-round4-2026-05-13.md → archive/followup-review-round4-2026-05-13.md} +0 -0
- /package/docs/{pi-crew-bugs.md → archive/pi-crew-bugs.md} +0 -0
- /package/docs/{pi-crew-test-final.md → archive/pi-crew-test-final.md} +0 -0
- /package/docs/{pi-crew-test-results.md → archive/pi-crew-test-results.md} +0 -0
- /package/docs/{pi-crew-test-round2.md → archive/pi-crew-test-round2.md} +0 -0
- /package/docs/{pi-crew-test-round4.md → archive/pi-crew-test-round4.md} +0 -0
- /package/docs/{pi-crew-test-round5.md → archive/pi-crew-test-round5.md} +0 -0
- /package/docs/{pi-crew-test-round6.md → archive/pi-crew-test-round6.md} +0 -0
- /package/docs/{pi-crew-v0.5.10-audit-fix-plan.md → archive/pi-crew-v0.5.10-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.11-audit-fix-plan.md → archive/pi-crew-v0.5.11-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.12-audit-fix-plan.md → archive/pi-crew-v0.5.12-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.13-audit-fix-plan.md → archive/pi-crew-v0.5.13-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.14-audit-fix-plan.md → archive/pi-crew-v0.5.14-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.16-audit-fix-plan.md → archive/pi-crew-v0.5.16-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.17-audit-fix-plan.md → archive/pi-crew-v0.5.17-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.5-audit-fix-plan.md → archive/pi-crew-v0.5.5-audit-fix-plan.md} +0 -0
- /package/docs/{pi-crew-v0.5.9-audit-fix-plan.md → archive/pi-crew-v0.5.9-audit-fix-plan.md} +0 -0
- /package/docs/{pi-mono-opportunities.md → archive/pi-mono-opportunities.md} +0 -0
- /package/docs/{pi-mono-review.md → archive/pi-mono-review.md} +0 -0
- /package/docs/{pi-subagent4-comparison.md → archive/pi-subagent4-comparison.md} +0 -0
- /package/docs/{pi-subagents3-deep-analysis.md → archive/pi-subagents3-deep-analysis.md} +0 -0
package/src/ui/theme-adapter.ts
CHANGED
|
@@ -47,13 +47,7 @@ export type CrewThemeColor =
|
|
|
47
47
|
// Special
|
|
48
48
|
| "bashMode";
|
|
49
49
|
|
|
50
|
-
export type CrewThemeBg =
|
|
51
|
-
| "selectedBg"
|
|
52
|
-
| "userMessageBg"
|
|
53
|
-
| "customMessageBg"
|
|
54
|
-
| "toolPendingBg"
|
|
55
|
-
| "toolSuccessBg"
|
|
56
|
-
| "toolErrorBg";
|
|
50
|
+
export type CrewThemeBg = "selectedBg" | "userMessageBg" | "customMessageBg" | "toolPendingBg" | "toolSuccessBg" | "toolErrorBg";
|
|
57
51
|
|
|
58
52
|
/** ANSI fallback values for theme color slots when the active theme doesn't define them. */
|
|
59
53
|
export const THEME_COLOR_FALLBACKS: Record<CrewThemeColor, string> = {
|
|
@@ -102,10 +96,7 @@ export const THEME_COLOR_FALLBACKS: Record<CrewThemeColor, string> = {
|
|
|
102
96
|
|
|
103
97
|
/** Map a thinking intensity level (0–5) to a theme color slot. */
|
|
104
98
|
export function thinkingColorForLevel(level: number): CrewThemeColor {
|
|
105
|
-
const slots: CrewThemeColor[] = [
|
|
106
|
-
"thinkingOff", "thinkingMinimal", "thinkingLow",
|
|
107
|
-
"thinkingMedium", "thinkingHigh", "thinkingXhigh",
|
|
108
|
-
];
|
|
99
|
+
const slots: CrewThemeColor[] = ["thinkingOff", "thinkingMinimal", "thinkingLow", "thinkingMedium", "thinkingHigh", "thinkingXhigh"];
|
|
109
100
|
return slots[Math.min(Math.max(level, 0), 5)] ?? "thinkingOff";
|
|
110
101
|
}
|
|
111
102
|
|
|
@@ -177,7 +168,14 @@ function callMaybeString(fn: unknown): string | undefined {
|
|
|
177
168
|
function themeSignature(theme: object): string {
|
|
178
169
|
const record = theme as Record<string, unknown>;
|
|
179
170
|
const primitiveEntries = Object.entries(record)
|
|
180
|
-
.filter(
|
|
171
|
+
.filter(
|
|
172
|
+
([_key, value]) =>
|
|
173
|
+
value === undefined ||
|
|
174
|
+
value === null ||
|
|
175
|
+
typeof value === "string" ||
|
|
176
|
+
typeof value === "number" ||
|
|
177
|
+
typeof value === "boolean",
|
|
178
|
+
)
|
|
181
179
|
.map(([key, value]) => `${key}:${String(value)}`)
|
|
182
180
|
.sort();
|
|
183
181
|
const colorMode = callMaybeString(record.getColorMode);
|
|
@@ -217,7 +215,8 @@ function startThemeSourceSubscription(theme: object, subscription: ThemeSourceSu
|
|
|
217
215
|
if (typeof record.addEventListener === "function") {
|
|
218
216
|
(record.addEventListener as (type: string, callback: () => void) => void)("change", emit);
|
|
219
217
|
if (typeof record.removeEventListener === "function") {
|
|
220
|
-
subscription.unsubscribeSource = () =>
|
|
218
|
+
subscription.unsubscribeSource = () =>
|
|
219
|
+
(record.removeEventListener as (type: string, callback: () => void) => void)("change", emit);
|
|
221
220
|
}
|
|
222
221
|
return;
|
|
223
222
|
}
|
|
@@ -235,7 +234,10 @@ export function subscribeThemeChange(theme: unknown, callback: () => void): () =
|
|
|
235
234
|
const key = theme;
|
|
236
235
|
let subscription = themeSubscriptions.get(key);
|
|
237
236
|
if (!subscription) {
|
|
238
|
-
subscription = {
|
|
237
|
+
subscription = {
|
|
238
|
+
callbacks: new Set(),
|
|
239
|
+
lastSignature: themeSignature(key),
|
|
240
|
+
};
|
|
239
241
|
themeSubscriptions.set(key, subscription);
|
|
240
242
|
startThemeSourceSubscription(key, subscription);
|
|
241
243
|
}
|
|
@@ -61,7 +61,12 @@ export function discoverPiThemes(): PiThemeInfo[] {
|
|
|
61
61
|
for (const name of BUILTIN_PI_THEMES) {
|
|
62
62
|
if (seen.has(name)) continue;
|
|
63
63
|
seen.add(name);
|
|
64
|
-
out.push({
|
|
64
|
+
out.push({
|
|
65
|
+
name,
|
|
66
|
+
source: "builtin",
|
|
67
|
+
displayName: name,
|
|
68
|
+
mode: name === "light" ? "light" : "dark",
|
|
69
|
+
});
|
|
65
70
|
}
|
|
66
71
|
|
|
67
72
|
// Custom themes from ~/.pi/agent/themes/
|
|
@@ -85,7 +90,13 @@ export function discoverPiThemes(): PiThemeInfo[] {
|
|
|
85
90
|
// keep undefined
|
|
86
91
|
}
|
|
87
92
|
seen.add(name);
|
|
88
|
-
out.push({
|
|
93
|
+
out.push({
|
|
94
|
+
name,
|
|
95
|
+
source: "custom",
|
|
96
|
+
path: fullPath,
|
|
97
|
+
displayName,
|
|
98
|
+
mode,
|
|
99
|
+
});
|
|
89
100
|
}
|
|
90
101
|
}
|
|
91
102
|
} catch {
|
|
@@ -24,10 +24,12 @@ const MAX_OUTPUT_LINE = 80;
|
|
|
24
24
|
|
|
25
25
|
function pickActiveAgent(agents: CrewAgentRecord[] | undefined): CrewAgentRecord | undefined {
|
|
26
26
|
if (!agents || agents.length === 0) return undefined;
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
+
);
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
function totalTokens(agent: CrewAgentRecord): number {
|
|
@@ -52,9 +54,7 @@ function taskCounts(tasks: TeamTaskState[] | undefined): string | undefined {
|
|
|
52
54
|
const completed = tasks.filter((t) => t.status === "completed").length;
|
|
53
55
|
const buckets = new Map<string, number>();
|
|
54
56
|
for (const task of tasks) buckets.set(task.status, (buckets.get(task.status) ?? 0) + 1);
|
|
55
|
-
const summary = [...buckets.entries()]
|
|
56
|
-
.map(([status, count]) => `${status}=${count}`)
|
|
57
|
-
.join(" ");
|
|
57
|
+
const summary = [...buckets.entries()].map(([status, count]) => `${status}=${count}`).join(" ");
|
|
58
58
|
return `tasks ${completed}/${total} done ${summary}`;
|
|
59
59
|
}
|
|
60
60
|
|
package/src/ui/tool-render.ts
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { Container, Spacer, Text, visibleWidth } from "@earendil-works/pi-tui";
|
|
11
11
|
import type { CrewAgentRecord } from "../runtime/crew-agent-runtime.ts";
|
|
12
|
-
import { replaceTabs } from "./render-diff.ts";
|
|
13
12
|
import { truncateToWidth } from "../utils/visual.ts";
|
|
13
|
+
import { replaceTabs } from "./render-diff.ts";
|
|
14
14
|
|
|
15
15
|
// ── Types ──────────────────────────────────────────────────────────────
|
|
16
16
|
export interface Theme {
|
|
@@ -18,12 +18,20 @@ export interface Theme {
|
|
|
18
18
|
bold(text: string): string;
|
|
19
19
|
}
|
|
20
20
|
export type ThemeColor = "success" | "error" | "warning" | "dim" | "toolTitle" | "accent" | "muted" | "text";
|
|
21
|
-
export interface ToolRenderContext {
|
|
21
|
+
export interface ToolRenderContext {
|
|
22
|
+
expanded: boolean;
|
|
23
|
+
lastComponent?: Container;
|
|
24
|
+
}
|
|
22
25
|
export type Component = Container | Text;
|
|
23
26
|
|
|
24
27
|
export interface TeamToolResultDetails {
|
|
25
|
-
action?: string;
|
|
26
|
-
|
|
28
|
+
action?: string;
|
|
29
|
+
status?: string;
|
|
30
|
+
runId?: string;
|
|
31
|
+
goal?: string;
|
|
32
|
+
team?: string;
|
|
33
|
+
workflow?: string;
|
|
34
|
+
error?: string;
|
|
27
35
|
agentRecords?: CrewAgentRecord[];
|
|
28
36
|
// FIX (Round 14): `results` is the legacy key used by some subagent
|
|
29
37
|
// responses. Add it here so renderers can read either field without
|
|
@@ -31,7 +39,12 @@ export interface TeamToolResultDetails {
|
|
|
31
39
|
results?: CrewAgentRecord[];
|
|
32
40
|
}
|
|
33
41
|
export interface AgentToolResultDetails {
|
|
34
|
-
results?: Array<{
|
|
42
|
+
results?: Array<{
|
|
43
|
+
agentId?: string;
|
|
44
|
+
status?: string;
|
|
45
|
+
output?: string;
|
|
46
|
+
error?: string;
|
|
47
|
+
}>;
|
|
35
48
|
}
|
|
36
49
|
|
|
37
50
|
/** Combined type for renderAgentToolResult — handles both nested details and flat result shapes */
|
|
@@ -55,7 +68,8 @@ export function formatTokens(n: number): string {
|
|
|
55
68
|
export function formatDuration(ms: number): string {
|
|
56
69
|
if (ms < 1000) return `${ms}ms`;
|
|
57
70
|
if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;
|
|
58
|
-
const m = Math.floor(ms / 60_000),
|
|
71
|
+
const m = Math.floor(ms / 60_000),
|
|
72
|
+
s = Math.floor((ms % 60_000) / 1000);
|
|
59
73
|
return s > 0 ? `${m}m${s}s` : `${m}m`;
|
|
60
74
|
}
|
|
61
75
|
|
|
@@ -79,17 +93,34 @@ export function truncLine(text: string, maxWidth: number): string {
|
|
|
79
93
|
|
|
80
94
|
export function formatToolPreview(name: string, args: Record<string, unknown>): string {
|
|
81
95
|
switch (name) {
|
|
82
|
-
case "bash":
|
|
83
|
-
case "
|
|
84
|
-
|
|
85
|
-
case "
|
|
86
|
-
|
|
87
|
-
case "
|
|
88
|
-
|
|
89
|
-
case "
|
|
90
|
-
|
|
91
|
-
case "
|
|
92
|
-
|
|
96
|
+
case "bash":
|
|
97
|
+
case "safe_bash":
|
|
98
|
+
return `$ ${((args.command as string) || "").slice(0, 80)}`;
|
|
99
|
+
case "read":
|
|
100
|
+
return `read ${(args.path as string) || ""}`;
|
|
101
|
+
case "write":
|
|
102
|
+
return `write ${(args.path as string) || ""}`;
|
|
103
|
+
case "edit":
|
|
104
|
+
return `edit ${(args.path as string) || ""}`;
|
|
105
|
+
case "grep":
|
|
106
|
+
case "find":
|
|
107
|
+
return `${name} ${((args.pattern || args.path) as string) || ""}`;
|
|
108
|
+
case "ls":
|
|
109
|
+
return `ls ${(args.path as string) || "."}`;
|
|
110
|
+
case "web_search":
|
|
111
|
+
case "search":
|
|
112
|
+
return `search "${((args.query as string) || "").slice(0, 60)}"`;
|
|
113
|
+
case "web_fetch":
|
|
114
|
+
case "fetch":
|
|
115
|
+
return `fetch ${(args.url as string) || ""}`;
|
|
116
|
+
case "team":
|
|
117
|
+
return `team action=${(args.action as string) || ""}`;
|
|
118
|
+
case "agent":
|
|
119
|
+
return `agent ${(args.agent as string) || ""}`;
|
|
120
|
+
default: {
|
|
121
|
+
const s = JSON.stringify(args);
|
|
122
|
+
return `${name} ${s.slice(0, 60)}`;
|
|
123
|
+
}
|
|
93
124
|
}
|
|
94
125
|
}
|
|
95
126
|
|
|
@@ -98,42 +129,54 @@ export function formatToolPreview(name: string, args: Record<string, unknown>):
|
|
|
98
129
|
/** team tool call: collapsed "team action='run' impl..." / expanded: header + goal */
|
|
99
130
|
export function renderTeamToolCall(
|
|
100
131
|
args: { action?: string; goal?: string; team?: string; workflow?: string },
|
|
101
|
-
theme: Theme,
|
|
132
|
+
theme: Theme,
|
|
133
|
+
context: ToolRenderContext,
|
|
102
134
|
): Component {
|
|
103
|
-
const action = args.action || "",
|
|
135
|
+
const action = args.action || "",
|
|
136
|
+
goal = args.goal || "";
|
|
104
137
|
const team = args.team ? ` ${theme.fg("dim", `(${args.team})`)}` : "";
|
|
105
138
|
|
|
106
139
|
if (!context.expanded) {
|
|
107
140
|
const preview = goal.length > 60 ? goal.slice(0, 60) + "…" : goal;
|
|
108
141
|
return new Text(
|
|
109
142
|
`${theme.fg("toolTitle", theme.bold("team"))} action=${theme.fg("accent", `'${action}'`)}${team}${theme.fg("dim", preview ? ` "${preview.replace(/\n/g, " ")}"` : "")}`,
|
|
110
|
-
0,
|
|
143
|
+
0,
|
|
144
|
+
0,
|
|
111
145
|
);
|
|
112
146
|
}
|
|
113
147
|
const c = context.lastComponent instanceof Container ? (context.lastComponent.clear(), context.lastComponent) : new Container();
|
|
114
148
|
c.addChild(new Text(`${theme.fg("toolTitle", theme.bold("team"))} action=${theme.fg("accent", `'${action}'`)}${team}`, 0, 0));
|
|
115
|
-
if (goal) {
|
|
149
|
+
if (goal) {
|
|
150
|
+
c.addChild(new Spacer(1));
|
|
151
|
+
c.addChild(new Text(theme.fg("text", goal), 0, 0));
|
|
152
|
+
}
|
|
116
153
|
return c;
|
|
117
154
|
}
|
|
118
155
|
|
|
119
156
|
/** agent tool call: collapsed "Agent explorer..." / expanded: header + prompt */
|
|
120
157
|
export function renderAgentToolCall(
|
|
121
158
|
args: { agent?: string; prompt?: string; task?: string; cwd?: string },
|
|
122
|
-
theme: Theme,
|
|
159
|
+
theme: Theme,
|
|
160
|
+
context: ToolRenderContext,
|
|
123
161
|
): Component {
|
|
124
|
-
const agentName = args.agent || "",
|
|
162
|
+
const agentName = args.agent || "",
|
|
163
|
+
prompt = args.prompt || args.task || "";
|
|
125
164
|
|
|
126
165
|
if (!context.expanded) {
|
|
127
166
|
const preview = prompt.length > 60 ? prompt.slice(0, 60) + "…" : prompt;
|
|
128
167
|
return new Text(
|
|
129
168
|
`${theme.fg("toolTitle", theme.bold("agent"))} ${theme.fg("accent", agentName)}${theme.fg("dim", preview ? ` "${preview.replace(/\n/g, " ")}"` : "")}`,
|
|
130
|
-
0,
|
|
169
|
+
0,
|
|
170
|
+
0,
|
|
131
171
|
);
|
|
132
172
|
}
|
|
133
173
|
const c = context.lastComponent instanceof Container ? (context.lastComponent.clear(), context.lastComponent) : new Container();
|
|
134
174
|
const cwdLabel = args.cwd ? theme.fg("dim", ` (cwd: ${args.cwd})`) : "";
|
|
135
175
|
c.addChild(new Text(`${theme.fg("toolTitle", theme.bold("agent"))} ${theme.fg("accent", agentName)}${cwdLabel}`, 0, 0));
|
|
136
|
-
if (prompt) {
|
|
176
|
+
if (prompt) {
|
|
177
|
+
c.addChild(new Spacer(1));
|
|
178
|
+
c.addChild(new Text(theme.fg("text", prompt), 0, 0));
|
|
179
|
+
}
|
|
137
180
|
return c;
|
|
138
181
|
}
|
|
139
182
|
|
|
@@ -146,23 +189,23 @@ export function renderAgentToolCall(
|
|
|
146
189
|
* Tool log: "▸ bash: $ npm test" / " read: src/index.ts"
|
|
147
190
|
* Usage: "↑12k ↓3k R45k W0 $0.023"
|
|
148
191
|
*/
|
|
149
|
-
export function renderAgentProgress(
|
|
150
|
-
record: CrewAgentRecord, theme: Theme, expanded: boolean, w: number,
|
|
151
|
-
): Container {
|
|
192
|
+
export function renderAgentProgress(record: CrewAgentRecord, theme: Theme, expanded: boolean, w: number): Container {
|
|
152
193
|
const c = new Container();
|
|
153
194
|
const prog = record.progress;
|
|
154
195
|
const isRunning = record.status === "running";
|
|
155
196
|
const isPending = record.status === "queued" || record.status === "waiting";
|
|
156
197
|
const innerW = Math.max(20, w);
|
|
157
198
|
|
|
158
|
-
const addLine = (content: string) =>
|
|
159
|
-
c.addChild(new Text(expanded ? content : truncLine(content, innerW), 0, 0));
|
|
199
|
+
const addLine = (content: string) => c.addChild(new Text(expanded ? content : truncLine(content, innerW), 0, 0));
|
|
160
200
|
|
|
161
201
|
// Status icon
|
|
162
|
-
const icon = isRunning
|
|
163
|
-
|
|
164
|
-
:
|
|
165
|
-
|
|
202
|
+
const icon = isRunning
|
|
203
|
+
? theme.fg("warning", "⟳")
|
|
204
|
+
: isPending
|
|
205
|
+
? theme.fg("dim", "○")
|
|
206
|
+
: record.status === "completed"
|
|
207
|
+
? theme.fg("success", "✓")
|
|
208
|
+
: theme.fg("error", "✗");
|
|
166
209
|
|
|
167
210
|
// Duration
|
|
168
211
|
const durationMs = prog?.durationMs ?? computeDurationMs(record.startedAt, record.completedAt);
|
|
@@ -181,9 +224,7 @@ export function renderAgentProgress(
|
|
|
181
224
|
if (prog?.recentTools?.length) {
|
|
182
225
|
for (const tool of prog.recentTools) {
|
|
183
226
|
const detail = tool.args ? `: ${tool.args}` : "";
|
|
184
|
-
const line = tool.endedAt
|
|
185
|
-
? theme.fg("muted", ` ${tool.tool}${detail}`)
|
|
186
|
-
: theme.fg("warning", `▸ ${tool.tool}${detail}`);
|
|
227
|
+
const line = tool.endedAt ? theme.fg("muted", ` ${tool.tool}${detail}`) : theme.fg("warning", `▸ ${tool.tool}${detail}`);
|
|
187
228
|
addLine(line);
|
|
188
229
|
}
|
|
189
230
|
}
|
|
@@ -216,7 +257,10 @@ export function renderAgentProgress(
|
|
|
216
257
|
if (usage?.cost) parts.push(theme.fg("dim", `$${usage.cost.toFixed(3)}`));
|
|
217
258
|
const tokens = prog?.tokens ?? 0;
|
|
218
259
|
if (tokens > 0) parts.push(theme.fg("dim", `${formatTokens(tokens)} ctx`));
|
|
219
|
-
if (parts.length) {
|
|
260
|
+
if (parts.length) {
|
|
261
|
+
c.addChild(new Spacer(1));
|
|
262
|
+
addLine(parts.join(" "));
|
|
263
|
+
}
|
|
220
264
|
|
|
221
265
|
return c;
|
|
222
266
|
}
|
|
@@ -243,7 +287,9 @@ interface TeamToolFlattenedDetails {
|
|
|
243
287
|
/** team tool result: 'run' shows agent progress rows, else compact summary */
|
|
244
288
|
export function renderTeamToolResult(
|
|
245
289
|
result: { details?: TeamToolResultDetails; content?: unknown[] } & Record<string, unknown>,
|
|
246
|
-
_options: unknown,
|
|
290
|
+
_options: unknown,
|
|
291
|
+
theme: Theme,
|
|
292
|
+
_context: unknown,
|
|
247
293
|
): Component {
|
|
248
294
|
// Handle both nested details (result.details) and flattened result shape (details at root level)
|
|
249
295
|
const d = (result as { details?: TeamToolResultDetails }).details;
|
|
@@ -264,7 +310,12 @@ export function renderTeamToolResult(
|
|
|
264
310
|
// For 'run' action without records: show goal prominently with status badge
|
|
265
311
|
if (flat.action === "run") {
|
|
266
312
|
const goalText = flat.goal || "";
|
|
267
|
-
const statusBadge = flat.status
|
|
313
|
+
const statusBadge = flat.status
|
|
314
|
+
? theme.fg(
|
|
315
|
+
flat.status === "completed" ? "success" : flat.status === "failed" ? "error" : "warning",
|
|
316
|
+
`[${flat.status}]`,
|
|
317
|
+
) + " "
|
|
318
|
+
: "";
|
|
268
319
|
return new Text(statusBadge + theme.fg("text", truncLine(goalText, 116)), 0, 0);
|
|
269
320
|
}
|
|
270
321
|
// For other actions: compact info line
|
|
@@ -301,7 +352,9 @@ export function renderTeamToolResult(
|
|
|
301
352
|
/** agent tool result: shows agent output rows with status icons */
|
|
302
353
|
export function renderAgentToolResult(
|
|
303
354
|
result: { details?: AgentToolResultDetails; content?: unknown[] } & Record<string, unknown>,
|
|
304
|
-
_options: unknown,
|
|
355
|
+
_options: unknown,
|
|
356
|
+
theme: Theme,
|
|
357
|
+
_context: unknown,
|
|
305
358
|
): Component {
|
|
306
359
|
// Handle both nested details and flattened result shape
|
|
307
360
|
const d = (result.details ?? result) as AgentResultData;
|
|
@@ -312,10 +365,14 @@ export function renderAgentToolResult(
|
|
|
312
365
|
const results = d?.results;
|
|
313
366
|
if (results?.length) {
|
|
314
367
|
for (const item of results) {
|
|
315
|
-
const icon =
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
368
|
+
const icon =
|
|
369
|
+
item.status === "completed"
|
|
370
|
+
? theme.fg("success", "✓")
|
|
371
|
+
: item.status === "failed"
|
|
372
|
+
? theme.fg("error", "✗")
|
|
373
|
+
: item.status === "running"
|
|
374
|
+
? theme.fg("warning", "⟳")
|
|
375
|
+
: theme.fg("dim", "○");
|
|
319
376
|
const label = item.agentId || "agent";
|
|
320
377
|
c.addChild(new Text(`${icon} ${theme.fg("toolTitle", theme.bold(label))}`, 0, 0));
|
|
321
378
|
if (item.error) {
|
|
@@ -335,10 +392,14 @@ export function renderAgentToolResult(
|
|
|
335
392
|
|
|
336
393
|
// Handle single agent result shape: { agentId, runId, status, output }
|
|
337
394
|
if (d?.agentId) {
|
|
338
|
-
const icon =
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
395
|
+
const icon =
|
|
396
|
+
d.status === "completed"
|
|
397
|
+
? theme.fg("success", "✓")
|
|
398
|
+
: d.status === "failed"
|
|
399
|
+
? theme.fg("error", "✗")
|
|
400
|
+
: d.status === "running"
|
|
401
|
+
? theme.fg("warning", "⟳")
|
|
402
|
+
: theme.fg("dim", "○");
|
|
342
403
|
const label = d.agentId;
|
|
343
404
|
c.addChild(new Text(`${icon} ${theme.fg("toolTitle", theme.bold(label))}`, 0, 0));
|
|
344
405
|
if (d.error) {
|
|
@@ -347,8 +408,7 @@ export function renderAgentToolResult(
|
|
|
347
408
|
const clean = truncLine(replaceTabs(String(d.error)), w - 2);
|
|
348
409
|
c.addChild(new Text(theme.fg("error", ` Error: ${clean}`), 0, 0));
|
|
349
410
|
} else if (d.output) {
|
|
350
|
-
for (const line of d.output.split("\n").slice(0, 5))
|
|
351
|
-
c.addChild(new Text(theme.fg("dim", ` ${truncLine(line, w - 2)}`), 0, 0));
|
|
411
|
+
for (const line of d.output.split("\n").slice(0, 5)) c.addChild(new Text(theme.fg("dim", ` ${truncLine(line, w - 2)}`), 0, 0));
|
|
352
412
|
}
|
|
353
413
|
return c;
|
|
354
414
|
}
|
|
@@ -361,21 +421,33 @@ export function renderAgentToolResult(
|
|
|
361
421
|
function extractText(content: unknown[] | undefined): string {
|
|
362
422
|
if (!content) return "(no output)";
|
|
363
423
|
if (!Array.isArray(content)) return String(content);
|
|
364
|
-
return
|
|
424
|
+
return (
|
|
425
|
+
content
|
|
426
|
+
.filter(
|
|
427
|
+
(c): c is Record<string, unknown> => typeof c === "object" && c !== null && (c as Record<string, unknown>).type === "text",
|
|
428
|
+
)
|
|
429
|
+
.map((c) => String((c as Record<string, unknown>).text ?? ""))
|
|
430
|
+
.join("\n") || "(no output)"
|
|
431
|
+
);
|
|
365
432
|
}
|
|
366
433
|
|
|
367
434
|
function parseArgs(argsStr: string | undefined): Record<string, unknown> {
|
|
368
435
|
if (!argsStr) return {};
|
|
369
436
|
try {
|
|
370
437
|
const p = JSON.parse(argsStr);
|
|
371
|
-
return typeof p === "object" && p !== null ? p as Record<string, unknown> : {};
|
|
372
|
-
} catch {
|
|
438
|
+
return typeof p === "object" && p !== null ? (p as Record<string, unknown>) : {};
|
|
439
|
+
} catch {
|
|
440
|
+
return {};
|
|
441
|
+
}
|
|
373
442
|
}
|
|
374
443
|
|
|
375
444
|
function computeDurationMs(startedAt: string, completedAt?: string): number {
|
|
376
445
|
if (!startedAt) return 0;
|
|
377
446
|
const start = new Date(startedAt).getTime();
|
|
378
447
|
if (isNaN(start)) return 0;
|
|
379
|
-
if (completedAt) {
|
|
448
|
+
if (completedAt) {
|
|
449
|
+
const end = new Date(completedAt).getTime();
|
|
450
|
+
return isNaN(end) ? 0 : Math.max(0, end - start);
|
|
451
|
+
}
|
|
380
452
|
return Math.max(0, Date.now() - start);
|
|
381
|
-
}
|
|
453
|
+
}
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* session reloads via pi.appendEntry().
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type { CrewTheme } from "../theme-adapter.ts";
|
|
10
|
-
import { formatTokens, formatDuration, truncLine } from "../tool-render.ts";
|
|
11
9
|
import type { CrewAgentRecord } from "../../runtime/crew-agent-runtime.ts";
|
|
10
|
+
import type { CrewTheme } from "../theme-adapter.ts";
|
|
11
|
+
import { formatDuration, formatTokens, truncLine } from "../tool-render.ts";
|
|
12
12
|
|
|
13
13
|
// ── State ──────────────────────────────────────────────────────────────
|
|
14
14
|
|
|
@@ -37,9 +37,12 @@ export function makeBriefEntry(enabled: boolean): BriefStateEntry {
|
|
|
37
37
|
export function restoreBriefState(entries: Iterable<unknown>): void {
|
|
38
38
|
for (const entry of entries) {
|
|
39
39
|
if (
|
|
40
|
-
typeof entry === "object" &&
|
|
41
|
-
|
|
42
|
-
"
|
|
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 &&
|
|
43
46
|
"data" in entry
|
|
44
47
|
) {
|
|
45
48
|
const data = (entry as Record<string, unknown>).data;
|
|
@@ -58,16 +61,26 @@ export { BRIEF_ENTRY_TYPE };
|
|
|
58
61
|
export function briefToolResult(toolName: string, result: { content?: unknown[] }, theme: CrewTheme): string {
|
|
59
62
|
const text = extractText(result?.content);
|
|
60
63
|
switch (toolName) {
|
|
61
|
-
case "read":
|
|
62
|
-
|
|
63
|
-
case "
|
|
64
|
-
|
|
65
|
-
case "
|
|
66
|
-
|
|
67
|
-
case "
|
|
68
|
-
|
|
69
|
-
case "
|
|
70
|
-
|
|
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);
|
|
71
84
|
}
|
|
72
85
|
}
|
|
73
86
|
|
|
@@ -96,9 +109,7 @@ function briefEdit(text: string, theme: CrewTheme): string {
|
|
|
96
109
|
if (added === 0 && removed === 0) {
|
|
97
110
|
return theme.fg("success", "→ edited");
|
|
98
111
|
}
|
|
99
|
-
return theme.fg("success", "→ edited ") +
|
|
100
|
-
theme.fg("toolDiffAdded", `+${added} `) +
|
|
101
|
-
theme.fg("toolDiffRemoved", `-${removed}`);
|
|
112
|
+
return theme.fg("success", "→ edited ") + theme.fg("toolDiffAdded", `+${added} `) + theme.fg("toolDiffRemoved", `-${removed}`);
|
|
102
113
|
}
|
|
103
114
|
|
|
104
115
|
function briefWrite(text: string, theme: CrewTheme): string {
|
|
@@ -127,13 +138,17 @@ function briefLs(text: string, theme: CrewTheme): string {
|
|
|
127
138
|
function briefTeam(result: { content?: unknown[] }, theme: CrewTheme): string {
|
|
128
139
|
// Try to extract structured details
|
|
129
140
|
const details = (result as Record<string, unknown>).details ?? result;
|
|
130
|
-
const d = typeof details === "object" && details !== null ? details as Record<string, unknown> : {};
|
|
141
|
+
const d = typeof details === "object" && details !== null ? (details as Record<string, unknown>) : {};
|
|
131
142
|
const status = typeof d.status === "string" ? d.status : "";
|
|
132
143
|
const runId = typeof d.runId === "string" ? d.runId : "";
|
|
133
|
-
const icon =
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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", "○");
|
|
137
152
|
|
|
138
153
|
// Agent records summary
|
|
139
154
|
const records = (d.agentRecords ?? d.results) as CrewAgentRecord[] | undefined;
|
|
@@ -154,12 +169,15 @@ function briefTeam(result: { content?: unknown[] }, theme: CrewTheme): string {
|
|
|
154
169
|
|
|
155
170
|
function briefAgent(result: { content?: unknown[] }, theme: CrewTheme): string {
|
|
156
171
|
const d = (result as Record<string, unknown>).details ?? result;
|
|
157
|
-
const data = typeof d === "object" && d !== null ? d as Record<string, unknown> : {};
|
|
172
|
+
const data = typeof d === "object" && d !== null ? (d as Record<string, unknown>) : {};
|
|
158
173
|
const status = typeof data.status === "string" ? data.status : "";
|
|
159
174
|
const agentId = typeof data.agentId === "string" ? data.agentId : "agent";
|
|
160
|
-
const icon =
|
|
161
|
-
|
|
162
|
-
|
|
175
|
+
const icon =
|
|
176
|
+
status === "completed"
|
|
177
|
+
? theme.fg("success", "\u2713")
|
|
178
|
+
: status === "failed"
|
|
179
|
+
? theme.fg("error", "\u2717")
|
|
180
|
+
: theme.fg("dim", "\u25CB");
|
|
163
181
|
// P3: Show duration and tokens when available
|
|
164
182
|
const parts: string[] = [agentId];
|
|
165
183
|
if (data.durationMs) parts.push(formatDuration(data.durationMs as number));
|