pi-crew 0.9.50 → 0.9.52
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 +150 -0
- package/README.md +216 -20
- package/dist/build-meta.json +2222 -1761
- package/dist/index.mjs +18636 -17603
- package/docs/actions-reference.md +431 -1
- package/package.json +19 -9
- package/schema.json +41 -0
- package/scripts/check-bundle-size.mjs +38 -0
- package/scripts/test-runner.mjs +11 -1
- package/skills/distill-software/SKILL.md +24 -1
- package/dist/index.mjs.map +0 -7
- package/docs/FEATURE_INTAKE.md +0 -126
- package/docs/HARNESS.md +0 -87
- package/docs/HARNESS_BACKLOG.md +0 -89
- package/docs/PROJECT_REVIEW.md +0 -270
- package/docs/PROJECT_REVIEW_FIXES.md +0 -342
- package/docs/PROJECT_REVIEW_ROUND4.md +0 -156
- package/docs/PROJECT_REVIEW_ROUND5.md +0 -86
- package/docs/REVIEW-FINDINGS-2026-06 +0 -357
- package/docs/REVIEW-FINDINGS-2026-07-CORE.md +0 -139
- package/docs/REVIEW-FINDINGS-2026-07.md +0 -125
- package/docs/TEST_MATRIX.md +0 -51
- package/docs/archive/README.md +0 -91
- package/docs/archive/followup-review-round3-2026-05-12.md +0 -342
- package/docs/archive/followup-review-round4-2026-05-13.md +0 -107
- package/docs/archive/pi-crew-bugs.md +0 -961
- package/docs/archive/pi-crew-test-final.md +0 -120
- package/docs/archive/pi-crew-test-results.md +0 -260
- package/docs/archive/pi-crew-test-round2.md +0 -136
- package/docs/archive/pi-crew-test-round4.md +0 -100
- package/docs/archive/pi-crew-test-round5.md +0 -70
- package/docs/archive/pi-crew-test-round6.md +0 -110
- package/docs/archive/pi-crew-v0.5.10-audit-fix-plan.md +0 -60
- package/docs/archive/pi-crew-v0.5.11-audit-fix-plan.md +0 -92
- package/docs/archive/pi-crew-v0.5.12-audit-fix-plan.md +0 -76
- package/docs/archive/pi-crew-v0.5.13-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.14-audit-fix-plan.md +0 -75
- package/docs/archive/pi-crew-v0.5.16-audit-fix-plan.md +0 -35
- package/docs/archive/pi-crew-v0.5.17-audit-fix-plan.md +0 -80
- package/docs/archive/pi-crew-v0.5.5-audit-fix-plan.md +0 -133
- package/docs/archive/pi-crew-v0.5.9-audit-fix-plan.md +0 -88
- package/docs/archive/pi-mono-opportunities.md +0 -969
- package/docs/archive/pi-mono-review.md +0 -291
- package/docs/archive/pi-subagent4-comparison.md +0 -261
- package/docs/archive/pi-subagents3-deep-analysis.md +0 -508
- package/docs/bugs/bug-021-notification-badge-counter-misleading.md +0 -293
- package/docs/bugs/bug-023-chain-windows-path-resolution.md +0 -106
- package/docs/bugs/bug-quota-display-truncation.md +0 -223
- package/docs/bugs/cross-session-notification-leakage.md +0 -82
- package/docs/code-review-2026-05-11.md +0 -592
- package/docs/coding-agent-optimization.md +0 -268
- package/docs/comparison-pi-subagents-vs-pi-crew.md +0 -303
- package/docs/decisions/0001-durable-state.md +0 -41
- package/docs/decisions/0002-child-process-for-async.md +0 -42
- package/docs/decisions/0003-depth-guard.md +0 -36
- package/docs/decisions/0004-execfile-over-exec.md +0 -34
- package/docs/decisions/0005-no-parameter-properties.md +0 -49
- package/docs/decisions/0006-publish-bundled-esm.md +0 -63
- package/docs/decisions/0007-active-run-binary-index.md +0 -54
- package/docs/decisions/0008-child-pi-warm-pool.md +0 -61
- package/docs/decisions/2026-07-21-broker-phase4-default-on.md +0 -77
- package/docs/decisions/2026-07-21-broker-windows-perms.md +0 -91
- package/docs/decisions/2026-07-22-broker-phase4-gated-on.md +0 -99
- package/docs/decisions/2026-07-24-oidc-trusted-publishing.md +0 -112
- package/docs/decisions/README.md +0 -26
- package/docs/deep-review-report.md +0 -384
- package/docs/distillation/cybersecurity-patterns.md +0 -294
- package/docs/feature-analysis-subagent4.md +0 -305
- package/docs/fix-plan-disabletools-exit-null.md +0 -219
- package/docs/fixes/BATCH_A_H1_H2.md +0 -86
- package/docs/fixes/bug-006-foreground-cancel-concurrent.md +0 -78
- package/docs/fixes/bug-007-async-notifier-stale-ctx.md +0 -112
- package/docs/fixes/bug-008-child-process-silent-timeout.md +0 -100
- package/docs/fixes/bug-009-executor-yield-limit-needs-attention.md +0 -75
- package/docs/fixes/bug-010-child-process-api-key-filtered.md +0 -109
- package/docs/fixes/bug-011-spawn-pi-enoent.md +0 -92
- package/docs/fixes/bug-012-essential-env-stripped.md +0 -89
- package/docs/fixes/bug-013-background-runner-death.md +0 -84
- package/docs/fixes/bug-014-infinite-retry-loop-needs-attention.md +0 -82
- package/docs/fixes/bug-015-background-runner-sigterm.md +0 -65
- package/docs/fixes/bug-017-background-runner-session-shutdown.md +0 -66
- package/docs/fixes/bug-017-background-runner-sigkill-double-fork.md +0 -28
- package/docs/fixes/bug-018-child-pi-worker-stdin-hang.md +0 -61
- package/docs/fixes/bug-019-phantom-runs-temp-workspace.md +0 -52
- package/docs/fixes/bug-020-infinite-retry-loop-needs-attention.md +0 -47
- package/docs/fixes/v0.9.10/locks-fix-verify.md +0 -3
- package/docs/fixes/v0.9.10/smoke-test.md +0 -12
- package/docs/followup-plan-2026-05-12.md +0 -463
- package/docs/followup-review-2026-05-12.md +0 -297
- package/docs/goals.md +0 -59
- package/docs/implementation-plan-top3.md +0 -333
- package/docs/issue-29-analysis.md +0 -189
- package/docs/live-mailbox-runtime.md +0 -36
- package/docs/migration/atomic-write-v2-migration.md +0 -299
- package/docs/next-upgrade-roadmap.md +0 -808
- package/docs/oh-my-pi-research.md +0 -509
- package/docs/optimization-plan-2026-07.md +0 -366
- package/docs/optimization-plan.md +0 -644
- package/docs/patterns/command-agent-skill.md +0 -71
- package/docs/perf/baseline-2026-05.md +0 -113
- package/docs/perf/final-report-2026-05.md +0 -206
- package/docs/perf/optimization-plan-2026-07-verified.md +0 -396
- package/docs/perf/performance-audit-report-2026-07.md +0 -948
- package/docs/perf/performance-review-2026-07.md +0 -287
- package/docs/perf/sprint-1-report.md +0 -71
- package/docs/perf/sprint-2-report.md +0 -81
- package/docs/perf/sprint-2.5-report.md +0 -53
- package/docs/perf/sprint-3-report.md +0 -36
- package/docs/perf/sprint-4-report.md +0 -47
- package/docs/perf/sprint-5-report.md +0 -51
- package/docs/perf/sprint-6-report.md +0 -94
- package/docs/perf/sprint-7-report.md +0 -74
- package/docs/perf/upgrade-plan-2026-05.md +0 -147
- package/docs/performance-optimization-execution-plan.md +0 -520
- package/docs/phase4-triage.md +0 -58
- package/docs/pi-crew-investigation-report.md +0 -411
- package/docs/product/README.md +0 -31
- package/docs/product/platform.md +0 -27
- package/docs/product/runtime-safety.md +0 -37
- package/docs/product/team-run.md +0 -39
- package/docs/product/team-tool.md +0 -37
- package/docs/runtime-analysis-child-vs-live.md +0 -171
- package/docs/runtime-migration-in-process-analysis.md +0 -250
- package/docs/skills/REFERENCE.md +0 -138
- package/docs/stories/README.md +0 -32
- package/docs/stories/US-DEPS-major-upgrade.md +0 -62
- package/docs/stories/backlog.md +0 -36
- package/docs/superpowers/plans/2026-06-09-fallow-patterns-adoption.md +0 -1270
- package/docs/templates/decision.md +0 -27
- package/docs/templates/story.md +0 -44
- package/docs/templates/validation-report.md +0 -32
- package/docs/ui-optimization-plan.md +0 -447
- package/src/adapters/claude-adapter.ts +0 -23
- package/src/adapters/codex-adapter.ts +0 -21
- package/src/adapters/cursor-adapter.ts +0 -17
- package/src/adapters/export-util.ts +0 -143
- package/src/adapters/index.ts +0 -15
- package/src/adapters/registry.ts +0 -18
- package/src/adapters/types.ts +0 -23
- package/src/agents/agent-config.ts +0 -194
- package/src/agents/agent-search.ts +0 -98
- package/src/agents/agent-serializer.ts +0 -38
- package/src/agents/discover-agents.ts +0 -623
- package/src/benchmark/benchmark-runner.ts +0 -313
- package/src/benchmark/feedback-loop.ts +0 -73
- package/src/config/config.ts +0 -1269
- package/src/config/defaults.ts +0 -193
- package/src/config/drift-detector.ts +0 -290
- package/src/config/markers.ts +0 -330
- package/src/config/resilient-parser.ts +0 -117
- package/src/config/role-tools.ts +0 -118
- package/src/config/suggestions.ts +0 -75
- package/src/config/types.ts +0 -278
- package/src/errors.ts +0 -194
- package/src/extension/action-suggestions.ts +0 -117
- package/src/extension/async-notifier.ts +0 -179
- package/src/extension/autonomous-policy.ts +0 -209
- package/src/extension/command-completions.ts +0 -120
- package/src/extension/context-status-injection.ts +0 -185
- package/src/extension/crew-autocomplete.ts +0 -131
- package/src/extension/crew-cleanup.ts +0 -168
- package/src/extension/crew-input-router.ts +0 -93
- package/src/extension/crew-shortcuts.ts +0 -87
- package/src/extension/crew-vibes/cat-frames.ts +0 -18
- package/src/extension/crew-vibes/config.ts +0 -195
- package/src/extension/crew-vibes/figures.ts +0 -101
- package/src/extension/crew-vibes/font-detect.ts +0 -71
- package/src/extension/crew-vibes/footer.ts +0 -292
- package/src/extension/crew-vibes/index.ts +0 -432
- package/src/extension/crew-vibes/provider-usage.ts +0 -396
- package/src/extension/crew-vibes/render.ts +0 -206
- package/src/extension/crew-vibes/speed.ts +0 -286
- package/src/extension/cross-extension-rpc.ts +0 -350
- package/src/extension/help.ts +0 -62
- package/src/extension/import-index.ts +0 -74
- package/src/extension/knowledge-injection.ts +0 -402
- package/src/extension/management.ts +0 -571
- package/src/extension/message-renderers.ts +0 -108
- package/src/extension/notification-router.ts +0 -152
- package/src/extension/notification-sink.ts +0 -54
- package/src/extension/pi-api.ts +0 -56
- package/src/extension/plan-orchestrate.ts +0 -302
- package/src/extension/project-init.ts +0 -170
- package/src/extension/register.ts +0 -113
- package/src/extension/registration/artifact-cleanup.ts +0 -20
- package/src/extension/registration/command-registration.ts +0 -58
- package/src/extension/registration/command-utils.ts +0 -58
- package/src/extension/registration/commands.ts +0 -1228
- package/src/extension/registration/compaction-guard.ts +0 -333
- package/src/extension/registration/context-builder.ts +0 -135
- package/src/extension/registration/crash-recovery-cache.ts +0 -54
- package/src/extension/registration/foreground-run-controller.ts +0 -238
- package/src/extension/registration/hook-registration.ts +0 -119
- package/src/extension/registration/lazy-configurers.ts +0 -124
- package/src/extension/registration/lifecycle-handlers.ts +0 -923
- package/src/extension/registration/lifecycle.ts +0 -259
- package/src/extension/registration/observability.ts +0 -322
- package/src/extension/registration/registration-types.ts +0 -158
- package/src/extension/registration/runtime-cleanup.ts +0 -230
- package/src/extension/registration/subagent-helpers.ts +0 -125
- package/src/extension/registration/subagent-manager-setup.ts +0 -330
- package/src/extension/registration/subagent-tools.ts +0 -456
- package/src/extension/registration/team-tool.ts +0 -220
- package/src/extension/registration/tool-registration.ts +0 -50
- package/src/extension/registration/ui.ts +0 -172
- package/src/extension/registration/viewers.ts +0 -121
- package/src/extension/registration/wire-cross-extension.ts +0 -37
- package/src/extension/result-watcher.ts +0 -139
- package/src/extension/rpc-hmac.ts +0 -256
- package/src/extension/run-bundle-schema.ts +0 -104
- package/src/extension/run-export.ts +0 -97
- package/src/extension/run-import.ts +0 -168
- package/src/extension/run-index.ts +0 -131
- package/src/extension/run-maintenance.ts +0 -190
- package/src/extension/session-summary.ts +0 -18
- package/src/extension/team-manager-command.ts +0 -153
- package/src/extension/team-onboard.ts +0 -177
- package/src/extension/team-recommendation.ts +0 -288
- package/src/extension/team-tool/anchor.ts +0 -172
- package/src/extension/team-tool/api.ts +0 -1244
- package/src/extension/team-tool/auto-summarize.ts +0 -142
- package/src/extension/team-tool/cache-control.ts +0 -19
- package/src/extension/team-tool/cancel.ts +0 -337
- package/src/extension/team-tool/chain-dispatch.ts +0 -95
- package/src/extension/team-tool/chain-executor.ts +0 -379
- package/src/extension/team-tool/config-patch.ts +0 -50
- package/src/extension/team-tool/context.ts +0 -149
- package/src/extension/team-tool/destructive-gate.ts +0 -52
- package/src/extension/team-tool/doctor.ts +0 -431
- package/src/extension/team-tool/explain.ts +0 -282
- package/src/extension/team-tool/failure-patterns.ts +0 -118
- package/src/extension/team-tool/goal-wrap.ts +0 -330
- package/src/extension/team-tool/goal.ts +0 -556
- package/src/extension/team-tool/handle-schedule.ts +0 -332
- package/src/extension/team-tool/handle-settings.ts +0 -520
- package/src/extension/team-tool/health-monitor.ts +0 -481
- package/src/extension/team-tool/inspect.ts +0 -88
- package/src/extension/team-tool/intent-policy.ts +0 -45
- package/src/extension/team-tool/lifecycle-actions.ts +0 -615
- package/src/extension/team-tool/orchestrate.ts +0 -98
- package/src/extension/team-tool/parallel-dispatch.ts +0 -183
- package/src/extension/team-tool/plan.ts +0 -50
- package/src/extension/team-tool/respond.ts +0 -150
- package/src/extension/team-tool/run-not-found.ts +0 -49
- package/src/extension/team-tool/run.ts +0 -1035
- package/src/extension/team-tool/status.ts +0 -260
- package/src/extension/team-tool/workflow-manage.ts +0 -261
- package/src/extension/team-tool-types.ts +0 -26
- package/src/extension/team-tool.ts +0 -1116
- package/src/extension/tool-result.ts +0 -16
- package/src/extension/validate-resources.ts +0 -108
- package/src/hooks/registry.ts +0 -200
- package/src/hooks/types.ts +0 -69
- package/src/i18n.ts +0 -212
- package/src/observability/correlation.ts +0 -50
- package/src/observability/event-bus.ts +0 -86
- package/src/observability/event-to-metric.ts +0 -170
- package/src/observability/exporters/adapter.ts +0 -27
- package/src/observability/exporters/otlp-exporter.ts +0 -356
- package/src/observability/exporters/prometheus-exporter.ts +0 -54
- package/src/observability/metric-registry.ts +0 -100
- package/src/observability/metric-retention.ts +0 -64
- package/src/observability/metric-sink.ts +0 -99
- package/src/observability/metrics-primitives.ts +0 -219
- package/src/plugins/plugin-define.ts +0 -6
- package/src/plugins/plugin-registry.ts +0 -32
- package/src/plugins/plugins/index.ts +0 -3
- package/src/plugins/plugins/nextjs.ts +0 -19
- package/src/plugins/plugins/vite.ts +0 -10
- package/src/plugins/plugins/vitest.ts +0 -9
- package/src/prompt/prompt-runtime.ts +0 -380
- package/src/runtime/adaptive-plan.ts +0 -563
- package/src/runtime/agent-control.ts +0 -215
- package/src/runtime/agent-memory.ts +0 -81
- package/src/runtime/agent-observability.ts +0 -122
- package/src/runtime/anchor-manager.ts +0 -475
- package/src/runtime/async-marker.ts +0 -32
- package/src/runtime/async-runner.ts +0 -381
- package/src/runtime/attention-events.ts +0 -28
- package/src/runtime/auto-summarize.ts +0 -344
- package/src/runtime/background-runner.ts +0 -837
- package/src/runtime/batch-barrier.ts +0 -147
- package/src/runtime/broker-issuer.ts +0 -37
- package/src/runtime/cancellation-token.ts +0 -99
- package/src/runtime/cancellation.ts +0 -99
- package/src/runtime/capability-inventory.ts +0 -137
- package/src/runtime/chain-parser.ts +0 -237
- package/src/runtime/chain-runner.ts +0 -606
- package/src/runtime/checkpoint.ts +0 -291
- package/src/runtime/child-pi-constants.ts +0 -42
- package/src/runtime/child-pi-kill.ts +0 -180
- package/src/runtime/child-pi-pool.ts +0 -68
- package/src/runtime/child-pi-spawn.ts +0 -287
- package/src/runtime/child-pi-steering.ts +0 -128
- package/src/runtime/child-pi-streams.ts +0 -296
- package/src/runtime/child-pi-transcript.ts +0 -169
- package/src/runtime/child-pi.ts +0 -1105
- package/src/runtime/coalesce-tasks.ts +0 -268
- package/src/runtime/code-summary.ts +0 -292
- package/src/runtime/command-trace.ts +0 -105
- package/src/runtime/compact-pipeline.ts +0 -56
- package/src/runtime/compact-stages/ansi-strip-stage.ts +0 -25
- package/src/runtime/compact-stages/blank-collapse-stage.ts +0 -31
- package/src/runtime/compact-stages/deduplicate-stage.ts +0 -34
- package/src/runtime/compact-stages/head-snap-stage.ts +0 -57
- package/src/runtime/compact-stages/index.ts +0 -23
- package/src/runtime/compact-stages/tail-capture-stage.ts +0 -77
- package/src/runtime/compact-stages/truncation-stage.ts +0 -74
- package/src/runtime/compaction-summary.ts +0 -278
- package/src/runtime/completion-guard.ts +0 -207
- package/src/runtime/concurrency.ts +0 -58
- package/src/runtime/crash-classification.ts +0 -229
- package/src/runtime/crash-recovery.ts +0 -577
- package/src/runtime/crew-agent-records.ts +0 -593
- package/src/runtime/crew-agent-runtime.ts +0 -62
- package/src/runtime/crew-broker-child.ts +0 -88
- package/src/runtime/crew-broker-client.ts +0 -673
- package/src/runtime/crew-broker-tokens.ts +0 -84
- package/src/runtime/crew-broker.ts +0 -1276
- package/src/runtime/crew-hooks.ts +0 -227
- package/src/runtime/cross-extension-rpc.ts +0 -143
- package/src/runtime/custom-tools/irc-tool.ts +0 -282
- package/src/runtime/custom-tools/submit-result-tool.ts +0 -102
- package/src/runtime/deadletter.ts +0 -47
- package/src/runtime/delivery-coordinator.ts +0 -211
- package/src/runtime/delta-conflict.ts +0 -348
- package/src/runtime/deterministic-ast.ts +0 -161
- package/src/runtime/diagnostic-export.ts +0 -171
- package/src/runtime/direct-run.ts +0 -45
- package/src/runtime/dwf-state-store.ts +0 -102
- package/src/runtime/dynamic-workflow-context.ts +0 -1016
- package/src/runtime/dynamic-workflow-runner.ts +0 -310
- package/src/runtime/effectiveness.ts +0 -90
- package/src/runtime/errors/crew-errors.ts +0 -162
- package/src/runtime/event-stream-bridge.ts +0 -98
- package/src/runtime/foreground-control.ts +0 -193
- package/src/runtime/foreground-watchdog.ts +0 -132
- package/src/runtime/global-worker-cap.ts +0 -96
- package/src/runtime/goal-achievement.ts +0 -148
- package/src/runtime/goal-evaluator.ts +0 -361
- package/src/runtime/goal-loop-runner.ts +0 -828
- package/src/runtime/goal-state-store.ts +0 -219
- package/src/runtime/green-contract.ts +0 -55
- package/src/runtime/group-join.ts +0 -267
- package/src/runtime/handoff-manager.ts +0 -598
- package/src/runtime/heartbeat-gradient.ts +0 -36
- package/src/runtime/heartbeat-watcher.ts +0 -239
- package/src/runtime/hidden-handoff.ts +0 -407
- package/src/runtime/important-line-classifier.ts +0 -140
- package/src/runtime/intercom-bridge.ts +0 -187
- package/src/runtime/iteration-hooks.ts +0 -305
- package/src/runtime/live-agent-control.ts +0 -136
- package/src/runtime/live-agent-manager.ts +0 -704
- package/src/runtime/live-control-realtime.ts +0 -56
- package/src/runtime/live-extension-bridge.ts +0 -148
- package/src/runtime/live-irc.ts +0 -97
- package/src/runtime/live-session-health.ts +0 -108
- package/src/runtime/live-session-runtime.ts +0 -1139
- package/src/runtime/loop-gates.ts +0 -128
- package/src/runtime/manifest-cache.ts +0 -375
- package/src/runtime/mcp-proxy.ts +0 -105
- package/src/runtime/metric-parser.ts +0 -36
- package/src/runtime/model-fallback.ts +0 -409
- package/src/runtime/model-resolver.ts +0 -126
- package/src/runtime/model-scope.ts +0 -158
- package/src/runtime/orphan-worker-registry.ts +0 -465
- package/src/runtime/output-validator.ts +0 -202
- package/src/runtime/overflow-recovery.ts +0 -206
- package/src/runtime/parallel-research.ts +0 -68
- package/src/runtime/parallel-utils.ts +0 -160
- package/src/runtime/parent-guard.ts +0 -134
- package/src/runtime/path-overlap.ts +0 -150
- package/src/runtime/peer-dep.ts +0 -292
- package/src/runtime/per-write-validator.ts +0 -181
- package/src/runtime/phase-progress.ts +0 -217
- package/src/runtime/phase-tracker.ts +0 -385
- package/src/runtime/pi-args.ts +0 -655
- package/src/runtime/pi-json-output.ts +0 -170
- package/src/runtime/pi-spawn.ts +0 -273
- package/src/runtime/pipeline-runner.ts +0 -523
- package/src/runtime/plan-templates.ts +0 -201
- package/src/runtime/policy-engine.ts +0 -115
- package/src/runtime/post-checks.ts +0 -142
- package/src/runtime/post-exit-stdio-guard.ts +0 -104
- package/src/runtime/process-lifecycle.ts +0 -491
- package/src/runtime/process-status.ts +0 -154
- package/src/runtime/progress-event-coalescer.ts +0 -44
- package/src/runtime/progress-tracker.ts +0 -124
- package/src/runtime/prose-compressor.ts +0 -162
- package/src/runtime/recovery-recipes.ts +0 -203
- package/src/runtime/replace.ts +0 -570
- package/src/runtime/resilient-edit.ts +0 -153
- package/src/runtime/result-extractor.ts +0 -213
- package/src/runtime/retry-executor.ts +0 -100
- package/src/runtime/retry-runner.ts +0 -336
- package/src/runtime/role-permission.ts +0 -59
- package/src/runtime/run-coalesced-task-group.ts +0 -308
- package/src/runtime/run-drift.ts +0 -219
- package/src/runtime/run-tracker.ts +0 -116
- package/src/runtime/runtime-policy.ts +0 -29
- package/src/runtime/runtime-resolver.ts +0 -172
- package/src/runtime/runtime-warmup.ts +0 -160
- package/src/runtime/scheduler.ts +0 -353
- package/src/runtime/semaphore.ts +0 -141
- package/src/runtime/sensitive-paths.ts +0 -93
- package/src/runtime/session-resources.ts +0 -25
- package/src/runtime/session-snapshot.ts +0 -59
- package/src/runtime/session-usage.ts +0 -79
- package/src/runtime/settings-store.ts +0 -155
- package/src/runtime/sidechain-output.ts +0 -35
- package/src/runtime/single-agent-compose.ts +0 -84
- package/src/runtime/skill-effectiveness.ts +0 -524
- package/src/runtime/skill-instructions.ts +0 -391
- package/src/runtime/stale-reconciler.ts +0 -680
- package/src/runtime/stream-preview.ts +0 -184
- package/src/runtime/streaming-output.ts +0 -50
- package/src/runtime/subagent-manager.ts +0 -561
- package/src/runtime/subprocess-tool-registry.ts +0 -70
- package/src/runtime/supervisor-contact.ts +0 -64
- package/src/runtime/task-display.ts +0 -52
- package/src/runtime/task-graph-scheduler.ts +0 -227
- package/src/runtime/task-graph.ts +0 -290
- package/src/runtime/task-health.ts +0 -83
- package/src/runtime/task-id.ts +0 -161
- package/src/runtime/task-output-context.ts +0 -602
- package/src/runtime/task-packet.ts +0 -268
- package/src/runtime/task-quality.ts +0 -199
- package/src/runtime/task-runner/capabilities.ts +0 -78
- package/src/runtime/task-runner/context-retrieval.ts +0 -163
- package/src/runtime/task-runner/live-executor.ts +0 -227
- package/src/runtime/task-runner/output-splitter.ts +0 -152
- package/src/runtime/task-runner/progress.ts +0 -157
- package/src/runtime/task-runner/prompt-builder.ts +0 -278
- package/src/runtime/task-runner/prompt-pipeline.ts +0 -88
- package/src/runtime/task-runner/result-utils.ts +0 -16
- package/src/runtime/task-runner/retrieval-orchestrator.ts +0 -310
- package/src/runtime/task-runner/run-projection.ts +0 -125
- package/src/runtime/task-runner/state-helpers.ts +0 -176
- package/src/runtime/task-runner/tail-read.ts +0 -34
- package/src/runtime/task-runner.ts +0 -1420
- package/src/runtime/team-runner-artifacts.ts +0 -13
- package/src/runtime/team-runner.ts +0 -1993
- package/src/runtime/tool-output-pruner.ts +0 -333
- package/src/runtime/tool-progress.ts +0 -278
- package/src/runtime/usage-tracker.ts +0 -73
- package/src/runtime/verification-gates.ts +0 -571
- package/src/runtime/verification-integrity.ts +0 -105
- package/src/runtime/verification-worktree.ts +0 -186
- package/src/runtime/worker-heartbeat.ts +0 -25
- package/src/runtime/worker-startup.ts +0 -83
- package/src/runtime/workflow-state.ts +0 -195
- package/src/runtime/workspace-lock.ts +0 -443
- package/src/runtime/workspace-tree.ts +0 -312
- package/src/runtime/yield-handler.ts +0 -224
- package/src/runtime/zombie-scanner.ts +0 -298
- package/src/schema/config-schema.ts +0 -327
- package/src/schema/team-tool-schema.ts +0 -415
- package/src/schema/validation-types.ts +0 -159
- package/src/skills/discover-skills.ts +0 -197
- package/src/skills/skill-templates.ts +0 -456
- package/src/skills/validate.ts +0 -285
- package/src/state/active-run-registry.ts +0 -439
- package/src/state/artifact-store.ts +0 -176
- package/src/state/atomic-write.ts +0 -903
- package/src/state/blob-store.ts +0 -308
- package/src/state/contracts.ts +0 -158
- package/src/state/crew-init.ts +0 -269
- package/src/state/decision-ledger.ts +0 -345
- package/src/state/event-log-rotation.ts +0 -342
- package/src/state/event-log.ts +0 -1311
- package/src/state/event-reconstructor.ts +0 -229
- package/src/state/gitignore-manager.ts +0 -46
- package/src/state/health-store.ts +0 -79
- package/src/state/hook-instinct-bridge.ts +0 -94
- package/src/state/hook-integrations.ts +0 -51
- package/src/state/instinct-store.ts +0 -275
- package/src/state/jsonl-writer.ts +0 -107
- package/src/state/locks.ts +0 -562
- package/src/state/mailbox.ts +0 -916
- package/src/state/observation-store.ts +0 -176
- package/src/state/run-cache.ts +0 -193
- package/src/state/run-graph.ts +0 -183
- package/src/state/run-metrics.ts +0 -165
- package/src/state/schedule.ts +0 -166
- package/src/state/session-state-map.ts +0 -51
- package/src/state/state-store.ts +0 -958
- package/src/state/task-claims.ts +0 -61
- package/src/state/tiered-eval.ts +0 -480
- package/src/state/types-eval.ts +0 -58
- package/src/state/types.ts +0 -440
- package/src/state/usage.ts +0 -138
- package/src/state/worker-atomic-writer.ts +0 -194
- package/src/subagents/async-entry.ts +0 -1
- package/src/subagents/index.ts +0 -3
- package/src/subagents/live/control.ts +0 -1
- package/src/subagents/live/manager.ts +0 -1
- package/src/subagents/live/realtime.ts +0 -1
- package/src/subagents/live/session-runtime.ts +0 -1
- package/src/subagents/manager.ts +0 -1
- package/src/subagents/spawn.ts +0 -1
- package/src/teams/discover-teams.ts +0 -187
- package/src/teams/team-config.ts +0 -27
- package/src/teams/team-serializer.ts +0 -38
- package/src/tools/safe-bash-extension.ts +0 -54
- package/src/tools/safe-bash.ts +0 -505
- package/src/types/diff.d.ts +0 -18
- package/src/types/new-api-types.ts +0 -35
- package/src/ui/agent-management-overlay.ts +0 -160
- package/src/ui/card-colors.ts +0 -139
- package/src/ui/crew-footer.ts +0 -102
- package/src/ui/crew-select-list.ts +0 -111
- package/src/ui/dashboard-panes/agents-pane.ts +0 -164
- package/src/ui/dashboard-panes/cancellation-pane.ts +0 -66
- package/src/ui/dashboard-panes/capability-pane.ts +0 -77
- package/src/ui/dashboard-panes/health-pane.ts +0 -31
- package/src/ui/dashboard-panes/mailbox-pane.ts +0 -35
- package/src/ui/dashboard-panes/metrics-pane.ts +0 -37
- package/src/ui/dashboard-panes/progress-pane.ts +0 -38
- package/src/ui/dashboard-panes/transcript-pane.ts +0 -10
- package/src/ui/deploy-bundled-themes.ts +0 -71
- package/src/ui/dwf-phase-display.ts +0 -151
- package/src/ui/dynamic-border.ts +0 -35
- package/src/ui/heartbeat-aggregator.ts +0 -74
- package/src/ui/key-utils.ts +0 -42
- package/src/ui/keybinding-map.ts +0 -248
- package/src/ui/layout-primitives.ts +0 -106
- package/src/ui/live-conversation-overlay.ts +0 -183
- package/src/ui/live-duration.ts +0 -55
- package/src/ui/live-run-sidebar.ts +0 -301
- package/src/ui/loaders.ts +0 -176
- package/src/ui/mascot.ts +0 -436
- package/src/ui/overlays/agent-picker-overlay.ts +0 -65
- package/src/ui/overlays/confirm-overlay.ts +0 -60
- package/src/ui/overlays/help-overlay.ts +0 -177
- package/src/ui/overlays/mailbox-compose-overlay.ts +0 -181
- package/src/ui/overlays/mailbox-compose-preview.ts +0 -78
- package/src/ui/overlays/mailbox-detail-overlay.ts +0 -154
- package/src/ui/pi-ui-compat.ts +0 -68
- package/src/ui/powerbar-publisher.ts +0 -459
- package/src/ui/render-coalescer.ts +0 -101
- package/src/ui/render-diff.ts +0 -160
- package/src/ui/render-scheduler.ts +0 -224
- package/src/ui/run-action-dispatcher.ts +0 -182
- package/src/ui/run-dashboard.ts +0 -913
- package/src/ui/run-event-bus.ts +0 -381
- package/src/ui/run-snapshot-cache.ts +0 -1057
- package/src/ui/settings-overlay.ts +0 -1067
- package/src/ui/snapshot-types.ts +0 -90
- package/src/ui/spinner.ts +0 -17
- package/src/ui/status-colors.ts +0 -143
- package/src/ui/syntax-highlight.ts +0 -136
- package/src/ui/terminal-status.ts +0 -269
- package/src/ui/theme-adapter.ts +0 -271
- package/src/ui/theme-discovery.ts +0 -199
- package/src/ui/tool-progress-formatter.ts +0 -93
- package/src/ui/tool-render.ts +0 -453
- package/src/ui/tool-renderers/brief-mode.ts +0 -225
- package/src/ui/tool-renderers/index.ts +0 -726
- package/src/ui/transcript-cache.ts +0 -128
- package/src/ui/transcript-entries.ts +0 -256
- package/src/ui/transcript-viewer.ts +0 -424
- package/src/ui/widget/index.ts +0 -357
- package/src/ui/widget/widget-formatters.ts +0 -182
- package/src/ui/widget/widget-model.ts +0 -110
- package/src/ui/widget/widget-renderer.ts +0 -182
- package/src/ui/widget/widget-types.ts +0 -36
- package/src/utils/bm25-search.ts +0 -235
- package/src/utils/completion-dedupe.ts +0 -63
- package/src/utils/conflict-detect.ts +0 -668
- package/src/utils/env-allowlist.ts +0 -30
- package/src/utils/env-filter.ts +0 -155
- package/src/utils/file-coalescer.ts +0 -98
- package/src/utils/fingerprint.ts +0 -180
- package/src/utils/frontmatter.ts +0 -70
- package/src/utils/fs-watch.ts +0 -37
- package/src/utils/gh-protocol.ts +0 -556
- package/src/utils/git.ts +0 -260
- package/src/utils/guards.ts +0 -107
- package/src/utils/ids.ts +0 -24
- package/src/utils/incremental-reader.ts +0 -220
- package/src/utils/internal-error.ts +0 -10
- package/src/utils/names.ts +0 -36
- package/src/utils/ndjson.ts +0 -115
- package/src/utils/paths.ts +0 -227
- package/src/utils/project-detector.ts +0 -160
- package/src/utils/redaction.ts +0 -347
- package/src/utils/resolve-shell.ts +0 -36
- package/src/utils/run-watcher-registry.ts +0 -152
- package/src/utils/safe-paths.ts +0 -383
- package/src/utils/scan-cache.ts +0 -144
- package/src/utils/session-utils.ts +0 -110
- package/src/utils/sleep.ts +0 -54
- package/src/utils/socket-path.ts +0 -127
- package/src/utils/sse-parser.ts +0 -129
- package/src/utils/task-name-generator.ts +0 -337
- package/src/utils/timings.ts +0 -33
- package/src/utils/token-counter.ts +0 -200
- package/src/utils/visual.ts +0 -207
- package/src/workflows/cost-estimator.ts +0 -34
- package/src/workflows/discover-workflows.ts +0 -290
- package/src/workflows/intermediate-store.ts +0 -166
- package/src/workflows/preflight-validator.ts +0 -168
- package/src/workflows/topology-analyzer.ts +0 -203
- package/src/workflows/validate-workflow.ts +0 -50
- package/src/workflows/workflow-config.ts +0 -70
- package/src/workflows/workflow-serializer.ts +0 -32
- package/src/worktree/branch-freshness.ts +0 -112
- package/src/worktree/cleanup.ts +0 -341
- package/src/worktree/worktree-manager.ts +0 -1200
package/src/ui/tool-render.ts
DELETED
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @deprecated Use tool-renderers/index.ts (teamToolRenderer/agentToolRenderer) instead.
|
|
3
|
-
* This file only exports shared utility functions (truncLine, formatTokens, formatDuration).
|
|
4
|
-
* The render functions below are kept for backward-compatible tests only.
|
|
5
|
-
*
|
|
6
|
-
* Shared rendering for pi-crew's tool TUI display.
|
|
7
|
-
* Ports logic from pi-subagent4 adapted for pi-crew's data model.
|
|
8
|
-
* Uses @earendil-works/pi-tui Components (Container, Text, Spacer) directly.
|
|
9
|
-
*/
|
|
10
|
-
import { Container, Spacer, Text } from "@earendil-works/pi-tui";
|
|
11
|
-
import type { CrewAgentRecord } from "../runtime/crew-agent-runtime.ts";
|
|
12
|
-
import { truncateToWidth } from "../utils/visual.ts";
|
|
13
|
-
import { replaceTabs } from "./render-diff.ts";
|
|
14
|
-
|
|
15
|
-
// ── Types ──────────────────────────────────────────────────────────────
|
|
16
|
-
export interface Theme {
|
|
17
|
-
fg(color: ThemeColor, text: string): string;
|
|
18
|
-
bold(text: string): string;
|
|
19
|
-
}
|
|
20
|
-
export type ThemeColor = "success" | "error" | "warning" | "dim" | "toolTitle" | "accent" | "muted" | "text";
|
|
21
|
-
export interface ToolRenderContext {
|
|
22
|
-
expanded: boolean;
|
|
23
|
-
lastComponent?: Container;
|
|
24
|
-
}
|
|
25
|
-
export type Component = Container | Text;
|
|
26
|
-
|
|
27
|
-
export interface TeamToolResultDetails {
|
|
28
|
-
action?: string;
|
|
29
|
-
status?: string;
|
|
30
|
-
runId?: string;
|
|
31
|
-
goal?: string;
|
|
32
|
-
team?: string;
|
|
33
|
-
workflow?: string;
|
|
34
|
-
error?: string;
|
|
35
|
-
agentRecords?: CrewAgentRecord[];
|
|
36
|
-
// FIX (Round 14): `results` is the legacy key used by some subagent
|
|
37
|
-
// responses. Add it here so renderers can read either field without
|
|
38
|
-
// bypassing type checks.
|
|
39
|
-
results?: CrewAgentRecord[];
|
|
40
|
-
}
|
|
41
|
-
export interface AgentToolResultDetails {
|
|
42
|
-
results?: Array<{
|
|
43
|
-
agentId?: string;
|
|
44
|
-
status?: string;
|
|
45
|
-
output?: string;
|
|
46
|
-
error?: string;
|
|
47
|
-
}>;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** Combined type for renderAgentToolResult — handles both nested details and flat result shapes */
|
|
51
|
-
interface AgentResultData extends AgentToolResultDetails {
|
|
52
|
-
agentId?: string;
|
|
53
|
-
status?: string;
|
|
54
|
-
error?: string;
|
|
55
|
-
output?: string;
|
|
56
|
-
runId?: string;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// ── Helpers ─────────────────────────────────────────────────────────
|
|
60
|
-
|
|
61
|
-
export function formatTokens(n: number): string {
|
|
62
|
-
if (n < 1000) return String(n);
|
|
63
|
-
if (n < 10_000) return `${(n / 1000).toFixed(1)}k`;
|
|
64
|
-
if (n < 1_000_000) return `${Math.round(n / 1000)}k`;
|
|
65
|
-
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function formatDuration(ms: number): string {
|
|
69
|
-
if (ms < 1000) return `${ms}ms`;
|
|
70
|
-
if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;
|
|
71
|
-
const m = Math.floor(ms / 60_000),
|
|
72
|
-
s = Math.floor((ms % 60_000) / 1000);
|
|
73
|
-
return s > 0 ? `${m}m${s}s` : `${m}m`;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** @internal */
|
|
77
|
-
function formatContextUsage(tokens: number, contextWindow: number | undefined): string {
|
|
78
|
-
if (!contextWindow) return `${formatTokens(tokens)} ctx`;
|
|
79
|
-
const pct = (tokens / contextWindow) * 100;
|
|
80
|
-
const maxStr = contextWindow >= 1_000_000 ? `${(contextWindow / 1_000_000).toFixed(1)}M` : `${Math.round(contextWindow / 1000)}k`;
|
|
81
|
-
return `${pct.toFixed(1)}%/${maxStr}`;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export function truncLine(text: string, maxWidth: number): string {
|
|
85
|
-
if (text.includes("\n") || text.includes("\r")) text = text.replace(/\r?\n/g, "↵ ");
|
|
86
|
-
// Round 23 (BUG 4): previously this loop counted 1 visual column per UTF-16
|
|
87
|
-
// code unit and indexed text[i], so for CJK it emitted up to 2x the visual
|
|
88
|
-
// width (frame overflow) and for emoji it split surrogate pairs (U+FFFD).
|
|
89
|
-
// Delegate to the grapheme/ANSI-aware truncateToWidth (keeps ANSI codes,
|
|
90
|
-
// respects double-wide CJK + surrogate pairs, adds the '…' ellipsis).
|
|
91
|
-
return truncateToWidth(text, maxWidth);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export function formatToolPreview(name: string, args: Record<string, unknown>): string {
|
|
95
|
-
switch (name) {
|
|
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
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// ── Tool Call Renderers ─────────────────────────────────────────────
|
|
128
|
-
|
|
129
|
-
/** team tool call: collapsed "team action='run' impl..." / expanded: header + goal */
|
|
130
|
-
export function renderTeamToolCall(
|
|
131
|
-
args: { action?: string; goal?: string; team?: string; workflow?: string },
|
|
132
|
-
theme: Theme,
|
|
133
|
-
context: ToolRenderContext,
|
|
134
|
-
): Component {
|
|
135
|
-
const action = args.action || "",
|
|
136
|
-
goal = args.goal || "";
|
|
137
|
-
const team = args.team ? ` ${theme.fg("dim", `(${args.team})`)}` : "";
|
|
138
|
-
|
|
139
|
-
if (!context.expanded) {
|
|
140
|
-
const preview = goal.length > 60 ? goal.slice(0, 60) + "…" : goal;
|
|
141
|
-
return new Text(
|
|
142
|
-
`${theme.fg("toolTitle", theme.bold("team"))} action=${theme.fg("accent", `'${action}'`)}${team}${theme.fg("dim", preview ? ` "${preview.replace(/\n/g, " ")}"` : "")}`,
|
|
143
|
-
0,
|
|
144
|
-
0,
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
const c = context.lastComponent instanceof Container ? (context.lastComponent.clear(), context.lastComponent) : new Container();
|
|
148
|
-
c.addChild(new Text(`${theme.fg("toolTitle", theme.bold("team"))} action=${theme.fg("accent", `'${action}'`)}${team}`, 0, 0));
|
|
149
|
-
if (goal) {
|
|
150
|
-
c.addChild(new Spacer(1));
|
|
151
|
-
c.addChild(new Text(theme.fg("text", goal), 0, 0));
|
|
152
|
-
}
|
|
153
|
-
return c;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/** agent tool call: collapsed "Agent explorer..." / expanded: header + prompt */
|
|
157
|
-
export function renderAgentToolCall(
|
|
158
|
-
args: { agent?: string; prompt?: string; task?: string; cwd?: string },
|
|
159
|
-
theme: Theme,
|
|
160
|
-
context: ToolRenderContext,
|
|
161
|
-
): Component {
|
|
162
|
-
const agentName = args.agent || "",
|
|
163
|
-
prompt = args.prompt || args.task || "";
|
|
164
|
-
|
|
165
|
-
if (!context.expanded) {
|
|
166
|
-
const preview = prompt.length > 60 ? prompt.slice(0, 60) + "…" : prompt;
|
|
167
|
-
return new Text(
|
|
168
|
-
`${theme.fg("toolTitle", theme.bold("agent"))} ${theme.fg("accent", agentName)}${theme.fg("dim", preview ? ` "${preview.replace(/\n/g, " ")}"` : "")}`,
|
|
169
|
-
0,
|
|
170
|
-
0,
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
const c = context.lastComponent instanceof Container ? (context.lastComponent.clear(), context.lastComponent) : new Container();
|
|
174
|
-
const cwdLabel = args.cwd ? theme.fg("dim", ` (cwd: ${args.cwd})`) : "";
|
|
175
|
-
c.addChild(new Text(`${theme.fg("toolTitle", theme.bold("agent"))} ${theme.fg("accent", agentName)}${cwdLabel}`, 0, 0));
|
|
176
|
-
if (prompt) {
|
|
177
|
-
c.addChild(new Spacer(1));
|
|
178
|
-
c.addChild(new Text(theme.fg("text", prompt), 0, 0));
|
|
179
|
-
}
|
|
180
|
-
return c;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// ── Agent Progress Renderer ──────────────────────────────────────────
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Render a single crew agent's progress block.
|
|
187
|
-
* Icon: ⟳ running ○ pending ✓ completed ✗ failed
|
|
188
|
-
* Header: "✓ executor (model) — 5 tools · 12.3s"
|
|
189
|
-
* Tool log: "▸ bash: $ npm test" / " read: src/index.ts"
|
|
190
|
-
* Usage: "↑12k ↓3k R45k W0 $0.023"
|
|
191
|
-
*/
|
|
192
|
-
export function renderAgentProgress(record: CrewAgentRecord, theme: Theme, expanded: boolean, w: number): Container {
|
|
193
|
-
const c = new Container();
|
|
194
|
-
const prog = record.progress;
|
|
195
|
-
const isRunning = record.status === "running";
|
|
196
|
-
const isPending = record.status === "queued" || record.status === "waiting";
|
|
197
|
-
const innerW = Math.max(20, w);
|
|
198
|
-
|
|
199
|
-
const addLine = (content: string) => c.addChild(new Text(expanded ? content : truncLine(content, innerW), 0, 0));
|
|
200
|
-
|
|
201
|
-
// Status icon
|
|
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", "✗");
|
|
209
|
-
|
|
210
|
-
// Duration
|
|
211
|
-
const durationMs = prog?.durationMs ?? computeDurationMs(record.startedAt, record.completedAt);
|
|
212
|
-
const stats = `${prog?.toolCount ?? record.toolUses ?? 0} tools · ${formatDuration(durationMs)}`;
|
|
213
|
-
const modelStr = record.model ? ` (${record.model})` : "";
|
|
214
|
-
const roleLabel = record.role || record.agent || "agent";
|
|
215
|
-
addLine(`${icon} ${theme.fg("toolTitle", theme.bold(roleLabel))}${theme.fg("dim", modelStr)} — ${theme.fg("dim", stats)}`);
|
|
216
|
-
|
|
217
|
-
// Current tool (running)
|
|
218
|
-
if (isRunning && prog?.currentTool) {
|
|
219
|
-
const toolLabel = formatToolPreview(prog.currentTool, parseArgs(prog.currentToolArgs));
|
|
220
|
-
addLine(theme.fg("warning", `▸ ${prog.currentTool}: ${toolLabel}`));
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// Recent tools log
|
|
224
|
-
if (prog?.recentTools?.length) {
|
|
225
|
-
for (const tool of prog.recentTools) {
|
|
226
|
-
const detail = tool.args ? `: ${tool.args}` : "";
|
|
227
|
-
const line = tool.endedAt ? theme.fg("muted", ` ${tool.tool}${detail}`) : theme.fg("warning", `▸ ${tool.tool}${detail}`);
|
|
228
|
-
addLine(line);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// Last assistant message (prose)
|
|
233
|
-
const lastOutput = prog?.recentOutput?.slice(-1)[0];
|
|
234
|
-
if (lastOutput?.trim()) {
|
|
235
|
-
c.addChild(new Spacer(1));
|
|
236
|
-
addLine(theme.fg("text", truncLine(lastOutput.replace(/\s+/g, " ").trim(), innerW)));
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// Error
|
|
240
|
-
// FIX (Round 20, render-utils sanitization): Sanitize tool-error display so
|
|
241
|
-
// embedded tabs / control chars / newlines / very long strings cannot break
|
|
242
|
-
// the terminal layout. Mirrors the upstream oh-my-pi pattern at
|
|
243
|
-
// packages/coding-agent/src/tools/render-utils.ts:177-185:
|
|
244
|
-
// formatErrorMessage = replaceTabs(truncateToWidth(clean, LINE_CAP))
|
|
245
|
-
if (record.error) {
|
|
246
|
-
const clean = truncLine(replaceTabs(String(record.error)), innerW);
|
|
247
|
-
addLine(theme.fg("error", `Error: ${clean}`));
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Usage line
|
|
251
|
-
const usage = record.usage;
|
|
252
|
-
const parts: string[] = [];
|
|
253
|
-
if (usage?.input) parts.push(theme.fg("dim", `↑${formatTokens(usage.input)}`));
|
|
254
|
-
if (usage?.output) parts.push(theme.fg("dim", `↓${formatTokens(usage.output)}`));
|
|
255
|
-
if (usage?.cacheRead) parts.push(theme.fg("dim", `R${formatTokens(usage.cacheRead)}`));
|
|
256
|
-
if (usage?.cacheWrite) parts.push(theme.fg("dim", `W${formatTokens(usage.cacheWrite)}`));
|
|
257
|
-
if (usage?.cost) parts.push(theme.fg("dim", `$${usage.cost.toFixed(3)}`));
|
|
258
|
-
const tokens = prog?.tokens ?? 0;
|
|
259
|
-
if (tokens > 0) parts.push(theme.fg("dim", `${formatTokens(tokens)} ctx`));
|
|
260
|
-
if (parts.length) {
|
|
261
|
-
c.addChild(new Spacer(1));
|
|
262
|
-
addLine(parts.join(" "));
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
return c;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// ── Tool Result Renderers ──────────────────────────────────────────────
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* FIX (Round 14, M1): Properly typed shape for team-tool result details
|
|
272
|
-
* that may be nested in `result.details` or flattened at the root level.
|
|
273
|
-
* Replaces the prior `as any` casts that bypassed type checking.
|
|
274
|
-
*/
|
|
275
|
-
interface TeamToolFlattenedDetails {
|
|
276
|
-
action?: string;
|
|
277
|
-
status?: string;
|
|
278
|
-
runId?: string;
|
|
279
|
-
goal?: string;
|
|
280
|
-
error?: string;
|
|
281
|
-
team?: string;
|
|
282
|
-
workflow?: string;
|
|
283
|
-
agentRecords?: unknown[];
|
|
284
|
-
results?: unknown[];
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/** team tool result: 'run' shows agent progress rows, else compact summary */
|
|
288
|
-
export function renderTeamToolResult(
|
|
289
|
-
result: { details?: TeamToolResultDetails; content?: unknown[] } & Record<string, unknown>,
|
|
290
|
-
_options: unknown,
|
|
291
|
-
theme: Theme,
|
|
292
|
-
_context: unknown,
|
|
293
|
-
): Component {
|
|
294
|
-
// Handle both nested details (result.details) and flattened result shape (details at root level)
|
|
295
|
-
const d = (result as { details?: TeamToolResultDetails }).details;
|
|
296
|
-
|
|
297
|
-
// If details is explicitly undefined/null, check if result itself looks like details (flattened)
|
|
298
|
-
// This handles cases where the result object has details properties at root level
|
|
299
|
-
if (d === undefined || d === null) {
|
|
300
|
-
// Check if result has detail-like properties to treat as flattened details
|
|
301
|
-
if ("action" in result || "status" in result || "runId" in result || "agentRecords" in result) {
|
|
302
|
-
// Use result as the details object (cast through unknown for safety)
|
|
303
|
-
const flat = result as unknown as TeamToolFlattenedDetails;
|
|
304
|
-
const c = new Container();
|
|
305
|
-
const records = (flat.agentRecords ?? flat.results) as CrewAgentRecord[] | undefined;
|
|
306
|
-
if (flat.action === "run" && records?.length) {
|
|
307
|
-
for (const r of records) c.addChild(renderAgentProgress(r, theme, false, 116));
|
|
308
|
-
return c;
|
|
309
|
-
}
|
|
310
|
-
// For 'run' action without records: show goal prominently with status badge
|
|
311
|
-
if (flat.action === "run") {
|
|
312
|
-
const goalText = flat.goal || "";
|
|
313
|
-
const statusBadge = flat.status
|
|
314
|
-
? theme.fg(
|
|
315
|
-
flat.status === "completed" ? "success" : flat.status === "failed" ? "error" : "warning",
|
|
316
|
-
`[${flat.status}]`,
|
|
317
|
-
) + " "
|
|
318
|
-
: "";
|
|
319
|
-
return new Text(statusBadge + theme.fg("text", truncLine(goalText, 116)), 0, 0);
|
|
320
|
-
}
|
|
321
|
-
// For other actions: compact info line
|
|
322
|
-
const parts: string[] = [];
|
|
323
|
-
if (flat.status) parts.push(`status=${flat.status}`);
|
|
324
|
-
if (flat.runId) parts.push(`runId=${flat.runId}`);
|
|
325
|
-
if (flat.error) parts.push(theme.fg("error", `error`));
|
|
326
|
-
if (flat.goal && parts.length === 0) parts.push(theme.fg("dim", truncLine(flat.goal, 116)));
|
|
327
|
-
return new Text(parts.join(" · "), 0, 0);
|
|
328
|
-
}
|
|
329
|
-
// No details found, fall back to content
|
|
330
|
-
const text = extractText(result?.content).slice(0, 200);
|
|
331
|
-
return new Text(text, 0, 0);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
const c = new Container();
|
|
335
|
-
// Support both 'results' array from subagents and direct agentRecords
|
|
336
|
-
const records = (d.agentRecords ?? d.results) as CrewAgentRecord[] | undefined;
|
|
337
|
-
if (d.action === "run" && records?.length) {
|
|
338
|
-
for (const r of records) c.addChild(renderAgentProgress(r, theme, false, 116));
|
|
339
|
-
return c;
|
|
340
|
-
}
|
|
341
|
-
const parts: string[] = [];
|
|
342
|
-
if (d.status) parts.push(`status=${d.status}`);
|
|
343
|
-
if (d.runId) parts.push(`runId=${d.runId}`);
|
|
344
|
-
if (d.team) parts.push(`team=${d.team}`);
|
|
345
|
-
if (d.workflow) parts.push(`workflow=${d.workflow}`);
|
|
346
|
-
if (d.error) parts.push(theme.fg("error", `error=${d.error}`));
|
|
347
|
-
if (d.goal) parts.push(theme.fg("dim", truncLine(d.goal, 116)));
|
|
348
|
-
if (parts.length === 0) return new Text(theme.fg("muted", "(no output)"), 0, 0);
|
|
349
|
-
return new Text(parts.join(" · "), 0, 0);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/** agent tool result: shows agent output rows with status icons */
|
|
353
|
-
export function renderAgentToolResult(
|
|
354
|
-
result: { details?: AgentToolResultDetails; content?: unknown[] } & Record<string, unknown>,
|
|
355
|
-
_options: unknown,
|
|
356
|
-
theme: Theme,
|
|
357
|
-
_context: unknown,
|
|
358
|
-
): Component {
|
|
359
|
-
// Handle both nested details and flattened result shape
|
|
360
|
-
const d = (result.details ?? result) as AgentResultData;
|
|
361
|
-
const c = new Container();
|
|
362
|
-
const w = 116;
|
|
363
|
-
|
|
364
|
-
// Check for results array (from subagent) OR single agent properties (agentId, status)
|
|
365
|
-
const results = d?.results;
|
|
366
|
-
if (results?.length) {
|
|
367
|
-
for (const item of results) {
|
|
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", "○");
|
|
376
|
-
const label = item.agentId || "agent";
|
|
377
|
-
c.addChild(new Text(`${icon} ${theme.fg("toolTitle", theme.bold(label))}`, 0, 0));
|
|
378
|
-
if (item.error) {
|
|
379
|
-
// FIX (Round 20, render-utils sanitization): Sanitize tool-error
|
|
380
|
-
// display so embedded tabs / newlines / very long strings cannot
|
|
381
|
-
// break the TUI border alignment. Mirrors upstream oh-my-pi
|
|
382
|
-
// render-utils.ts:177-185.
|
|
383
|
-
const clean = truncLine(replaceTabs(String(item.error)), w - 2);
|
|
384
|
-
c.addChild(new Text(theme.fg("error", ` Error: ${clean}`), 0, 0));
|
|
385
|
-
} else if (item.output) {
|
|
386
|
-
for (const line of item.output.split("\n").slice(0, 5))
|
|
387
|
-
c.addChild(new Text(theme.fg("dim", ` ${truncLine(line, w - 2)}`), 0, 0));
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
return c;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
// Handle single agent result shape: { agentId, runId, status, output }
|
|
394
|
-
if (d?.agentId) {
|
|
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", "○");
|
|
403
|
-
const label = d.agentId;
|
|
404
|
-
c.addChild(new Text(`${icon} ${theme.fg("toolTitle", theme.bold(label))}`, 0, 0));
|
|
405
|
-
if (d.error) {
|
|
406
|
-
// FIX (Round 20, render-utils sanitization): Same sanitization as
|
|
407
|
-
// above — see renderAgentToolResult header comment.
|
|
408
|
-
const clean = truncLine(replaceTabs(String(d.error)), w - 2);
|
|
409
|
-
c.addChild(new Text(theme.fg("error", ` Error: ${clean}`), 0, 0));
|
|
410
|
-
} else if (d.output) {
|
|
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));
|
|
412
|
-
}
|
|
413
|
-
return c;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
return new Text(extractText(result?.content).slice(0, 200), 0, 0);
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
// ── Utilities ─────────────────────────────────────────────────────────
|
|
420
|
-
|
|
421
|
-
function extractText(content: unknown[] | undefined): string {
|
|
422
|
-
if (!content) return "(no output)";
|
|
423
|
-
if (!Array.isArray(content)) return String(content);
|
|
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
|
-
);
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
function parseArgs(argsStr: string | undefined): Record<string, unknown> {
|
|
435
|
-
if (!argsStr) return {};
|
|
436
|
-
try {
|
|
437
|
-
const p = JSON.parse(argsStr);
|
|
438
|
-
return typeof p === "object" && p !== null ? (p as Record<string, unknown>) : {};
|
|
439
|
-
} catch {
|
|
440
|
-
return {};
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
function computeDurationMs(startedAt: string, completedAt?: string): number {
|
|
445
|
-
if (!startedAt) return 0;
|
|
446
|
-
const start = new Date(startedAt).getTime();
|
|
447
|
-
if (Number.isNaN(start)) return 0;
|
|
448
|
-
if (completedAt) {
|
|
449
|
-
const end = new Date(completedAt).getTime();
|
|
450
|
-
return Number.isNaN(end) ? 0 : Math.max(0, end - start);
|
|
451
|
-
}
|
|
452
|
-
return Math.max(0, Date.now() - start);
|
|
453
|
-
}
|
|
@@ -1,225 +0,0 @@
|
|
|
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 type { CrewTheme } from "../theme-adapter.ts";
|
|
11
|
-
import { formatDuration, formatTokens, truncLine } from "../tool-render.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
|
-
}
|