@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.
Files changed (279) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +211 -67
  3. package/extensions/dm-subagents/agents/claude-code-writer.md +15 -0
  4. package/extensions/dm-subagents/agents/claude-code.md +15 -0
  5. package/extensions/dm-subagents/agents/codex-exec-writer.md +15 -0
  6. package/extensions/dm-subagents/agents/codex-exec.md +15 -0
  7. package/extensions/dm-subagents/agents/cursor-agent-writer.md +14 -0
  8. package/extensions/dm-subagents/agents/cursor-agent.md +14 -0
  9. package/extensions/dm-subagents/agents/delegate.md +3 -2
  10. package/extensions/dm-subagents/agents/oracle.md +10 -5
  11. package/extensions/dm-subagents/agents/researcher.md +2 -2
  12. package/extensions/dm-subagents/agents/reviewer.md +17 -7
  13. package/extensions/dm-subagents/agents/scout.md +5 -5
  14. package/extensions/dm-subagents/agents/worker.md +6 -2
  15. package/extensions/dm-subagents/async-retention-discovery-worker.mjs +167 -0
  16. package/extensions/dm-subagents/index.js +4 -0
  17. package/extensions/dm-subagents/inspector-runner.mjs +10 -0
  18. package/extensions/dm-subagents/install.mjs +3 -2
  19. package/extensions/dm-subagents/package.json +2 -2
  20. package/extensions/dm-subagents/prompts/council.md +60 -0
  21. package/extensions/dm-subagents/prompts/parallel-review.md +5 -1
  22. package/extensions/dm-subagents/prompts/review-loop.md +13 -7
  23. package/extensions/dm-subagents/skills/council-mode/SKILL.md +59 -0
  24. package/extensions/dm-subagents/skills/council-mode/references/pass-contracts.md +150 -0
  25. package/extensions/dm-subagents/skills/dm-subagents/SKILL.md +96 -911
  26. package/extensions/dm-subagents/skills/dm-subagents/references/constraints-and-recipes.md +70 -0
  27. package/extensions/dm-subagents/skills/dm-subagents/references/execution-controls.md +539 -0
  28. package/extensions/dm-subagents/skills/dm-subagents/references/management-authoring-rpc.md +161 -0
  29. package/extensions/dm-subagents/skills/dm-subagents/references/multi-lane-orchestration.md +51 -0
  30. package/extensions/dm-subagents/skills/dm-subagents/references/prompting-and-roles.md +295 -0
  31. package/extensions/dm-subagents/skills/dm-subagents/references/review-and-validation.md +73 -0
  32. package/extensions/dm-subagents/src/agents/agent-management.js +716 -484
  33. package/extensions/dm-subagents/src/agents/agent-refinements.js +563 -0
  34. package/extensions/dm-subagents/src/agents/agent-serializer.js +70 -5
  35. package/extensions/dm-subagents/src/agents/agents.js +1447 -299
  36. package/extensions/dm-subagents/src/agents/builtin-names.js +15 -0
  37. package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -7
  38. package/extensions/dm-subagents/src/agents/frontmatter.js +64 -14
  39. package/extensions/dm-subagents/src/agents/identity.js +1 -1
  40. package/extensions/dm-subagents/src/agents/proactive-skills.js +14 -11
  41. package/extensions/dm-subagents/src/agents/runtime-agent-events.js +49 -0
  42. package/extensions/dm-subagents/src/agents/runtime-agent-registry.js +412 -0
  43. package/extensions/dm-subagents/src/agents/skills.js +52 -35
  44. package/extensions/dm-subagents/src/api/agents.js +6 -0
  45. package/extensions/dm-subagents/src/api/background-work.js +151 -0
  46. package/extensions/dm-subagents/src/api/capability-ceiling.js +12 -0
  47. package/extensions/dm-subagents/src/api/control-channel.js +3 -0
  48. package/extensions/dm-subagents/src/api/delegation.js +5 -0
  49. package/extensions/dm-subagents/src/api/dm-args.js +3 -0
  50. package/extensions/dm-subagents/src/api/external-job-provider.js +137 -0
  51. package/extensions/dm-subagents/src/api/external-runs.js +233 -0
  52. package/extensions/dm-subagents/src/api/intercom-bridge.js +3 -0
  53. package/extensions/dm-subagents/src/api/preflight.js +322 -0
  54. package/extensions/dm-subagents/src/api/project-panes.js +11 -0
  55. package/extensions/dm-subagents/src/api/shared-types.js +4 -0
  56. package/extensions/dm-subagents/src/extension/config.js +175 -0
  57. package/extensions/dm-subagents/src/extension/control-notices.js +4 -43
  58. package/extensions/dm-subagents/src/extension/doctor.js +71 -17
  59. package/extensions/dm-subagents/src/extension/fanout-child.js +49 -32
  60. package/extensions/dm-subagents/src/extension/index.js +711 -265
  61. package/extensions/dm-subagents/src/extension/public-execution.js +114 -0
  62. package/extensions/dm-subagents/src/extension/rpc.js +427 -22
  63. package/extensions/dm-subagents/src/extension/schemas.js +158 -65
  64. package/extensions/dm-subagents/src/extension/steering-notices.js +23 -0
  65. package/extensions/dm-subagents/src/extension/subagent-guide.js +31 -0
  66. package/extensions/dm-subagents/src/extension/tool-description.js +92 -74
  67. package/extensions/dm-subagents/src/extension/tool-result.js +7 -0
  68. package/extensions/dm-subagents/src/inspectors/herdr/actions.js +218 -0
  69. package/extensions/dm-subagents/src/inspectors/herdr/client.js +123 -0
  70. package/extensions/dm-subagents/src/inspectors/herdr/focus.js +47 -0
  71. package/extensions/dm-subagents/src/inspectors/herdr/inspector-runner.js +160 -0
  72. package/extensions/dm-subagents/src/inspectors/herdr/project-panes.js +618 -0
  73. package/extensions/dm-subagents/src/inspectors/herdr/session-roots-codec.js +21 -0
  74. package/extensions/dm-subagents/src/inspectors/herdr/shell-command.js +15 -0
  75. package/extensions/dm-subagents/src/integrations/herdr-status.js +377 -0
  76. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +17 -13
  77. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +371 -79
  78. package/extensions/dm-subagents/src/intercom/result-intercom.js +47 -7
  79. package/extensions/dm-subagents/src/missions/actions.js +394 -0
  80. package/extensions/dm-subagents/src/missions/goal-driver.js +149 -0
  81. package/extensions/dm-subagents/src/missions/lifecycle.js +331 -0
  82. package/extensions/dm-subagents/src/missions/store.js +548 -0
  83. package/extensions/dm-subagents/src/missions/types.js +9 -0
  84. package/extensions/dm-subagents/src/missions/workflow-state.js +245 -0
  85. package/extensions/dm-subagents/src/policy/authority.js +37 -0
  86. package/extensions/dm-subagents/src/profiles/profiles.js +36 -18
  87. package/extensions/dm-subagents/src/runs/background/active-async-capacity.js +427 -0
  88. package/extensions/dm-subagents/src/runs/background/active-run-index.js +122 -0
  89. package/extensions/dm-subagents/src/runs/background/async-execution.js +925 -137
  90. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +515 -148
  91. package/extensions/dm-subagents/src/runs/background/async-resume.js +378 -51
  92. package/extensions/dm-subagents/src/runs/background/async-retention.js +828 -0
  93. package/extensions/dm-subagents/src/runs/background/async-status-snapshot.js +31 -0
  94. package/extensions/dm-subagents/src/runs/background/async-status.js +259 -22
  95. package/extensions/dm-subagents/src/runs/background/auto-drain.js +46 -0
  96. package/extensions/dm-subagents/src/runs/background/chain-append.js +50 -15
  97. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +67 -12
  98. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +5 -1
  99. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +3 -11
  100. package/extensions/dm-subagents/src/runs/background/completion-replay.js +245 -0
  101. package/extensions/dm-subagents/src/runs/background/control-channel.js +423 -36
  102. package/extensions/dm-subagents/src/runs/background/fleet-view.js +132 -59
  103. package/extensions/dm-subagents/src/runs/background/index-segment.js +38 -0
  104. package/extensions/dm-subagents/src/runs/background/inspect-rpc.js +373 -0
  105. package/extensions/dm-subagents/src/runs/background/notify.js +357 -57
  106. package/extensions/dm-subagents/src/runs/background/owned-process-tree.js +86 -0
  107. package/extensions/dm-subagents/src/runs/background/process-terminal.js +269 -0
  108. package/extensions/dm-subagents/src/runs/background/result-delivery-ownership.js +34 -0
  109. package/extensions/dm-subagents/src/runs/background/result-files.js +469 -0
  110. package/extensions/dm-subagents/src/runs/background/result-watcher.js +540 -75
  111. package/extensions/dm-subagents/src/runs/background/resume-guidance.js +44 -0
  112. package/extensions/dm-subagents/src/runs/background/retained-children.js +119 -0
  113. package/extensions/dm-subagents/src/runs/background/run-id-query.js +5 -0
  114. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +93 -9
  115. package/extensions/dm-subagents/src/runs/background/run-status.js +303 -32
  116. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +784 -376
  117. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +75 -34
  118. package/extensions/dm-subagents/src/runs/background/steering.js +221 -0
  119. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +3106 -844
  120. package/extensions/dm-subagents/src/runs/background/subagent-wait.js +529 -0
  121. package/extensions/dm-subagents/src/runs/background/terminal-run-index.js +106 -0
  122. package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -1
  123. package/extensions/dm-subagents/src/runs/background/wait-completions.js +155 -0
  124. package/extensions/dm-subagents/src/runs/background/wait-config.js +46 -0
  125. package/extensions/dm-subagents/src/runs/background/wait-subscriptions.js +278 -0
  126. package/extensions/dm-subagents/src/runs/background/wait-tool.js +47 -0
  127. package/extensions/dm-subagents/src/runs/foreground/async-dismiss-action.js +81 -0
  128. package/extensions/dm-subagents/src/runs/foreground/async-steering-action.js +245 -0
  129. package/extensions/dm-subagents/src/runs/foreground/async-stop-action.js +74 -0
  130. package/extensions/dm-subagents/src/runs/foreground/execution.js +1401 -342
  131. package/extensions/dm-subagents/src/runs/foreground/foreground-control.js +133 -0
  132. package/extensions/dm-subagents/src/runs/foreground/foreground-history.js +148 -0
  133. package/extensions/dm-subagents/src/runs/foreground/prompt-audit.js +139 -0
  134. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +4278 -1441
  135. package/extensions/dm-subagents/src/runs/foreground/workflow-detach-reconcile.js +278 -0
  136. package/extensions/dm-subagents/src/runs/foreground/workflow-foreground-steering.js +155 -0
  137. package/extensions/dm-subagents/src/runs/shared/abort-recovery.js +97 -0
  138. package/extensions/dm-subagents/src/runs/shared/acceptance.js +597 -148
  139. package/extensions/dm-subagents/src/runs/shared/agent-contract.js +35 -0
  140. package/extensions/dm-subagents/src/runs/shared/async-status-projection.js +472 -0
  141. package/extensions/dm-subagents/src/runs/shared/background-process-options.js +6 -0
  142. package/extensions/dm-subagents/src/runs/shared/capability-ceiling.js +175 -0
  143. package/extensions/dm-subagents/src/runs/shared/child-identity.js +32 -0
  144. package/extensions/dm-subagents/src/runs/shared/child-launch-plan.js +65 -0
  145. package/extensions/dm-subagents/src/runs/shared/child-protocol.js +447 -0
  146. package/extensions/dm-subagents/src/runs/shared/claude-code-adapter.js +120 -0
  147. package/extensions/dm-subagents/src/runs/shared/codex-exec-adapter.js +129 -0
  148. package/extensions/dm-subagents/src/runs/shared/completion-evidence.js +40 -0
  149. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +140 -83
  150. package/extensions/dm-subagents/src/runs/shared/context-mode.js +38 -0
  151. package/extensions/dm-subagents/src/runs/shared/cursor-agent-adapter.js +101 -0
  152. package/extensions/dm-subagents/src/runs/shared/dm-args.js +445 -72
  153. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +27 -16
  154. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +19 -6
  155. package/extensions/dm-subagents/src/runs/shared/extension-bindings.js +81 -0
  156. package/extensions/dm-subagents/src/runs/shared/external-cli-contract.js +134 -0
  157. package/extensions/dm-subagents/src/runs/shared/external-cli-preflight.js +98 -0
  158. package/extensions/dm-subagents/src/runs/shared/external-cli-runner.js +419 -0
  159. package/extensions/dm-subagents/src/runs/shared/external-job-bridge.js +404 -0
  160. package/extensions/dm-subagents/src/runs/shared/external-job-runner.js +334 -0
  161. package/extensions/dm-subagents/src/runs/shared/fast-mode-extension.js +8 -0
  162. package/extensions/dm-subagents/src/runs/shared/host-step-status.js +228 -0
  163. package/extensions/dm-subagents/src/runs/shared/lane-metadata.js +104 -0
  164. package/extensions/dm-subagents/src/runs/shared/launch-cwd.js +17 -0
  165. package/extensions/dm-subagents/src/runs/shared/llm-intent-arbiter.js +190 -0
  166. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +48 -3
  167. package/extensions/dm-subagents/src/runs/shared/mcp-config-sources.js +387 -0
  168. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +212 -137
  169. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-grant.js +131 -0
  170. package/extensions/dm-subagents/src/runs/shared/model-exclusions.js +207 -0
  171. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +225 -55
  172. package/extensions/dm-subagents/src/runs/shared/model-scope.js +85 -28
  173. package/extensions/dm-subagents/src/runs/shared/mutation-evidence.js +182 -0
  174. package/extensions/dm-subagents/src/runs/shared/nested-events.js +264 -102
  175. package/extensions/dm-subagents/src/runs/shared/nested-render.js +15 -5
  176. package/extensions/dm-subagents/src/runs/shared/orca-progress-tabs.js +505 -0
  177. package/extensions/dm-subagents/src/runs/shared/parallel-handoff.js +653 -0
  178. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +29 -12
  179. package/extensions/dm-subagents/src/runs/shared/permissions.js +108 -0
  180. package/extensions/dm-subagents/src/runs/shared/process-signal.js +13 -0
  181. package/extensions/dm-subagents/src/runs/shared/run-fanout-budget.js +257 -0
  182. package/extensions/dm-subagents/src/runs/shared/run-history.js +133 -13
  183. package/extensions/dm-subagents/src/runs/shared/runtime-acknowledged-extensions.js +62 -0
  184. package/extensions/dm-subagents/src/runs/shared/session-lease.js +225 -0
  185. package/extensions/dm-subagents/src/runs/shared/single-output.js +129 -27
  186. package/extensions/dm-subagents/src/runs/shared/spawn-budget.js +95 -0
  187. package/extensions/dm-subagents/src/runs/shared/structured-output.js +129 -10
  188. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +66 -11
  189. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +548 -70
  190. package/extensions/dm-subagents/src/runs/shared/subagent-startup-retry.js +50 -0
  191. package/extensions/dm-subagents/src/runs/shared/task-intent.js +130 -0
  192. package/extensions/dm-subagents/src/runs/shared/tool-availability.js +59 -0
  193. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +7 -5
  194. package/extensions/dm-subagents/src/runs/shared/tool-timeout.js +64 -0
  195. package/extensions/dm-subagents/src/runs/shared/usage-budget.js +74 -0
  196. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +22 -0
  197. package/extensions/dm-subagents/src/runs/shared/worktree-cleanup-plan.js +721 -0
  198. package/extensions/dm-subagents/src/runs/shared/worktree.js +168 -19
  199. package/extensions/dm-subagents/src/shared/accessible-dir.js +35 -0
  200. package/extensions/dm-subagents/src/shared/agent-stream-options.js +3 -0
  201. package/extensions/dm-subagents/src/shared/artifacts.js +170 -11
  202. package/extensions/dm-subagents/src/shared/atomic-json.js +36 -38
  203. package/extensions/dm-subagents/src/shared/capacity-resilient-json.js +77 -0
  204. package/extensions/dm-subagents/src/shared/child-session-name.js +15 -0
  205. package/extensions/dm-subagents/src/shared/child-transcript.js +57 -2
  206. package/extensions/dm-subagents/src/shared/completion-owner.js +7 -0
  207. package/extensions/dm-subagents/src/shared/display-text.js +142 -0
  208. package/extensions/dm-subagents/src/shared/extension-context.js +17 -0
  209. package/extensions/dm-subagents/src/shared/file-coalescer.js +9 -0
  210. package/extensions/dm-subagents/src/shared/file-system-retry.js +56 -0
  211. package/extensions/dm-subagents/src/shared/fork-context.js +96 -33
  212. package/extensions/dm-subagents/src/shared/formatters.js +21 -7
  213. package/extensions/dm-subagents/src/shared/launch-contract.js +94 -0
  214. package/extensions/dm-subagents/src/shared/model-info.js +10 -5
  215. package/extensions/dm-subagents/src/shared/node-executable.js +19 -0
  216. package/extensions/dm-subagents/src/shared/prompt-resources.js +10 -0
  217. package/extensions/dm-subagents/src/shared/pruned-fork.js +427 -0
  218. package/extensions/dm-subagents/src/shared/session-file-trust.js +19 -0
  219. package/extensions/dm-subagents/src/shared/session-tokens.js +14 -3
  220. package/extensions/dm-subagents/src/shared/settings.js +39 -47
  221. package/extensions/dm-subagents/src/shared/shortcuts.js +16 -0
  222. package/extensions/dm-subagents/src/shared/status-format.js +9 -2
  223. package/extensions/dm-subagents/src/shared/thinking-ceiling.js +41 -0
  224. package/extensions/dm-subagents/src/shared/types.js +47 -7
  225. package/extensions/dm-subagents/src/shared/utf8.js +12 -0
  226. package/extensions/dm-subagents/src/shared/utils.js +151 -131
  227. package/extensions/dm-subagents/src/shared/watch-strategy.js +3 -0
  228. package/extensions/dm-subagents/src/shared/workflow-child-permit.js +84 -0
  229. package/extensions/dm-subagents/src/slash/delegation-adapters.js +274 -0
  230. package/extensions/dm-subagents/src/slash/delegation-json.js +113 -0
  231. package/extensions/dm-subagents/src/slash/delegation-request.js +152 -0
  232. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +294 -243
  233. package/extensions/dm-subagents/src/slash/prompt-workflows.js +35 -73
  234. package/extensions/dm-subagents/src/slash/selector.js +101 -0
  235. package/extensions/dm-subagents/src/slash/slash-bridge.js +17 -1
  236. package/extensions/dm-subagents/src/slash/slash-commands.js +722 -732
  237. package/extensions/dm-subagents/src/slash/slash-live-state.js +37 -19
  238. package/extensions/dm-subagents/src/slash/subagents-admin.js +410 -0
  239. package/extensions/dm-subagents/src/tui/fleet-status.js +824 -0
  240. package/extensions/dm-subagents/src/tui/fleet-transcript.js +479 -0
  241. package/extensions/dm-subagents/src/tui/fleet.js +1326 -0
  242. package/extensions/dm-subagents/src/tui/render-helpers.js +22 -0
  243. package/extensions/dm-subagents/src/tui/render.js +1511 -261
  244. package/extensions/dm-subagents/src/watchdog/change-signature.js +220 -0
  245. package/extensions/dm-subagents/src/watchdog/child-status.js +151 -0
  246. package/extensions/dm-subagents/src/watchdog/emission-guard.js +90 -0
  247. package/extensions/dm-subagents/src/watchdog/lsp-diagnostics.js +484 -0
  248. package/extensions/dm-subagents/src/watchdog/model-selection.js +154 -0
  249. package/extensions/dm-subagents/src/watchdog/permission-arbiter.js +138 -0
  250. package/extensions/dm-subagents/src/watchdog/register-child.js +112 -0
  251. package/extensions/dm-subagents/src/watchdog/register-main.js +419 -0
  252. package/extensions/dm-subagents/src/watchdog/render.js +54 -0
  253. package/extensions/dm-subagents/src/watchdog/review.js +251 -0
  254. package/extensions/dm-subagents/src/watchdog/runtime.js +803 -0
  255. package/extensions/dm-subagents/src/watchdog/scope.js +56 -0
  256. package/extensions/dm-subagents/src/watchdog/settings.js +515 -0
  257. package/extensions/dm-subagents/src/watchdog/tool-actions.js +151 -0
  258. package/extensions/dm-subagents/src/watchdog/turn-delta.js +169 -0
  259. package/extensions/dm-subagents/src/watchdog/types.js +29 -0
  260. package/extensions/dm-subagents/src/watchdog/warning-format.js +58 -0
  261. package/extensions/dm-subagents/src/workflows/chat-progress.js +116 -0
  262. package/extensions/dm-subagents/src/workflows/host-command.js +227 -0
  263. package/extensions/dm-subagents/src/workflows/scripted-workflow.js +2011 -0
  264. package/extensions/dm-subagents/src/workflows/workflow-child-summary.js +116 -0
  265. package/extensions/dm-subagents/src/workflows/workflow-preflight.js +243 -0
  266. package/extensions/dm-subagents/src/workflows/workflow-receipt.js +387 -0
  267. package/extensions/dm-subagents/src/workflows/workflow-settlement.js +189 -0
  268. package/package.json +4 -3
  269. package/extensions/dm-fff/package.json +0 -21
  270. package/extensions/dm-fff/src/index.js +0 -691
  271. package/extensions/dm-fff/src/query.js +0 -60
  272. package/extensions/dm-subagents/agents/context-builder.md +0 -46
  273. package/extensions/dm-subagents/agents/planner.md +0 -55
  274. package/extensions/dm-subagents/prompts/parallel-context-build.md +0 -55
  275. package/extensions/dm-subagents/prompts/parallel-handoff-plan.md +0 -61
  276. package/extensions/dm-subagents/src/runs/background/wait.js +0 -206
  277. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +0 -1013
  278. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +0 -981
  279. 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
- - After contact_supervisor with reason "need_decision", stay alive and continue only after the reply arrives. Do not finish your final response with a choose-one question.
19
- - Do not ask for clarification when the only conflict is review-only/no-edit versus progress-writing or artifact-writing instructions. Review-only/no-edit wins; leave files unchanged and mention the conflict in your final result only if it matters.
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 or intercom for routine completion handoffs. If no coordination is needed, return a focused task result.`;
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 normalizedSessionId = sessionId.startsWith("session-") ? sessionId.slice("session-".length) : sessionId;
29
- return `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 8)}`;
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 = ["intercom", "contact_supervisor"];
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}