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
|
@@ -33,7 +33,15 @@ function requestId(): string {
|
|
|
33
33
|
return `ctrl_${Date.now().toString(36)}_${Math.random().toString(16).slice(2, 10)}`;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
export function appendLiveAgentControlRequest(
|
|
36
|
+
export function appendLiveAgentControlRequest(
|
|
37
|
+
manifest: TeamRunManifest,
|
|
38
|
+
input: {
|
|
39
|
+
taskId: string;
|
|
40
|
+
agentId?: string;
|
|
41
|
+
operation: LiveAgentControlOperation;
|
|
42
|
+
message?: string;
|
|
43
|
+
},
|
|
44
|
+
): LiveAgentControlRequest {
|
|
37
45
|
const request: LiveAgentControlRequest = {
|
|
38
46
|
id: requestId(),
|
|
39
47
|
runId: manifest.runId,
|
|
@@ -48,7 +56,11 @@ export function appendLiveAgentControlRequest(manifest: TeamRunManifest, input:
|
|
|
48
56
|
return request;
|
|
49
57
|
}
|
|
50
58
|
|
|
51
|
-
export function readLiveAgentControlRequests(
|
|
59
|
+
export function readLiveAgentControlRequests(
|
|
60
|
+
manifest: TeamRunManifest,
|
|
61
|
+
taskId: string,
|
|
62
|
+
cursor: LiveAgentControlCursor = { offset: 0 },
|
|
63
|
+
): { requests: LiveAgentControlRequest[]; cursor: LiveAgentControlCursor } {
|
|
52
64
|
let filePath: string;
|
|
53
65
|
try {
|
|
54
66
|
filePath = liveAgentControlFile(manifest, taskId);
|
|
@@ -69,20 +81,56 @@ export function readLiveAgentControlRequests(manifest: TeamRunManifest, taskId:
|
|
|
69
81
|
return { requests, cursor: { offset: lines.length } };
|
|
70
82
|
}
|
|
71
83
|
|
|
72
|
-
export async function applyLiveAgentControlRequest(input: {
|
|
84
|
+
export async function applyLiveAgentControlRequest(input: {
|
|
85
|
+
request: LiveAgentControlRequest;
|
|
86
|
+
taskId: string;
|
|
87
|
+
agentId: string;
|
|
88
|
+
session: {
|
|
89
|
+
steer?: (text: string) => Promise<void>;
|
|
90
|
+
prompt?: (text: string, options?: Record<string, unknown>) => Promise<void>;
|
|
91
|
+
abort?: () => Promise<void> | void;
|
|
92
|
+
};
|
|
93
|
+
seenRequestIds?: Set<string>;
|
|
94
|
+
}): Promise<boolean> {
|
|
73
95
|
const { request, taskId, agentId, session, seenRequestIds } = input;
|
|
74
96
|
if (seenRequestIds?.has(request.id)) return false;
|
|
75
97
|
if (request.agentId && request.agentId !== agentId && request.agentId !== taskId) return false;
|
|
76
98
|
seenRequestIds?.add(request.id);
|
|
77
99
|
if (request.operation === "steer") await session.steer?.(request.message ?? "Please report current status and wrap up if possible.");
|
|
78
|
-
else if (request.operation === "follow-up")
|
|
79
|
-
|
|
100
|
+
else if (request.operation === "follow-up")
|
|
101
|
+
await session.prompt?.(request.message ?? "Please continue with the follow-up request.", {
|
|
102
|
+
source: "api",
|
|
103
|
+
expandPromptTemplates: false,
|
|
104
|
+
});
|
|
105
|
+
else if (request.operation === "resume")
|
|
106
|
+
await session.prompt?.(request.message ?? "Please resume and report final status.", {
|
|
107
|
+
source: "api",
|
|
108
|
+
expandPromptTemplates: false,
|
|
109
|
+
});
|
|
80
110
|
else if (request.operation === "stop") await session.abort?.();
|
|
81
111
|
return true;
|
|
82
112
|
}
|
|
83
113
|
|
|
84
|
-
export async function applyLiveAgentControlRequests(input: {
|
|
114
|
+
export async function applyLiveAgentControlRequests(input: {
|
|
115
|
+
manifest: TeamRunManifest;
|
|
116
|
+
taskId: string;
|
|
117
|
+
agentId: string;
|
|
118
|
+
session: {
|
|
119
|
+
steer?: (text: string) => Promise<void>;
|
|
120
|
+
prompt?: (text: string, options?: Record<string, unknown>) => Promise<void>;
|
|
121
|
+
abort?: () => Promise<void> | void;
|
|
122
|
+
};
|
|
123
|
+
cursor: LiveAgentControlCursor;
|
|
124
|
+
seenRequestIds?: Set<string>;
|
|
125
|
+
}): Promise<LiveAgentControlCursor> {
|
|
85
126
|
const batch = readLiveAgentControlRequests(input.manifest, input.taskId, input.cursor);
|
|
86
|
-
for (const request of batch.requests)
|
|
127
|
+
for (const request of batch.requests)
|
|
128
|
+
await applyLiveAgentControlRequest({
|
|
129
|
+
request,
|
|
130
|
+
taskId: input.taskId,
|
|
131
|
+
agentId: input.agentId,
|
|
132
|
+
session: input.session,
|
|
133
|
+
seenRequestIds: input.seenRequestIds,
|
|
134
|
+
});
|
|
87
135
|
return batch.cursor;
|
|
88
136
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import type { appendEvent } from "../state/event-log.ts";
|
|
2
|
+
import { logInternalError } from "../utils/internal-error.ts";
|
|
1
3
|
import type { CrewAgentRecord } from "./crew-agent-runtime.ts";
|
|
2
4
|
import type { IrcMessage } from "./live-irc.ts";
|
|
3
|
-
import { logInternalError } from "../utils/internal-error.ts";
|
|
4
|
-
import type { appendEvent } from "../state/event-log.ts";
|
|
5
5
|
|
|
6
6
|
const MAX_PENDING_MESSAGES = 1000;
|
|
7
7
|
|
|
@@ -12,7 +12,12 @@ type LiveSessionHandle = {
|
|
|
12
12
|
dispose?: () => void;
|
|
13
13
|
/** Upstream session stats (input/output/cacheWrite tokens, context %). */
|
|
14
14
|
getSessionStats?: () => {
|
|
15
|
-
tokens?: {
|
|
15
|
+
tokens?: {
|
|
16
|
+
input?: number;
|
|
17
|
+
output?: number;
|
|
18
|
+
cacheWrite?: number;
|
|
19
|
+
cacheRead?: number;
|
|
20
|
+
};
|
|
16
21
|
contextUsage?: { percent?: number | null; window?: number };
|
|
17
22
|
};
|
|
18
23
|
};
|
|
@@ -86,7 +91,13 @@ function listActiveLiveAgentsByWorkspace(workspaceId: string): LiveAgentHandle[]
|
|
|
86
91
|
return listActiveLiveAgents().filter((a) => a.workspaceId === workspaceId);
|
|
87
92
|
}
|
|
88
93
|
|
|
89
|
-
export function registerLiveAgent(
|
|
94
|
+
export function registerLiveAgent(
|
|
95
|
+
input: Omit<LiveAgentHandle, "createdAt" | "updatedAt" | "pendingSteers" | "pendingFollowUps" | "pendingMessages" | "activity"> & {
|
|
96
|
+
workspaceId: string;
|
|
97
|
+
},
|
|
98
|
+
eventLogFn?: typeof appendEvent,
|
|
99
|
+
eventsPath?: string,
|
|
100
|
+
): LiveAgentHandle {
|
|
90
101
|
const now = new Date().toISOString();
|
|
91
102
|
const existing = liveAgents.get(input.agentId);
|
|
92
103
|
const handle: LiveAgentHandle = {
|
|
@@ -124,16 +135,41 @@ export function registerLiveAgent(input: Omit<LiveAgentHandle, "createdAt" | "up
|
|
|
124
135
|
}
|
|
125
136
|
}
|
|
126
137
|
liveAgents.set(input.agentId, handle);
|
|
127
|
-
try {
|
|
138
|
+
try {
|
|
139
|
+
if (eventLogFn && eventsPath)
|
|
140
|
+
eventLogFn(eventsPath, {
|
|
141
|
+
type: "live_agent.registered",
|
|
142
|
+
runId: input.runId,
|
|
143
|
+
taskId: input.taskId,
|
|
144
|
+
message: `Live agent registered: ${input.agent} (${input.role})`,
|
|
145
|
+
data: {
|
|
146
|
+
agentId: input.agentId,
|
|
147
|
+
role: input.role,
|
|
148
|
+
agent: input.agent,
|
|
149
|
+
workspaceId: input.workspaceId,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
} catch {
|
|
153
|
+
/* non-critical */
|
|
154
|
+
}
|
|
128
155
|
if (handle.pendingSteers.length && typeof handle.session.steer === "function") {
|
|
129
156
|
const pending = [...handle.pendingSteers];
|
|
130
157
|
handle.pendingSteers.length = 0;
|
|
131
|
-
for (const message of pending)
|
|
158
|
+
for (const message of pending)
|
|
159
|
+
void handle.session
|
|
160
|
+
.steer(message)
|
|
161
|
+
.catch((error) => logInternalError("live-agent-manager.steer", error, `agentId=${handle.agentId}`));
|
|
132
162
|
}
|
|
133
163
|
if (handle.pendingFollowUps.length && typeof handle.session.prompt === "function") {
|
|
134
164
|
const pending = [...handle.pendingFollowUps];
|
|
135
165
|
handle.pendingFollowUps.length = 0;
|
|
136
|
-
for (const message of pending)
|
|
166
|
+
for (const message of pending)
|
|
167
|
+
void handle.session
|
|
168
|
+
.prompt(message, {
|
|
169
|
+
source: "api",
|
|
170
|
+
expandPromptTemplates: false,
|
|
171
|
+
})
|
|
172
|
+
.catch((error) => logInternalError("live-agent-manager.prompt", error, `agentId=${handle.agentId}`));
|
|
137
173
|
}
|
|
138
174
|
return handle;
|
|
139
175
|
}
|
|
@@ -146,7 +182,9 @@ export function updateLiveAgentStatus(agentId: string, status: CrewAgentRecord["
|
|
|
146
182
|
}
|
|
147
183
|
|
|
148
184
|
function safeDisposeLiveSession(handle: LiveAgentHandle): void {
|
|
149
|
-
try {
|
|
185
|
+
try {
|
|
186
|
+
handle.session.dispose?.();
|
|
187
|
+
} catch (error) {
|
|
150
188
|
logInternalError("live-agent-manager.dispose", error, `agentId=${handle.agentId}`);
|
|
151
189
|
}
|
|
152
190
|
}
|
|
@@ -166,22 +204,48 @@ export function disposeLiveAgentSession(agentIdOrTaskId: string): void {
|
|
|
166
204
|
safeDisposeLiveSession(handle);
|
|
167
205
|
}
|
|
168
206
|
|
|
169
|
-
export async function terminateLiveAgent(
|
|
207
|
+
export async function terminateLiveAgent(
|
|
208
|
+
agentIdOrTaskId: string,
|
|
209
|
+
status: CrewAgentRecord["status"] = "stopped",
|
|
210
|
+
eventLogFn?: typeof appendEvent,
|
|
211
|
+
eventsPath?: string,
|
|
212
|
+
): Promise<LiveAgentHandle | undefined> {
|
|
170
213
|
const handle = getLiveAgent(agentIdOrTaskId);
|
|
171
214
|
if (!handle) return undefined;
|
|
172
215
|
handle.status = status;
|
|
173
216
|
handle.updatedAt = new Date().toISOString();
|
|
174
|
-
try {
|
|
217
|
+
try {
|
|
218
|
+
if (eventLogFn && eventsPath)
|
|
219
|
+
eventLogFn(eventsPath, {
|
|
220
|
+
type: "live_agent.terminated",
|
|
221
|
+
runId: handle.runId,
|
|
222
|
+
taskId: handle.taskId,
|
|
223
|
+
message: `Live agent terminated: ${handle.agent} status=${status}`,
|
|
224
|
+
data: {
|
|
225
|
+
agentId: handle.agentId,
|
|
226
|
+
status,
|
|
227
|
+
role: handle.role,
|
|
228
|
+
workspaceId: handle.workspaceId,
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
} catch {
|
|
232
|
+
/* non-critical */
|
|
233
|
+
}
|
|
175
234
|
try {
|
|
176
235
|
await handle.session.abort?.();
|
|
177
236
|
} finally {
|
|
178
237
|
safeDisposeLiveSession(handle);
|
|
179
|
-
liveAgents.delete(handle.agentId);
|
|
238
|
+
liveAgents.delete(handle.agentId); // Move AFTER abort completes to prevent race
|
|
180
239
|
}
|
|
181
240
|
return handle;
|
|
182
241
|
}
|
|
183
242
|
|
|
184
|
-
export async function terminateLiveAgentsForRun(
|
|
243
|
+
export async function terminateLiveAgentsForRun(
|
|
244
|
+
runId: string,
|
|
245
|
+
status: CrewAgentRecord["status"] = "failed",
|
|
246
|
+
eventLogFn?: typeof appendEvent,
|
|
247
|
+
eventsPath?: string,
|
|
248
|
+
): Promise<number> {
|
|
185
249
|
const agents = [...liveAgents.values()].filter((agent) => agent.runId === runId);
|
|
186
250
|
await Promise.all(agents.map((agent) => terminateLiveAgent(agent.agentId, status, eventLogFn, eventsPath)));
|
|
187
251
|
return agents.length;
|
|
@@ -191,11 +255,11 @@ export function getLiveAgent(agentIdOrTaskId: string): LiveAgentHandle | undefin
|
|
|
191
255
|
return liveAgents.get(agentIdOrTaskId) ?? [...liveAgents.values()].find((entry) => entry.taskId === agentIdOrTaskId);
|
|
192
256
|
}
|
|
193
257
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
258
|
+
/** Maximum time a terminal live agent handle stays in memory (10 minutes). */
|
|
259
|
+
const STALE_HANDLE_MS = 10 * 60 * 1000;
|
|
260
|
+
/** Maximum time a running/queued live agent handle stays without any update (30 minutes).
|
|
261
|
+
* After this, the agent is presumed dead — the real process would have updated the handle. */
|
|
262
|
+
const STALE_RUNNING_HANDLE_MS = 30 * 60 * 1000;
|
|
199
263
|
|
|
200
264
|
/** Remove dead live agent handles.
|
|
201
265
|
* Evicts: (1) terminal-status handles older than STALE_HANDLE_MS, and
|
|
@@ -262,7 +326,10 @@ export async function followUpLiveAgent(agentIdOrTaskId: string, prompt: string)
|
|
|
262
326
|
handle.pendingFollowUps.push(prompt);
|
|
263
327
|
return handle;
|
|
264
328
|
}
|
|
265
|
-
await handle.session.prompt(prompt, {
|
|
329
|
+
await handle.session.prompt(prompt, {
|
|
330
|
+
source: "api",
|
|
331
|
+
expandPromptTemplates: false,
|
|
332
|
+
});
|
|
266
333
|
handle.updatedAt = new Date().toISOString();
|
|
267
334
|
return handle;
|
|
268
335
|
}
|
|
@@ -278,7 +345,10 @@ export async function resumeLiveAgent(agentIdOrTaskId: string, prompt: string):
|
|
|
278
345
|
if (!handle) throw new Error(`Live agent '${agentIdOrTaskId}' is not registered in this process.`);
|
|
279
346
|
if (typeof handle.session.prompt !== "function") throw new Error(`Live agent '${agentIdOrTaskId}' does not expose prompt().`);
|
|
280
347
|
handle.status = "running";
|
|
281
|
-
await handle.session.prompt(prompt, {
|
|
348
|
+
await handle.session.prompt(prompt, {
|
|
349
|
+
source: "api",
|
|
350
|
+
expandPromptTemplates: false,
|
|
351
|
+
});
|
|
282
352
|
handle.status = "completed";
|
|
283
353
|
handle.updatedAt = new Date().toISOString();
|
|
284
354
|
return handle;
|
|
@@ -354,7 +424,11 @@ export function sendIrcMessage(targetAgentId: string, message: IrcMessage): void
|
|
|
354
424
|
if (typeof session.sendCustomMessage === "function") {
|
|
355
425
|
try {
|
|
356
426
|
(session.sendCustomMessage as (msg: unknown, opts?: unknown) => void)(
|
|
357
|
-
{
|
|
427
|
+
{
|
|
428
|
+
customType: "irc",
|
|
429
|
+
content: `[DM from ${message.from}] ${message.content}`,
|
|
430
|
+
display: "collapsed",
|
|
431
|
+
},
|
|
358
432
|
{ deliverAs: "followUp", triggerTurn: false },
|
|
359
433
|
);
|
|
360
434
|
return;
|
|
@@ -365,7 +439,9 @@ export function sendIrcMessage(targetAgentId: string, message: IrcMessage): void
|
|
|
365
439
|
// Fallback: inject as prompt (blocking)
|
|
366
440
|
if (typeof handle.session.prompt === "function") {
|
|
367
441
|
const ircPrompt = `[Message from ${message.from}] ${message.content}`;
|
|
368
|
-
void handle.session
|
|
442
|
+
void handle.session
|
|
443
|
+
.prompt(ircPrompt, { source: "api", expandPromptTemplates: false })
|
|
444
|
+
.catch((error) => logInternalError("live-agent-manager.irc-deliver", error, `agentId=${handle.agentId}`));
|
|
369
445
|
}
|
|
370
446
|
}
|
|
371
447
|
|
|
@@ -388,7 +464,11 @@ export function broadcastIrcMessage(fromAgentId: string, message: IrcMessage): s
|
|
|
388
464
|
if (typeof session.sendCustomMessage === "function") {
|
|
389
465
|
try {
|
|
390
466
|
(session.sendCustomMessage as (msg: unknown, opts?: unknown) => void)(
|
|
391
|
-
{
|
|
467
|
+
{
|
|
468
|
+
customType: "irc",
|
|
469
|
+
content: `[Broadcast from ${message.from}] ${message.content}`,
|
|
470
|
+
display: "collapsed",
|
|
471
|
+
},
|
|
392
472
|
{ deliverAs: "followUp", triggerTurn: false },
|
|
393
473
|
);
|
|
394
474
|
recipients.push(handle.agentId);
|
|
@@ -400,7 +480,12 @@ export function broadcastIrcMessage(fromAgentId: string, message: IrcMessage): s
|
|
|
400
480
|
// Fallback: inject as prompt
|
|
401
481
|
if (typeof handle.session.prompt === "function") {
|
|
402
482
|
const ircPrompt = `[Broadcast from ${message.from}] ${message.content}`;
|
|
403
|
-
void handle.session
|
|
483
|
+
void handle.session
|
|
484
|
+
.prompt(ircPrompt, {
|
|
485
|
+
source: "api",
|
|
486
|
+
expandPromptTemplates: false,
|
|
487
|
+
})
|
|
488
|
+
.catch((error) => logInternalError("live-agent-manager.irc-broadcast", error, `agentId=${handle.agentId}`));
|
|
404
489
|
}
|
|
405
490
|
recipients.push(handle.agentId);
|
|
406
491
|
}
|
|
@@ -491,7 +576,12 @@ export async function respondAsBackground(
|
|
|
491
576
|
if (typeof session.sendCustomMessage === "function") {
|
|
492
577
|
try {
|
|
493
578
|
(session.sendCustomMessage as (msg: unknown, o?: unknown) => void)(
|
|
494
|
-
{
|
|
579
|
+
{
|
|
580
|
+
customType: "irc",
|
|
581
|
+
content: deliveredTag,
|
|
582
|
+
display: "collapsed",
|
|
583
|
+
corrId,
|
|
584
|
+
},
|
|
495
585
|
{ deliverAs: "followUp", triggerTurn: false },
|
|
496
586
|
);
|
|
497
587
|
delivered = true;
|
|
@@ -501,10 +591,16 @@ export async function respondAsBackground(
|
|
|
501
591
|
}
|
|
502
592
|
if (!delivered && typeof handle.session.prompt === "function") {
|
|
503
593
|
const promptText = `${deliveredTag}${awaitReply ? ` (reply correlation: ${corrId})` : ""}`;
|
|
504
|
-
void handle.session
|
|
594
|
+
void handle.session
|
|
595
|
+
.prompt(promptText, { source: "api", expandPromptTemplates: false })
|
|
596
|
+
.catch((error) => logInternalError("live-agent-manager.respondAsBackground", error, `agentId=${handle.agentId}`));
|
|
505
597
|
delivered = true;
|
|
506
598
|
}
|
|
507
|
-
if (!delivered)
|
|
599
|
+
if (!delivered)
|
|
600
|
+
return {
|
|
601
|
+
ok: false,
|
|
602
|
+
error: `Target '${targetAgentId}' has no message channel.`,
|
|
603
|
+
};
|
|
508
604
|
handle.updatedAt = new Date().toISOString();
|
|
509
605
|
|
|
510
606
|
if (!awaitReply) return { ok: true, corrId };
|
|
@@ -555,7 +651,14 @@ export function awaitPendingReply(
|
|
|
555
651
|
signal.addEventListener("abort", signalListener, { once: true });
|
|
556
652
|
}
|
|
557
653
|
|
|
558
|
-
pendingReplies.set(corrId, {
|
|
654
|
+
pendingReplies.set(corrId, {
|
|
655
|
+
corrId,
|
|
656
|
+
targetAgentId,
|
|
657
|
+
fromId,
|
|
658
|
+
deadline,
|
|
659
|
+
resolve: finish,
|
|
660
|
+
timer,
|
|
661
|
+
});
|
|
559
662
|
const set = pendingRepliesByTarget.get(targetAgentId) ?? new Set<string>();
|
|
560
663
|
set.add(corrId);
|
|
561
664
|
pendingRepliesByTarget.set(targetAgentId, set);
|
|
@@ -25,10 +25,30 @@ export function liveControlRealtimeMessage(request: LiveAgentControlRequest): Li
|
|
|
25
25
|
|
|
26
26
|
export function parseLiveControlRealtimeMessage(raw: unknown): LiveAgentControlRequest | undefined {
|
|
27
27
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return undefined;
|
|
28
|
-
const message = raw as {
|
|
29
|
-
|
|
28
|
+
const message = raw as {
|
|
29
|
+
type?: unknown;
|
|
30
|
+
version?: unknown;
|
|
31
|
+
request?: unknown;
|
|
32
|
+
};
|
|
33
|
+
if (
|
|
34
|
+
message.type !== "live-control" ||
|
|
35
|
+
message.version !== 1 ||
|
|
36
|
+
!message.request ||
|
|
37
|
+
typeof message.request !== "object" ||
|
|
38
|
+
Array.isArray(message.request)
|
|
39
|
+
)
|
|
40
|
+
return undefined;
|
|
30
41
|
const request = message.request as Partial<LiveAgentControlRequest>;
|
|
31
|
-
return typeof request.id === "string" &&
|
|
42
|
+
return typeof request.id === "string" &&
|
|
43
|
+
typeof request.runId === "string" &&
|
|
44
|
+
typeof request.taskId === "string" &&
|
|
45
|
+
(request.operation === "steer" ||
|
|
46
|
+
request.operation === "follow-up" ||
|
|
47
|
+
request.operation === "stop" ||
|
|
48
|
+
request.operation === "resume") &&
|
|
49
|
+
typeof request.createdAt === "string"
|
|
50
|
+
? (request as LiveAgentControlRequest)
|
|
51
|
+
: undefined;
|
|
32
52
|
}
|
|
33
53
|
|
|
34
54
|
export function clearLiveControlRealtimeForTest(): void {
|
package/src/runtime/live-irc.ts
CHANGED
|
@@ -77,7 +77,10 @@ function routeIrcMessage(
|
|
|
77
77
|
},
|
|
78
78
|
): { deliveredTo: string[]; error?: string } {
|
|
79
79
|
if (!message.to || !message.message?.trim()) {
|
|
80
|
-
return {
|
|
80
|
+
return {
|
|
81
|
+
deliveredTo: [],
|
|
82
|
+
error: "Missing 'to' (agent ID or 'all') and 'message' fields.",
|
|
83
|
+
};
|
|
81
84
|
}
|
|
82
85
|
if (message.to === selfId) {
|
|
83
86
|
return { deliveredTo: [], error: "Cannot send a message to yourself." };
|
|
@@ -60,10 +60,18 @@ export function collectLiveSessionHealth(
|
|
|
60
60
|
|
|
61
61
|
for (const agent of agents) {
|
|
62
62
|
switch (agent.status) {
|
|
63
|
-
case "running":
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
case "
|
|
63
|
+
case "running":
|
|
64
|
+
running++;
|
|
65
|
+
break;
|
|
66
|
+
case "idle":
|
|
67
|
+
idle++;
|
|
68
|
+
break;
|
|
69
|
+
case "completed":
|
|
70
|
+
completed++;
|
|
71
|
+
break;
|
|
72
|
+
case "failed":
|
|
73
|
+
failed++;
|
|
74
|
+
break;
|
|
67
75
|
}
|
|
68
76
|
}
|
|
69
77
|
|