@jterrats/open-orchestra 1.0.8 → 1.0.10

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 (188) hide show
  1. package/AGENTS.md +15 -2
  2. package/CLAUDE.md +16 -2
  3. package/dist/acceptance-criteria-quality.d.ts +12 -0
  4. package/dist/acceptance-criteria-quality.js +137 -0
  5. package/dist/acceptance-criteria-quality.js.map +1 -0
  6. package/dist/architecture-debt-inventory.d.ts +31 -0
  7. package/dist/architecture-debt-inventory.js +200 -0
  8. package/dist/architecture-debt-inventory.js.map +1 -0
  9. package/dist/architecture-debt-report.d.ts +2 -0
  10. package/dist/architecture-debt-report.js +28 -0
  11. package/dist/architecture-debt-report.js.map +1 -0
  12. package/dist/autonomous-phase-lifecycle.d.ts +5 -1
  13. package/dist/autonomous-phase-lifecycle.js +87 -17
  14. package/dist/autonomous-phase-lifecycle.js.map +1 -1
  15. package/dist/autonomous-run-store.js +2 -2
  16. package/dist/autonomous-run-store.js.map +1 -1
  17. package/dist/benchmark.js +2 -1
  18. package/dist/benchmark.js.map +1 -1
  19. package/dist/clarification.js +2 -1
  20. package/dist/clarification.js.map +1 -1
  21. package/dist/cli-payloads.d.ts +4 -0
  22. package/dist/cli-payloads.js +24 -0
  23. package/dist/cli-payloads.js.map +1 -0
  24. package/dist/collaboration-flows.d.ts +1 -2
  25. package/dist/command-manifest.js +18 -5
  26. package/dist/command-manifest.js.map +1 -1
  27. package/dist/command-routes-integrations.js +2 -1
  28. package/dist/command-routes-integrations.js.map +1 -1
  29. package/dist/command-routes.js +3 -1
  30. package/dist/command-routes.js.map +1 -1
  31. package/dist/command-utils.d.ts +1 -2
  32. package/dist/command-utils.js.map +1 -1
  33. package/dist/commands.d.ts +2 -2
  34. package/dist/commands.js +17 -4
  35. package/dist/commands.js.map +1 -1
  36. package/dist/constants.js +1 -0
  37. package/dist/constants.js.map +1 -1
  38. package/dist/cursor-canvas.js +21 -1
  39. package/dist/cursor-canvas.js.map +1 -1
  40. package/dist/cursor-mdc.d.ts +10 -0
  41. package/dist/cursor-mdc.js +37 -0
  42. package/dist/cursor-mdc.js.map +1 -0
  43. package/dist/fs-utils.js +2 -1
  44. package/dist/fs-utils.js.map +1 -1
  45. package/dist/generated-guidance-health.d.ts +33 -0
  46. package/dist/generated-guidance-health.js +125 -0
  47. package/dist/generated-guidance-health.js.map +1 -0
  48. package/dist/github.js +22 -7
  49. package/dist/github.js.map +1 -1
  50. package/dist/health-checks.js +2 -51
  51. package/dist/health-checks.js.map +1 -1
  52. package/dist/id-utils.d.ts +3 -0
  53. package/dist/id-utils.js +11 -0
  54. package/dist/id-utils.js.map +1 -0
  55. package/dist/instruction-blocks.js +20 -5
  56. package/dist/instruction-blocks.js.map +1 -1
  57. package/dist/mcp-oauth-proxy.js +5 -5
  58. package/dist/mcp-oauth-proxy.js.map +1 -1
  59. package/dist/memory-status.js +31 -5
  60. package/dist/memory-status.js.map +1 -1
  61. package/dist/memory.js +31 -7
  62. package/dist/memory.js.map +1 -1
  63. package/dist/metrics-commands.js +69 -17
  64. package/dist/metrics-commands.js.map +1 -1
  65. package/dist/notifications.js +12 -2
  66. package/dist/notifications.js.map +1 -1
  67. package/dist/phase-deterministic-output.d.ts +4 -0
  68. package/dist/phase-deterministic-output.js +62 -0
  69. package/dist/phase-deterministic-output.js.map +1 -0
  70. package/dist/phase-executor.js +9 -172
  71. package/dist/phase-executor.js.map +1 -1
  72. package/dist/phase-playbooks.js +17 -0
  73. package/dist/phase-playbooks.js.map +1 -1
  74. package/dist/provider-utils.js +11 -1
  75. package/dist/provider-utils.js.map +1 -1
  76. package/dist/qa-e2e-artifacts.d.ts +7 -0
  77. package/dist/qa-e2e-artifacts.js +225 -0
  78. package/dist/qa-e2e-artifacts.js.map +1 -0
  79. package/dist/quality-contracts.d.ts +83 -0
  80. package/dist/quality-contracts.js +463 -0
  81. package/dist/quality-contracts.js.map +1 -0
  82. package/dist/refresh-generated.js +81 -28
  83. package/dist/refresh-generated.js.map +1 -1
  84. package/dist/runtime-bootstrap.js +26 -2
  85. package/dist/runtime-bootstrap.js.map +1 -1
  86. package/dist/runtime-commands.d.ts +2 -0
  87. package/dist/runtime-commands.js +190 -1
  88. package/dist/runtime-commands.js.map +1 -1
  89. package/dist/runtime-context-manifest.d.ts +27 -0
  90. package/dist/runtime-context-manifest.js +151 -0
  91. package/dist/runtime-context-manifest.js.map +1 -0
  92. package/dist/runtime-execution-renderer.d.ts +3 -1
  93. package/dist/runtime-execution-renderer.js +7 -1
  94. package/dist/runtime-execution-renderer.js.map +1 -1
  95. package/dist/runtime-execution.d.ts +2 -1
  96. package/dist/runtime-execution.js +191 -2
  97. package/dist/runtime-execution.js.map +1 -1
  98. package/dist/runtime-guardrails.js +5 -1
  99. package/dist/runtime-guardrails.js.map +1 -1
  100. package/dist/runtime-lifecycle-watch-adapters.d.ts +4 -0
  101. package/dist/runtime-lifecycle-watch-adapters.js +87 -0
  102. package/dist/runtime-lifecycle-watch-adapters.js.map +1 -0
  103. package/dist/runtime-lifecycle-watch.d.ts +85 -0
  104. package/dist/runtime-lifecycle-watch.js +312 -0
  105. package/dist/runtime-lifecycle-watch.js.map +1 -0
  106. package/dist/runtime-parent-action-dispatch.d.ts +30 -0
  107. package/dist/runtime-parent-action-dispatch.js +114 -0
  108. package/dist/runtime-parent-action-dispatch.js.map +1 -0
  109. package/dist/runtime-parent-action-eligibility.d.ts +12 -0
  110. package/dist/runtime-parent-action-eligibility.js +131 -0
  111. package/dist/runtime-parent-action-eligibility.js.map +1 -0
  112. package/dist/runtime-parent-actions.d.ts +7 -2
  113. package/dist/runtime-parent-actions.js +145 -1
  114. package/dist/runtime-parent-actions.js.map +1 -1
  115. package/dist/runtime-spawn-bridge.js +21 -1
  116. package/dist/runtime-spawn-bridge.js.map +1 -1
  117. package/dist/skills-validation.js +1 -2
  118. package/dist/skills-validation.js.map +1 -1
  119. package/dist/sonar-commands.d.ts +1 -0
  120. package/dist/sonar-commands.js +36 -0
  121. package/dist/sonar-commands.js.map +1 -1
  122. package/dist/sonar-insights.d.ts +13 -0
  123. package/dist/sonar-insights.js +32 -53
  124. package/dist/sonar-insights.js.map +1 -1
  125. package/dist/sonar-payload-normalizers.d.ts +16 -0
  126. package/dist/sonar-payload-normalizers.js +67 -0
  127. package/dist/sonar-payload-normalizers.js.map +1 -0
  128. package/dist/sonar-preflight.d.ts +26 -0
  129. package/dist/sonar-preflight.js +111 -0
  130. package/dist/sonar-preflight.js.map +1 -0
  131. package/dist/sonar-redaction.d.ts +1 -0
  132. package/dist/sonar-redaction.js +13 -0
  133. package/dist/sonar-redaction.js.map +1 -0
  134. package/dist/subagent-protocol.js.map +1 -1
  135. package/dist/task-graph-commands.js +8 -1
  136. package/dist/task-graph-commands.js.map +1 -1
  137. package/dist/telemetry-redaction.js +31 -2
  138. package/dist/telemetry-redaction.js.map +1 -1
  139. package/dist/types/model-config.d.ts +6 -0
  140. package/dist/types/runtime.d.ts +49 -2
  141. package/dist/types/tasks.d.ts +12 -0
  142. package/dist/types.d.ts +1 -1
  143. package/dist/types.js.map +1 -1
  144. package/dist/web-api.js +8 -0
  145. package/dist/web-api.js.map +1 -1
  146. package/dist/web-artifacts.js +8 -3
  147. package/dist/web-artifacts.js.map +1 -1
  148. package/dist/web-console/assets/index-DA8Fs4r7.js +11 -0
  149. package/dist/web-console/index.html +1 -1
  150. package/dist/workflow-background-subagents.js +8 -4
  151. package/dist/workflow-background-subagents.js.map +1 -1
  152. package/dist/workflow-handoff-assessment.d.ts +3 -0
  153. package/dist/workflow-handoff-assessment.js +246 -0
  154. package/dist/workflow-handoff-assessment.js.map +1 -0
  155. package/dist/workflow-handoff-contract.d.ts +32 -0
  156. package/dist/workflow-handoff-contract.js +123 -0
  157. package/dist/workflow-handoff-contract.js.map +1 -0
  158. package/dist/workflow-phase-transition.d.ts +16 -0
  159. package/dist/workflow-phase-transition.js +76 -0
  160. package/dist/workflow-phase-transition.js.map +1 -0
  161. package/dist/workflow-run-commands.js +79 -18
  162. package/dist/workflow-run-commands.js.map +1 -1
  163. package/dist/workflow-services.js +62 -28
  164. package/dist/workflow-services.js.map +1 -1
  165. package/dist/workspace-init-artifacts.d.ts +9 -0
  166. package/dist/workspace-init-artifacts.js +28 -0
  167. package/dist/workspace-init-artifacts.js.map +1 -1
  168. package/dist/workspace-runtime-bootstrap.d.ts +3 -1
  169. package/dist/workspace-runtime-bootstrap.js +8 -3
  170. package/dist/workspace-runtime-bootstrap.js.map +1 -1
  171. package/dist/workspace.d.ts +5 -2
  172. package/dist/workspace.js +46 -16
  173. package/dist/workspace.js.map +1 -1
  174. package/docs/adoption-guide.md +12 -0
  175. package/docs/architecture-debt-inventory.md +25 -0
  176. package/docs/autonomous-workflow.md +10 -2
  177. package/docs/claude-adapter-qa-matrix.md +56 -0
  178. package/docs/e2e-test-batteries.md +34 -23
  179. package/docs/orchestra-mvp.md +21 -0
  180. package/docs/release-test-matrix.md +22 -0
  181. package/docs/runtime-adapters.md +155 -15
  182. package/docs/sonar-quality-gates.md +240 -11
  183. package/package.json +5 -1
  184. package/rules/delivery-quality-gates.mdc +8 -0
  185. package/rules/devops-tooling.mdc +1 -0
  186. package/rules/security-guardrails.mdc +3 -0
  187. package/rules/testing-discipline.mdc +9 -0
  188. package/dist/web-console/assets/index-CgSKcay8.js +0 -11
@@ -0,0 +1,85 @@
1
+ import { type RuntimeParentActionDispatchResult } from "./runtime-parent-action-dispatch.js";
2
+ import { type RuntimeSpawnLifecycleStatus } from "./runtime-spawn-bridge.js";
3
+ import type { CliIo, RuntimeLifecycleWatcherAdapter } from "./types.js";
4
+ export type RuntimeWatchInspectionStatus = "completed" | "waiting" | "timed_out" | "skipped";
5
+ export interface RuntimeWatchInspection {
6
+ sessionId: string;
7
+ taskId: string;
8
+ runtime?: string;
9
+ phase?: string;
10
+ role?: string;
11
+ status: RuntimeWatchInspectionStatus;
12
+ currentStatus: string;
13
+ artifact?: string;
14
+ reason: string;
15
+ watcher: RuntimeLifecycleWatcherAdapter;
16
+ }
17
+ export interface RuntimeWatchReport {
18
+ generatedAt: string;
19
+ inspected: number;
20
+ transitions: RuntimeWatchInspection[];
21
+ }
22
+ export interface RuntimeParentActionDispatchOptions {
23
+ root: string;
24
+ taskId?: string;
25
+ runtime?: string;
26
+ untilIdle: boolean;
27
+ timeoutMs: number;
28
+ idleTimeoutMs: number;
29
+ intervalMs: number;
30
+ now?: () => number;
31
+ io: CliIo;
32
+ jsonOutput: boolean;
33
+ }
34
+ export interface RuntimeParentActionDispatchReport {
35
+ generatedAt: string;
36
+ mode: "once" | "until-idle";
37
+ taskId?: string;
38
+ runtime?: string;
39
+ attempts: number;
40
+ timeoutMs: number;
41
+ idleTimeoutMs: number;
42
+ intervalMs: number;
43
+ stopReason: "idle" | "timeout" | "once";
44
+ passes: RuntimeParentActionDispatchPass[];
45
+ }
46
+ export interface RuntimeParentActionDispatchPass {
47
+ pass: number;
48
+ actions: RuntimeParentActionDispatchResult[];
49
+ watch: RuntimeWatchReport & {
50
+ applied: RuntimeWatchTransitionApplication[];
51
+ };
52
+ }
53
+ export interface RuntimeWatchTransitionApplication {
54
+ sessionId: string;
55
+ status: string;
56
+ applied: boolean;
57
+ }
58
+ export declare function inspectRuntimeLifecycleWatch({ root, taskId, now, }: {
59
+ root: string;
60
+ taskId?: string;
61
+ now?: number;
62
+ }): Promise<RuntimeWatchReport>;
63
+ export declare function dispatchRuntimeParentActionsUntilIdle({ root, taskId, runtime, untilIdle, timeoutMs, idleTimeoutMs, intervalMs, now, io, jsonOutput, }: RuntimeParentActionDispatchOptions): Promise<RuntimeParentActionDispatchReport>;
64
+ export declare function applyRuntimeWatchTransition(root: string, transition: RuntimeWatchInspection, { io, jsonOutput, }: {
65
+ io: CliIo;
66
+ jsonOutput: boolean;
67
+ }): Promise<RuntimeWatchTransitionApplication>;
68
+ export type RuntimeLifecycleAutoResumeResult = {
69
+ status: "resumed";
70
+ runId: string;
71
+ taskId: string;
72
+ transition: "forward" | "blocked" | "done";
73
+ output: string[];
74
+ } | {
75
+ status: "skipped";
76
+ reason: string;
77
+ };
78
+ export declare function attemptRuntimeLifecycleAutoResume({ root, sessionId, status, disabled, jsonOutput, io, }: {
79
+ root: string;
80
+ sessionId: string;
81
+ status: RuntimeSpawnLifecycleStatus;
82
+ disabled: boolean;
83
+ jsonOutput: boolean;
84
+ io: CliIo;
85
+ }): Promise<RuntimeLifecycleAutoResumeResult>;
@@ -0,0 +1,312 @@
1
+ import { resolveWorkspaceWritePath, exists } from "./fs-utils.js";
2
+ import { normalizeRuntimeDelegationGuardrails, summarizeRuntimeDelegationOperations, } from "./runtime-guardrails.js";
3
+ import { dispatchPendingRuntimeParentActions, } from "./runtime-parent-action-dispatch.js";
4
+ import { resolveRuntimeLifecycleWatcherAdapter } from "./runtime-lifecycle-watch-adapters.js";
5
+ import { recordRuntimeSpawnLifecycle, } from "./runtime-spawn-bridge.js";
6
+ import { listActiveAutonomousRuns, listAutonomousRuns, } from "./autonomous-workflow.js";
7
+ import { readEvents } from "./workspace.js";
8
+ import { getWorkflowConfig } from "./workflow-services.js";
9
+ import { runWorkflowRun } from "./workflow-run-commands.js";
10
+ import { removeUndefined } from "./command-utils.js";
11
+ export async function inspectRuntimeLifecycleWatch({ root, taskId, now = Date.now(), }) {
12
+ const config = await getWorkflowConfig(root);
13
+ const policy = normalizeRuntimeDelegationGuardrails(config.runtimePolicy?.delegation?.guardrails);
14
+ const events = await readEvents(root);
15
+ const report = summarizeRuntimeDelegationOperations({
16
+ policy,
17
+ events,
18
+ includeClosed: true,
19
+ now,
20
+ ...(taskId ? { taskId } : {}),
21
+ });
22
+ const active = report.sessions.filter((session) => session.active);
23
+ const transitions = await Promise.all(active.map((session) => inspectSession({
24
+ root,
25
+ session,
26
+ now,
27
+ timeoutMs: policy.timeoutMs,
28
+ ...optionalExpectedArtifact(expectedResultArtifact(events, session.sessionId)),
29
+ })));
30
+ return {
31
+ generatedAt: new Date(now).toISOString(),
32
+ inspected: active.length,
33
+ transitions,
34
+ };
35
+ }
36
+ export async function dispatchRuntimeParentActionsUntilIdle({ root, taskId, runtime, untilIdle, timeoutMs, idleTimeoutMs, intervalMs, now = Date.now, io, jsonOutput, }) {
37
+ const startedAt = now();
38
+ let lastProgressAt = startedAt;
39
+ let attempts = 0;
40
+ let stopReason = untilIdle
41
+ ? "idle"
42
+ : "once";
43
+ const passes = [];
44
+ while (true) {
45
+ attempts += 1;
46
+ const pass = await dispatchRuntimeParentActionPass(removeUndefined({
47
+ root,
48
+ taskId,
49
+ runtime,
50
+ now,
51
+ io,
52
+ jsonOutput,
53
+ passNumber: attempts,
54
+ }));
55
+ passes.push(pass);
56
+ if (runtimeDispatchPassMadeProgress(pass)) {
57
+ lastProgressAt = now();
58
+ }
59
+ if (!untilIdle) {
60
+ break;
61
+ }
62
+ const nextStopReason = runtimeDispatchStopReason({
63
+ now: now(),
64
+ startedAt,
65
+ lastProgressAt,
66
+ timeoutMs,
67
+ idleTimeoutMs,
68
+ });
69
+ if (nextStopReason) {
70
+ stopReason = nextStopReason;
71
+ break;
72
+ }
73
+ await sleep(Math.max(1, intervalMs));
74
+ }
75
+ return {
76
+ generatedAt: new Date(now()).toISOString(),
77
+ mode: untilIdle ? "until-idle" : "once",
78
+ ...(taskId ? { taskId } : {}),
79
+ ...(runtime ? { runtime } : {}),
80
+ attempts,
81
+ timeoutMs,
82
+ idleTimeoutMs,
83
+ intervalMs,
84
+ stopReason,
85
+ passes,
86
+ };
87
+ }
88
+ export async function applyRuntimeWatchTransition(root, transition, { io, jsonOutput, }) {
89
+ const lifecycleStatus = transition.status === "timed_out" ? "timed_out" : "completed";
90
+ const event = await recordRuntimeSpawnLifecycle({
91
+ root,
92
+ sessionId: transition.sessionId,
93
+ status: lifecycleStatus,
94
+ spawnedAgentId: `watcher:${transition.sessionId}`,
95
+ ...(transition.artifact ? { artifact: transition.artifact } : {}),
96
+ summary: `Runtime watch ${lifecycleStatus}: ${transition.reason}`,
97
+ });
98
+ if (lifecycleStatus === "completed") {
99
+ await attemptRuntimeLifecycleAutoResume({
100
+ root,
101
+ sessionId: transition.sessionId,
102
+ status: "completed",
103
+ disabled: false,
104
+ jsonOutput,
105
+ io,
106
+ });
107
+ }
108
+ return { sessionId: transition.sessionId, status: event.type, applied: true };
109
+ }
110
+ export async function attemptRuntimeLifecycleAutoResume({ root, sessionId, status, disabled, jsonOutput, io, }) {
111
+ if (disabled) {
112
+ return { status: "skipped", reason: "disabled by --no-auto-resume" };
113
+ }
114
+ if (status !== "completed" && status !== "closed") {
115
+ return {
116
+ status: "skipped",
117
+ reason: `lifecycle status ${status} does not auto-resume workflow`,
118
+ };
119
+ }
120
+ const run = await findPausedRunForRuntimeSession(root, sessionId);
121
+ if (!run) {
122
+ return {
123
+ status: "skipped",
124
+ reason: "no paused workflow run is waiting on this runtime session",
125
+ };
126
+ }
127
+ const resumeOutput = [];
128
+ const resumeIo = jsonOutput
129
+ ? { log: (line) => resumeOutput.push(line) }
130
+ : io;
131
+ await runWorkflowRun(removeUndefined({
132
+ task: run.taskId,
133
+ resume: run.id,
134
+ "phase-execution": run.phaseExecutionMode ?? "auto",
135
+ json: jsonOutput,
136
+ }), resumeIo, root);
137
+ const resumed = await findRunById(root, run.id);
138
+ return {
139
+ status: "resumed",
140
+ runId: run.id,
141
+ taskId: run.taskId,
142
+ transition: workflowResumeTransition(resumed),
143
+ output: resumeOutput,
144
+ };
145
+ }
146
+ async function dispatchRuntimeParentActionPass({ root, taskId, runtime, now, io, jsonOutput, passNumber, }) {
147
+ const actionResults = await dispatchPendingParentActions(removeUndefined({
148
+ root,
149
+ taskId,
150
+ runtime,
151
+ }));
152
+ const watch = await inspectRuntimeLifecycleWatch({
153
+ root,
154
+ ...(taskId ? { taskId } : {}),
155
+ now: now(),
156
+ });
157
+ const applied = await applyRuntimeWatchTransitions({
158
+ root,
159
+ transitions: watch.transitions,
160
+ io,
161
+ jsonOutput,
162
+ });
163
+ return {
164
+ pass: passNumber,
165
+ actions: actionResults,
166
+ watch: { ...watch, applied },
167
+ };
168
+ }
169
+ async function dispatchPendingParentActions({ root, taskId, runtime, }) {
170
+ return dispatchPendingRuntimeParentActions(removeUndefined({ root, taskId, runtime }));
171
+ }
172
+ async function applyRuntimeWatchTransitions({ root, transitions, io, jsonOutput, }) {
173
+ const applied = [];
174
+ for (const transition of transitions) {
175
+ if (!isTerminalWatchTransition(transition)) {
176
+ continue;
177
+ }
178
+ applied.push(await applyRuntimeWatchTransition(root, transition, {
179
+ io,
180
+ jsonOutput,
181
+ }));
182
+ }
183
+ return applied;
184
+ }
185
+ function isTerminalWatchTransition(transition) {
186
+ return transition.status === "completed" || transition.status === "timed_out";
187
+ }
188
+ function runtimeDispatchPassMadeProgress({ actions, watch, }) {
189
+ return (actions.some((result) => result.status === "dispatched") ||
190
+ watch.applied.length > 0);
191
+ }
192
+ function runtimeDispatchStopReason({ now, startedAt, lastProgressAt, timeoutMs, idleTimeoutMs, }) {
193
+ if (timeoutMs > 0 && now - startedAt >= timeoutMs) {
194
+ return "timeout";
195
+ }
196
+ if (now - lastProgressAt >= idleTimeoutMs) {
197
+ return "idle";
198
+ }
199
+ return undefined;
200
+ }
201
+ function workflowResumeTransition(run) {
202
+ if (run?.status === "done") {
203
+ return "done";
204
+ }
205
+ if (run?.status === "paused") {
206
+ return "blocked";
207
+ }
208
+ return "forward";
209
+ }
210
+ async function inspectSession({ root, session, now, timeoutMs, expectedArtifact, }) {
211
+ const base = {
212
+ sessionId: session.sessionId,
213
+ taskId: session.taskId,
214
+ ...(session.runtime ? { runtime: session.runtime } : {}),
215
+ ...(session.phase ? { phase: session.phase } : {}),
216
+ ...(session.role ? { role: session.role } : {}),
217
+ currentStatus: session.status,
218
+ watcher: resolveRuntimeLifecycleWatcherAdapter(session.runtime),
219
+ };
220
+ if (session.status === "requested") {
221
+ return {
222
+ ...base,
223
+ status: "waiting",
224
+ reason: "session is requested but has not been spawned",
225
+ };
226
+ }
227
+ if (session.status === "queued" || session.status === "suspended") {
228
+ return {
229
+ ...base,
230
+ status: "skipped",
231
+ reason: `session status ${session.status} is not watchable`,
232
+ };
233
+ }
234
+ const ageMs = Math.max(0, now - Date.parse(session.updatedAt));
235
+ if (ageMs > timeoutMs) {
236
+ return {
237
+ ...base,
238
+ status: "timed_out",
239
+ reason: `session exceeded timeout ${timeoutMs}ms`,
240
+ };
241
+ }
242
+ if (!expectedArtifact) {
243
+ return {
244
+ ...base,
245
+ status: "waiting",
246
+ reason: "no expected result artifact is known yet",
247
+ };
248
+ }
249
+ if (!isSafeHandoffArtifact(expectedArtifact)) {
250
+ return {
251
+ ...base,
252
+ status: "skipped",
253
+ artifact: expectedArtifact,
254
+ reason: "expected artifact is not a safe workflow handoff path",
255
+ };
256
+ }
257
+ if (await exists(resolveWorkspaceWritePath(root, expectedArtifact))) {
258
+ return {
259
+ ...base,
260
+ status: "completed",
261
+ artifact: expectedArtifact,
262
+ reason: "expected handoff artifact exists",
263
+ };
264
+ }
265
+ return {
266
+ ...base,
267
+ status: "waiting",
268
+ artifact: expectedArtifact,
269
+ reason: "expected handoff artifact is not present yet",
270
+ };
271
+ }
272
+ function expectedResultArtifact(events, sessionId) {
273
+ for (const event of [...events].sort((left, right) => right.timestamp.localeCompare(left.timestamp))) {
274
+ if (event.metadata.sessionId !== sessionId)
275
+ continue;
276
+ const direct = event.metadata.expectedResultArtifact;
277
+ if (typeof direct === "string")
278
+ return direct;
279
+ const action = event.metadata.parentRuntimeAction;
280
+ if (!action || typeof action !== "object")
281
+ continue;
282
+ const payload = action.payload;
283
+ if (!payload || typeof payload !== "object")
284
+ continue;
285
+ const artifact = payload
286
+ .expectedResultArtifact;
287
+ if (typeof artifact === "string")
288
+ return artifact;
289
+ }
290
+ return undefined;
291
+ }
292
+ function isSafeHandoffArtifact(artifact) {
293
+ return (artifact.startsWith(".agent-workflow/handoffs/") && !artifact.includes(".."));
294
+ }
295
+ function optionalExpectedArtifact(expectedArtifact) {
296
+ return expectedArtifact ? { expectedArtifact } : {};
297
+ }
298
+ async function findPausedRunForRuntimeSession(root, sessionId) {
299
+ return (await listActiveAutonomousRuns(root)).find((run) => run.status === "paused" &&
300
+ run.phases.some((phase) => phase.status === "blocked" &&
301
+ phase.executor?.executor === "runtime-native-subagent" &&
302
+ phase.executor.sessionId === sessionId));
303
+ }
304
+ async function findRunById(root, runId) {
305
+ return (await listAutonomousRuns(root)).find((run) => run.id === runId);
306
+ }
307
+ function sleep(ms) {
308
+ return new Promise((resolve) => {
309
+ setTimeout(resolve, ms);
310
+ });
311
+ }
312
+ //# sourceMappingURL=runtime-lifecycle-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-lifecycle-watch.js","sourceRoot":"","sources":["../src/runtime-lifecycle-watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { PendingRuntimeParentAction, RuntimeParentActionEligibility } from "./types.js";
2
+ export interface RuntimeParentActionDispatchFallback {
3
+ summary: string;
4
+ guidance: string;
5
+ lifecycleCommands: PendingRuntimeParentAction["action"]["lifecycleCommands"];
6
+ promptArtifact: string;
7
+ expectedResultArtifact: string;
8
+ }
9
+ export interface RuntimeParentActionDispatchResult {
10
+ sessionId: string;
11
+ taskId: string;
12
+ runtime: string;
13
+ phase: string;
14
+ role: string;
15
+ status: "dispatched" | "skipped";
16
+ reason: string;
17
+ eligibility: RuntimeParentActionEligibility;
18
+ agentId?: string;
19
+ fallback?: RuntimeParentActionDispatchFallback;
20
+ }
21
+ export declare function dispatchPendingRuntimeParentActions({ root, taskId, runtime, }: {
22
+ root: string;
23
+ taskId?: string;
24
+ runtime?: string;
25
+ }): Promise<RuntimeParentActionDispatchResult[]>;
26
+ export declare function dispatchRuntimeParentAction({ root, action, runtime, }: {
27
+ root: string;
28
+ action: PendingRuntimeParentAction;
29
+ runtime?: string;
30
+ }): Promise<RuntimeParentActionDispatchResult>;
@@ -0,0 +1,114 @@
1
+ import { getRuntimeExecutionAdapter } from "./runtime-adapters.js";
2
+ import { normalizeRuntimeDelegationGuardrails, summarizeRuntimeDelegationOperations, } from "./runtime-guardrails.js";
3
+ import { listPendingRuntimeParentActions } from "./runtime-parent-actions.js";
4
+ import { evaluateRuntimeParentActionEligibility, runtimeParentActionLegacyRationale, } from "./runtime-parent-action-eligibility.js";
5
+ import { recordRuntimeSpawnLifecycle } from "./runtime-spawn-bridge.js";
6
+ import { readEvents } from "./workspace.js";
7
+ import { getWorkflowConfig } from "./workflow-services.js";
8
+ import { removeUndefined } from "./command-utils.js";
9
+ export async function dispatchPendingRuntimeParentActions({ root, taskId, runtime, }) {
10
+ const actions = listPendingRuntimeParentActions({
11
+ events: await readEvents(root),
12
+ ...(taskId ? { taskId } : {}),
13
+ });
14
+ return Promise.all(actions.map((action) => dispatchRuntimeParentAction(removeUndefined({ root, action, runtime }))));
15
+ }
16
+ export async function dispatchRuntimeParentAction({ root, action, runtime, }) {
17
+ const base = runtimeParentActionDispatchBase(action);
18
+ const sessions = await runtimeSessions(root, action.taskId);
19
+ const session = sessions.find((candidate) => candidate.sessionId === action.sessionId);
20
+ const eligibility = evaluateRuntimeParentActionEligibility({
21
+ action,
22
+ adapter: safeRuntimeAdapter(action.runtime),
23
+ ...(runtime ? { runtimeFilter: runtime } : {}),
24
+ ...(session ? { session } : {}),
25
+ safetyState: session ? "safe" : "unknown",
26
+ });
27
+ if (!eligibility.dispatchable) {
28
+ return {
29
+ ...base,
30
+ status: "skipped",
31
+ reason: runtimeParentActionDispatchReason(eligibility),
32
+ eligibility,
33
+ fallback: runtimeParentActionFallback(action, eligibility),
34
+ };
35
+ }
36
+ const agentId = runtimeParentActionAgentId(action);
37
+ await recordRuntimeSpawnLifecycle({
38
+ root,
39
+ sessionId: action.sessionId,
40
+ status: "spawned",
41
+ spawnedAgentId: agentId,
42
+ summary: `Runtime parent action dispatched: ${action.action.kind}`,
43
+ });
44
+ if (action.action.kind === "claude-agent-request") {
45
+ await recordRuntimeSpawnLifecycle({
46
+ root,
47
+ sessionId: action.sessionId,
48
+ status: "active",
49
+ spawnedAgentId: agentId,
50
+ summary: `Runtime parent action active: ${action.action.kind}`,
51
+ });
52
+ }
53
+ return {
54
+ ...base,
55
+ status: "dispatched",
56
+ agentId,
57
+ reason: `dispatched ${action.action.kind} through active parent runtime`,
58
+ eligibility,
59
+ };
60
+ }
61
+ function runtimeParentActionDispatchBase(action) {
62
+ return {
63
+ sessionId: action.sessionId,
64
+ taskId: action.taskId,
65
+ runtime: action.runtime,
66
+ phase: action.phase,
67
+ role: action.role,
68
+ };
69
+ }
70
+ function runtimeParentActionAgentId(action) {
71
+ if (action.action.kind === "claude-agent-request") {
72
+ return `claude-code-agent:${deterministicSessionLabel(action.sessionId)}`;
73
+ }
74
+ return `dispatcher:${action.sessionId}`;
75
+ }
76
+ function deterministicSessionLabel(sessionId) {
77
+ return sessionId.replace(/[^a-zA-Z0-9._-]+/g, "-");
78
+ }
79
+ function runtimeParentActionDispatchReason(eligibility) {
80
+ const queued = eligibility.reasons.find((reason) => reason.code === "queued");
81
+ if (queued) {
82
+ return queued.message;
83
+ }
84
+ const runtimeMismatch = eligibility.reasons.find((reason) => reason.code === "runtime-mismatch");
85
+ return (runtimeMismatch?.message ?? runtimeParentActionLegacyRationale(eligibility));
86
+ }
87
+ function runtimeParentActionFallback(action, eligibility) {
88
+ return {
89
+ summary: runtimeParentActionLegacyRationale(eligibility),
90
+ guidance: "Inspect the prompt artifact, launch the active parent runtime's native subagent tool manually when supported, then record lifecycle with the provided commands. Do not call provider APIs from Orchestra.",
91
+ lifecycleCommands: action.action.lifecycleCommands,
92
+ promptArtifact: action.action.payload.promptArtifact,
93
+ expectedResultArtifact: action.action.payload.expectedResultArtifact,
94
+ };
95
+ }
96
+ async function runtimeSessions(root, taskId) {
97
+ const config = await getWorkflowConfig(root);
98
+ const policy = normalizeRuntimeDelegationGuardrails(config.runtimePolicy?.delegation?.guardrails);
99
+ return summarizeRuntimeDelegationOperations({
100
+ policy,
101
+ events: await readEvents(root),
102
+ taskId,
103
+ includeClosed: true,
104
+ }).sessions;
105
+ }
106
+ function safeRuntimeAdapter(runtime) {
107
+ try {
108
+ return getRuntimeExecutionAdapter(runtime);
109
+ }
110
+ catch {
111
+ return undefined;
112
+ }
113
+ }
114
+ //# sourceMappingURL=runtime-parent-action-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-parent-action-dispatch.js","sourceRoot":"","sources":["../src/runtime-parent-action-dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { PendingRuntimeParentAction, RuntimeDelegationSessionSummary, RuntimeExecutionAdapter, RuntimeParentActionEligibility, RuntimeParentActionSafetyState } from "./types.js";
2
+ export interface RuntimeParentActionEligibilityInput {
3
+ action: RuntimeParentActionEligibilityCandidate;
4
+ adapter?: RuntimeExecutionAdapter | undefined;
5
+ runtimeFilter?: string | undefined;
6
+ session?: RuntimeDelegationSessionSummary | undefined;
7
+ safetyState?: RuntimeParentActionSafetyState;
8
+ isLatestAction?: boolean;
9
+ }
10
+ export type RuntimeParentActionEligibilityCandidate = Omit<PendingRuntimeParentAction, "actionable" | "rationale" | "eligibility"> & Partial<Pick<PendingRuntimeParentAction, "actionable" | "rationale" | "eligibility">>;
11
+ export declare function evaluateRuntimeParentActionEligibility({ action, adapter, runtimeFilter, session, safetyState, isLatestAction, }: RuntimeParentActionEligibilityInput): RuntimeParentActionEligibility;
12
+ export declare function runtimeParentActionLegacyRationale(eligibility: RuntimeParentActionEligibility): string;