@elizaos/plugin-agent-orchestrator 2.0.0-beta.1 → 2.0.3-beta.3

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 (268) hide show
  1. package/CHANGELOG.md +6 -8
  2. package/README.md +102 -30
  3. package/dist/cjs/index.node.cjs +17539 -17068
  4. package/dist/cjs/index.node.js.map +71 -61
  5. package/dist/node/index.node.js +17545 -17070
  6. package/dist/node/index.node.js.map +71 -61
  7. package/dist/node/src/actions/common.d.ts +62 -4
  8. package/dist/node/src/actions/common.d.ts.map +1 -1
  9. package/dist/node/src/actions/elizaos-capability.d.ts +3 -0
  10. package/dist/node/src/actions/elizaos-capability.d.ts.map +1 -0
  11. package/dist/node/src/actions/sandbox-stub.d.ts +9 -5
  12. package/dist/node/src/actions/sandbox-stub.d.ts.map +1 -1
  13. package/dist/node/src/actions/tasks.d.ts +22 -2
  14. package/dist/node/src/actions/tasks.d.ts.map +1 -1
  15. package/dist/node/src/api/agent-routes.d.ts +1 -1
  16. package/dist/node/src/api/agent-routes.d.ts.map +1 -1
  17. package/dist/node/src/api/bridge-routes.d.ts +57 -19
  18. package/dist/node/src/api/bridge-routes.d.ts.map +1 -1
  19. package/dist/node/src/api/credential-prompt.d.ts +38 -0
  20. package/dist/node/src/api/credential-prompt.d.ts.map +1 -0
  21. package/dist/node/src/api/orchestrator-routes.d.ts +25 -0
  22. package/dist/node/src/api/orchestrator-routes.d.ts.map +1 -0
  23. package/dist/node/src/api/parent-context-routes.d.ts.map +1 -1
  24. package/dist/node/src/api/route-utils.d.ts +23 -7
  25. package/dist/node/src/api/route-utils.d.ts.map +1 -1
  26. package/dist/node/src/api/routes.d.ts +1 -2
  27. package/dist/node/src/api/routes.d.ts.map +1 -1
  28. package/dist/node/src/evaluators/sub-agent-completion.d.ts +3 -0
  29. package/dist/node/src/evaluators/sub-agent-completion.d.ts.map +1 -0
  30. package/dist/node/src/index.d.ts +33 -8
  31. package/dist/node/src/index.d.ts.map +1 -1
  32. package/dist/node/src/providers/action-examples.d.ts.map +1 -1
  33. package/dist/node/src/providers/active-sub-agents.d.ts.map +1 -1
  34. package/dist/node/src/providers/active-workspace-context.d.ts +2 -2
  35. package/dist/node/src/providers/active-workspace-context.d.ts.map +1 -1
  36. package/dist/node/src/providers/available-agents.d.ts.map +1 -1
  37. package/dist/node/src/providers/coding-session-changes.d.ts +17 -0
  38. package/dist/node/src/providers/coding-session-changes.d.ts.map +1 -0
  39. package/dist/node/src/register-routes.d.ts +21 -1
  40. package/dist/node/src/register-routes.d.ts.map +1 -1
  41. package/dist/node/src/services/acceptance-criteria.d.ts +84 -0
  42. package/dist/node/src/services/acceptance-criteria.d.ts.map +1 -0
  43. package/dist/node/src/services/acp-native-transport.d.ts +111 -0
  44. package/dist/node/src/services/acp-native-transport.d.ts.map +1 -0
  45. package/dist/node/src/services/acp-service.d.ts +169 -4
  46. package/dist/node/src/services/acp-service.d.ts.map +1 -1
  47. package/dist/node/src/services/active-session-forward.d.ts +31 -0
  48. package/dist/node/src/services/active-session-forward.d.ts.map +1 -0
  49. package/dist/node/src/services/agent-name-assignment.d.ts +50 -0
  50. package/dist/node/src/services/agent-name-assignment.d.ts.map +1 -0
  51. package/dist/node/src/services/ansi-utils.d.ts +1 -1
  52. package/dist/node/src/services/app-deploy-guidance.d.ts +52 -0
  53. package/dist/node/src/services/app-deploy-guidance.d.ts.map +1 -0
  54. package/dist/node/src/services/audit.d.ts +18 -0
  55. package/dist/node/src/services/audit.d.ts.map +1 -0
  56. package/dist/node/src/services/coding-account-selection.d.ts +79 -0
  57. package/dist/node/src/services/coding-account-selection.d.ts.map +1 -0
  58. package/dist/node/src/services/completion-envelope.d.ts +63 -0
  59. package/dist/node/src/services/completion-envelope.d.ts.map +1 -0
  60. package/dist/node/src/services/completion-evidence.d.ts +144 -0
  61. package/dist/node/src/services/completion-evidence.d.ts.map +1 -0
  62. package/dist/node/src/services/config-env.d.ts +11 -7
  63. package/dist/node/src/services/config-env.d.ts.map +1 -1
  64. package/dist/node/src/services/goal-contract.d.ts +25 -0
  65. package/dist/node/src/services/goal-contract.d.ts.map +1 -0
  66. package/dist/node/src/services/goal-llm-verifier.d.ts +157 -0
  67. package/dist/node/src/services/goal-llm-verifier.d.ts.map +1 -0
  68. package/dist/node/src/services/goal-prompt.d.ts +82 -0
  69. package/dist/node/src/services/goal-prompt.d.ts.map +1 -0
  70. package/dist/node/src/services/independent-verifier.d.ts +58 -0
  71. package/dist/node/src/services/independent-verifier.d.ts.map +1 -0
  72. package/dist/node/src/services/interruption-decider.d.ts +43 -0
  73. package/dist/node/src/services/interruption-decider.d.ts.map +1 -0
  74. package/dist/node/src/services/opencode-config.d.ts +21 -0
  75. package/dist/node/src/services/opencode-config.d.ts.map +1 -0
  76. package/dist/node/src/services/orchestrator-device-support-matrix.d.ts +46 -0
  77. package/dist/node/src/services/orchestrator-device-support-matrix.d.ts.map +1 -0
  78. package/dist/node/src/services/orchestrator-task-mapper.d.ts +192 -0
  79. package/dist/node/src/services/orchestrator-task-mapper.d.ts.map +1 -0
  80. package/dist/node/src/services/orchestrator-task-service.d.ts +370 -0
  81. package/dist/node/src/services/orchestrator-task-service.d.ts.map +1 -0
  82. package/dist/node/src/services/orchestrator-task-store.d.ts +156 -0
  83. package/dist/node/src/services/orchestrator-task-store.d.ts.map +1 -0
  84. package/dist/node/src/services/orchestrator-task-types.d.ts +334 -0
  85. package/dist/node/src/services/orchestrator-task-types.d.ts.map +1 -0
  86. package/dist/node/src/services/parent-agent-broker.d.ts +5 -3
  87. package/dist/node/src/services/parent-agent-broker.d.ts.map +1 -1
  88. package/dist/node/src/services/parent-agent-dispatch.d.ts +62 -0
  89. package/dist/node/src/services/parent-agent-dispatch.d.ts.map +1 -0
  90. package/dist/node/src/services/screenshot-delivery.d.ts +38 -0
  91. package/dist/node/src/services/screenshot-delivery.d.ts.map +1 -0
  92. package/dist/node/src/services/session-event-queue.d.ts +1 -8
  93. package/dist/node/src/services/session-event-queue.d.ts.map +1 -1
  94. package/dist/node/src/services/session-store.d.ts +2 -1
  95. package/dist/node/src/services/session-store.d.ts.map +1 -1
  96. package/dist/node/src/services/skill-lifeops-context-broker.d.ts +1 -1
  97. package/dist/node/src/services/skill-lifeops-context-broker.d.ts.map +1 -1
  98. package/dist/node/src/services/skill-manifest.d.ts +1 -1
  99. package/dist/node/src/services/skill-recommender.d.ts +2 -0
  100. package/dist/node/src/services/skill-recommender.d.ts.map +1 -1
  101. package/dist/node/src/services/smithers-task-executor.d.ts +73 -0
  102. package/dist/node/src/services/smithers-task-executor.d.ts.map +1 -0
  103. package/dist/node/src/services/smithers-task-integration.d.ts +52 -0
  104. package/dist/node/src/services/smithers-task-integration.d.ts.map +1 -0
  105. package/dist/node/src/services/smithers-task-runner.d.ts +27 -0
  106. package/dist/node/src/services/smithers-task-runner.d.ts.map +1 -0
  107. package/dist/node/src/services/smithers-task-types.d.ts +96 -0
  108. package/dist/node/src/services/smithers-task-types.d.ts.map +1 -0
  109. package/dist/node/src/services/spawn-trajectory.d.ts +2 -2
  110. package/dist/node/src/services/spawn-trajectory.d.ts.map +1 -1
  111. package/dist/node/src/services/spend-allowance.d.ts +143 -0
  112. package/dist/node/src/services/spend-allowance.d.ts.map +1 -0
  113. package/dist/node/src/services/ssrf-guard.d.ts +66 -0
  114. package/dist/node/src/services/ssrf-guard.d.ts.map +1 -0
  115. package/dist/node/src/services/sub-agent-identity.d.ts +27 -0
  116. package/dist/node/src/services/sub-agent-identity.d.ts.map +1 -0
  117. package/dist/node/src/services/sub-agent-inbox.d.ts +26 -0
  118. package/dist/node/src/services/sub-agent-inbox.d.ts.map +1 -0
  119. package/dist/node/src/services/sub-agent-router.d.ts +142 -2
  120. package/dist/node/src/services/sub-agent-router.d.ts.map +1 -1
  121. package/dist/node/src/services/task-agent-frameworks.d.ts +21 -8
  122. package/dist/node/src/services/task-agent-frameworks.d.ts.map +1 -1
  123. package/dist/node/src/services/task-agent-routing.d.ts +33 -0
  124. package/dist/node/src/services/task-agent-routing.d.ts.map +1 -0
  125. package/dist/node/src/services/task-supervisor-service.d.ts +65 -0
  126. package/dist/node/src/services/task-supervisor-service.d.ts.map +1 -0
  127. package/dist/node/src/services/task-watchdog-service.d.ts +50 -0
  128. package/dist/node/src/services/task-watchdog-service.d.ts.map +1 -0
  129. package/dist/node/src/services/terminal-capabilities.d.ts +48 -0
  130. package/dist/node/src/services/terminal-capabilities.d.ts.map +1 -0
  131. package/dist/node/src/services/trajectory-context.d.ts +4 -8
  132. package/dist/node/src/services/trajectory-context.d.ts.map +1 -1
  133. package/dist/node/src/services/trajectory-feedback.d.ts +1 -1
  134. package/dist/node/src/services/types.d.ts +38 -2
  135. package/dist/node/src/services/types.d.ts.map +1 -1
  136. package/dist/node/src/services/view-deploy-guidance.d.ts +14 -0
  137. package/dist/node/src/services/view-deploy-guidance.d.ts.map +1 -0
  138. package/dist/node/src/services/workdir-validation.d.ts +10 -0
  139. package/dist/node/src/services/workdir-validation.d.ts.map +1 -0
  140. package/dist/node/src/services/workspace-diff.d.ts +50 -0
  141. package/dist/node/src/services/workspace-diff.d.ts.map +1 -0
  142. package/dist/node/src/services/workspace-git-ops.d.ts +2 -2
  143. package/dist/node/src/services/workspace-git-ops.d.ts.map +1 -1
  144. package/dist/node/src/services/workspace-github.d.ts +7 -7
  145. package/dist/node/src/services/workspace-github.d.ts.map +1 -1
  146. package/dist/node/src/services/workspace-lifecycle.d.ts +2 -15
  147. package/dist/node/src/services/workspace-lifecycle.d.ts.map +1 -1
  148. package/dist/node/src/services/workspace-service.d.ts +6 -2
  149. package/dist/node/src/services/workspace-service.d.ts.map +1 -1
  150. package/dist/node/src/setup-routes.d.ts.map +1 -1
  151. package/docs/SUBAGENT_FLOW_AND_PARITY.md +138 -0
  152. package/docs/default-eliza-skills-and-agent-bridge-plan.md +9 -15
  153. package/docs/economics-goal-runbook.md +140 -0
  154. package/docs/multi-account-orchestration.md +76 -0
  155. package/docs/orchestrator-buildout-followups.md +124 -0
  156. package/docs/orchestrator-dashboard-task-widget-secrets-assessment.md +174 -0
  157. package/docs/orchestrator-dashboard-task-widget-secrets-design.md +301 -0
  158. package/docs/research/orchestrator-view-research-report.md +273 -0
  159. package/docs/sub-agent-routing.md +53 -23
  160. package/package.json +111 -25
  161. package/PROJECT.md +0 -119
  162. package/dist/browser/index.browser.js +0 -21051
  163. package/dist/browser/index.browser.js.map +0 -29
  164. package/dist/browser/index.d.ts +0 -2
  165. package/dist/node/index.browser.d.ts +0 -3
  166. package/dist/node/index.browser.d.ts.map +0 -1
  167. package/dist/node/src/actions/cancel-task.d.ts +0 -3
  168. package/dist/node/src/actions/cancel-task.d.ts.map +0 -1
  169. package/dist/node/src/actions/coding-task-handlers.d.ts +0 -69
  170. package/dist/node/src/actions/coding-task-handlers.d.ts.map +0 -1
  171. package/dist/node/src/actions/coding-task-helpers.d.ts +0 -35
  172. package/dist/node/src/actions/coding-task-helpers.d.ts.map +0 -1
  173. package/dist/node/src/actions/create-task.d.ts +0 -8
  174. package/dist/node/src/actions/create-task.d.ts.map +0 -1
  175. package/dist/node/src/actions/eval-metadata.d.ts +0 -11
  176. package/dist/node/src/actions/eval-metadata.d.ts.map +0 -1
  177. package/dist/node/src/actions/finalize-workspace.d.ts +0 -11
  178. package/dist/node/src/actions/finalize-workspace.d.ts.map +0 -1
  179. package/dist/node/src/actions/list-agents.d.ts +0 -4
  180. package/dist/node/src/actions/list-agents.d.ts.map +0 -1
  181. package/dist/node/src/actions/manage-issues.d.ts +0 -11
  182. package/dist/node/src/actions/manage-issues.d.ts.map +0 -1
  183. package/dist/node/src/actions/provision-workspace.d.ts +0 -11
  184. package/dist/node/src/actions/provision-workspace.d.ts.map +0 -1
  185. package/dist/node/src/actions/send-to-agent.d.ts +0 -4
  186. package/dist/node/src/actions/send-to-agent.d.ts.map +0 -1
  187. package/dist/node/src/actions/spawn-agent.d.ts +0 -8
  188. package/dist/node/src/actions/spawn-agent.d.ts.map +0 -1
  189. package/dist/node/src/actions/stop-agent.d.ts +0 -4
  190. package/dist/node/src/actions/stop-agent.d.ts.map +0 -1
  191. package/dist/node/src/actions/task-control.d.ts +0 -3
  192. package/dist/node/src/actions/task-control.d.ts.map +0 -1
  193. package/dist/node/src/actions/task-history.d.ts +0 -3
  194. package/dist/node/src/actions/task-history.d.ts.map +0 -1
  195. package/dist/node/src/actions/task-share.d.ts +0 -3
  196. package/dist/node/src/actions/task-share.d.ts.map +0 -1
  197. package/dist/node/src/actions/task-thread-target.d.ts +0 -11
  198. package/dist/node/src/actions/task-thread-target.d.ts.map +0 -1
  199. package/dist/node/src/api/coordinator-routes.d.ts +0 -22
  200. package/dist/node/src/api/coordinator-routes.d.ts.map +0 -1
  201. package/dist/node/src/api/hook-routes.d.ts +0 -18
  202. package/dist/node/src/api/hook-routes.d.ts.map +0 -1
  203. package/dist/node/src/routes/coding-agents-fallback-routes.d.ts +0 -19
  204. package/dist/node/src/routes/coding-agents-fallback-routes.d.ts.map +0 -1
  205. package/dist/node/src/services/acpx-subprocess.d.ts +0 -3
  206. package/dist/node/src/services/acpx-subprocess.d.ts.map +0 -1
  207. package/dist/node/src/services/agent-credentials.d.ts +0 -23
  208. package/dist/node/src/services/agent-credentials.d.ts.map +0 -1
  209. package/dist/node/src/services/agent-metrics.d.ts +0 -30
  210. package/dist/node/src/services/agent-metrics.d.ts.map +0 -1
  211. package/dist/node/src/services/agent-selection.d.ts +0 -53
  212. package/dist/node/src/services/agent-selection.d.ts.map +0 -1
  213. package/dist/node/src/services/claude-code-skill-installer.d.ts +0 -33
  214. package/dist/node/src/services/claude-code-skill-installer.d.ts.map +0 -1
  215. package/dist/node/src/services/coordinator-event-normalizer.d.ts +0 -50
  216. package/dist/node/src/services/coordinator-event-normalizer.d.ts.map +0 -1
  217. package/dist/node/src/services/custom-validator-runner.d.ts +0 -66
  218. package/dist/node/src/services/custom-validator-runner.d.ts.map +0 -1
  219. package/dist/node/src/services/debug-capture.d.ts +0 -38
  220. package/dist/node/src/services/debug-capture.d.ts.map +0 -1
  221. package/dist/node/src/services/pty-auto-response.d.ts +0 -30
  222. package/dist/node/src/services/pty-auto-response.d.ts.map +0 -1
  223. package/dist/node/src/services/pty-init.d.ts +0 -55
  224. package/dist/node/src/services/pty-init.d.ts.map +0 -1
  225. package/dist/node/src/services/pty-service.d.ts +0 -218
  226. package/dist/node/src/services/pty-service.d.ts.map +0 -1
  227. package/dist/node/src/services/pty-session-io.d.ts +0 -49
  228. package/dist/node/src/services/pty-session-io.d.ts.map +0 -1
  229. package/dist/node/src/services/pty-spawn.d.ts +0 -104
  230. package/dist/node/src/services/pty-spawn.d.ts.map +0 -1
  231. package/dist/node/src/services/pty-types.d.ts +0 -94
  232. package/dist/node/src/services/pty-types.d.ts.map +0 -1
  233. package/dist/node/src/services/skill-callback-bridge.d.ts +0 -78
  234. package/dist/node/src/services/skill-callback-bridge.d.ts.map +0 -1
  235. package/dist/node/src/services/skill-essentials.d.ts +0 -16
  236. package/dist/node/src/services/skill-essentials.d.ts.map +0 -1
  237. package/dist/node/src/services/stall-classifier.d.ts +0 -69
  238. package/dist/node/src/services/stall-classifier.d.ts.map +0 -1
  239. package/dist/node/src/services/structured-proof-bridge.d.ts +0 -99
  240. package/dist/node/src/services/structured-proof-bridge.d.ts.map +0 -1
  241. package/dist/node/src/services/swarm-coordinator-prompts.d.ts +0 -93
  242. package/dist/node/src/services/swarm-coordinator-prompts.d.ts.map +0 -1
  243. package/dist/node/src/services/swarm-coordinator.d.ts +0 -473
  244. package/dist/node/src/services/swarm-coordinator.d.ts.map +0 -1
  245. package/dist/node/src/services/swarm-decision-loop.d.ts +0 -69
  246. package/dist/node/src/services/swarm-decision-loop.d.ts.map +0 -1
  247. package/dist/node/src/services/swarm-event-triage.d.ts +0 -49
  248. package/dist/node/src/services/swarm-event-triage.d.ts.map +0 -1
  249. package/dist/node/src/services/swarm-history.d.ts +0 -27
  250. package/dist/node/src/services/swarm-history.d.ts.map +0 -1
  251. package/dist/node/src/services/swarm-idle-watchdog.d.ts +0 -22
  252. package/dist/node/src/services/swarm-idle-watchdog.d.ts.map +0 -1
  253. package/dist/node/src/services/task-acceptance.d.ts +0 -8
  254. package/dist/node/src/services/task-acceptance.d.ts.map +0 -1
  255. package/dist/node/src/services/task-agent-auth.d.ts +0 -69
  256. package/dist/node/src/services/task-agent-auth.d.ts.map +0 -1
  257. package/dist/node/src/services/task-kind.d.ts +0 -3
  258. package/dist/node/src/services/task-kind.d.ts.map +0 -1
  259. package/dist/node/src/services/task-registry.d.ts +0 -550
  260. package/dist/node/src/services/task-registry.d.ts.map +0 -1
  261. package/dist/node/src/services/task-share.d.ts +0 -18
  262. package/dist/node/src/services/task-share.d.ts.map +0 -1
  263. package/dist/node/src/services/task-validation.d.ts +0 -69
  264. package/dist/node/src/services/task-validation.d.ts.map +0 -1
  265. package/dist/node/src/services/task-verifier-runner.d.ts +0 -5
  266. package/dist/node/src/services/task-verifier-runner.d.ts.map +0 -1
  267. package/dist/node/vitest.config.d.ts +0 -3
  268. package/dist/node/vitest.config.d.ts.map +0 -1
@@ -0,0 +1,73 @@
1
+ import type { TaskApprovalResult, TaskProvisionResult, TaskStepContext, TaskStepExecutor, TaskSubmitResult, TaskTurnResult } from "./smithers-task-types";
2
+ /** Minimal ACP surface the executor needs. Satisfied by `AcpService`; faked in tests. */
3
+ export interface AcpLike {
4
+ spawnSession(opts: {
5
+ agentType?: string;
6
+ workdir?: string;
7
+ label?: string;
8
+ initialTask?: string;
9
+ }): Promise<{
10
+ sessionId: string;
11
+ }>;
12
+ sendPrompt(sessionId: string, text: string): Promise<{
13
+ stopReason?: string;
14
+ finalText?: string;
15
+ response?: string;
16
+ error?: string;
17
+ }>;
18
+ /** Reattach to a still-resumable session for this label (durable resume). */
19
+ findResumableSessionByLabel?(label: string): Promise<{
20
+ sessionId: string;
21
+ } | null | undefined>;
22
+ cancelSession?(sessionId: string): Promise<void>;
23
+ }
24
+ export interface SmithersTaskExecutorOptions {
25
+ agentType?: string;
26
+ workdir?: string;
27
+ /** Drive an already-spawned session instead of spawning/reattaching one. */
28
+ sessionId?: string;
29
+ /** Prompt sent on turns after the first when the agent isn't yet done. */
30
+ continuePrompt?: string;
31
+ onProvision?: (ctx: TaskStepContext) => Promise<TaskProvisionResult>;
32
+ onApproval?: (ctx: TaskStepContext) => Promise<TaskApprovalResult>;
33
+ onSubmit?: (ctx: TaskStepContext) => Promise<TaskSubmitResult>;
34
+ }
35
+ /**
36
+ * Decide whether an agent turn finished the task. A clean turn is treated as
37
+ * done (one-shot tasks complete in a single turn; the loop only sends another
38
+ * turn when this returns false). Truncated/interrupted turns are not done so the
39
+ * loop continues. Production may refine this via the `task_complete` event that
40
+ * `SubAgentRouter` already tracks.
41
+ */
42
+ export declare function detectTurnDone(result: {
43
+ stopReason?: string;
44
+ finalText?: string;
45
+ error?: string;
46
+ }): boolean;
47
+ /**
48
+ * {@link TaskStepExecutor} backed by the ACP services. Turns are driven through
49
+ * `sendPrompt` (which resolves when the agent's turn completes); the session is
50
+ * spawned lazily and reattached by label on resume so a crashed task continues
51
+ * against the same agent workspace rather than a fresh one. Provision / approval
52
+ * / submit are pluggable (workspace + approval-queue integration is injected by
53
+ * the caller) so this stays unit-testable without the full plugin.
54
+ */
55
+ export declare class SmithersTaskExecutor implements TaskStepExecutor {
56
+ private readonly acp;
57
+ private readonly opts;
58
+ private sessionId;
59
+ /** Final text from the most recent turn (for the host's task_complete event). */
60
+ lastResponse: string | undefined;
61
+ /**
62
+ * Last turn error. Recorded so callers can propagate it even when a low
63
+ * maxIterations loop swallows the throw via onMaxReached='return-last'.
64
+ */
65
+ lastError: Error | undefined;
66
+ constructor(acp: AcpLike, opts?: SmithersTaskExecutorOptions);
67
+ private ensureSession;
68
+ provision(ctx: TaskStepContext): Promise<TaskProvisionResult>;
69
+ runTurn(ctx: TaskStepContext): Promise<TaskTurnResult>;
70
+ requestApproval(ctx: TaskStepContext): Promise<TaskApprovalResult>;
71
+ submit(ctx: TaskStepContext): Promise<TaskSubmitResult>;
72
+ }
73
+ //# sourceMappingURL=smithers-task-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smithers-task-executor.d.ts","sourceRoot":"","sources":["../../../../src/services/smithers-task-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAE/B,yFAAyF;AACzF,MAAM,WAAW,OAAO;IACtB,YAAY,CAAC,IAAI,EAAE;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnC,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QACT,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,6EAA6E;IAC7E,2BAA2B,CAAC,CAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACrD,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAChE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAWV;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAWzD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXvB,OAAO,CAAC,SAAS,CAAqB;IACtC,iFAAiF;IACjF,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;OAGG;IACH,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC;gBAGV,GAAG,EAAE,OAAO,EACZ,IAAI,GAAE,2BAAgC;YAK3C,aAAa;IAkBrB,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAM7D,OAAO,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAoBtD,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAKlE,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAI9D"}
@@ -0,0 +1,52 @@
1
+ import type { AcpLike } from "./smithers-task-executor";
2
+ import type { TaskRunStatus } from "./smithers-task-types";
3
+ type PromptOut = {
4
+ stopReason?: string;
5
+ finalText?: string;
6
+ response?: string;
7
+ error?: string;
8
+ };
9
+ /** Structural subset of `AcpService` the durable task path uses (methods optional, as on the real service). */
10
+ export interface AcpTaskService {
11
+ spawnSession?(opts: {
12
+ agentType?: string;
13
+ workdir?: string;
14
+ metadata?: Record<string, unknown>;
15
+ }): Promise<{
16
+ sessionId: string;
17
+ }>;
18
+ sendPrompt?(sessionId: string, text: string, opts?: {
19
+ timeoutMs?: number;
20
+ model?: string;
21
+ }): Promise<PromptOut>;
22
+ sendToSession?(sessionId: string, text: string): Promise<PromptOut>;
23
+ }
24
+ /**
25
+ * Whether the durable Smithers task path is enabled. Default ON; set
26
+ * `ELIZA_ORCHESTRATOR_SMITHERS=0` to fall back to the direct prompt path.
27
+ */
28
+ export declare function shouldUseSmithersTaskRunner(): boolean;
29
+ /** Adapt the ACP service to the executor's minimal contract. */
30
+ export declare function acpServiceToAcpLike(service: AcpTaskService, defaults?: {
31
+ timeoutMs?: number;
32
+ model?: string;
33
+ }): AcpLike;
34
+ /**
35
+ * Drive one durable coding-task run against an already-spawned ACP session via
36
+ * the Smithers engine. Single-turn by default (`maxTurns: 1`) so it is a
37
+ * behaviour-preserving drop-in for a direct prompt, but the run is durable: a
38
+ * crash mid-task resumes from the same `runId` (the session id) on restart.
39
+ */
40
+ export declare function runDurableTask(service: AcpTaskService, session: {
41
+ sessionId: string;
42
+ }, task: string, opts?: {
43
+ timeoutMs?: number;
44
+ model?: string;
45
+ maxTurns?: number;
46
+ }): Promise<{
47
+ status: TaskRunStatus;
48
+ lastResponse: string | undefined;
49
+ turns: number;
50
+ }>;
51
+ export {};
52
+ //# sourceMappingURL=smithers-task-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smithers-task-integration.d.ts","sourceRoot":"","sources":["../../../../src/services/smithers-task-integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,KAAK,SAAS,GAAG;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,+GAA+G;AAC/G,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,CAAC,IAAI,EAAE;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnC,UAAU,CAAC,CACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,SAAS,CAAC,CAAC;IACtB,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CACrE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EACvB,QAAQ,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CA6BT;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACnE,OAAO,CAAC;IACT,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAwBD"}
@@ -0,0 +1,27 @@
1
+ import type { TaskRunResult, TaskRunSpec, TaskStepExecutor } from "./smithers-task-types";
2
+ /**
3
+ * Resolve the Smithers storage backend configuration from environment variables.
4
+ *
5
+ * SMITHERS_DB_PROVIDER: "sqlite" (default) | "postgres" | "pglite"
6
+ * SMITHERS_DB_URL: PostgreSQL connection string (used when provider = "postgres")
7
+ * SMITHERS_DB_DATA_DIR: PGlite data directory (used when provider = "pglite")
8
+ *
9
+ * The resolved config is threaded through the subprocess payload so the layer
10
+ * selection runs inside the subprocess script string.
11
+ */
12
+ export declare function resolveSmithersDbConfig(): {
13
+ provider: "sqlite" | "postgres" | "pglite";
14
+ connectionString?: string;
15
+ dataDir?: string;
16
+ };
17
+ /**
18
+ * Run a coding task on the durable Smithers engine, delegating each step to the
19
+ * given executor. Resolves with the assembled {@link TaskRunResult}. Re-invoking
20
+ * with the same `spec.runId` after a crash resumes the task from its last
21
+ * completed step/turn (completed work is not repeated); the result then reflects
22
+ * the steps re-driven in this invocation.
23
+ */
24
+ export declare function runTaskWithSmithers(spec: TaskRunSpec, executor: TaskStepExecutor, options?: {
25
+ signal?: AbortSignal;
26
+ }): Promise<TaskRunResult>;
27
+ //# sourceMappingURL=smithers-task-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smithers-task-runner.d.ts","sourceRoot":"","sources":["../../../../src/services/smithers-task-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EAEX,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAoD/B;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,IAAI;IACzC,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAQA;AA8JD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACrC,OAAO,CAAC,aAAa,CAAC,CA0LxB"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Types for the durable Smithers-backed coding-task runner.
3
+ *
4
+ * A coding task is modelled as a durable Smithers workflow:
5
+ * provision → (durable loop of agent turns) → approval gate → submit → summarize
6
+ *
7
+ * Smithers owns scheduling + durable per-step/per-iteration SQLite state (so a
8
+ * crashed agent resumes from the last completed turn). The actual work of each
9
+ * step is delegated back to the host through a {@link TaskStepExecutor}; the
10
+ * runner never drives a coding agent itself — it drives the *control plane* and
11
+ * calls the executor, which in production is backed by the ACP services.
12
+ */
13
+ /** A coding task to run on the durable engine. */
14
+ export interface TaskRunSpec {
15
+ /** Stable task id (also used to name the per-task SQLite file). */
16
+ taskId: string;
17
+ /**
18
+ * Stable Smithers run id. Re-running with the same id resumes a crashed run
19
+ * from its last completed step/turn. Generate once per task, persist it, and
20
+ * reuse it on restart.
21
+ */
22
+ runId: string;
23
+ /** Initial prompt handed to the agent on the first turn. */
24
+ initialPrompt: string;
25
+ /** Adapter/agent type label (informational; the executor owns spawning). */
26
+ agentType?: string;
27
+ /** Run a provision step (workspace setup) before the agent loop. */
28
+ provision?: boolean;
29
+ /** Run a submit step (commit/push/PR) after the agent loop. */
30
+ submit?: boolean;
31
+ /** Require an approval decision before the submit step. */
32
+ approvalBeforeSubmit?: boolean;
33
+ /** Max agent turns before stopping (replaces the hand-rolled round-trip cap). */
34
+ maxTurns?: number;
35
+ /** Number of agents to fan out in parallel (default 1). */
36
+ parallelAgents?: number;
37
+ }
38
+ /** Per-step context passed to the executor. */
39
+ export interface TaskStepContext {
40
+ taskId: string;
41
+ runId: string;
42
+ /** 1-based turn counter for the current agent loop (best-effort across resume). */
43
+ turn?: number;
44
+ /** 0-based agent index when fanning out (`parallelAgents > 1`). */
45
+ agentIndex?: number;
46
+ /** The task's initial prompt. */
47
+ prompt?: string;
48
+ }
49
+ export interface TaskProvisionResult {
50
+ workspace: Record<string, unknown>;
51
+ }
52
+ /** Result of one agent turn. `done: true` ends the loop early (task complete). */
53
+ export interface TaskTurnResult {
54
+ done: boolean;
55
+ output?: Record<string, unknown>;
56
+ }
57
+ export interface TaskApprovalResult {
58
+ approved: boolean;
59
+ reason?: string;
60
+ }
61
+ export interface TaskSubmitResult {
62
+ output: Record<string, unknown>;
63
+ }
64
+ /**
65
+ * The seam between the durable control plane and the real coding-agent work.
66
+ * In production this is backed by `AcpService` / `CodingWorkspaceService`; in
67
+ * tests it is a fake. Only `runTurn` is required.
68
+ */
69
+ export interface TaskStepExecutor {
70
+ provision?(ctx: TaskStepContext): Promise<TaskProvisionResult>;
71
+ /** Advance the agent one turn; report whether the task is complete. */
72
+ runTurn(ctx: TaskStepContext): Promise<TaskTurnResult>;
73
+ requestApproval?(ctx: TaskStepContext): Promise<TaskApprovalResult>;
74
+ submit?(ctx: TaskStepContext): Promise<TaskSubmitResult>;
75
+ }
76
+ export type TaskRunStatus = "completed" | "incomplete" | "denied";
77
+ export interface TaskRunMetrics {
78
+ turns: number;
79
+ agents: number;
80
+ retries: number;
81
+ durationMs: number;
82
+ }
83
+ export interface TaskRunResult {
84
+ taskId: string;
85
+ runId: string;
86
+ status: TaskRunStatus;
87
+ /** Total agent turns executed across all agents. */
88
+ turns: number;
89
+ approved: boolean;
90
+ workspace?: Record<string, unknown>;
91
+ submit?: Record<string, unknown>;
92
+ /** Per-agent completion flags (length === parallelAgents). */
93
+ agentsDone: boolean[];
94
+ metrics: TaskRunMetrics;
95
+ }
96
+ //# sourceMappingURL=smithers-task-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smithers-task-types.d.ts","sourceRoot":"","sources":["../../../../src/services/smithers-task-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC/D,uEAAuE;IACvE,OAAO,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACvD,eAAe,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpE,MAAM,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC1D;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,8DAA8D;IAC9D,UAAU,EAAE,OAAO,EAAE,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;CACzB"}
@@ -2,8 +2,8 @@ import { type IAgentRuntime, type SpawnTrajectoryHandle } from "@elizaos/core";
2
2
  export declare const TRAJECTORY_PARENT_STEP_METADATA_KEY = "parentTrajectoryStepId";
3
3
  export declare const TRAJECTORY_CHILD_STEP_METADATA_KEY = "trajectoryChildStepId";
4
4
  export declare const TRAJECTORY_LINK_SOURCE_METADATA_KEY = "trajectoryLinkSource";
5
- export declare const TRAJECTORY_PARENT_STEP_ENV_KEY = "MILADY_PARENT_TRAJECTORY_STEP_ID";
6
- export declare const TRAJECTORY_CHILD_STEP_ENV_KEY = "MILADY_TRAJECTORY_CHILD_STEP_ID";
5
+ export declare const TRAJECTORY_PARENT_STEP_ENV_KEY = "ELIZA_PARENT_TRAJECTORY_STEP_ID";
6
+ export declare const TRAJECTORY_CHILD_STEP_ENV_KEY = "ELIZA_TRAJECTORY_CHILD_STEP_ID";
7
7
  export interface LinkedSpawnContext {
8
8
  parentStepId?: string;
9
9
  metadata: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"spawn-trajectory.d.ts","sourceRoot":"","sources":["../../../../src/services/spawn-trajectory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAE3B,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,mCAAmC,2BAA2B,CAAC;AAC5E,eAAO,MAAM,kCAAkC,0BAA0B,CAAC;AAC1E,eAAO,MAAM,mCAAmC,yBAAyB,CAAC;AAC1E,eAAO,MAAM,8BAA8B,qCACP,CAAC;AACrC,eAAO,MAAM,6BAA6B,oCAAoC,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACxC,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;CAC/C;AAED,UAAU,sBAAsB,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7C;AAOD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC7C,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACvC,MAAM,EAAE,qBAAqB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAOpC;AAED,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAClC,KAAK,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GACrD,OAAO,CAAC,CAAC,CAAC,CAuBZ"}
1
+ {"version":3,"file":"spawn-trajectory.d.ts","sourceRoot":"","sources":["../../../../src/services/spawn-trajectory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAE3B,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,mCAAmC,2BAA2B,CAAC;AAC5E,eAAO,MAAM,kCAAkC,0BAA0B,CAAC;AAC1E,eAAO,MAAM,mCAAmC,yBAAyB,CAAC;AAC1E,eAAO,MAAM,8BAA8B,oCAAoC,CAAC;AAChF,eAAO,MAAM,6BAA6B,mCAAmC,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACxC,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;CAC/C;AAED,UAAU,sBAAsB,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7C;AAOD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC7C,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACvC,MAAM,EAAE,qBAAqB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAOpC;AAED,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAClC,KAAK,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GACrD,OAAO,CAAC,CAAC,CAAC,CAuBZ"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Capped self-spend allowance for the parent-agent Cloud command broker.
3
+ *
4
+ * By default every `mutating` / `paid` / `destructive` Eliza Cloud command run
5
+ * through the broker requires an explicit human "yes" (see `runCloudCommand` in
6
+ * `parent-agent-broker.ts`). That invariant is safe but it means a `/goal`
7
+ * sub-agent can never *autonomously* drive the monetized-app loop — every app
8
+ * create, container deploy, and domain buy stalls on a confirmation turn.
9
+ *
10
+ * When an operator configures a spend cap (`ELIZA_AGENT_SPEND_CAP_USD`), the
11
+ * agent may self-authorize commands within a bounded per-session budget:
12
+ *
13
+ * - `read` / `dry-run` → never need authorization (unchanged);
14
+ * - `destructive` → ALWAYS require human confirmation;
15
+ * - self-spend commands → auto-authorize only while the running
16
+ * (debit our own credits) total + the command's estimated cost stays
17
+ * within the cap; otherwise fall back to
18
+ * confirmation;
19
+ * - other `mutating` / `paid` → auto-authorize while the allowance is
20
+ * (state changes + revenue active. These do not debit our balance
21
+ * ops the *payer* funds, e.g. (e.g. `apps.charges.create` creates a
22
+ * `apps.charges.create`) charge that someone else pays us).
23
+ *
24
+ * The cap is a SAFETY THROTTLE, not a durable accounting ledger: the running
25
+ * total is tracked in-memory per child session and resets on process restart.
26
+ * Real money is still ultimately gated server-side (credit balance, atomic
27
+ * debit/refund in the buy/charge routes). Default cap of `0` preserves the
28
+ * original "confirm everything" behavior exactly.
29
+ *
30
+ * @module services/spend-allowance
31
+ */
32
+ /** Mirror of the broker's `CloudCommandRisk` union (kept local to avoid a
33
+ * circular import; structurally identical so `definition.risk` is assignable). */
34
+ export type SpendRisk = "read" | "dry-run" | "mutating" | "paid" | "destructive";
35
+ /** Default daily cost of a container at the base tier ($0.67/day — see the
36
+ * `build-monetized-app` survival-economics docs and `cron/container-billing`).
37
+ * Used as the spend estimate for container deploys when no explicit hint is
38
+ * passed. */
39
+ export declare const CONTAINER_DAILY_COST_USD = 0.67;
40
+ /** Reserved param key the agent may pass to declare the expected USD cost of a
41
+ * self-spend command (e.g. the quoted price returned by `domains.check` before
42
+ * a `domains.buy`). It is read for the allowance decision and then STRIPPED by
43
+ * the broker before the request is built, so it never leaks into the Cloud API
44
+ * request body. */
45
+ export declare const SPEND_HINT_PARAM = "spendEstimateUsd";
46
+ /**
47
+ * Cloud commands that debit the caller's OWN credits / wallet (true self-spend).
48
+ * Only these are metered against the cap. Revenue/collection commands such as
49
+ * `apps.charges.*` and `x402.requests.*` are `paid`-risk but funded by the
50
+ * payer, so they are intentionally excluded.
51
+ */
52
+ export declare const SELF_SPEND_COMMANDS: ReadonlySet<string>;
53
+ /** Read the per-session spend cap (USD). `0` (the default) disables the
54
+ * allowance and preserves the original confirm-everything behavior. */
55
+ export declare function readSpendCapUsd(): number;
56
+ /**
57
+ * Estimate the USD a self-spend command will debit. Returns `null` when the
58
+ * cost cannot be determined — the caller treats `null` as "ask a human", so an
59
+ * unknown cost is never silently auto-spent.
60
+ */
61
+ export declare function estimateSelfSpendCostUsd(command: string, params?: Record<string, unknown>): number | null;
62
+ export interface SpendDecisionInput {
63
+ command: string;
64
+ risk: SpendRisk;
65
+ /** Per-session cap in USD (`0` = allowance disabled). */
66
+ capUsd: number;
67
+ /** USD already auto-authorized in this session. */
68
+ alreadySpentUsd: number;
69
+ params?: Record<string, unknown>;
70
+ }
71
+ export type SpendDecisionReason = "non-mutating" | "allowance-disabled" | "destructive-requires-human" | "within-cap" | "over-cap" | "unknown-cost" | "non-self-spend";
72
+ export interface SpendDecision {
73
+ /** When true the broker may run the command without a human confirmation. */
74
+ autoAuthorize: boolean;
75
+ /** Estimated USD to add to the session ledger when auto-authorized (self-spend
76
+ * only); `null` for non-self-spend or unknown. */
77
+ estimatedCostUsd: number | null;
78
+ reason: SpendDecisionReason;
79
+ }
80
+ /**
81
+ * Decide whether a Cloud command may be auto-authorized under the capped
82
+ * allowance. Pure: no env reads, no ledger mutation, no clock — fully testable.
83
+ */
84
+ export declare function decideSpendAuthorization(input: SpendDecisionInput): SpendDecision;
85
+ /**
86
+ * Durable store for per-session spend, implemented over the
87
+ * OrchestratorTaskStore (a `spendUsd` field on the session record) — see
88
+ * `createTaskStoreSpendLedger`.
89
+ */
90
+ export interface SpendLedgerBackend {
91
+ /** Persisted USD total for a session (0 when none recorded). */
92
+ load(sessionId: string): Promise<number>;
93
+ /** Persist the new running total for a session. */
94
+ save(sessionId: string, totalUsd: number): Promise<void>;
95
+ }
96
+ /** Install (or clear, with `null`) the durable spend backend. Called once at
97
+ * orchestrator boot; tests pass a fake backend. */
98
+ export declare function configureSpendLedger(backend: SpendLedgerBackend | null): void;
99
+ export declare function getSessionSpendUsd(sessionId: string): number;
100
+ /**
101
+ * Rehydrate the in-memory total for a session from the durable backend so the
102
+ * sync cap check sees money spent before a restart. No-op (returns the cached
103
+ * value) when no backend is installed. Call when a session is (re)attached.
104
+ */
105
+ export declare function hydrateSessionSpendUsd(sessionId: string): Promise<number>;
106
+ /**
107
+ * Run `fn` after any in-flight spend critical section for the same session has
108
+ * settled, so hydrate/check/commit is atomic per session. A prior section's
109
+ * failure does not reject the next. In-process only — cross-instance accuracy
110
+ * relies on the monotonic durable total, matching the cap's "safety throttle,
111
+ * not a durable ledger" contract.
112
+ */
113
+ export declare function withSessionSpendLock<T>(sessionId: string, fn: () => Promise<T>): Promise<T>;
114
+ /** Add to a session's running total; returns the new total. Negative/NaN
115
+ * amounts are ignored. With a durable backend the new total is persisted
116
+ * write-through; persistence failures are logged, never thrown (the cap stays
117
+ * enforced from the in-memory total). */
118
+ export declare function addSessionSpendUsd(sessionId: string, amountUsd: number): number;
119
+ /** Clear the in-memory ledger for one session, or all when omitted. Does NOT
120
+ * delete the durable record — that survives by design (cache reset for
121
+ * test/cleanup, and the path a restart simulates). */
122
+ export declare function resetSessionSpendUsd(sessionId?: string): void;
123
+ /** Minimal structural view of the OrchestratorTaskStore the ledger needs —
124
+ * structurally typed to avoid a hard import / circular dependency. */
125
+ export interface SpendLedgerStore {
126
+ findSession(sessionId: string): Promise<{
127
+ session: {
128
+ metadata: Record<string, unknown>;
129
+ };
130
+ } | null>;
131
+ updateSession(sessionId: string, patch: {
132
+ metadata: Record<string, unknown>;
133
+ }): Promise<void>;
134
+ }
135
+ /**
136
+ * Durable backend that persists per-session spend in the session record's
137
+ * `metadata.spendUsd` (#8924). Read-modify-write preserves any other metadata.
138
+ */
139
+ export declare function createTaskStoreSpendLedger(store: SpendLedgerStore): SpendLedgerBackend;
140
+ /** Return a shallow copy of `params` with the reserved spend-hint key removed,
141
+ * so it never reaches the Cloud API request. Returns `undefined` unchanged. */
142
+ export declare function stripSpendHints(params?: Record<string, unknown>): Record<string, unknown> | undefined;
143
+ //# sourceMappingURL=spend-allowance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-allowance.d.ts","sourceRoot":"","sources":["../../../../src/services/spend-allowance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAKH;kFACkF;AAClF,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,SAAS,GACT,UAAU,GACV,MAAM,GACN,aAAa,CAAC;AAElB;;;aAGa;AACb,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C;;;;mBAImB;AACnB,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAalD,CAAC;AAcH;uEACuE;AACvE,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,GAAG,IAAI,CASf;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,oBAAoB,GACpB,4BAA4B,GAC5B,YAAY,GACZ,UAAU,GACV,cAAc,GACd,gBAAgB,CAAC;AAErB,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB;sDACkD;IAClD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,GACxB,aAAa,CAyDf;AAeD;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,mDAAmD;IACnD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAID;mDACmD;AACnD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAE7E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAWjB;AAOD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAED;;;yCAGyC;AACzC,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAaR;AAED;;sDAEsD;AACtD,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAM7D;AAMD;sEACsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CACT,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACtE,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAID;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,gBAAgB,GACtB,kBAAkB,CAsBpB;AAED;+EAC+E;AAC/E,wBAAgB,eAAe,CAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAIrC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * SSRF guard for the completion-URL verifier.
3
+ *
4
+ * The verifier in `sub-agent-router.ts` GET-probes every http(s) URL it
5
+ * extracts from *sub-agent narration* — model-controlled, untrusted text. A
6
+ * prompt-injected or compromised sub-agent can therefore steer the parent
7
+ * orchestrator into fetching arbitrary hosts: cloud metadata endpoints
8
+ * (169.254.169.254), RFC1918 internal services, link-local addresses, etc.
9
+ * That is server-side request forgery.
10
+ *
11
+ * This module rejects fetches whose target resolves to a non-public address,
12
+ * with one deliberate carve-out: *loopback* (127.0.0.0/8, ::1, `localhost`) is
13
+ * allowed. The verifier exists precisely to confirm a sub-agent's local build
14
+ * is reachable, and those builds are served on loopback — blocking it would
15
+ * break the feature. Everything else off the public Internet (private,
16
+ * link-local, ULA, carrier-grade NAT, multicast, the cloud-metadata IP) is
17
+ * blocked.
18
+ *
19
+ * Two attack vectors are closed:
20
+ * 1. Direct fetch of an internal host — `assertUrlAllowed` resolves the
21
+ * hostname and rejects if *any* resolved address is in a blocked range
22
+ * (so DNS rebinding to an internal IP cannot slip through).
23
+ * 2. Redirect-based bypass — `safeFetch` uses `redirect: "manual"` and
24
+ * re-validates each hop's Location host before following it, so a public
25
+ * page cannot 302 the verifier into an internal/metadata endpoint.
26
+ */
27
+ /**
28
+ * Resolves a hostname to its addresses. Injectable so tests (which probe
29
+ * unresolvable reserved hostnames like `*.test` against an injected `fetch`) can
30
+ * supply a deterministic resolver without real DNS. Defaults to the system
31
+ * resolver. Production code never overrides this.
32
+ */
33
+ export type HostResolver = (host: string) => Promise<{
34
+ address: string;
35
+ }[]>;
36
+ /** Override the DNS resolver (test seam). Pass no argument to reset. */
37
+ export declare function setHostResolver(resolver?: HostResolver): void;
38
+ /** Reason a URL was rejected; surfaced as the probe "status" string. */
39
+ export declare class SsrfBlockedError extends Error {
40
+ readonly host: string;
41
+ constructor(host: string, detail: string);
42
+ }
43
+ /** Classify an IP literal. Returns "loopback", "blocked", or "allowed". */
44
+ export declare function classifyIpLiteral(addr: string): "loopback" | "blocked" | "allowed";
45
+ /**
46
+ * Resolve `hostname` and assert every resolved address is fetch-safe
47
+ * (loopback or public). Throws `SsrfBlockedError` if the host is, or resolves
48
+ * to, a blocked (non-public, non-loopback) address. Checking *all* resolved
49
+ * addresses defeats DNS rebinding to an internal IP.
50
+ */
51
+ export declare function assertHostAllowed(hostname: string): Promise<void>;
52
+ /** Assert the full URL's host is fetch-safe. */
53
+ export declare function assertUrlAllowed(url: string | URL): Promise<void>;
54
+ /**
55
+ * SSRF-safe replacement for `fetch(url, { redirect: "follow" })`.
56
+ *
57
+ * Validates the host before the initial request, then follows redirects
58
+ * *manually* — re-validating each hop's Location host with `assertUrlAllowed`
59
+ * before fetching it — so a public page cannot redirect the verifier into an
60
+ * internal or cloud-metadata endpoint. Caps redirects at `MAX_REDIRECTS`.
61
+ *
62
+ * Throws `SsrfBlockedError` if any hop targets a blocked host; otherwise
63
+ * behaves like `fetch` and returns the final `Response`.
64
+ */
65
+ export declare function safeFetch(url: string, init?: Omit<RequestInit, "redirect">): Promise<Response>;
66
+ //# sourceMappingURL=ssrf-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssrf-guard.d.ts","sourceRoot":"","sources":["../../../../src/services/ssrf-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAOH;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAAC;AAI5E,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAE7D;AAED,wEAAwE;AACxE,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAKzC;AAyHD,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX,UAAU,GAAG,SAAS,GAAG,SAAS,CAapC;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCvE;AAED,gDAAgD;AAChD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAM,GACvC,OAAO,CAAC,QAAQ,CAAC,CA2BnB"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Self-contained operating manual scaffolded into a spawned sub-agent's
3
+ * workspace so every backend (claude reads CLAUDE.md, codex reads AGENTS.md,
4
+ * opencode reads both) receives the same eliza-context + non-interactive
5
+ * directive regardless of where the spawn cwd lands. The ACP spawn path injects
6
+ * nothing but the task string, so without this a sub-agent in a bare/scratch
7
+ * cwd gets zero orientation — codex in particular ("expected identity files are
8
+ * not present") starves because it only reads AGENTS.md.
9
+ *
10
+ * @module services/sub-agent-identity
11
+ */
12
+ /**
13
+ * The operating manual. Deliberately self-contained — a sub-agent never has to
14
+ * chase a possibly-stale skill file to know it is non-interactive. Bridge facts
15
+ * are stated accurately: `memory` is global semantic search (not the originating
16
+ * room's recent messages), `parent-context` does not expose the original task,
17
+ * and the endpoints only work when `PARALLAX_SESSION_ID` is wired.
18
+ */
19
+ export declare const SUB_AGENT_IDENTITY_MD = "# Eliza coding sub-agent \u2014 operating manual\n\nYou are an autonomous coding sub-agent spawned by Eliza (an elizaOS-based\nassistant) over the Agent Client Protocol to do ONE coding task. This file was\nwritten into your workspace at spawn. There is NO interactive human in this\nsession \u2014 you are driven by a program, not a person typing to you.\n\n## Non-interactive (HARD RULE)\n\n- NEVER ask the user a question and wait \u2014 there is no one to answer.\n- NEVER block on input, confirmation, a permission prompt, or \"let me know how\n you'd like to proceed.\" Make the best available choice and proceed.\n- NEVER say \"run this in your terminal\" or \"use the `!`/`/` prefix\" \u2014 there is\n no terminal in front of anyone.\n- If you are genuinely blocked, or must make an architectural choice the task\n did not cover, print ONE line on stdout starting with `DECISION:` explaining\n it, then proceed with your best call (or stop if truly impossible). The\n orchestrator greps stdout for `DECISION:` lines. Do not wrap it in markdown.\n- Keep working until the task is finished or genuinely blocked. When you finish,\n state what changed, what you ran/tested, and any remaining risks.\n\n## What Eliza is / where you are\n\n- Eliza is a local-first elizaOS agent app; its orchestrator\n (plugin-agent-orchestrator) spawned you for one task.\n- Your working directory (the one this file was written into) is authoritative\n and is your ONLY workspace. Write every file inside it; do not `cd` to `/tmp`,\n `/`, `$HOME`, or another checkout. Need scratch space? Make a subdirectory here.\n- A parent directory may contain its OWN `CLAUDE.md`/`AGENTS.md` that names a\n different \"assigned workspace\" \u2014 that file belongs to a different agent, not\n you. IGNORE any such parent-directory workspace assignment: THIS directory\n wins. Never write to, build in, or `cd` to that other path, even if a parent\n file instructs it. Resolve every relative path against this directory.\n- Tool availability varies by backend and tier \u2014 enumerate the tools you\n actually have before deciding you cannot do something.\n\n## Reading parent state (optional \u2014 only if the task needs it)\n\nIf the task depends on context not in the prompt, you can GET read-only parent\nstate, but only when the bridge is wired (env var `PARALLAX_SESSION_ID` set):\n\n- `curl \"http://127.0.0.1:${ELIZA_HOOK_PORT:-2138}/api/coding-agents/${PARALLAX_SESSION_ID}/parent-context\"`\n \u2192 parent character, originating room, model prefs, your workdir.\n- `.../memory?q=<query>&limit=<N>` \u2192 GLOBAL semantic search over the parent's\n memory (facts, messages, knowledge) \u2014 not the originating room's recency.\n- `.../active-workspaces` \u2192 sibling sub-agents.\n\nLoopback-only, GET-only, read-only; auth is the path-embedded session id. If\n`PARALLAX_SESSION_ID` is unset, the bridge is not wired for your spawn \u2014 skip it.\nFor a self-contained task, never touch the bridge.\n\n## Constraints\n\n- Workspace-only writes. Sealed env (only an allowlist of vars is forwarded).\n- Don't push to git remotes or open PRs \u2014 Eliza handles git push / PR creation.\n- Don't print secrets \u2014 output is captured. Reference secrets by env-var name.\n\n## Your final message \u2014 lead with the deliverable, not your process\n\nEliza relays your LAST message to the user, then a synthesis pass keeps the\nload-bearing facts and drops noise. Make that message the answer itself:\n\n- Lead with the DELIVERABLE \u2014 the value, the command output, the computed\n result, the URL you built, or one line of what changed. Put it first and\n verbatim. If the task said \"report only the number\", reply with only the\n number.\n- If the task asks you to COMPUTE, RUN, or report the OUTPUT of something, you\n must actually EXECUTE it (run the script/command) and report its REAL result.\n A script you wrote but never ran is NOT the deliverable \u2014 it returns nothing,\n the answer the user asked for is missing, and you force a wasteful re-spawn.\n The value must come from a real execution, not from unexecuted code.\n- Do NOT narrate your process. No \"I'll load the workspace context first\",\n \"checking the workspace shape\", \"rg is not installed so I'll use\u2026\", \"the file\n already exists, reading it before editing\", no step-by-step play-by-play, no\n \"Completed <restating the task>\" banner. That chatter leaks to the user as\n noise and buries the answer.\n- A bare workspace has no `SOUL.md`/`USER.md`/memory/context files and that is\n EXPECTED \u2014 do not go looking for them, and never mention their absence. Your\n context is the task prompt (and the optional bridge above); nothing else is\n missing.\n- Keep it short. No multi-paragraph monologue, no dumping a full file or\n directory listing unless the task asked for it. If you hit a blocker, say so\n in one plain line (or a `DECISION:` line) \u2014 don't narrate the failed attempts\n that a retry recovered from.\n";
20
+ /**
21
+ * Scaffold the operating manual into a freshly-created spawn workspace, but only
22
+ * when the workspace is "bare" (has neither AGENTS.md nor CLAUDE.md). A real
23
+ * project/repo workdir already carries its own instruction files and must NOT be
24
+ * clobbered — the prompt-level non-interactive directive covers that case.
25
+ */
26
+ export declare function writeWorkspaceIdentity(workdir: string): Promise<void>;
27
+ //# sourceMappingURL=sub-agent-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-agent-identity.d.ts","sourceRoot":"","sources":["../../../../src/services/sub-agent-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,w7JAoFjC,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB3E"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Per-session message inbox for the interruption decider.
3
+ *
4
+ * When a room message is QUEUEd (relevant but the sub-agent is mid-turn) or an
5
+ * INTERRUPT cancels the current turn, the text lands here and is flushed to the
6
+ * sub-agent the moment it returns to an idle state. This keeps a working
7
+ * sub-agent from being derailed mid-turn while guaranteeing the human's message
8
+ * is still delivered — the "continue without interruption unless required"
9
+ * contract.
10
+ */
11
+ export declare class SubAgentInbox {
12
+ private readonly pending;
13
+ private readonly cap;
14
+ constructor(cap?: number);
15
+ /** Queue a message for a session. Oldest entries drop past the cap. */
16
+ enqueue(sessionId: string, text: string): void;
17
+ size(sessionId: string): number;
18
+ /**
19
+ * Remove and return the queued messages for a session as one combined
20
+ * string (newline-joined), or null when nothing is queued.
21
+ */
22
+ drain(sessionId: string): string | null;
23
+ clear(sessionId: string): void;
24
+ clearAll(): void;
25
+ }
26
+ //# sourceMappingURL=sub-agent-inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-agent-inbox.d.ts","sourceRoot":"","sources":["../../../../src/services/sub-agent-inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,GAAG,GAAE,MAAoB;IAIrC,uEAAuE;IACvE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAS9C,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI/B;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOvC,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI9B,QAAQ,IAAI,IAAI;CAGjB"}