@elizaos/plugin-agent-orchestrator 2.0.3-beta.2 → 2.0.3-beta.4

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 (176) hide show
  1. package/dist/cjs/index.d.ts +2 -0
  2. package/dist/cjs/index.node.cjs +20962 -0
  3. package/dist/cjs/index.node.js.map +82 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/node/index.d.ts +2 -0
  6. package/dist/node/index.d.ts.map +1 -0
  7. package/dist/node/index.node.d.ts +4 -0
  8. package/dist/node/index.node.d.ts.map +1 -0
  9. package/dist/node/index.node.js +20946 -0
  10. package/dist/node/index.node.js.map +82 -0
  11. package/dist/node/src/actions/common.d.ts +114 -0
  12. package/dist/node/src/actions/common.d.ts.map +1 -0
  13. package/dist/node/src/actions/elizaos-capability.d.ts +3 -0
  14. package/dist/node/src/actions/elizaos-capability.d.ts.map +1 -0
  15. package/dist/node/src/actions/sandbox-stub.d.ts +25 -0
  16. package/dist/node/src/actions/sandbox-stub.d.ts.map +1 -0
  17. package/dist/node/src/actions/tasks.d.ts +108 -0
  18. package/dist/node/src/actions/tasks.d.ts.map +1 -0
  19. package/dist/node/src/api/agent-routes.d.ts +18 -0
  20. package/dist/node/src/api/agent-routes.d.ts.map +1 -0
  21. package/dist/node/src/api/bridge-routes.d.ts +70 -0
  22. package/dist/node/src/api/bridge-routes.d.ts.map +1 -0
  23. package/dist/node/src/api/credential-prompt.d.ts +38 -0
  24. package/dist/node/src/api/credential-prompt.d.ts.map +1 -0
  25. package/dist/node/src/api/issue-routes.d.ts +17 -0
  26. package/dist/node/src/api/issue-routes.d.ts.map +1 -0
  27. package/dist/node/src/api/orchestrator-routes.d.ts +25 -0
  28. package/dist/node/src/api/orchestrator-routes.d.ts.map +1 -0
  29. package/dist/node/src/api/parent-context-routes.d.ts +17 -0
  30. package/dist/node/src/api/parent-context-routes.d.ts.map +1 -0
  31. package/dist/node/src/api/route-utils.d.ts +34 -0
  32. package/dist/node/src/api/route-utils.d.ts.map +1 -0
  33. package/dist/node/src/api/routes.d.ts +22 -0
  34. package/dist/node/src/api/routes.d.ts.map +1 -0
  35. package/dist/node/src/api/workspace-routes.d.ts +17 -0
  36. package/dist/node/src/api/workspace-routes.d.ts.map +1 -0
  37. package/dist/node/src/evaluators/sub-agent-completion.d.ts +3 -0
  38. package/dist/node/src/evaluators/sub-agent-completion.d.ts.map +1 -0
  39. package/dist/node/src/index.d.ts +57 -0
  40. package/dist/node/src/index.d.ts.map +1 -0
  41. package/dist/node/src/providers/action-examples.d.ts +14 -0
  42. package/dist/node/src/providers/action-examples.d.ts.map +1 -0
  43. package/dist/node/src/providers/active-sub-agents.d.ts +15 -0
  44. package/dist/node/src/providers/active-sub-agents.d.ts.map +1 -0
  45. package/dist/node/src/providers/active-workspace-context.d.ts +13 -0
  46. package/dist/node/src/providers/active-workspace-context.d.ts.map +1 -0
  47. package/dist/node/src/providers/available-agents.d.ts +4 -0
  48. package/dist/node/src/providers/available-agents.d.ts.map +1 -0
  49. package/dist/node/src/providers/coding-session-changes.d.ts +17 -0
  50. package/dist/node/src/providers/coding-session-changes.d.ts.map +1 -0
  51. package/dist/node/src/register-routes.d.ts +31 -0
  52. package/dist/node/src/register-routes.d.ts.map +1 -0
  53. package/dist/node/src/services/acceptance-criteria.d.ts +84 -0
  54. package/dist/node/src/services/acceptance-criteria.d.ts.map +1 -0
  55. package/dist/node/src/services/acp-native-transport.d.ts +111 -0
  56. package/dist/node/src/services/acp-native-transport.d.ts.map +1 -0
  57. package/dist/node/src/services/acp-service.d.ts +226 -0
  58. package/dist/node/src/services/acp-service.d.ts.map +1 -0
  59. package/dist/node/src/services/active-session-forward.d.ts +31 -0
  60. package/dist/node/src/services/active-session-forward.d.ts.map +1 -0
  61. package/dist/node/src/services/agent-name-assignment.d.ts +50 -0
  62. package/dist/node/src/services/agent-name-assignment.d.ts.map +1 -0
  63. package/dist/node/src/services/ansi-utils.d.ts +64 -0
  64. package/dist/node/src/services/ansi-utils.d.ts.map +1 -0
  65. package/dist/node/src/services/app-deploy-guidance.d.ts +52 -0
  66. package/dist/node/src/services/app-deploy-guidance.d.ts.map +1 -0
  67. package/dist/node/src/services/audit.d.ts +18 -0
  68. package/dist/node/src/services/audit.d.ts.map +1 -0
  69. package/dist/node/src/services/coding-account-selection.d.ts +79 -0
  70. package/dist/node/src/services/coding-account-selection.d.ts.map +1 -0
  71. package/dist/node/src/services/completion-envelope.d.ts +63 -0
  72. package/dist/node/src/services/completion-envelope.d.ts.map +1 -0
  73. package/dist/node/src/services/completion-evidence.d.ts +144 -0
  74. package/dist/node/src/services/completion-evidence.d.ts.map +1 -0
  75. package/dist/node/src/services/config-env.d.ts +27 -0
  76. package/dist/node/src/services/config-env.d.ts.map +1 -0
  77. package/dist/node/src/services/goal-contract.d.ts +25 -0
  78. package/dist/node/src/services/goal-contract.d.ts.map +1 -0
  79. package/dist/node/src/services/goal-llm-verifier.d.ts +157 -0
  80. package/dist/node/src/services/goal-llm-verifier.d.ts.map +1 -0
  81. package/dist/node/src/services/goal-prompt.d.ts +82 -0
  82. package/dist/node/src/services/goal-prompt.d.ts.map +1 -0
  83. package/dist/node/src/services/independent-verifier.d.ts +58 -0
  84. package/dist/node/src/services/independent-verifier.d.ts.map +1 -0
  85. package/dist/node/src/services/interruption-decider.d.ts +43 -0
  86. package/dist/node/src/services/interruption-decider.d.ts.map +1 -0
  87. package/dist/node/src/services/json-model-output.d.ts +2 -0
  88. package/dist/node/src/services/json-model-output.d.ts.map +1 -0
  89. package/dist/node/src/services/opencode-config.d.ts +21 -0
  90. package/dist/node/src/services/opencode-config.d.ts.map +1 -0
  91. package/dist/node/src/services/orchestrator-device-support-matrix.d.ts +46 -0
  92. package/dist/node/src/services/orchestrator-device-support-matrix.d.ts.map +1 -0
  93. package/dist/node/src/services/orchestrator-task-mapper.d.ts +192 -0
  94. package/dist/node/src/services/orchestrator-task-mapper.d.ts.map +1 -0
  95. package/dist/node/src/services/orchestrator-task-service.d.ts +370 -0
  96. package/dist/node/src/services/orchestrator-task-service.d.ts.map +1 -0
  97. package/dist/node/src/services/orchestrator-task-store.d.ts +156 -0
  98. package/dist/node/src/services/orchestrator-task-store.d.ts.map +1 -0
  99. package/dist/node/src/services/orchestrator-task-types.d.ts +334 -0
  100. package/dist/node/src/services/orchestrator-task-types.d.ts.map +1 -0
  101. package/dist/node/src/services/parent-agent-broker.d.ts +23 -0
  102. package/dist/node/src/services/parent-agent-broker.d.ts.map +1 -0
  103. package/dist/node/src/services/parent-agent-dispatch.d.ts +62 -0
  104. package/dist/node/src/services/parent-agent-dispatch.d.ts.map +1 -0
  105. package/dist/node/src/services/repo-input.d.ts +16 -0
  106. package/dist/node/src/services/repo-input.d.ts.map +1 -0
  107. package/dist/node/src/services/screenshot-delivery.d.ts +38 -0
  108. package/dist/node/src/services/screenshot-delivery.d.ts.map +1 -0
  109. package/dist/node/src/services/session-event-queue.d.ts +18 -0
  110. package/dist/node/src/services/session-event-queue.d.ts.map +1 -0
  111. package/dist/node/src/services/session-store.d.ts +108 -0
  112. package/dist/node/src/services/session-store.d.ts.map +1 -0
  113. package/dist/node/src/services/skill-lifeops-context-broker.d.ts +20 -0
  114. package/dist/node/src/services/skill-lifeops-context-broker.d.ts.map +1 -0
  115. package/dist/node/src/services/skill-manifest.d.ts +48 -0
  116. package/dist/node/src/services/skill-manifest.d.ts.map +1 -0
  117. package/dist/node/src/services/skill-recommender.d.ts +53 -0
  118. package/dist/node/src/services/skill-recommender.d.ts.map +1 -0
  119. package/dist/node/src/services/smithers-task-executor.d.ts +73 -0
  120. package/dist/node/src/services/smithers-task-executor.d.ts.map +1 -0
  121. package/dist/node/src/services/smithers-task-integration.d.ts +52 -0
  122. package/dist/node/src/services/smithers-task-integration.d.ts.map +1 -0
  123. package/dist/node/src/services/smithers-task-runner.d.ts +27 -0
  124. package/dist/node/src/services/smithers-task-runner.d.ts.map +1 -0
  125. package/dist/node/src/services/smithers-task-types.d.ts +96 -0
  126. package/dist/node/src/services/smithers-task-types.d.ts.map +1 -0
  127. package/dist/node/src/services/spawn-trajectory.d.ts +23 -0
  128. package/dist/node/src/services/spawn-trajectory.d.ts.map +1 -0
  129. package/dist/node/src/services/spend-allowance.d.ts +143 -0
  130. package/dist/node/src/services/spend-allowance.d.ts.map +1 -0
  131. package/dist/node/src/services/ssrf-guard.d.ts +66 -0
  132. package/dist/node/src/services/ssrf-guard.d.ts.map +1 -0
  133. package/dist/node/src/services/sub-agent-identity.d.ts +27 -0
  134. package/dist/node/src/services/sub-agent-identity.d.ts.map +1 -0
  135. package/dist/node/src/services/sub-agent-inbox.d.ts +26 -0
  136. package/dist/node/src/services/sub-agent-inbox.d.ts.map +1 -0
  137. package/dist/node/src/services/sub-agent-router.d.ts +178 -0
  138. package/dist/node/src/services/sub-agent-router.d.ts.map +1 -0
  139. package/dist/node/src/services/task-agent-frameworks.d.ts +103 -0
  140. package/dist/node/src/services/task-agent-frameworks.d.ts.map +1 -0
  141. package/dist/node/src/services/task-agent-routing.d.ts +33 -0
  142. package/dist/node/src/services/task-agent-routing.d.ts.map +1 -0
  143. package/dist/node/src/services/task-policy.d.ts +17 -0
  144. package/dist/node/src/services/task-policy.d.ts.map +1 -0
  145. package/dist/node/src/services/task-supervisor-service.d.ts +65 -0
  146. package/dist/node/src/services/task-supervisor-service.d.ts.map +1 -0
  147. package/dist/node/src/services/task-watchdog-service.d.ts +50 -0
  148. package/dist/node/src/services/task-watchdog-service.d.ts.map +1 -0
  149. package/dist/node/src/services/terminal-capabilities.d.ts +48 -0
  150. package/dist/node/src/services/terminal-capabilities.d.ts.map +1 -0
  151. package/dist/node/src/services/trajectory-context.d.ts +69 -0
  152. package/dist/node/src/services/trajectory-context.d.ts.map +1 -0
  153. package/dist/node/src/services/trajectory-feedback.d.ts +53 -0
  154. package/dist/node/src/services/trajectory-feedback.d.ts.map +1 -0
  155. package/dist/node/src/services/types.d.ts +188 -0
  156. package/dist/node/src/services/types.d.ts.map +1 -0
  157. package/dist/node/src/services/view-deploy-guidance.d.ts +14 -0
  158. package/dist/node/src/services/view-deploy-guidance.d.ts.map +1 -0
  159. package/dist/node/src/services/workdir-validation.d.ts +10 -0
  160. package/dist/node/src/services/workdir-validation.d.ts.map +1 -0
  161. package/dist/node/src/services/workspace-diff.d.ts +50 -0
  162. package/dist/node/src/services/workspace-diff.d.ts.map +1 -0
  163. package/dist/node/src/services/workspace-git-ops.d.ts +28 -0
  164. package/dist/node/src/services/workspace-git-ops.d.ts.map +1 -0
  165. package/dist/node/src/services/workspace-github.d.ts +60 -0
  166. package/dist/node/src/services/workspace-github.d.ts.map +1 -0
  167. package/dist/node/src/services/workspace-lifecycle.d.ts +5 -0
  168. package/dist/node/src/services/workspace-lifecycle.d.ts.map +1 -0
  169. package/dist/node/src/services/workspace-service.d.ts +126 -0
  170. package/dist/node/src/services/workspace-service.d.ts.map +1 -0
  171. package/dist/node/src/services/workspace-types.d.ts +81 -0
  172. package/dist/node/src/services/workspace-types.d.ts.map +1 -0
  173. package/dist/node/src/setup-routes.d.ts +9 -0
  174. package/dist/node/src/setup-routes.d.ts.map +1 -0
  175. package/docs/multi-account-orchestration.md +1 -1
  176. package/package.json +7 -4
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Orchestrator task service.
3
+ *
4
+ * Bridges ephemeral ACP sub-agent sessions to the durable
5
+ * {@link OrchestratorTaskStore} and owns the task lifecycle the
6
+ * `/api/orchestrator/*` routes expose. Two responsibilities:
7
+ *
8
+ * 1. **Event bridge.** Subscribes to {@link AcpService} session events and
9
+ * records them against the owning task — status, tool activity, messages,
10
+ * token usage. A sub-agent's `task_complete` moves the task to `validating`,
11
+ * never straight to `done`; promotion to `done` requires an explicit
12
+ * {@link OrchestratorTaskService.validateTask} call.
13
+ * 2. **Lifecycle API.** Create / list / inspect / update / pause / resume /
14
+ * archive / reopen / delete / fork tasks, spawn and steer sub-agents through
15
+ * the mandatory goal wrapper, and aggregate cross-task status.
16
+ *
17
+ * @module services/orchestrator-task-service
18
+ */
19
+ import { type IAgentRuntime, Service } from "@elizaos/core";
20
+ import { type GoalFollowUpReason } from "./goal-prompt.js";
21
+ import { type TaskEventDto, type TaskMessageDto, type TaskPlanRevisionDto, type TaskThreadDetailDto, type TaskThreadDto, type TaskTimelineItemDto } from "./orchestrator-task-mapper.js";
22
+ import { OrchestratorTaskStore } from "./orchestrator-task-store.js";
23
+ import { type CreateTaskInput, type OrchestratorAccountOverview, type OrchestratorRoomRosterOverview, type OrchestratorTaskRecord, type OrchestratorTaskStatus, type TaskListFilter, type TaskMessageDirection, type TaskMessageSenderKind, type TaskUsageSummary } from "./orchestrator-task-types.js";
24
+ import type { ApprovalPreset } from "./types.js";
25
+ /**
26
+ * Recoverable operator-recovery conflict.
27
+ *
28
+ * Thrown by the recovery methods (createPlanRevision / retry / rerun / restart)
29
+ * when the requested recovery cannot proceed against the current task state
30
+ * (missing plan revision, missing source message/event, no/terminal session,
31
+ * unsupported destructive rerun). The orchestrator recovery routes map this
32
+ * class to HTTP 409, so the status code is decoupled from the message wording —
33
+ * callers must not regex-match the message to derive the status.
34
+ */
35
+ export declare class RecoveryConflictError extends Error {
36
+ constructor(message: string);
37
+ }
38
+ type RuntimeLike = IAgentRuntime & {
39
+ logger?: Partial<Record<"debug" | "info" | "warn" | "error", (message: string, data?: unknown) => void>>;
40
+ databaseAdapter?: unknown;
41
+ getSetting?: (key: string) => string | undefined | null;
42
+ };
43
+ export interface SpawnAgentForTaskOptions {
44
+ framework?: string;
45
+ providerSource?: string;
46
+ model?: string;
47
+ workdir?: string;
48
+ repo?: string;
49
+ label?: string;
50
+ /** Concrete first instruction; defaults to the task goal. */
51
+ task?: string;
52
+ approvalPreset?: ApprovalPreset;
53
+ /**
54
+ * Recursion depth for nested spawns. 0 (default) = spawned by the main agent;
55
+ * a sub-agent spawning its own child passes parentDepth + 1. Enforced against
56
+ * the max-nesting-depth cap so self-spawning can't run away.
57
+ */
58
+ nestingDepth?: number;
59
+ }
60
+ export interface AddMessageInput {
61
+ content: string;
62
+ senderKind: TaskMessageSenderKind;
63
+ sessionId?: string;
64
+ direction?: TaskMessageDirection;
65
+ metadata?: Record<string, unknown>;
66
+ }
67
+ export interface RetryTaskTurnInput {
68
+ messageId?: string;
69
+ sessionId?: string;
70
+ instruction?: string;
71
+ planRevisionId?: string;
72
+ mode?: "same-session" | "new-session";
73
+ agent?: SpawnAgentForTaskOptions;
74
+ }
75
+ export interface RerunFromEventInput {
76
+ eventId: string;
77
+ instruction?: string;
78
+ planRevisionId?: string;
79
+ stopActive?: boolean;
80
+ preserveHistory?: boolean;
81
+ agent?: SpawnAgentForTaskOptions;
82
+ }
83
+ export interface RestartTaskInput {
84
+ instruction?: string;
85
+ planRevisionId?: string;
86
+ stopActive?: boolean;
87
+ agent?: SpawnAgentForTaskOptions;
88
+ }
89
+ export interface CreatePlanRevisionInput {
90
+ plan: Record<string, unknown>;
91
+ basePlanRevisionId?: string;
92
+ editSummary?: string;
93
+ createdBy?: string;
94
+ metadata?: Record<string, unknown>;
95
+ makeCurrent?: boolean;
96
+ }
97
+ export interface RestartWithEditedPlanInput extends RestartTaskInput {
98
+ plan: Record<string, unknown>;
99
+ basePlanRevisionId?: string;
100
+ editSummary?: string;
101
+ }
102
+ export interface PageResult<T> {
103
+ items: T[];
104
+ nextCursor: string | null;
105
+ }
106
+ export interface OrchestratorStatus {
107
+ taskCount: number;
108
+ activeTaskCount: number;
109
+ pausedTaskCount: number;
110
+ blockedTaskCount: number;
111
+ validatingTaskCount: number;
112
+ sessionCount: number;
113
+ activeSessionCount: number;
114
+ usage: TaskUsageSummary;
115
+ byStatus: Record<OrchestratorTaskStatus, number>;
116
+ }
117
+ export declare class OrchestratorTaskService extends Service {
118
+ static serviceType: string;
119
+ capabilityDescription: string;
120
+ protected readonly runtime: RuntimeLike;
121
+ private readonly store;
122
+ private readonly sessionTaskIndex;
123
+ private readonly autoVerifyInFlight;
124
+ private unsubscribe;
125
+ private started;
126
+ constructor(runtime: IAgentRuntime, opts?: {
127
+ store?: OrchestratorTaskStore;
128
+ });
129
+ static start(runtime: IAgentRuntime): Promise<OrchestratorTaskService>;
130
+ start(): Promise<void>;
131
+ private subscribeToAcp;
132
+ private bindToAcpWhenReady;
133
+ stop(): Promise<void>;
134
+ private readonly changeListeners;
135
+ /** Subscribe to change pings for a task. Returns an unsubscribe function. */
136
+ subscribeTaskChanges(taskId: string, listener: () => void): () => void;
137
+ private emitChange;
138
+ private onSessionEvent;
139
+ private applySessionEvent;
140
+ /**
141
+ * Mirror the real git change set a sub-agent produced into the durable task
142
+ * store session record's metadata, so the existing `/api/orchestrator/tasks/:id`
143
+ * detail route serves it (`TaskSessionDto.metadata.lastChangeSet`) and the
144
+ * task view can render a read-only diff without a new endpoint.
145
+ *
146
+ * Source of truth is the change set the router captured onto the LIVE ACP
147
+ * session metadata at `task_complete`. Because the router's capture and this
148
+ * event-bridge handler run on the same ACP event with no guaranteed ordering,
149
+ * fall back to capturing it here from the same session-scoped signals (spawn
150
+ * baseline + agent-written tool paths) when the ACP write hasn't landed yet.
151
+ *
152
+ * Additive and null-safe: when there is no change set (unchanged completion,
153
+ * non-git workdir), nothing is written and the DTO simply omits it.
154
+ */
155
+ private mirrorChangeSetToStore;
156
+ /**
157
+ * Assemble the rich, sectioned completion-evidence string the auto
158
+ * goal-verifier grills against, from data the orchestrator already has —
159
+ * instead of feeding it only the thin `task_complete` event summary.
160
+ *
161
+ * Sections (each omitted when absent):
162
+ * - **CHANGESET** — the real git diff captured at completion (the same
163
+ * {@link WorkspaceChangeSet} the CODING_SESSION_CHANGES provider renders),
164
+ * read from the live ACP session or, failing that, the mirrored store
165
+ * session metadata;
166
+ * - **DELIVERABLE / FINAL REPLY** — the sub-agent's completion summary
167
+ * (its reported result) and any longer captured `sub_agent` reply recorded
168
+ * in the task room;
169
+ * - **VERIFIED URLS** — reachable URLs mined from the completion summary and
170
+ * recorded sub-agent messages (loopback-flagged so the verifier can reject
171
+ * localhost-only "deploys");
172
+ * - **TEST / BUILD / TYPECHECK OUTPUT** — lines that look like build/test
173
+ * output, mined from the durable event/message log of this session;
174
+ * - **ARTIFACTS** — screenshot/trajectory artifact references on the task or
175
+ * its session metadata.
176
+ *
177
+ * Fire-and-forget safety: this runs on the `task_complete` event-write path,
178
+ * so it must NEVER throw. Any failure falls back to the bare summary, which is
179
+ * exactly the prior behavior.
180
+ */
181
+ private buildCompletionEvidence;
182
+ /**
183
+ * Assemble the TYPED {@link CompletionEvidenceBundle} from data the
184
+ * orchestrator already has (issue #8894). Each field resolves from a named
185
+ * source:
186
+ * - `summary` — the `task_complete` response (fallback);
187
+ * - `diffSummary` — the real git change set captured at completion, via the
188
+ * same {@link readLastChangeSet} mechanism the CODING_SESSION_CHANGES path
189
+ * and `mirrorChangeSetToStore` use, rendered with {@link renderChangeSetBody};
190
+ * - `toolOutput` — test/build/lint stdout mined from recorded `tool_running`
191
+ * events (and sub-agent messages) and classified by {@link classifyToolOutput};
192
+ * - `verifiedUrls` — URLs probed at completion (session/task `subAgentVerifiedUrls`
193
+ * metadata plus URLs mined from the summary and sub-agent replies);
194
+ * - `screenshots` — screenshot artifact paths on the task/session.
195
+ *
196
+ * Pure with respect to throwing: returns at least the summary on any error.
197
+ */
198
+ private collectEvidenceBundle;
199
+ /** Build per-tool evidence signals from recorded `tool_running`/`tool_result`
200
+ * events: the signal text is the tool's captured stdout, and the source label
201
+ * carries the command/title so {@link classifyToolOutput} can class it. */
202
+ private extractToolSignals;
203
+ /** URLs the router stamped as verified onto the task or session metadata
204
+ * (`subAgentVerifiedUrls`), separate from URLs mined out of free text. */
205
+ private metadataVerifiedUrls;
206
+ /**
207
+ * Write the completion-evidence bundle as a single appended JSONL line and
208
+ * record the artifact path on a task event so a reviewer can re-read exactly
209
+ * what the verifier judged.
210
+ *
211
+ * Fire-and-forget: invoked with `void` from {@link buildCompletionEvidence},
212
+ * so every IO step is wrapped — a failure logs and continues without throwing
213
+ * into the `task_complete` event path. The path is already stamped on the
214
+ * bundle by the caller, so a write failure only means the artifact never lands;
215
+ * the evidence string still cites the (intended) path.
216
+ */
217
+ private writeEvidenceTrajectory;
218
+ /** The completion-evidence trajectory file path: a `completion-evidence.jsonl`
219
+ * under the live session workdir's `.eliza/trajectories`, else a `~/.eliza`-
220
+ * scoped per-task dir when no workspace is available. Deterministic so it can
221
+ * be cited in the evidence before the file is actually written. */
222
+ private resolveTrajectoryPath;
223
+ /** The git change set for a completed session: prefer the live ACP session
224
+ * metadata (freshest), fall back to the mirrored store-session metadata. */
225
+ private resolveCompletionChangeSet;
226
+ /** Screenshot / trajectory / other artifact references for the verifier to
227
+ * cite, from the durable artifact rows plus any artifact paths stamped on
228
+ * the task or its session metadata. */
229
+ private collectArtifactRefs;
230
+ /**
231
+ * Advance a non-terminal task to `next`, but never override a status the
232
+ * operator or validation owns. `validating`/`waiting_on_user`/`blocked` are
233
+ * not stomped by a later `active`, and terminal tasks are immutable here.
234
+ */
235
+ private advanceTaskStatus;
236
+ private markSessionAccountUnhealthy;
237
+ private recordUsage;
238
+ private recordMessage;
239
+ private resolveTaskId;
240
+ createTask(input: CreateTaskInput): Promise<TaskThreadDetailDto>;
241
+ /**
242
+ * When a task is created WITHOUT acceptance criteria and with a non-trivial
243
+ * goal, populate 3-5 measurable default criteria so the auto goal-verifier
244
+ * (#8896) always has something to grill against instead of fast-pathing to
245
+ * pass / parking forever in `validating`.
246
+ *
247
+ * - **No-op when criteria were supplied** — the caller's contract wins; the
248
+ * input is returned unchanged.
249
+ * - **Gated** behind `ELIZA_REQUIRE_GOAL_CONTRACT` (default ON; `"0"`
250
+ * disables), mirroring {@link shouldAutoVerifyGoal}.
251
+ * - **Defensive** — {@link generateDefaultAcceptanceCriteria} never throws;
252
+ * on any model failure it returns the static template set, so task creation
253
+ * can never be broken by criteria generation.
254
+ */
255
+ private withDefaultAcceptanceCriteria;
256
+ /** Map an explicit `kind` on the create input to a task type when it lines up
257
+ * with a known template type, so the caller's stated kind beats keyword
258
+ * detection; otherwise let {@link detectTaskType} read the goal text. */
259
+ private taskTypeHintFor;
260
+ listTasks(filter?: TaskListFilter): Promise<TaskThreadDto[]>;
261
+ getTask(taskId: string): Promise<TaskThreadDetailDto | null>;
262
+ /**
263
+ * Resolve the originating chat target for a task — the room + connector source
264
+ * it was created from — so proactive surfaces (the TaskSupervisorService
265
+ * digest, #8900) can post back to where the user is. The origin `source` is
266
+ * read from the task record metadata stamped at create time. Returns null when
267
+ * the task has no origin room (e.g. an API-created task with no chat).
268
+ */
269
+ getTaskOriginTarget(taskId: string): Promise<{
270
+ roomId: string;
271
+ source: string;
272
+ worldId?: string;
273
+ } | null>;
274
+ updateTask(taskId: string, patch: Partial<Pick<OrchestratorTaskRecord, "title" | "goal" | "summary" | "acceptanceCriteria" | "priority" | "currentPlan" | "providerPolicy" | "metadata">>): Promise<TaskThreadDetailDto | null>;
275
+ pauseTask(taskId: string): Promise<TaskThreadDetailDto | null>;
276
+ resumeTask(taskId: string): Promise<TaskThreadDetailDto | null>;
277
+ archiveTask(taskId: string): Promise<TaskThreadDetailDto | null>;
278
+ reopenTask(taskId: string): Promise<TaskThreadDetailDto | null>;
279
+ deleteTask(taskId: string): Promise<boolean>;
280
+ forkTask(taskId: string, overrides?: Partial<CreateTaskInput>): Promise<TaskThreadDetailDto | null>;
281
+ /** Promote a `validating` task to `done` (proof passed) or back to `active`
282
+ * (proof failed → retry). The orchestrator never reports `done` without this. */
283
+ validateTask(taskId: string, result: {
284
+ passed: boolean;
285
+ summary?: string;
286
+ evidence?: string;
287
+ verifier?: string;
288
+ humanOverride?: boolean;
289
+ }): Promise<TaskThreadDetailDto | null>;
290
+ /**
291
+ * Automatically judge a freshly-`validating` task against its acceptance
292
+ * criteria (issue #8124): the orchestrator should always behave like `/goal`,
293
+ * confirming the sub-agent met every criterion before reporting done.
294
+ *
295
+ * Behavior:
296
+ * - **Gated.** No-op when {@link shouldAutoVerifyGoal} is off, when the task
297
+ * has no acceptance criteria (so a criteria-free task incurs zero model
298
+ * spend and behaves exactly as before), or when the task is no longer
299
+ * `validating` (e.g. a human already validated it).
300
+ * - **Small model only.** Delegates to {@link verifyGoalCompletion}, which
301
+ * uses `ModelType.TEXT_SMALL`.
302
+ * - **Pass →** forwards a passing verdict to {@link validateTask} (task → done).
303
+ * - **Fail, under cap →** sends a corrective follow-up to the active sub-agent
304
+ * citing the unmet criteria (task returns to `active` via `sendToTaskAgent`),
305
+ * and increments the per-task attempt counter.
306
+ * - **Fail, cap reached →** stops looping and parks the task on
307
+ * `waiting_on_user` for a human, instead of re-prompting forever.
308
+ *
309
+ * Fire-and-forget from the event bridge: failures here must never break the
310
+ * session-event write path, so everything is wrapped and logged.
311
+ */
312
+ private autoVerifyCompletion;
313
+ addMessage(taskId: string, input: AddMessageInput): Promise<boolean>;
314
+ /**
315
+ * Record a user turn in the task room and relay it to every live sub-agent
316
+ * as a goal-wrapped follow-up. This is the composer's entry point: talking to
317
+ * the room steers the workers attached to it. Terminal sessions are skipped;
318
+ * the message is still recorded so the room history stays complete.
319
+ */
320
+ postUserMessage(taskId: string, content: string): Promise<{
321
+ recorded: boolean;
322
+ forwardedTo: string[];
323
+ failedTo: Array<{
324
+ sessionId: string;
325
+ error: string;
326
+ }>;
327
+ } | null>;
328
+ createPlanRevision(taskId: string, input: CreatePlanRevisionInput): Promise<TaskPlanRevisionDto | null>;
329
+ listPlanRevisions(taskId: string, opts?: {
330
+ limit?: number;
331
+ cursor?: string;
332
+ }): Promise<PageResult<TaskPlanRevisionDto> | null>;
333
+ retryTaskTurn(taskId: string, input?: RetryTaskTurnInput): Promise<TaskThreadDetailDto | null>;
334
+ rerunFromEvent(taskId: string, input: RerunFromEventInput): Promise<TaskThreadDetailDto | null>;
335
+ restartTask(taskId: string, input?: RestartTaskInput): Promise<TaskThreadDetailDto | null>;
336
+ restartWithEditedPlan(taskId: string, input: RestartWithEditedPlanInput): Promise<TaskThreadDetailDto | null>;
337
+ listMessages(taskId: string, opts?: {
338
+ limit?: number;
339
+ cursor?: string;
340
+ }): Promise<PageResult<TaskMessageDto> | null>;
341
+ listEvents(taskId: string, opts?: {
342
+ limit?: number;
343
+ cursor?: string;
344
+ }): Promise<PageResult<TaskEventDto> | null>;
345
+ listTimeline(taskId: string, opts?: {
346
+ limit?: number;
347
+ cursor?: string;
348
+ }): Promise<PageResult<TaskTimelineItemDto> | null>;
349
+ getUsage(taskId: string): Promise<TaskUsageSummary | null>;
350
+ spawnAgentForTask(taskId: string, opts?: SpawnAgentForTaskOptions): Promise<TaskThreadDetailDto | null>;
351
+ sendToTaskAgent(taskId: string, sessionId: string, message: string, reason?: GoalFollowUpReason): Promise<boolean>;
352
+ stopTaskAgent(taskId: string, sessionId: string): Promise<boolean>;
353
+ getStatus(): Promise<OrchestratorStatus>;
354
+ getAccountOverview(): Promise<OrchestratorAccountOverview>;
355
+ /**
356
+ * Per-room participant roster: groups live sessions by their task room and
357
+ * lists the orchestrator + owning user + each sub-agent (with its pooled
358
+ * account). The accounts overview is a flat global map; this is the
359
+ * room-scoped view the task-room sidebar renders. Only rooms with at least
360
+ * one sub-agent session are included (an empty room has no roster to show).
361
+ */
362
+ getRoomRoster(): Promise<OrchestratorRoomRosterOverview>;
363
+ pauseAll(): Promise<number>;
364
+ resumeAll(): Promise<number>;
365
+ private stopActiveSessions;
366
+ private acp;
367
+ private log;
368
+ }
369
+ export {};
370
+ //# sourceMappingURL=orchestrator-task-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-task-service.d.ts","sourceRoot":"","sources":["../../../../src/services/orchestrator-task-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Durable orchestrator task store.
3
+ *
4
+ * Persists one {@link OrchestratorTaskDocument} per task across three
5
+ * backends, picked in the same order as the ACP session store: a runtime SQL
6
+ * adapter when present, else a JSON file, else memory. The document model
7
+ * keeps each task's sessions / events / messages / usage / artifacts /
8
+ * decisions inline so a detail read is a single lookup.
9
+ *
10
+ * @module services/orchestrator-task-store
11
+ */
12
+ import type { CreateTaskInput, OrchestratorTaskArtifact, OrchestratorTaskDecision, OrchestratorTaskDocument, OrchestratorTaskEvent, OrchestratorTaskMessage, OrchestratorTaskPlanRevision, OrchestratorTaskRecord, OrchestratorTaskSession, OrchestratorTaskUsage, TaskListFilter } from "./orchestrator-task-types.js";
13
+ export type TaskStoreBackend = "runtime-db" | "file" | "memory";
14
+ interface Logger {
15
+ warn?: (message: string, ...args: unknown[]) => void;
16
+ error?: (message: string, ...args: unknown[]) => void;
17
+ info?: (message: string, ...args: unknown[]) => void;
18
+ debug?: (message: string, ...args: unknown[]) => void;
19
+ }
20
+ interface TaskStoreRuntime {
21
+ databaseAdapter?: unknown;
22
+ logger?: Logger;
23
+ getSetting?: (key: string) => string | undefined;
24
+ }
25
+ type SqlDatabaseAdapter = {
26
+ query?: (sql: string, params?: unknown[]) => Promise<unknown> | unknown;
27
+ execute?: (sql: string, params?: unknown[]) => Promise<unknown> | unknown;
28
+ run?: (sql: string, params?: unknown[]) => Promise<unknown> | unknown;
29
+ all?: (sql: string, params?: unknown[]) => Promise<unknown[]> | unknown[];
30
+ get?: (sql: string, params?: unknown[]) => Promise<unknown> | unknown;
31
+ select?: (sql: string, params?: unknown[]) => Promise<unknown[]> | unknown[];
32
+ };
33
+ /**
34
+ * In-memory backend. The file backend extends this with JSON persistence; the
35
+ * SQL backend reimplements the same surface against a runtime adapter.
36
+ */
37
+ export declare class InMemoryTaskStore {
38
+ protected readonly docs: Map<string, OrchestratorTaskDocument>;
39
+ private tail;
40
+ protected enqueue<T>(operation: () => Promise<T> | T): Promise<T>;
41
+ createTask(input: CreateTaskInput): Promise<OrchestratorTaskDocument>;
42
+ getTask(id: string): Promise<OrchestratorTaskDocument | null>;
43
+ listTasks(filter?: TaskListFilter): Promise<OrchestratorTaskRecord[]>;
44
+ updateTask(id: string, patch: Partial<OrchestratorTaskRecord>): Promise<OrchestratorTaskRecord | null>;
45
+ deleteTask(id: string): Promise<boolean>;
46
+ addSession(session: OrchestratorTaskSession): Promise<void>;
47
+ updateSession(sessionId: string, patch: Partial<OrchestratorTaskSession>): Promise<void>;
48
+ findSession(sessionId: string): Promise<{
49
+ taskId: string;
50
+ session: OrchestratorTaskSession;
51
+ } | null>;
52
+ addEvent(event: OrchestratorTaskEvent): Promise<void>;
53
+ addMessage(message: OrchestratorTaskMessage): Promise<void>;
54
+ addUsage(usage: OrchestratorTaskUsage): Promise<void>;
55
+ addArtifact(artifact: OrchestratorTaskArtifact): Promise<void>;
56
+ addDecision(decision: OrchestratorTaskDecision): Promise<void>;
57
+ addPlanRevision(revision: OrchestratorTaskPlanRevision): Promise<void>;
58
+ private appendChild;
59
+ protected afterWrite(): Promise<void>;
60
+ /** Replace the in-memory doc set from a durable source. Public so the SQL
61
+ * backend can seed this store as a single-document mutation engine. */
62
+ hydrate(docs: OrchestratorTaskDocument[]): void;
63
+ }
64
+ export declare class FileTaskStore extends InMemoryTaskStore {
65
+ private readonly filePath;
66
+ private readonly logger?;
67
+ private readonly lockFile;
68
+ private loaded;
69
+ constructor(filePath: string, logger?: Logger | undefined);
70
+ private ensureLoaded;
71
+ createTask(input: CreateTaskInput): Promise<OrchestratorTaskDocument>;
72
+ getTask(id: string): Promise<OrchestratorTaskDocument | null>;
73
+ listTasks(filter?: TaskListFilter): Promise<OrchestratorTaskRecord[]>;
74
+ updateTask(id: string, patch: Partial<OrchestratorTaskRecord>): Promise<OrchestratorTaskRecord | null>;
75
+ deleteTask(id: string): Promise<boolean>;
76
+ addSession(session: OrchestratorTaskSession): Promise<void>;
77
+ updateSession(sessionId: string, patch: Partial<OrchestratorTaskSession>): Promise<void>;
78
+ findSession(sessionId: string): Promise<{
79
+ taskId: string;
80
+ session: OrchestratorTaskSession;
81
+ } | null>;
82
+ addEvent(event: OrchestratorTaskEvent): Promise<void>;
83
+ addMessage(message: OrchestratorTaskMessage): Promise<void>;
84
+ addUsage(usage: OrchestratorTaskUsage): Promise<void>;
85
+ addArtifact(artifact: OrchestratorTaskArtifact): Promise<void>;
86
+ addDecision(decision: OrchestratorTaskDecision): Promise<void>;
87
+ addPlanRevision(revision: OrchestratorTaskPlanRevision): Promise<void>;
88
+ protected afterWrite(): Promise<void>;
89
+ private withLock;
90
+ private removeStaleLock;
91
+ }
92
+ /** SQL backend. Stores the whole document as a JSON column with indexed
93
+ * columns for the list query, so all reads/writes are single-row operations. */
94
+ export declare class RuntimeDbTaskStore {
95
+ private readonly adapter;
96
+ private readonly cache;
97
+ private initPromise;
98
+ private tail;
99
+ constructor(adapter: SqlDatabaseAdapter);
100
+ private enqueue;
101
+ private ensureInitialized;
102
+ private exec;
103
+ private rows;
104
+ private parseDoc;
105
+ private persist;
106
+ private loadOne;
107
+ createTask(input: CreateTaskInput): Promise<OrchestratorTaskDocument>;
108
+ getTask(id: string): Promise<OrchestratorTaskDocument | null>;
109
+ listTasks(filter?: TaskListFilter): Promise<OrchestratorTaskRecord[]>;
110
+ /** Run a mutation against the freshest stored document, then persist it. */
111
+ private mutate;
112
+ updateTask(id: string, patch: Partial<OrchestratorTaskRecord>): Promise<OrchestratorTaskRecord | null>;
113
+ deleteTask(id: string): Promise<boolean>;
114
+ addSession(session: OrchestratorTaskSession): Promise<void>;
115
+ updateSession(sessionId: string, patch: Partial<OrchestratorTaskSession>): Promise<void>;
116
+ findSession(sessionId: string): Promise<{
117
+ taskId: string;
118
+ session: OrchestratorTaskSession;
119
+ } | null>;
120
+ addEvent(event: OrchestratorTaskEvent): Promise<void>;
121
+ addMessage(message: OrchestratorTaskMessage): Promise<void>;
122
+ addUsage(usage: OrchestratorTaskUsage): Promise<void>;
123
+ addArtifact(artifact: OrchestratorTaskArtifact): Promise<void>;
124
+ addDecision(decision: OrchestratorTaskDecision): Promise<void>;
125
+ addPlanRevision(revision: OrchestratorTaskPlanRevision): Promise<void>;
126
+ }
127
+ export interface OrchestratorTaskStoreOptions {
128
+ runtime?: TaskStoreRuntime;
129
+ stateFile?: string;
130
+ backend?: TaskStoreBackend;
131
+ }
132
+ /** Backend-selecting facade. Mirrors `AcpSessionStore`'s selection order. */
133
+ export declare class OrchestratorTaskStore {
134
+ readonly backend: TaskStoreBackend;
135
+ private readonly delegate;
136
+ constructor(options?: OrchestratorTaskStoreOptions);
137
+ createTask(input: CreateTaskInput): Promise<OrchestratorTaskDocument>;
138
+ getTask(id: string): Promise<OrchestratorTaskDocument | null>;
139
+ listTasks(filter?: TaskListFilter): Promise<OrchestratorTaskRecord[]>;
140
+ updateTask(id: string, patch: Partial<OrchestratorTaskRecord>): Promise<OrchestratorTaskRecord | null>;
141
+ deleteTask(id: string): Promise<boolean>;
142
+ addSession(session: OrchestratorTaskSession): Promise<void>;
143
+ updateSession(sessionId: string, patch: Partial<OrchestratorTaskSession>): Promise<void>;
144
+ findSession(sessionId: string): Promise<{
145
+ taskId: string;
146
+ session: OrchestratorTaskSession;
147
+ } | null>;
148
+ addEvent(event: OrchestratorTaskEvent): Promise<void>;
149
+ addMessage(message: OrchestratorTaskMessage): Promise<void>;
150
+ addUsage(usage: OrchestratorTaskUsage): Promise<void>;
151
+ addArtifact(artifact: OrchestratorTaskArtifact): Promise<void>;
152
+ addDecision(decision: OrchestratorTaskDecision): Promise<void>;
153
+ addPlanRevision(revision: OrchestratorTaskPlanRevision): Promise<void>;
154
+ }
155
+ export {};
156
+ //# sourceMappingURL=orchestrator-task-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-task-store.d.ts","sourceRoot":"","sources":["../../../../src/services/orchestrator-task-store.ts"],"names":[],"mappings":"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"}