@duckmind/dm-windows-x64 0.61.4 → 0.61.9
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/dm.exe +0 -0
- package/extensions/.dm-extensions.json +211 -67
- package/extensions/dm-subagents/agents/claude-code-writer.md +15 -0
- package/extensions/dm-subagents/agents/claude-code.md +15 -0
- package/extensions/dm-subagents/agents/codex-exec-writer.md +15 -0
- package/extensions/dm-subagents/agents/codex-exec.md +15 -0
- package/extensions/dm-subagents/agents/cursor-agent-writer.md +14 -0
- package/extensions/dm-subagents/agents/cursor-agent.md +14 -0
- package/extensions/dm-subagents/agents/delegate.md +3 -2
- package/extensions/dm-subagents/agents/oracle.md +10 -5
- package/extensions/dm-subagents/agents/researcher.md +2 -2
- package/extensions/dm-subagents/agents/reviewer.md +17 -7
- package/extensions/dm-subagents/agents/scout.md +5 -5
- package/extensions/dm-subagents/agents/worker.md +6 -2
- package/extensions/dm-subagents/async-retention-discovery-worker.mjs +167 -0
- package/extensions/dm-subagents/index.js +4 -0
- package/extensions/dm-subagents/inspector-runner.mjs +10 -0
- package/extensions/dm-subagents/install.mjs +3 -2
- package/extensions/dm-subagents/package.json +2 -2
- package/extensions/dm-subagents/prompts/council.md +60 -0
- package/extensions/dm-subagents/prompts/parallel-review.md +5 -1
- package/extensions/dm-subagents/prompts/review-loop.md +13 -7
- package/extensions/dm-subagents/skills/council-mode/SKILL.md +59 -0
- package/extensions/dm-subagents/skills/council-mode/references/pass-contracts.md +150 -0
- package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +96 -911
- package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +70 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +539 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +161 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +51 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +295 -0
- package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +73 -0
- package/extensions/dm-subagents/src/agents/agent-management.js +716 -484
- package/extensions/dm-subagents/src/agents/agent-refinements.js +563 -0
- package/extensions/dm-subagents/src/agents/agent-serializer.js +70 -5
- package/extensions/dm-subagents/src/agents/agents.js +1447 -299
- package/extensions/dm-subagents/src/agents/builtin-names.js +15 -0
- package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -7
- package/extensions/dm-subagents/src/agents/frontmatter.js +64 -14
- package/extensions/dm-subagents/src/agents/identity.js +1 -1
- package/extensions/dm-subagents/src/agents/proactive-skills.js +14 -11
- package/extensions/dm-subagents/src/agents/runtime-agent-events.js +49 -0
- package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +412 -0
- package/extensions/dm-subagents/src/agents/skills.js +52 -35
- package/extensions/dm-subagents/src/api/agents.js +6 -0
- package/extensions/dm-subagents/src/api/background-work.js +151 -0
- package/extensions/dm-subagents/src/api/capability-ceiling.js +12 -0
- package/extensions/dm-subagents/src/api/control-channel.js +3 -0
- package/extensions/dm-subagents/src/api/delegation.js +5 -0
- package/extensions/dm-subagents/src/api/dm-args.js +3 -0
- package/extensions/dm-subagents/src/api/external-job-provider.js +137 -0
- package/extensions/dm-subagents/src/api/external-runs.js +233 -0
- package/extensions/dm-subagents/src/api/intercom-bridge.js +3 -0
- package/extensions/dm-subagents/src/api/preflight.js +322 -0
- package/extensions/dm-subagents/src/api/project-panes.js +11 -0
- package/extensions/dm-subagents/src/api/shared-types.js +4 -0
- package/extensions/dm-subagents/src/extension/config.js +175 -0
- package/extensions/dm-subagents/src/extension/control-notices.js +4 -43
- package/extensions/dm-subagents/src/extension/doctor.js +71 -17
- package/extensions/dm-subagents/src/extension/fanout-child.js +49 -32
- package/extensions/dm-subagents/src/extension/index.js +711 -265
- package/extensions/dm-subagents/src/extension/public-execution.js +114 -0
- package/extensions/dm-subagents/src/extension/rpc.js +427 -22
- package/extensions/dm-subagents/src/extension/schemas.js +158 -65
- package/extensions/dm-subagents/src/extension/steering-notices.js +23 -0
- package/extensions/dm-subagents/src/extension/subagent-guide.js +31 -0
- package/extensions/dm-subagents/src/extension/tool-description.js +92 -74
- package/extensions/dm-subagents/src/extension/tool-result.js +7 -0
- package/extensions/dm-subagents/src/inspectors/herdr/actions.js +218 -0
- package/extensions/dm-subagents/src/inspectors/herdr/client.js +123 -0
- package/extensions/dm-subagents/src/inspectors/herdr/focus.js +47 -0
- package/extensions/dm-subagents/src/inspectors/herdr/inspector-runner.js +160 -0
- package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +618 -0
- package/extensions/dm-subagents/src/inspectors/herdr/session-roots-codec.js +21 -0
- package/extensions/dm-subagents/src/inspectors/herdr/shell-command.js +15 -0
- package/extensions/dm-subagents/src/integrations/herdr-status.js +377 -0
- package/extensions/dm-subagents/src/intercom/intercom-bridge.js +17 -13
- package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +371 -79
- package/extensions/dm-subagents/src/intercom/result-intercom.js +47 -7
- package/extensions/dm-subagents/src/missions/actions.js +394 -0
- package/extensions/dm-subagents/src/missions/goal-driver.js +149 -0
- package/extensions/dm-subagents/src/missions/lifecycle.js +331 -0
- package/extensions/dm-subagents/src/missions/store.js +548 -0
- package/extensions/dm-subagents/src/missions/types.js +9 -0
- package/extensions/dm-subagents/src/missions/workflow-state.js +245 -0
- package/extensions/dm-subagents/src/policy/authority.js +37 -0
- package/extensions/dm-subagents/src/profiles/profiles.js +36 -18
- package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +427 -0
- package/extensions/dm-subagents/src/runs/background/active-run-index.js +122 -0
- package/extensions/dm-subagents/src/runs/background/async-execution.js +925 -137
- package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +515 -148
- package/extensions/dm-subagents/src/runs/background/async-resume.js +378 -51
- package/extensions/dm-subagents/src/runs/background/async-retention.js +828 -0
- package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +31 -0
- package/extensions/dm-subagents/src/runs/background/async-status.js +259 -22
- package/extensions/dm-subagents/src/runs/background/auto-drain.js +46 -0
- package/extensions/dm-subagents/src/runs/background/chain-append.js +50 -15
- package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +67 -12
- package/extensions/dm-subagents/src/runs/background/completion-batcher.js +5 -1
- package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +3 -11
- package/extensions/dm-subagents/src/runs/background/completion-replay.js +245 -0
- package/extensions/dm-subagents/src/runs/background/control-channel.js +423 -36
- package/extensions/dm-subagents/src/runs/background/fleet-view.js +132 -59
- package/extensions/dm-subagents/src/runs/background/index-segment.js +38 -0
- package/extensions/dm-subagents/src/runs/background/inspect-rpc.js +373 -0
- package/extensions/dm-subagents/src/runs/background/notify.js +357 -57
- package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +86 -0
- package/extensions/dm-subagents/src/runs/background/process-terminal.js +269 -0
- package/extensions/dm-subagents/src/runs/background/result-delivery-ownership.js +34 -0
- package/extensions/dm-subagents/src/runs/background/result-files.js +469 -0
- package/extensions/dm-subagents/src/runs/background/result-watcher.js +540 -75
- package/extensions/dm-subagents/src/runs/background/resume-guidance.js +44 -0
- package/extensions/dm-subagents/src/runs/background/retained-children.js +119 -0
- package/extensions/dm-subagents/src/runs/background/run-id-query.js +5 -0
- package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +93 -9
- package/extensions/dm-subagents/src/runs/background/run-status.js +303 -32
- package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +784 -376
- package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +75 -34
- package/extensions/dm-subagents/src/runs/background/steering.js +221 -0
- package/extensions/dm-subagents/src/runs/background/subagent-runner.js +3106 -844
- package/extensions/dm-subagents/src/runs/background/subagent-wait.js +529 -0
- package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +106 -0
- package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -1
- package/extensions/dm-subagents/src/runs/background/wait-completions.js +155 -0
- package/extensions/dm-subagents/src/runs/background/wait-config.js +46 -0
- package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +278 -0
- package/extensions/dm-subagents/src/runs/background/wait-tool.js +47 -0
- package/extensions/dm-subagents/src/runs/foreground/async-dismiss-action.js +81 -0
- package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +245 -0
- package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +74 -0
- package/extensions/dm-subagents/src/runs/foreground/execution.js +1401 -342
- package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +133 -0
- package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +148 -0
- package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +139 -0
- package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +4278 -1441
- package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +278 -0
- package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +155 -0
- package/extensions/dm-subagents/src/runs/shared/abort-recovery.js +97 -0
- package/extensions/dm-subagents/src/runs/shared/acceptance.js +597 -148
- package/extensions/dm-subagents/src/runs/shared/agent-contract.js +35 -0
- package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +472 -0
- package/extensions/dm-subagents/src/runs/shared/background-process-options.js +6 -0
- package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +175 -0
- package/extensions/dm-subagents/src/runs/shared/child-identity.js +32 -0
- package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +65 -0
- package/extensions/dm-subagents/src/runs/shared/child-protocol.js +447 -0
- package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +120 -0
- package/extensions/dm-subagents/src/runs/shared/codex-exec-adapter.js +129 -0
- package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +40 -0
- package/extensions/dm-subagents/src/runs/shared/completion-guard.js +140 -83
- package/extensions/dm-subagents/src/runs/shared/context-mode.js +38 -0
- package/extensions/dm-subagents/src/runs/shared/cursor-agent-adapter.js +101 -0
- package/extensions/dm-subagents/src/runs/shared/dm-args.js +445 -72
- package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +27 -16
- package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +19 -6
- package/extensions/dm-subagents/src/runs/shared/extension-bindings.js +81 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +134 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +98 -0
- package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +419 -0
- package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +404 -0
- package/extensions/dm-subagents/src/runs/shared/external-job-runner.js +334 -0
- package/extensions/dm-subagents/src/runs/shared/fast-mode-extension.js +8 -0
- package/extensions/dm-subagents/src/runs/shared/host-step-status.js +228 -0
- package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +104 -0
- package/extensions/dm-subagents/src/runs/shared/launch-cwd.js +17 -0
- package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +190 -0
- package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +48 -3
- package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +387 -0
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +212 -137
- package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +131 -0
- package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +207 -0
- package/extensions/dm-subagents/src/runs/shared/model-fallback.js +225 -55
- package/extensions/dm-subagents/src/runs/shared/model-scope.js +85 -28
- package/extensions/dm-subagents/src/runs/shared/mutation-evidence.js +182 -0
- package/extensions/dm-subagents/src/runs/shared/nested-events.js +264 -102
- package/extensions/dm-subagents/src/runs/shared/nested-render.js +15 -5
- package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +505 -0
- package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +653 -0
- package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +29 -12
- package/extensions/dm-subagents/src/runs/shared/permissions.js +108 -0
- package/extensions/dm-subagents/src/runs/shared/process-signal.js +13 -0
- package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +257 -0
- package/extensions/dm-subagents/src/runs/shared/run-history.js +133 -13
- package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +62 -0
- package/extensions/dm-subagents/src/runs/shared/session-lease.js +225 -0
- package/extensions/dm-subagents/src/runs/shared/single-output.js +129 -27
- package/extensions/dm-subagents/src/runs/shared/spawn-budget.js +95 -0
- package/extensions/dm-subagents/src/runs/shared/structured-output.js +129 -10
- package/extensions/dm-subagents/src/runs/shared/subagent-control.js +66 -11
- package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +548 -70
- package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +50 -0
- package/extensions/dm-subagents/src/runs/shared/task-intent.js +130 -0
- package/extensions/dm-subagents/src/runs/shared/tool-availability.js +59 -0
- package/extensions/dm-subagents/src/runs/shared/tool-budget.js +7 -5
- package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +64 -0
- package/extensions/dm-subagents/src/runs/shared/usage-budget.js +74 -0
- package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +22 -0
- package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +721 -0
- package/extensions/dm-subagents/src/runs/shared/worktree.js +168 -19
- package/extensions/dm-subagents/src/shared/accessible-dir.js +35 -0
- package/extensions/dm-subagents/src/shared/agent-stream-options.js +3 -0
- package/extensions/dm-subagents/src/shared/artifacts.js +170 -11
- package/extensions/dm-subagents/src/shared/atomic-json.js +36 -38
- package/extensions/dm-subagents/src/shared/capacity-resilient-json.js +77 -0
- package/extensions/dm-subagents/src/shared/child-session-name.js +15 -0
- package/extensions/dm-subagents/src/shared/child-transcript.js +57 -2
- package/extensions/dm-subagents/src/shared/completion-owner.js +7 -0
- package/extensions/dm-subagents/src/shared/display-text.js +142 -0
- package/extensions/dm-subagents/src/shared/extension-context.js +17 -0
- package/extensions/dm-subagents/src/shared/file-coalescer.js +9 -0
- package/extensions/dm-subagents/src/shared/file-system-retry.js +56 -0
- package/extensions/dm-subagents/src/shared/fork-context.js +96 -33
- package/extensions/dm-subagents/src/shared/formatters.js +21 -7
- package/extensions/dm-subagents/src/shared/launch-contract.js +94 -0
- package/extensions/dm-subagents/src/shared/model-info.js +10 -5
- package/extensions/dm-subagents/src/shared/node-executable.js +19 -0
- package/extensions/dm-subagents/src/shared/prompt-resources.js +10 -0
- package/extensions/dm-subagents/src/shared/pruned-fork.js +427 -0
- package/extensions/dm-subagents/src/shared/session-file-trust.js +19 -0
- package/extensions/dm-subagents/src/shared/session-tokens.js +14 -3
- package/extensions/dm-subagents/src/shared/settings.js +39 -47
- package/extensions/dm-subagents/src/shared/shortcuts.js +16 -0
- package/extensions/dm-subagents/src/shared/status-format.js +9 -2
- package/extensions/dm-subagents/src/shared/thinking-ceiling.js +41 -0
- package/extensions/dm-subagents/src/shared/types.js +47 -7
- package/extensions/dm-subagents/src/shared/utf8.js +12 -0
- package/extensions/dm-subagents/src/shared/utils.js +151 -131
- package/extensions/dm-subagents/src/shared/watch-strategy.js +3 -0
- package/extensions/dm-subagents/src/shared/workflow-child-permit.js +84 -0
- package/extensions/dm-subagents/src/slash/delegation-adapters.js +274 -0
- package/extensions/dm-subagents/src/slash/delegation-json.js +113 -0
- package/extensions/dm-subagents/src/slash/delegation-request.js +152 -0
- package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +294 -243
- package/extensions/dm-subagents/src/slash/prompt-workflows.js +35 -73
- package/extensions/dm-subagents/src/slash/selector.js +101 -0
- package/extensions/dm-subagents/src/slash/slash-bridge.js +17 -1
- package/extensions/dm-subagents/src/slash/slash-commands.js +722 -732
- package/extensions/dm-subagents/src/slash/slash-live-state.js +37 -19
- package/extensions/dm-subagents/src/slash/subagents-admin.js +410 -0
- package/extensions/dm-subagents/src/tui/fleet-status.js +824 -0
- package/extensions/dm-subagents/src/tui/fleet-transcript.js +479 -0
- package/extensions/dm-subagents/src/tui/fleet.js +1326 -0
- package/extensions/dm-subagents/src/tui/render-helpers.js +22 -0
- package/extensions/dm-subagents/src/tui/render.js +1511 -261
- package/extensions/dm-subagents/src/watchdog/change-signature.js +220 -0
- package/extensions/dm-subagents/src/watchdog/child-status.js +151 -0
- package/extensions/dm-subagents/src/watchdog/emission-guard.js +90 -0
- package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +484 -0
- package/extensions/dm-subagents/src/watchdog/model-selection.js +154 -0
- package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +138 -0
- package/extensions/dm-subagents/src/watchdog/register-child.js +112 -0
- package/extensions/dm-subagents/src/watchdog/register-main.js +419 -0
- package/extensions/dm-subagents/src/watchdog/render.js +54 -0
- package/extensions/dm-subagents/src/watchdog/review.js +251 -0
- package/extensions/dm-subagents/src/watchdog/runtime.js +803 -0
- package/extensions/dm-subagents/src/watchdog/scope.js +56 -0
- package/extensions/dm-subagents/src/watchdog/settings.js +515 -0
- package/extensions/dm-subagents/src/watchdog/tool-actions.js +151 -0
- package/extensions/dm-subagents/src/watchdog/turn-delta.js +169 -0
- package/extensions/dm-subagents/src/watchdog/types.js +29 -0
- package/extensions/dm-subagents/src/watchdog/warning-format.js +58 -0
- package/extensions/dm-subagents/src/workflows/chat-progress.js +116 -0
- package/extensions/dm-subagents/src/workflows/host-command.js +227 -0
- package/extensions/dm-subagents/src/workflows/scripted-workflow.js +2011 -0
- package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +116 -0
- package/extensions/dm-subagents/src/workflows/workflow-preflight.js +243 -0
- package/extensions/dm-subagents/src/workflows/workflow-receipt.js +387 -0
- package/extensions/dm-subagents/src/workflows/workflow-settlement.js +189 -0
- package/package.json +4 -3
- package/extensions/dm-fff/package.json +0 -21
- package/extensions/dm-fff/src/index.js +0 -691
- package/extensions/dm-fff/src/query.js +0 -60
- package/extensions/dm-subagents/agents/context-builder.md +0 -46
- package/extensions/dm-subagents/agents/planner.md +0 -55
- package/extensions/dm-subagents/prompts/parallel-context-build.md +0 -55
- package/extensions/dm-subagents/prompts/parallel-handoff-plan.md +0 -61
- package/extensions/dm-subagents/src/runs/background/wait.js +0 -206
- package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +0 -1013
- package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +0 -981
- package/extensions/dm-subagents/src/runs/shared/turn-budget.js +0 -50
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SUBAGENT_ASYNC_COMPLETE_EVENT,
|
|
3
|
+
SUBAGENT_ASYNC_STARTED_EVENT,
|
|
4
|
+
SUBAGENT_CONTROL_EVENT
|
|
5
|
+
} from "../shared/types.js";
|
|
6
|
+
import { previewDisplayText, sanitizeDisplayText } from "../shared/display-text.js";
|
|
7
|
+
const DEFAULT_SOURCE = "dm-subagents:herdr";
|
|
8
|
+
const DEFAULT_TTL_MS = 120000;
|
|
9
|
+
const DEFAULT_REFRESH_MS = 45000;
|
|
10
|
+
const MAX_TASK_LABEL_CHARS = 80;
|
|
11
|
+
const MAX_TITLE_TASK_CHARS = 42;
|
|
12
|
+
const MAX_WORKFLOW_LABEL_NODES = 128;
|
|
13
|
+
const MAX_WORKFLOW_LABEL_DEPTH = 8;
|
|
14
|
+
let metadataReportSeq = Date.now() * 1000;
|
|
15
|
+
function nextMetadataReportSeq() {
|
|
16
|
+
metadataReportSeq = Math.max(metadataReportSeq + 1, Date.now() * 1000);
|
|
17
|
+
return metadataReportSeq;
|
|
18
|
+
}
|
|
19
|
+
function isRecord(value) {
|
|
20
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function boundedTaskLabel(value, maxChars = MAX_TASK_LABEL_CHARS) {
|
|
23
|
+
if (typeof value !== "string")
|
|
24
|
+
return;
|
|
25
|
+
const normalized = sanitizeDisplayText(value).trim();
|
|
26
|
+
if (!normalized)
|
|
27
|
+
return;
|
|
28
|
+
return previewDisplayText(normalized, maxChars);
|
|
29
|
+
}
|
|
30
|
+
function workflowTaskLabel(data) {
|
|
31
|
+
const explicit = boundedTaskLabel(data.taskLabel);
|
|
32
|
+
if (explicit)
|
|
33
|
+
return explicit;
|
|
34
|
+
if (!isRecord(data.workflowGraph) || !Array.isArray(data.workflowGraph.nodes))
|
|
35
|
+
return;
|
|
36
|
+
const currentNodeId = typeof data.workflowGraph.currentNodeId === "string" ? data.workflowGraph.currentNodeId : undefined;
|
|
37
|
+
const nodes = [];
|
|
38
|
+
const collect = (values, depth) => {
|
|
39
|
+
if (depth > MAX_WORKFLOW_LABEL_DEPTH || nodes.length >= MAX_WORKFLOW_LABEL_NODES)
|
|
40
|
+
return;
|
|
41
|
+
for (const value of values) {
|
|
42
|
+
if (nodes.length >= MAX_WORKFLOW_LABEL_NODES)
|
|
43
|
+
return;
|
|
44
|
+
if (!isRecord(value))
|
|
45
|
+
continue;
|
|
46
|
+
nodes.push(value);
|
|
47
|
+
if (Array.isArray(value.children))
|
|
48
|
+
collect(value.children, depth + 1);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
collect(data.workflowGraph.nodes, 0);
|
|
52
|
+
const current = currentNodeId ? nodes.find((node) => node.id === currentNodeId) : undefined;
|
|
53
|
+
const active = current ?? nodes.find((node) => node.status === "running") ?? nodes.find((node) => node.status === "pending");
|
|
54
|
+
return boundedTaskLabel(active?.label);
|
|
55
|
+
}
|
|
56
|
+
function startedRun(data) {
|
|
57
|
+
if (!isRecord(data) || typeof data.id !== "string" || !data.id)
|
|
58
|
+
return;
|
|
59
|
+
const taskLabel = workflowTaskLabel(data);
|
|
60
|
+
return {
|
|
61
|
+
id: data.id,
|
|
62
|
+
...typeof data.agent === "string" ? { agent: data.agent } : {},
|
|
63
|
+
...Array.isArray(data.agents) && data.agents.every((agent) => typeof agent === "string") ? { agents: data.agents } : {},
|
|
64
|
+
...taskLabel ? { taskLabel } : {}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function completedRunId(data) {
|
|
68
|
+
if (!isRecord(data))
|
|
69
|
+
return;
|
|
70
|
+
const id = typeof data.runId === "string" ? data.runId : data.id;
|
|
71
|
+
return typeof id === "string" && id.length > 0 ? id : undefined;
|
|
72
|
+
}
|
|
73
|
+
function attentionNotice(data) {
|
|
74
|
+
if (!isRecord(data) || data.source !== "async" || !isRecord(data.event))
|
|
75
|
+
return;
|
|
76
|
+
if (data.event.type !== "needs_attention" || typeof data.event.runId !== "string" || !data.event.runId)
|
|
77
|
+
return;
|
|
78
|
+
const label = typeof data.noticeText === "string" && data.noticeText ? data.noticeText : typeof data.event.message === "string" && data.event.message ? data.event.message : "subagent needs attention";
|
|
79
|
+
return { runId: data.event.runId, label };
|
|
80
|
+
}
|
|
81
|
+
export function registerHerdrStatusBridge(options) {
|
|
82
|
+
const env = options.env ?? process.env;
|
|
83
|
+
const paneId = env.HERDR_PANE_ID;
|
|
84
|
+
const enabled = env.HERDR_ENV === "1" && typeof paneId === "string" && paneId.length > 0;
|
|
85
|
+
const runHerdr = options.runHerdr;
|
|
86
|
+
const ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
|
|
87
|
+
const refreshMs = options.refreshMs ?? DEFAULT_REFRESH_MS;
|
|
88
|
+
const timers = options.timers ?? { setInterval, clearInterval };
|
|
89
|
+
const runs = new Map;
|
|
90
|
+
const attentionLabels = new Map;
|
|
91
|
+
const acknowledgedAttention = new Set;
|
|
92
|
+
const subscriptions = [];
|
|
93
|
+
let rootSession = false;
|
|
94
|
+
let published = false;
|
|
95
|
+
let busyRaised = false;
|
|
96
|
+
let busyLabel;
|
|
97
|
+
let blockedRaised = false;
|
|
98
|
+
let blockedLabel;
|
|
99
|
+
let disposed = false;
|
|
100
|
+
let pendingReport;
|
|
101
|
+
let draining = false;
|
|
102
|
+
let drainPromise = Promise.resolve();
|
|
103
|
+
let refreshTimer;
|
|
104
|
+
const activeAgentNames = () => [...new Set([...runs.values()].flatMap((run) => run.agents?.length ? run.agents : run.agent ? [run.agent] : []))];
|
|
105
|
+
const activeSubagentCount = () => [...runs.values()].reduce((total, run) => total + Math.max(1, run.agents?.length ?? (run.agent ? 1 : 0)), 0);
|
|
106
|
+
const activeTaskLabel = () => [...runs.values()].reverse().find((run) => run.taskLabel)?.taskLabel;
|
|
107
|
+
const label = (includeAttention = false) => {
|
|
108
|
+
const agents = activeAgentNames();
|
|
109
|
+
const activeCount = activeSubagentCount();
|
|
110
|
+
const who = agents.length > 0 ? ` (${agents.slice(0, 3).join(", ")}${agents.length > 3 ? ", …" : ""})` : "";
|
|
111
|
+
const panes = Math.max(0, options.getProjectPaneCount?.() ?? 0);
|
|
112
|
+
const paneText = panes > 0 ? ` · ${panes} pane${panes === 1 ? "" : "s"}` : "";
|
|
113
|
+
const task = activeTaskLabel();
|
|
114
|
+
const taskText = task ? ` · ${task}` : "";
|
|
115
|
+
const attention = includeAttention && attentionLabels.size > 0 ? " ⚠" : "";
|
|
116
|
+
return `⏳ ${activeCount} subagent${activeCount === 1 ? "" : "s"}${who}${paneText}${taskText}${attention}`;
|
|
117
|
+
};
|
|
118
|
+
const titleSuffix = () => {
|
|
119
|
+
if (runs.size === 0)
|
|
120
|
+
return;
|
|
121
|
+
const agentNames = activeAgentNames();
|
|
122
|
+
const activeCount = activeSubagentCount();
|
|
123
|
+
const task = boundedTaskLabel(activeTaskLabel(), MAX_TITLE_TASK_CHARS);
|
|
124
|
+
const target = task ?? (activeCount === 1 && agentNames.length === 1 ? agentNames[0] : String(activeCount));
|
|
125
|
+
return `⏳${target}${attentionLabels.size > 0 ? "⚠" : ""}`;
|
|
126
|
+
};
|
|
127
|
+
const enqueue = (args) => {
|
|
128
|
+
pendingReport = args;
|
|
129
|
+
if (draining)
|
|
130
|
+
return;
|
|
131
|
+
draining = true;
|
|
132
|
+
drainPromise = (async () => {
|
|
133
|
+
while (pendingReport) {
|
|
134
|
+
const next = pendingReport;
|
|
135
|
+
pendingReport = undefined;
|
|
136
|
+
try {
|
|
137
|
+
await runHerdr(next);
|
|
138
|
+
} catch {}
|
|
139
|
+
}
|
|
140
|
+
})().finally(() => {
|
|
141
|
+
draining = false;
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
const publish = () => {
|
|
145
|
+
if (!enabled || !rootSession || disposed || !paneId)
|
|
146
|
+
return;
|
|
147
|
+
if (runs.size === 0 && !published)
|
|
148
|
+
return;
|
|
149
|
+
const seq = String(nextMetadataReportSeq());
|
|
150
|
+
if (runs.size === 0) {
|
|
151
|
+
published = false;
|
|
152
|
+
enqueue([
|
|
153
|
+
"pane",
|
|
154
|
+
"report-metadata",
|
|
155
|
+
paneId,
|
|
156
|
+
"--source",
|
|
157
|
+
DEFAULT_SOURCE,
|
|
158
|
+
"--agent",
|
|
159
|
+
"dm",
|
|
160
|
+
"--applies-to-source",
|
|
161
|
+
"herdr:dm",
|
|
162
|
+
"--clear-state-labels",
|
|
163
|
+
"--clear-token",
|
|
164
|
+
"summary",
|
|
165
|
+
"--clear-token",
|
|
166
|
+
"title-suffix",
|
|
167
|
+
"--seq",
|
|
168
|
+
seq
|
|
169
|
+
]);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const text = label(true);
|
|
173
|
+
const suffix = titleSuffix();
|
|
174
|
+
published = true;
|
|
175
|
+
enqueue([
|
|
176
|
+
"pane",
|
|
177
|
+
"report-metadata",
|
|
178
|
+
paneId,
|
|
179
|
+
"--source",
|
|
180
|
+
DEFAULT_SOURCE,
|
|
181
|
+
"--agent",
|
|
182
|
+
"dm",
|
|
183
|
+
"--applies-to-source",
|
|
184
|
+
"herdr:dm",
|
|
185
|
+
"--state-label",
|
|
186
|
+
`idle=${text}`,
|
|
187
|
+
"--state-label",
|
|
188
|
+
`done=${text}`,
|
|
189
|
+
"--state-label",
|
|
190
|
+
`working=${text}`,
|
|
191
|
+
"--token",
|
|
192
|
+
`summary=${text}`,
|
|
193
|
+
...suffix ? ["--token", `title-suffix=${suffix}`] : [],
|
|
194
|
+
"--ttl-ms",
|
|
195
|
+
String(ttlMs),
|
|
196
|
+
"--seq",
|
|
197
|
+
seq
|
|
198
|
+
]);
|
|
199
|
+
};
|
|
200
|
+
const syncRefreshTimer = () => {
|
|
201
|
+
if (runs.size > 0 && refreshMs > 0 && !refreshTimer) {
|
|
202
|
+
refreshTimer = timers.setInterval(() => refresh(), refreshMs);
|
|
203
|
+
refreshTimer.unref?.();
|
|
204
|
+
} else if ((runs.size === 0 || refreshMs <= 0) && refreshTimer) {
|
|
205
|
+
timers.clearInterval(refreshTimer);
|
|
206
|
+
refreshTimer = undefined;
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
const syncBusy = () => {
|
|
210
|
+
if (!enabled || !rootSession || disposed)
|
|
211
|
+
return;
|
|
212
|
+
if (runs.size > 0) {
|
|
213
|
+
const text = label();
|
|
214
|
+
if (busyRaised && busyLabel === text)
|
|
215
|
+
return;
|
|
216
|
+
if (busyRaised)
|
|
217
|
+
options.events.emit("herdr:busy", { active: false });
|
|
218
|
+
busyRaised = true;
|
|
219
|
+
busyLabel = text;
|
|
220
|
+
options.events.emit("herdr:busy", { active: true, label: text });
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (busyRaised) {
|
|
224
|
+
busyRaised = false;
|
|
225
|
+
busyLabel = undefined;
|
|
226
|
+
options.events.emit("herdr:busy", { active: false });
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
const syncBlocked = () => {
|
|
230
|
+
if (!enabled || !rootSession || disposed)
|
|
231
|
+
return;
|
|
232
|
+
const nextLabel = [...attentionLabels.values()].at(-1);
|
|
233
|
+
if (nextLabel !== undefined) {
|
|
234
|
+
if (blockedRaised && blockedLabel === nextLabel)
|
|
235
|
+
return;
|
|
236
|
+
if (blockedRaised)
|
|
237
|
+
options.events.emit("herdr:blocked", { active: false });
|
|
238
|
+
blockedRaised = true;
|
|
239
|
+
blockedLabel = nextLabel;
|
|
240
|
+
options.events.emit("herdr:blocked", { active: true, label: nextLabel });
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (blockedRaised) {
|
|
244
|
+
blockedRaised = false;
|
|
245
|
+
blockedLabel = undefined;
|
|
246
|
+
options.events.emit("herdr:blocked", { active: false });
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
const clearAttention = () => {
|
|
250
|
+
attentionLabels.clear();
|
|
251
|
+
syncBlocked();
|
|
252
|
+
publish();
|
|
253
|
+
};
|
|
254
|
+
const raiseAttention = (runId, labelText) => {
|
|
255
|
+
if (!rootSession || attentionLabels.has(runId))
|
|
256
|
+
return;
|
|
257
|
+
acknowledgedAttention.delete(runId);
|
|
258
|
+
attentionLabels.set(runId, labelText);
|
|
259
|
+
syncBlocked();
|
|
260
|
+
publish();
|
|
261
|
+
};
|
|
262
|
+
const replaceRuns = (nextRuns) => {
|
|
263
|
+
const nextAttention = new Map;
|
|
264
|
+
const activeIds = new Set;
|
|
265
|
+
runs.clear();
|
|
266
|
+
for (const run of nextRuns) {
|
|
267
|
+
if (!run || typeof run.id !== "string" || !run.id)
|
|
268
|
+
continue;
|
|
269
|
+
activeIds.add(run.id);
|
|
270
|
+
const taskLabel = boundedTaskLabel(run.taskLabel);
|
|
271
|
+
const { taskLabel: _rawTaskLabel, ...sanitizedRun } = run;
|
|
272
|
+
runs.set(run.id, { ...sanitizedRun, ...taskLabel ? { taskLabel } : {} });
|
|
273
|
+
if (!run.needsAttention) {
|
|
274
|
+
acknowledgedAttention.delete(run.id);
|
|
275
|
+
} else if (!acknowledgedAttention.has(run.id)) {
|
|
276
|
+
nextAttention.set(run.id, run.attentionLabel || attentionLabels.get(run.id) || "subagent needs attention");
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
for (const id of acknowledgedAttention) {
|
|
280
|
+
if (!activeIds.has(id))
|
|
281
|
+
acknowledgedAttention.delete(id);
|
|
282
|
+
}
|
|
283
|
+
attentionLabels.clear();
|
|
284
|
+
for (const [id, labelText] of nextAttention)
|
|
285
|
+
attentionLabels.set(id, labelText);
|
|
286
|
+
syncBusy();
|
|
287
|
+
syncRefreshTimer();
|
|
288
|
+
syncBlocked();
|
|
289
|
+
publish();
|
|
290
|
+
};
|
|
291
|
+
const refresh = () => {
|
|
292
|
+
if (!options.getRuns) {
|
|
293
|
+
publish();
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
replaceRuns(options.getRuns());
|
|
298
|
+
} catch {
|
|
299
|
+
publish();
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
const subscribe = (event, handler) => {
|
|
303
|
+
const unsubscribe = options.events.on(event, handler);
|
|
304
|
+
if (typeof unsubscribe === "function")
|
|
305
|
+
subscriptions.push(unsubscribe);
|
|
306
|
+
};
|
|
307
|
+
if (enabled) {
|
|
308
|
+
subscribe(SUBAGENT_ASYNC_STARTED_EVENT, (data) => {
|
|
309
|
+
if (!rootSession)
|
|
310
|
+
return;
|
|
311
|
+
const run = startedRun(data);
|
|
312
|
+
if (!run)
|
|
313
|
+
return;
|
|
314
|
+
acknowledgedAttention.delete(run.id);
|
|
315
|
+
runs.set(run.id, run);
|
|
316
|
+
syncBusy();
|
|
317
|
+
syncRefreshTimer();
|
|
318
|
+
publish();
|
|
319
|
+
});
|
|
320
|
+
subscribe(SUBAGENT_ASYNC_COMPLETE_EVENT, (data) => {
|
|
321
|
+
if (!rootSession)
|
|
322
|
+
return;
|
|
323
|
+
const id = completedRunId(data);
|
|
324
|
+
if (!id || !runs.delete(id))
|
|
325
|
+
return;
|
|
326
|
+
acknowledgedAttention.delete(id);
|
|
327
|
+
if (attentionLabels.delete(id))
|
|
328
|
+
syncBlocked();
|
|
329
|
+
syncBusy();
|
|
330
|
+
syncRefreshTimer();
|
|
331
|
+
publish();
|
|
332
|
+
});
|
|
333
|
+
subscribe(SUBAGENT_CONTROL_EVENT, (data) => {
|
|
334
|
+
if (!rootSession)
|
|
335
|
+
return;
|
|
336
|
+
const notice = attentionNotice(data);
|
|
337
|
+
if (!notice || !runs.has(notice.runId))
|
|
338
|
+
return;
|
|
339
|
+
raiseAttention(notice.runId, notice.label);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
agentStarted() {
|
|
344
|
+
for (const id of attentionLabels.keys())
|
|
345
|
+
acknowledgedAttention.add(id);
|
|
346
|
+
clearAttention();
|
|
347
|
+
},
|
|
348
|
+
sessionStarted({ hasUI, runs: restoredRuns }) {
|
|
349
|
+
if (!enabled || disposed || hasUI !== true)
|
|
350
|
+
return;
|
|
351
|
+
rootSession = true;
|
|
352
|
+
replaceRuns(restoredRuns);
|
|
353
|
+
},
|
|
354
|
+
syncRuns() {
|
|
355
|
+
if (!enabled || !rootSession || disposed)
|
|
356
|
+
return;
|
|
357
|
+
refresh();
|
|
358
|
+
},
|
|
359
|
+
async flush() {
|
|
360
|
+
while (draining || pendingReport)
|
|
361
|
+
await drainPromise;
|
|
362
|
+
},
|
|
363
|
+
dispose() {
|
|
364
|
+
if (disposed)
|
|
365
|
+
return;
|
|
366
|
+
clearAttention();
|
|
367
|
+
acknowledgedAttention.clear();
|
|
368
|
+
runs.clear();
|
|
369
|
+
syncBusy();
|
|
370
|
+
syncRefreshTimer();
|
|
371
|
+
publish();
|
|
372
|
+
for (const unsubscribe of subscriptions)
|
|
373
|
+
unsubscribe();
|
|
374
|
+
disposed = true;
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
}
|
|
@@ -10,23 +10,25 @@ function defaultSubagentConfigDir(agentDir = defaultAgentDir()) {
|
|
|
10
10
|
return path.join(agentDir, "extensions", "subagent");
|
|
11
11
|
}
|
|
12
12
|
const DEFAULT_INTERCOM_TARGET_PREFIX = "subagent-chat";
|
|
13
|
+
export const PI_INTERCOM_SESSION_ID_ENV = "PI_INTERCOM_SESSION_ID";
|
|
13
14
|
export const INTERCOM_BRIDGE_MARKER = "Intercom orchestration channel:";
|
|
14
15
|
const DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `The inherited thread is reference-only. Do not continue that conversation or send questions, status updates, or completion handoffs to the supervisor in normal assistant text.
|
|
15
16
|
|
|
16
17
|
Use contact_supervisor first. It resolves the supervisor session "{orchestratorTarget}" and run metadata automatically.
|
|
17
18
|
- Need a decision, blocked, approval, or product/API/scope ambiguity: contact_supervisor({ reason: "need_decision", message: "<question>" })
|
|
18
|
-
-
|
|
19
|
-
-
|
|
19
|
+
- Need structured supervisor input rather than a freeform reply: contact_supervisor({ reason: "interview_request", message: "<what input is needed>", interview: { title: "...", questions: [] } })
|
|
20
|
+
- After contact_supervisor with reason "need_decision" or "interview_request", stay alive and continue only after the reply arrives. Do not finish your final response with a choose-one question.
|
|
21
|
+
- Do not ask for clarification when the only conflict is review-only/no-edit versus progress-writing or artifact-writing instructions. If an output path is configured but no write-capable tool is available, return the complete artifact in your final response; the runtime will persist it. Do not contact the supervisor merely because you cannot write that output path directly.
|
|
20
22
|
- Meaningful progress or unexpected discoveries that change the plan: contact_supervisor({ reason: "progress_update", message: "UPDATE: <summary>" })
|
|
21
|
-
- Generic intercom is lower-level plumbing/fallback only: intercom({ action: "ask", to: "{orchestratorTarget}", message: "<question>" })
|
|
22
23
|
|
|
23
|
-
Do not use contact_supervisor
|
|
24
|
-
export function resolveIntercomSessionTarget(sessionName, sessionId) {
|
|
24
|
+
Do not use contact_supervisor for routine completion handoffs. If no coordination is needed, return a focused task result.`;
|
|
25
|
+
export function resolveIntercomSessionTarget(sessionName, sessionId, intercomSessionId = process.env[PI_INTERCOM_SESSION_ID_ENV]) {
|
|
25
26
|
const trimmedName = sessionName?.trim();
|
|
26
27
|
if (trimmedName)
|
|
27
28
|
return trimmedName;
|
|
28
|
-
const
|
|
29
|
-
|
|
29
|
+
const fallbackSessionId = intercomSessionId?.trim() || sessionId;
|
|
30
|
+
const normalizedSessionId = fallbackSessionId.startsWith("session-") ? fallbackSessionId.slice("session-".length) : fallbackSessionId;
|
|
31
|
+
return `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 18)}`;
|
|
30
32
|
}
|
|
31
33
|
function sanitizeIntercomTargetPart(value) {
|
|
32
34
|
return value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "") || "agent";
|
|
@@ -42,11 +44,12 @@ export function resolveIntercomBridgeMode(value) {
|
|
|
42
44
|
}
|
|
43
45
|
function resolveIntercomBridgeConfig(value) {
|
|
44
46
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
45
|
-
return { mode: "always", instructionFile: "" };
|
|
47
|
+
return { mode: "always", instructionFile: "", resultDelivery: false };
|
|
46
48
|
}
|
|
47
49
|
return {
|
|
48
50
|
mode: resolveIntercomBridgeMode(value.mode),
|
|
49
|
-
instructionFile: typeof value.instructionFile === "string" ? value.instructionFile : ""
|
|
51
|
+
instructionFile: typeof value.instructionFile === "string" ? value.instructionFile : "",
|
|
52
|
+
resultDelivery: value.resultDelivery === true
|
|
50
53
|
};
|
|
51
54
|
}
|
|
52
55
|
function expandTilde(filePath) {
|
|
@@ -97,7 +100,7 @@ export function diagnoseIntercomBridge(input) {
|
|
|
97
100
|
};
|
|
98
101
|
}
|
|
99
102
|
export function resolveIntercomBridge(input) {
|
|
100
|
-
const config = resolveIntercomBridgeConfig(input.config);
|
|
103
|
+
const config = resolveIntercomBridgeConfig(input.override !== undefined ? input.override : input.config);
|
|
101
104
|
const mode = config.mode;
|
|
102
105
|
const orchestratorTarget = input.orchestratorTarget?.trim();
|
|
103
106
|
const agentDir = path.resolve(input.agentDir ?? defaultAgentDir());
|
|
@@ -105,11 +108,12 @@ export function resolveIntercomBridge(input) {
|
|
|
105
108
|
const defaultInstruction = buildIntercomBridgeInstruction(orchestratorTarget || "{orchestratorTarget}", DEFAULT_INTERCOM_BRIDGE_TEMPLATE);
|
|
106
109
|
const reason = inactiveReason(mode, input.context, orchestratorTarget);
|
|
107
110
|
if (reason || !orchestratorTarget) {
|
|
108
|
-
return { active: false, mode, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };
|
|
111
|
+
return { active: false, mode, resultDelivery: config.resultDelivery, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };
|
|
109
112
|
}
|
|
110
113
|
return {
|
|
111
114
|
active: true,
|
|
112
115
|
mode,
|
|
116
|
+
resultDelivery: config.resultDelivery,
|
|
113
117
|
orchestratorTarget,
|
|
114
118
|
extensionDir: NATIVE_INTERCOM_EXTENSION_DIR,
|
|
115
119
|
instruction: buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir))
|
|
@@ -118,8 +122,8 @@ export function resolveIntercomBridge(input) {
|
|
|
118
122
|
export function applyIntercomBridgeToAgent(agent, bridge) {
|
|
119
123
|
if (!bridge.active || !bridge.orchestratorTarget)
|
|
120
124
|
return agent;
|
|
121
|
-
const bridgeTools = ["
|
|
122
|
-
const tools = agent.tools ? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))] : agent.tools;
|
|
125
|
+
const bridgeTools = ["contact_supervisor"];
|
|
126
|
+
const tools = agent.tools && agent.tools.length > 0 ? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))] : agent.tools;
|
|
123
127
|
const instruction = bridge.instruction;
|
|
124
128
|
const trimmedPrompt = agent.systemPrompt?.trim() || "";
|
|
125
129
|
const systemPrompt = trimmedPrompt.includes(INTERCOM_BRIDGE_MARKER) ? trimmedPrompt : trimmedPrompt ? `${trimmedPrompt}
|