@principles/pd-cli 1.73.0

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 (298) hide show
  1. package/README.md +90 -0
  2. package/dist/commands/artifact.d.ts +14 -0
  3. package/dist/commands/artifact.d.ts.map +1 -0
  4. package/dist/commands/artifact.js +67 -0
  5. package/dist/commands/artifact.js.map +1 -0
  6. package/dist/commands/candidate.d.ts +83 -0
  7. package/dist/commands/candidate.d.ts.map +1 -0
  8. package/dist/commands/candidate.js +891 -0
  9. package/dist/commands/candidate.js.map +1 -0
  10. package/dist/commands/central-sync.d.ts +10 -0
  11. package/dist/commands/central-sync.d.ts.map +1 -0
  12. package/dist/commands/central-sync.js +32 -0
  13. package/dist/commands/central-sync.js.map +1 -0
  14. package/dist/commands/console.d.ts +9 -0
  15. package/dist/commands/console.d.ts.map +1 -0
  16. package/dist/commands/console.js +114 -0
  17. package/dist/commands/console.js.map +1 -0
  18. package/dist/commands/context.d.ts +7 -0
  19. package/dist/commands/context.d.ts.map +1 -0
  20. package/dist/commands/context.js +55 -0
  21. package/dist/commands/context.js.map +1 -0
  22. package/dist/commands/demo-story-a.d.ts +12 -0
  23. package/dist/commands/demo-story-a.d.ts.map +1 -0
  24. package/dist/commands/demo-story-a.js +175 -0
  25. package/dist/commands/demo-story-a.js.map +1 -0
  26. package/dist/commands/diagnose.d.ts +35 -0
  27. package/dist/commands/diagnose.d.ts.map +1 -0
  28. package/dist/commands/diagnose.js +390 -0
  29. package/dist/commands/diagnose.js.map +1 -0
  30. package/dist/commands/evolution-tasks-list.d.ts +15 -0
  31. package/dist/commands/evolution-tasks-list.d.ts.map +1 -0
  32. package/dist/commands/evolution-tasks-list.js +34 -0
  33. package/dist/commands/evolution-tasks-list.js.map +1 -0
  34. package/dist/commands/evolution-tasks-show.d.ts +14 -0
  35. package/dist/commands/evolution-tasks-show.d.ts.map +1 -0
  36. package/dist/commands/evolution-tasks-show.js +52 -0
  37. package/dist/commands/evolution-tasks-show.js.map +1 -0
  38. package/dist/commands/flow.d.ts +7 -0
  39. package/dist/commands/flow.d.ts.map +1 -0
  40. package/dist/commands/flow.js +57 -0
  41. package/dist/commands/flow.js.map +1 -0
  42. package/dist/commands/health.d.ts +16 -0
  43. package/dist/commands/health.d.ts.map +1 -0
  44. package/dist/commands/health.js +150 -0
  45. package/dist/commands/health.js.map +1 -0
  46. package/dist/commands/history.d.ts +11 -0
  47. package/dist/commands/history.d.ts.map +1 -0
  48. package/dist/commands/history.js +50 -0
  49. package/dist/commands/history.js.map +1 -0
  50. package/dist/commands/legacy-cleanup.d.ts +27 -0
  51. package/dist/commands/legacy-cleanup.d.ts.map +1 -0
  52. package/dist/commands/legacy-cleanup.js +171 -0
  53. package/dist/commands/legacy-cleanup.js.map +1 -0
  54. package/dist/commands/legacy-import.d.ts +7 -0
  55. package/dist/commands/legacy-import.d.ts.map +1 -0
  56. package/dist/commands/legacy-import.js +86 -0
  57. package/dist/commands/legacy-import.js.map +1 -0
  58. package/dist/commands/pain-record.d.ts +10 -0
  59. package/dist/commands/pain-record.d.ts.map +1 -0
  60. package/dist/commands/pain-record.js +162 -0
  61. package/dist/commands/pain-record.js.map +1 -0
  62. package/dist/commands/proven-channel-baseline.d.ts +12 -0
  63. package/dist/commands/proven-channel-baseline.d.ts.map +1 -0
  64. package/dist/commands/proven-channel-baseline.js +97 -0
  65. package/dist/commands/proven-channel-baseline.js.map +1 -0
  66. package/dist/commands/remediation-output.d.ts +40 -0
  67. package/dist/commands/remediation-output.d.ts.map +1 -0
  68. package/dist/commands/remediation-output.js +23 -0
  69. package/dist/commands/remediation-output.js.map +1 -0
  70. package/dist/commands/run.d.ts +10 -0
  71. package/dist/commands/run.d.ts.map +1 -0
  72. package/dist/commands/run.js +68 -0
  73. package/dist/commands/run.js.map +1 -0
  74. package/dist/commands/runtime-activation.d.ts +11 -0
  75. package/dist/commands/runtime-activation.d.ts.map +1 -0
  76. package/dist/commands/runtime-activation.js +150 -0
  77. package/dist/commands/runtime-activation.js.map +1 -0
  78. package/dist/commands/runtime-canary.d.ts +30 -0
  79. package/dist/commands/runtime-canary.d.ts.map +1 -0
  80. package/dist/commands/runtime-canary.js +343 -0
  81. package/dist/commands/runtime-canary.js.map +1 -0
  82. package/dist/commands/runtime-diagnostics-export.d.ts +20 -0
  83. package/dist/commands/runtime-diagnostics-export.d.ts.map +1 -0
  84. package/dist/commands/runtime-diagnostics-export.js +177 -0
  85. package/dist/commands/runtime-diagnostics-export.js.map +1 -0
  86. package/dist/commands/runtime-features.d.ts +26 -0
  87. package/dist/commands/runtime-features.d.ts.map +1 -0
  88. package/dist/commands/runtime-features.js +70 -0
  89. package/dist/commands/runtime-features.js.map +1 -0
  90. package/dist/commands/runtime-gfi-snapshot.d.ts +7 -0
  91. package/dist/commands/runtime-gfi-snapshot.d.ts.map +1 -0
  92. package/dist/commands/runtime-gfi-snapshot.js +101 -0
  93. package/dist/commands/runtime-gfi-snapshot.js.map +1 -0
  94. package/dist/commands/runtime-health-snapshot.d.ts +7 -0
  95. package/dist/commands/runtime-health-snapshot.d.ts.map +1 -0
  96. package/dist/commands/runtime-health-snapshot.js +93 -0
  97. package/dist/commands/runtime-health-snapshot.js.map +1 -0
  98. package/dist/commands/runtime-idle-trigger.d.ts +12 -0
  99. package/dist/commands/runtime-idle-trigger.d.ts.map +1 -0
  100. package/dist/commands/runtime-idle-trigger.js +102 -0
  101. package/dist/commands/runtime-idle-trigger.js.map +1 -0
  102. package/dist/commands/runtime-internalization-enqueue-successors.d.ts +9 -0
  103. package/dist/commands/runtime-internalization-enqueue-successors.d.ts.map +1 -0
  104. package/dist/commands/runtime-internalization-enqueue-successors.js +393 -0
  105. package/dist/commands/runtime-internalization-enqueue-successors.js.map +1 -0
  106. package/dist/commands/runtime-internalization-integrity-repair.d.ts +9 -0
  107. package/dist/commands/runtime-internalization-integrity-repair.d.ts.map +1 -0
  108. package/dist/commands/runtime-internalization-integrity-repair.js +54 -0
  109. package/dist/commands/runtime-internalization-integrity-repair.js.map +1 -0
  110. package/dist/commands/runtime-internalization-integrity.d.ts +7 -0
  111. package/dist/commands/runtime-internalization-integrity.d.ts.map +1 -0
  112. package/dist/commands/runtime-internalization-integrity.js +53 -0
  113. package/dist/commands/runtime-internalization-integrity.js.map +1 -0
  114. package/dist/commands/runtime-internalization-queue.d.ts +7 -0
  115. package/dist/commands/runtime-internalization-queue.d.ts.map +1 -0
  116. package/dist/commands/runtime-internalization-queue.js +85 -0
  117. package/dist/commands/runtime-internalization-queue.js.map +1 -0
  118. package/dist/commands/runtime-internalization-run-once.d.ts +12 -0
  119. package/dist/commands/runtime-internalization-run-once.d.ts.map +1 -0
  120. package/dist/commands/runtime-internalization-run-once.js +546 -0
  121. package/dist/commands/runtime-internalization-run-once.js.map +1 -0
  122. package/dist/commands/runtime-internalization-wake-once.d.ts +8 -0
  123. package/dist/commands/runtime-internalization-wake-once.d.ts.map +1 -0
  124. package/dist/commands/runtime-internalization-wake-once.js +72 -0
  125. package/dist/commands/runtime-internalization-wake-once.js.map +1 -0
  126. package/dist/commands/runtime-pain-flood-simulation.d.ts +10 -0
  127. package/dist/commands/runtime-pain-flood-simulation.d.ts.map +1 -0
  128. package/dist/commands/runtime-pain-flood-simulation.js +104 -0
  129. package/dist/commands/runtime-pain-flood-simulation.js.map +1 -0
  130. package/dist/commands/runtime-pruning.d.ts +45 -0
  131. package/dist/commands/runtime-pruning.d.ts.map +1 -0
  132. package/dist/commands/runtime-pruning.js +355 -0
  133. package/dist/commands/runtime-pruning.js.map +1 -0
  134. package/dist/commands/runtime-recovery.d.ts +9 -0
  135. package/dist/commands/runtime-recovery.d.ts.map +1 -0
  136. package/dist/commands/runtime-recovery.js +94 -0
  137. package/dist/commands/runtime-recovery.js.map +1 -0
  138. package/dist/commands/runtime-synthetic-baseline.d.ts +7 -0
  139. package/dist/commands/runtime-synthetic-baseline.d.ts.map +1 -0
  140. package/dist/commands/runtime-synthetic-baseline.js +59 -0
  141. package/dist/commands/runtime-synthetic-baseline.js.map +1 -0
  142. package/dist/commands/runtime-uat.d.ts +52 -0
  143. package/dist/commands/runtime-uat.d.ts.map +1 -0
  144. package/dist/commands/runtime-uat.js +274 -0
  145. package/dist/commands/runtime-uat.js.map +1 -0
  146. package/dist/commands/runtime.d.ts +20 -0
  147. package/dist/commands/runtime.d.ts.map +1 -0
  148. package/dist/commands/runtime.js +256 -0
  149. package/dist/commands/runtime.js.map +1 -0
  150. package/dist/commands/samples-list.d.ts +11 -0
  151. package/dist/commands/samples-list.d.ts.map +1 -0
  152. package/dist/commands/samples-list.js +37 -0
  153. package/dist/commands/samples-list.js.map +1 -0
  154. package/dist/commands/samples-review.d.ts +14 -0
  155. package/dist/commands/samples-review.d.ts.map +1 -0
  156. package/dist/commands/samples-review.js +22 -0
  157. package/dist/commands/samples-review.js.map +1 -0
  158. package/dist/commands/task.d.ts +14 -0
  159. package/dist/commands/task.d.ts.map +1 -0
  160. package/dist/commands/task.js +92 -0
  161. package/dist/commands/task.js.map +1 -0
  162. package/dist/commands/trace.d.ts +19 -0
  163. package/dist/commands/trace.d.ts.map +1 -0
  164. package/dist/commands/trace.js +154 -0
  165. package/dist/commands/trace.js.map +1 -0
  166. package/dist/commands/trajectory.d.ts +11 -0
  167. package/dist/commands/trajectory.d.ts.map +1 -0
  168. package/dist/commands/trajectory.js +47 -0
  169. package/dist/commands/trajectory.js.map +1 -0
  170. package/dist/index.d.ts +9 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +736 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/legacy/legacy-import.d.ts +15 -0
  175. package/dist/legacy/legacy-import.d.ts.map +1 -0
  176. package/dist/legacy/legacy-import.js +141 -0
  177. package/dist/legacy/legacy-import.js.map +1 -0
  178. package/dist/legacy/session-history-import.d.ts +26 -0
  179. package/dist/legacy/session-history-import.d.ts.map +1 -0
  180. package/dist/legacy/session-history-import.js +151 -0
  181. package/dist/legacy/session-history-import.js.map +1 -0
  182. package/dist/principle-tree-ledger-adapter.d.ts +12 -0
  183. package/dist/principle-tree-ledger-adapter.d.ts.map +1 -0
  184. package/dist/principle-tree-ledger-adapter.js +12 -0
  185. package/dist/principle-tree-ledger-adapter.js.map +1 -0
  186. package/dist/resolve-workspace.d.ts +12 -0
  187. package/dist/resolve-workspace.d.ts.map +1 -0
  188. package/dist/resolve-workspace.js +20 -0
  189. package/dist/resolve-workspace.js.map +1 -0
  190. package/dist/services/demo-story-a-runner.d.ts +8 -0
  191. package/dist/services/demo-story-a-runner.d.ts.map +1 -0
  192. package/dist/services/demo-story-a-runner.js +369 -0
  193. package/dist/services/demo-story-a-runner.js.map +1 -0
  194. package/dist/services/feature-flag-loader.d.ts +6 -0
  195. package/dist/services/feature-flag-loader.d.ts.map +1 -0
  196. package/dist/services/feature-flag-loader.js +54 -0
  197. package/dist/services/feature-flag-loader.js.map +1 -0
  198. package/dist/services/pain-flood-simulation-runner.d.ts +10 -0
  199. package/dist/services/pain-flood-simulation-runner.d.ts.map +1 -0
  200. package/dist/services/pain-flood-simulation-runner.js +289 -0
  201. package/dist/services/pain-flood-simulation-runner.js.map +1 -0
  202. package/dist/services/proven-channel-baseline-runner.d.ts +12 -0
  203. package/dist/services/proven-channel-baseline-runner.d.ts.map +1 -0
  204. package/dist/services/proven-channel-baseline-runner.js +114 -0
  205. package/dist/services/proven-channel-baseline-runner.js.map +1 -0
  206. package/dist/services/synthetic-baseline-runner.d.ts +8 -0
  207. package/dist/services/synthetic-baseline-runner.d.ts.map +1 -0
  208. package/dist/services/synthetic-baseline-runner.js +251 -0
  209. package/dist/services/synthetic-baseline-runner.js.map +1 -0
  210. package/package.json +35 -0
  211. package/src/commands/artifact.ts +82 -0
  212. package/src/commands/candidate.ts +1117 -0
  213. package/src/commands/central-sync.ts +44 -0
  214. package/src/commands/console.ts +121 -0
  215. package/src/commands/context.ts +72 -0
  216. package/src/commands/demo-story-a.ts +195 -0
  217. package/src/commands/diagnose.ts +452 -0
  218. package/src/commands/evolution-tasks-list.ts +44 -0
  219. package/src/commands/evolution-tasks-show.ts +60 -0
  220. package/src/commands/flow.ts +60 -0
  221. package/src/commands/health.ts +189 -0
  222. package/src/commands/history.ts +63 -0
  223. package/src/commands/legacy-cleanup.ts +206 -0
  224. package/src/commands/legacy-import.ts +104 -0
  225. package/src/commands/pain-record.ts +167 -0
  226. package/src/commands/proven-channel-baseline.ts +113 -0
  227. package/src/commands/remediation-output.ts +66 -0
  228. package/src/commands/run.ts +89 -0
  229. package/src/commands/runtime-activation.ts +176 -0
  230. package/src/commands/runtime-canary.ts +371 -0
  231. package/src/commands/runtime-diagnostics-export.ts +229 -0
  232. package/src/commands/runtime-features.ts +103 -0
  233. package/src/commands/runtime-gfi-snapshot.ts +135 -0
  234. package/src/commands/runtime-health-snapshot.ts +106 -0
  235. package/src/commands/runtime-internalization-enqueue-successors.ts +479 -0
  236. package/src/commands/runtime-internalization-integrity-repair.ts +69 -0
  237. package/src/commands/runtime-internalization-integrity.ts +63 -0
  238. package/src/commands/runtime-internalization-queue.ts +106 -0
  239. package/src/commands/runtime-internalization-run-once.ts +658 -0
  240. package/src/commands/runtime-internalization-wake-once.ts +87 -0
  241. package/src/commands/runtime-pain-flood-simulation.ts +121 -0
  242. package/src/commands/runtime-pruning.ts +438 -0
  243. package/src/commands/runtime-recovery.ts +107 -0
  244. package/src/commands/runtime-synthetic-baseline.ts +70 -0
  245. package/src/commands/runtime-uat.ts +339 -0
  246. package/src/commands/runtime.ts +281 -0
  247. package/src/commands/samples-list.ts +43 -0
  248. package/src/commands/samples-review.ts +32 -0
  249. package/src/commands/task.ts +130 -0
  250. package/src/commands/trace.ts +174 -0
  251. package/src/commands/trajectory.ts +64 -0
  252. package/src/index.ts +829 -0
  253. package/src/legacy/legacy-import.ts +179 -0
  254. package/src/legacy/session-history-import.ts +231 -0
  255. package/src/principle-tree-ledger-adapter.ts +13 -0
  256. package/src/resolve-workspace.ts +20 -0
  257. package/src/services/demo-story-a-runner.ts +472 -0
  258. package/src/services/feature-flag-loader.ts +73 -0
  259. package/src/services/pain-flood-simulation-runner.ts +354 -0
  260. package/src/services/proven-channel-baseline-runner.ts +150 -0
  261. package/src/services/synthetic-baseline-runner.ts +291 -0
  262. package/tests/commands/candidate-audit-repair.test.ts +338 -0
  263. package/tests/commands/candidate-intake.test.ts +589 -0
  264. package/tests/commands/candidate-internalization-backfill.test.ts +480 -0
  265. package/tests/commands/candidate-internalize.test.ts +272 -0
  266. package/tests/commands/candidate-route.test.ts +328 -0
  267. package/tests/commands/candidate-show.test.ts +95 -0
  268. package/tests/commands/cli-command-tree.test.ts +64 -0
  269. package/tests/commands/context.test.ts +114 -0
  270. package/tests/commands/demo-story-a.test.ts +255 -0
  271. package/tests/commands/diagnose.test.ts +792 -0
  272. package/tests/commands/health.test.ts +330 -0
  273. package/tests/commands/pain-record.test.ts +316 -0
  274. package/tests/commands/plugin-config-resolution-cutover.test.ts +220 -0
  275. package/tests/commands/proven-channel-baseline.test.ts +441 -0
  276. package/tests/commands/runtime-activation.test.ts +168 -0
  277. package/tests/commands/runtime-canary.test.ts +369 -0
  278. package/tests/commands/runtime-diagnostics-export.test.ts +170 -0
  279. package/tests/commands/runtime-features.test.ts +114 -0
  280. package/tests/commands/runtime-health-snapshot.test.ts +357 -0
  281. package/tests/commands/runtime-internalization-enqueue-successors.test.ts +803 -0
  282. package/tests/commands/runtime-internalization-integrity-repair.test.ts +169 -0
  283. package/tests/commands/runtime-internalization-integrity.test.ts +102 -0
  284. package/tests/commands/runtime-internalization-queue.test.ts +252 -0
  285. package/tests/commands/runtime-internalization-run-once.test.ts +1318 -0
  286. package/tests/commands/runtime-internalization-wake-once.test.ts +170 -0
  287. package/tests/commands/runtime-internalization.test.ts +52 -0
  288. package/tests/commands/runtime-pain-flood-simulation.test.ts +418 -0
  289. package/tests/commands/runtime-pruning.test.ts +693 -0
  290. package/tests/commands/runtime-recovery.test.ts +96 -0
  291. package/tests/commands/runtime-synthetic-baseline.test.ts +249 -0
  292. package/tests/commands/runtime-uat.test.ts +397 -0
  293. package/tests/commands/runtime.test.ts +262 -0
  294. package/tests/commands/trace.test.ts +314 -0
  295. package/tests/e2e/candidate-intake-e2e.test.ts +316 -0
  296. package/tests/services/feature-flag-loader.test.ts +207 -0
  297. package/tests/services/proven-channel-baseline-runner.test.ts +30 -0
  298. package/tsconfig.json +26 -0
@@ -0,0 +1,85 @@
1
+ /**
2
+ * pd runtime internalization queue command handler.
3
+ *
4
+ * Usage:
5
+ * pd runtime internalization queue --workspace <path> --json
6
+ *
7
+ * Provides a read-only snapshot of the PI task queue health.
8
+ * Never acquires leases or mutates any task/run/artifact/ledger state.
9
+ */
10
+ import * as path from 'path';
11
+ import { createInternalizationQueueReadModel } from '@principles/core/runtime-v2';
12
+ import { resolveWorkspaceDir } from '../resolve-workspace.js';
13
+ import { loadEffectiveFeatureFlags } from '../services/feature-flag-loader.js';
14
+ function formatTextOutput(snap) {
15
+ const lines = [];
16
+ lines.push(`Internalization Queue Snapshot`);
17
+ lines.push(` pending: ${snap.pendingCount} retry_wait: ${snap.retryWaitCount}`);
18
+ if (snap.invalidMetadataCount > 0) {
19
+ lines.push(` invalid_metadata: ${snap.invalidMetadataCount} (${snap.sampleInvalidTaskIds.join(', ')})`);
20
+ }
21
+ lines.push(` ready: ${snap.readyTasks.length}`);
22
+ const taskKinds = Object.entries(snap.countsByTaskKind);
23
+ if (taskKinds.length > 0) {
24
+ lines.push(` by_kind: ${taskKinds.map(([k, v]) => `${k}=${v}`).join(', ')}`);
25
+ }
26
+ const channels = Object.entries(snap.countsByChannel);
27
+ if (channels.length > 0) {
28
+ lines.push(` by_channel: ${channels.map(([k, v]) => `${k}=${v}`).join(', ')}`);
29
+ }
30
+ if (snap.blockedSummary.count > 0) {
31
+ lines.push(` blocked: ${snap.blockedSummary.count}`);
32
+ for (const s of snap.blockedSummary.samples.slice(0, 3)) {
33
+ lines.push(` ${s.taskId} (${s.taskKind}) blocked by: ${s.blockedBy.join(', ')}`);
34
+ }
35
+ }
36
+ if (snap.dependencyFailedSummary.count > 0) {
37
+ lines.push(` dependency_failed: ${snap.dependencyFailedSummary.count}`);
38
+ for (const s of snap.dependencyFailedSummary.samples.slice(0, 3)) {
39
+ lines.push(` ${s.taskId} (${s.taskKind}) failed deps: ${s.failedDependencies.join(', ')}`);
40
+ }
41
+ }
42
+ if (snap.leaseConflictSummary.count > 0) {
43
+ lines.push(` lease_conflict: ${snap.leaseConflictSummary.count}`);
44
+ for (const s of snap.leaseConflictSummary.samples.slice(0, 3)) {
45
+ lines.push(` ${s.taskId} (${s.taskKind}) owner: ${s.leaseOwner}, expires: ${s.leaseExpiresAt}`);
46
+ }
47
+ }
48
+ if (snap.retryWaitPendingSummary.count > 0) {
49
+ lines.push(` retry_wait_pending: ${snap.retryWaitPendingSummary.count}`);
50
+ for (const s of snap.retryWaitPendingSummary.samples.slice(0, 3)) {
51
+ lines.push(` ${s.taskId} (${s.taskKind}) retry_after: ${s.retryAfter}`);
52
+ }
53
+ }
54
+ if (snap.noReadyTasks) {
55
+ lines.push(` no_ready_tasks: ${snap.noReadyTasks.reason} (inspected: ${snap.noReadyTasks.inspectedCount})`);
56
+ }
57
+ if (snap.suppressedTasks.length > 0) {
58
+ lines.push(` suppressed (${snap.suppressedTasks.length}):`);
59
+ for (const s of snap.suppressedTasks.slice(0, 5)) {
60
+ lines.push(` ${s.taskId} (${s.taskKind}, ${s.channel}) reason: ${s.reason}`);
61
+ }
62
+ }
63
+ return lines.join('\n');
64
+ }
65
+ export async function handleRuntimeInternalizationQueue(opts) {
66
+ const workspaceDir = opts.workspace ? path.resolve(opts.workspace) : resolveWorkspaceDir();
67
+ const featureFlags = loadEffectiveFeatureFlags(workspaceDir);
68
+ const enabledChannels = new Set(Object.values(featureFlags.flags)
69
+ .filter(f => f.enabled)
70
+ .map(f => f.id));
71
+ const { readModel, close } = await createInternalizationQueueReadModel({ workspaceDir, enabledChannels });
72
+ try {
73
+ const snapshot = await readModel.getSnapshot();
74
+ if (opts.json) {
75
+ console.log(JSON.stringify(snapshot, null, 2));
76
+ }
77
+ else {
78
+ console.log(formatTextOutput(snapshot));
79
+ }
80
+ }
81
+ finally {
82
+ await close();
83
+ }
84
+ }
85
+ //# sourceMappingURL=runtime-internalization-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-internalization-queue.js","sourceRoot":"","sources":["../../src/commands/runtime-internalization-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ interface RunOnceOptions {
2
+ workspace?: string;
3
+ json?: boolean;
4
+ runtime?: string;
5
+ runner?: string;
6
+ allowTestDouble?: boolean;
7
+ enqueueNext?: boolean;
8
+ timeoutMs?: number;
9
+ }
10
+ export declare function handleRuntimeInternalizationRunOnce(opts: RunOnceOptions): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=runtime-internalization-run-once.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-internalization-run-once.d.ts","sourceRoot":"","sources":["../../src/commands/runtime-internalization-run-once.ts"],"names":[],"mappings":"AA6BA,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2cD,wBAAsB,mCAAmC,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiK7F"}
@@ -0,0 +1,546 @@
1
+ import * as path from 'path';
2
+ import { RuntimeStateManager, InternalizationOrchestrator, DreamerRunner, PhilosopherRunner, ScribeRunner, ArtificerRunner, EvaluatorRunner, RolloutReviewerRunner, TrainerRunner, StoreEventEmitter, DefaultDreamerValidator, DefaultPhilosopherValidator, DefaultScribeValidator, DefaultArtificerValidator, DefaultEvaluatorValidator, DefaultRolloutReviewerValidator, DefaultTrainerValidator, TestDoubleRuntimeAdapter, PiAiRuntimeAdapter, OpenClawCliRuntimeAdapter, resolveRuntimeConfig, isRuntimeConfigError, validateRuntimeConfig, } from '@principles/core/runtime-v2';
3
+ import { resolveWorkspaceDir } from '../resolve-workspace.js';
4
+ const OWNER = 'pd-cli-internalization-run-once';
5
+ const RUNTIME_KIND = 'local-worker';
6
+ class ConfigResolutionError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'ConfigResolutionError';
10
+ }
11
+ }
12
+ const SUPPORTED_RUNNERS = new Set(['dreamer', 'philosopher', 'scribe', 'artificer', 'evaluator', 'rollout_reviewer', 'trainer']);
13
+ function buildOutput(wakeResult, runnerResult, skipReason) {
14
+ const base = { decision: wakeResult.decision };
15
+ switch (wakeResult.decision) {
16
+ case 'leased':
17
+ base.taskId = wakeResult.taskId;
18
+ base.taskKind = wakeResult.taskKind;
19
+ base.attemptCount = wakeResult.attemptCount;
20
+ if (runnerResult)
21
+ base.runnerResult = runnerResult;
22
+ if (skipReason)
23
+ base.skipReason = skipReason;
24
+ break;
25
+ case 'would_lease':
26
+ base.taskId = wakeResult.taskId;
27
+ base.taskKind = wakeResult.taskKind;
28
+ if (runnerResult) {
29
+ base.runnerResult = runnerResult;
30
+ base.runId = runnerResult.runId;
31
+ base.artifactId = runnerResult.artifactId;
32
+ base.resultRef = runnerResult.resultRef;
33
+ }
34
+ if (skipReason)
35
+ base.skipReason = skipReason;
36
+ break;
37
+ case 'no_ready_tasks':
38
+ base.reason = wakeResult.reason;
39
+ base.inspectedCount = wakeResult.inspectedCount;
40
+ break;
41
+ case 'blocked':
42
+ base.taskId = wakeResult.taskId;
43
+ base.taskKind = wakeResult.taskKind;
44
+ break;
45
+ case 'dependency_failed':
46
+ base.taskId = wakeResult.taskId;
47
+ base.taskKind = wakeResult.taskKind;
48
+ break;
49
+ case 'lease_conflict':
50
+ base.taskId = wakeResult.taskId;
51
+ base.conflictReason = wakeResult.conflictReason;
52
+ break;
53
+ case 'invalid_task_metadata':
54
+ base.taskId = wakeResult.taskId;
55
+ base.taskKind = wakeResult.taskKind;
56
+ break;
57
+ default:
58
+ break;
59
+ }
60
+ return base;
61
+ }
62
+ function formatTextOutput(output) {
63
+ const lines = [];
64
+ lines.push(`Internalization Run-Once: ${output.decision}`);
65
+ if (output.runnerKind) {
66
+ lines.push(` runner: ${output.runnerKind}`);
67
+ }
68
+ if (output.taskId) {
69
+ lines.push(` task: ${output.taskId} (${output.taskKind ?? 'unknown'})`);
70
+ }
71
+ if (output.runnerResult) {
72
+ lines.push(` runner: ${output.runnerResult.status}`);
73
+ if (output.runId) {
74
+ lines.push(` runId: ${output.runId}`);
75
+ }
76
+ if (output.artifactId) {
77
+ lines.push(` artifactId: ${output.artifactId}`);
78
+ }
79
+ if (output.resultRef) {
80
+ lines.push(` resultRef: ${output.resultRef}`);
81
+ }
82
+ if (output.runnerResult.errorCategory) {
83
+ lines.push(` error: ${output.runnerResult.errorCategory}`);
84
+ }
85
+ if (output.runnerResult.failureReason) {
86
+ lines.push(` reason: ${output.runnerResult.failureReason}`);
87
+ }
88
+ }
89
+ if (output.skipReason) {
90
+ lines.push(` skip: ${output.skipReason}`);
91
+ }
92
+ if (output.conflictReason) {
93
+ lines.push(` conflict: ${output.conflictReason}`);
94
+ }
95
+ if (output.reason) {
96
+ lines.push(` reason: ${output.reason}`);
97
+ }
98
+ if (output.successorTaskId) {
99
+ lines.push(` successor: ${output.successorTaskId} (${output.successorKind ?? 'unknown'})`);
100
+ }
101
+ if (output.enqueueDecision) {
102
+ lines.push(` enqueue: ${output.enqueueDecision}`);
103
+ }
104
+ if (output.effectiveTimeoutMs) {
105
+ lines.push(` timeout: ${output.effectiveTimeoutMs}ms`);
106
+ }
107
+ if (output.timeoutSource) {
108
+ lines.push(` timeoutSource: ${output.timeoutSource}`);
109
+ }
110
+ return lines.join('\n');
111
+ }
112
+ function resolveRuntimeAdapter(opts) {
113
+ if (opts.runtimeKind === 'test-double') {
114
+ if (opts.runnerKind === 'philosopher') {
115
+ return new TestDoubleRuntimeAdapter({
116
+ onPollRun: (_runId) => ({
117
+ runId: _runId,
118
+ status: 'succeeded',
119
+ startedAt: new Date().toISOString(),
120
+ endedAt: new Date().toISOString(),
121
+ }),
122
+ onFetchOutput: (_runId) => ({
123
+ runId: _runId,
124
+ payload: {
125
+ taskId: opts.taskId,
126
+ sourceDreamerArtifactId: 'pi-art-test-dreamer',
127
+ thesis: 'Test thesis from test-double',
128
+ principleCandidate: {
129
+ title: 'Test Principle',
130
+ rationale: 'Test rationale',
131
+ scope: 'Test scope',
132
+ confidence: 0.8,
133
+ },
134
+ risks: [],
135
+ generatedAt: new Date().toISOString(),
136
+ },
137
+ }),
138
+ });
139
+ }
140
+ if (opts.runnerKind === 'scribe') {
141
+ return new TestDoubleRuntimeAdapter({
142
+ onPollRun: (_runId) => ({
143
+ runId: _runId,
144
+ status: 'succeeded',
145
+ startedAt: new Date().toISOString(),
146
+ endedAt: new Date().toISOString(),
147
+ }),
148
+ onFetchOutput: (_runId) => ({
149
+ runId: _runId,
150
+ payload: {
151
+ taskId: opts.taskId,
152
+ sourcePhilosopherArtifactId: 'pi-art-test-philosopher',
153
+ principleDraft: {
154
+ title: 'Test Principle Draft',
155
+ statement: 'Test principle statement',
156
+ rationale: 'Test rationale',
157
+ applicability: ['All operations'],
158
+ antiPatterns: ['Ignoring validation'],
159
+ confidence: 0.8,
160
+ },
161
+ sourceTrace: {
162
+ philosopherArtifactId: 'pi-art-test-philosopher',
163
+ },
164
+ risks: [],
165
+ generatedAt: new Date().toISOString(),
166
+ },
167
+ }),
168
+ });
169
+ }
170
+ if (opts.runnerKind === 'artificer') {
171
+ let capturedSourceScribeArtifactId = 'pi-art-test-scribe';
172
+ return new TestDoubleRuntimeAdapter({
173
+ onStartRun: (input) => {
174
+ try {
175
+ const payloadStr = typeof input.inputPayload === 'string' ? input.inputPayload : JSON.stringify(input.inputPayload);
176
+ const parsed = JSON.parse(payloadStr);
177
+ if (typeof parsed.sourceScribeArtifactId === 'string' && parsed.sourceScribeArtifactId.trim() !== '') {
178
+ capturedSourceScribeArtifactId = parsed.sourceScribeArtifactId;
179
+ }
180
+ }
181
+ catch { /* use default */ }
182
+ return { runId: `td-artificer-${Date.now()}`, runtimeKind: 'test-double', startedAt: new Date().toISOString() };
183
+ },
184
+ onPollRun: (_runId) => ({
185
+ runId: _runId,
186
+ status: 'succeeded',
187
+ startedAt: new Date().toISOString(),
188
+ endedAt: new Date().toISOString(),
189
+ }),
190
+ onFetchOutput: (_runId) => ({
191
+ runId: _runId,
192
+ payload: {
193
+ taskId: opts.taskId,
194
+ sourceScribeArtifactId: capturedSourceScribeArtifactId,
195
+ implementationPlan: {
196
+ summary: 'Test implementation summary',
197
+ targetSurface: 'src/test/*.ts',
198
+ changes: ['Add validation to test module'],
199
+ tests: ['Unit test for validation'],
200
+ rolloutNotes: ['Deploy behind feature flag'],
201
+ confidence: 0.8,
202
+ },
203
+ sourceTrace: {
204
+ scribeArtifactId: capturedSourceScribeArtifactId,
205
+ },
206
+ risks: [],
207
+ generatedAt: new Date().toISOString(),
208
+ },
209
+ }),
210
+ });
211
+ }
212
+ if (opts.runnerKind === 'evaluator') {
213
+ let capturedSourceArtificerArtifactId = 'pi-art-test-artificer';
214
+ return new TestDoubleRuntimeAdapter({
215
+ onStartRun: (input) => {
216
+ try {
217
+ const payloadStr = typeof input.inputPayload === 'string' ? input.inputPayload : JSON.stringify(input.inputPayload);
218
+ const parsed = JSON.parse(payloadStr);
219
+ if (typeof parsed.sourceArtificerArtifactId === 'string' && parsed.sourceArtificerArtifactId.trim() !== '') {
220
+ capturedSourceArtificerArtifactId = parsed.sourceArtificerArtifactId;
221
+ }
222
+ }
223
+ catch { /* use default */ }
224
+ return { runId: `td-evaluator-${Date.now()}`, runtimeKind: 'test-double', startedAt: new Date().toISOString() };
225
+ },
226
+ onPollRun: (_runId) => ({
227
+ runId: _runId,
228
+ status: 'succeeded',
229
+ startedAt: new Date().toISOString(),
230
+ endedAt: new Date().toISOString(),
231
+ }),
232
+ onFetchOutput: (_runId) => ({
233
+ runId: _runId,
234
+ payload: {
235
+ taskId: opts.taskId,
236
+ sourceArtificerArtifactId: capturedSourceArtificerArtifactId,
237
+ evaluation: {
238
+ decision: 'approved',
239
+ summary: 'Test evaluation summary',
240
+ score: 0.85,
241
+ strengths: ['Well-structured plan'],
242
+ concerns: [],
243
+ requiredChanges: [],
244
+ },
245
+ sourceTrace: {
246
+ artificerArtifactId: capturedSourceArtificerArtifactId,
247
+ },
248
+ risks: [],
249
+ generatedAt: new Date().toISOString(),
250
+ },
251
+ }),
252
+ });
253
+ }
254
+ if (opts.runnerKind === 'rollout_reviewer') {
255
+ let capturedSourceEvaluatorArtifactId = 'pi-art-test-evaluator';
256
+ return new TestDoubleRuntimeAdapter({
257
+ onStartRun: (input) => {
258
+ try {
259
+ const payloadStr = typeof input.inputPayload === 'string' ? input.inputPayload : JSON.stringify(input.inputPayload);
260
+ const parsed = JSON.parse(payloadStr);
261
+ if (typeof parsed.sourceEvaluatorArtifactId === 'string' && parsed.sourceEvaluatorArtifactId.trim() !== '') {
262
+ capturedSourceEvaluatorArtifactId = parsed.sourceEvaluatorArtifactId;
263
+ }
264
+ }
265
+ catch { /* use default */ }
266
+ return { runId: `td-rollout-reviewer-${Date.now()}`, runtimeKind: 'test-double', startedAt: new Date().toISOString() };
267
+ },
268
+ onPollRun: (_runId) => ({
269
+ runId: _runId,
270
+ status: 'succeeded',
271
+ startedAt: new Date().toISOString(),
272
+ endedAt: new Date().toISOString(),
273
+ }),
274
+ onFetchOutput: (_runId) => ({
275
+ runId: _runId,
276
+ payload: {
277
+ taskId: opts.taskId,
278
+ sourceEvaluatorArtifactId: capturedSourceEvaluatorArtifactId,
279
+ review: {
280
+ decision: 'approve_rollout',
281
+ summary: 'Test rollout review summary',
282
+ confidence: 0.9,
283
+ requiredChanges: [],
284
+ rolloutRisks: [],
285
+ safetyChecks: ['Verify feature flag is properly configured'],
286
+ },
287
+ sourceTrace: {
288
+ evaluatorArtifactId: capturedSourceEvaluatorArtifactId,
289
+ },
290
+ risks: [],
291
+ generatedAt: new Date().toISOString(),
292
+ },
293
+ }),
294
+ });
295
+ }
296
+ if (opts.runnerKind === 'trainer') {
297
+ let capturedSourceRolloutReviewerArtifactId = 'pi-art-test-rollout-reviewer';
298
+ return new TestDoubleRuntimeAdapter({
299
+ onStartRun: (input) => {
300
+ try {
301
+ const payloadStr = typeof input.inputPayload === 'string' ? input.inputPayload : JSON.stringify(input.inputPayload);
302
+ const parsed = JSON.parse(payloadStr);
303
+ if (typeof parsed.sourceRolloutReviewerArtifactId === 'string' && parsed.sourceRolloutReviewerArtifactId.trim() !== '') {
304
+ capturedSourceRolloutReviewerArtifactId = parsed.sourceRolloutReviewerArtifactId;
305
+ }
306
+ }
307
+ catch { /* use default */ }
308
+ return { runId: `td-trainer-${Date.now()}`, runtimeKind: 'test-double', startedAt: new Date().toISOString() };
309
+ },
310
+ onPollRun: (_runId) => ({
311
+ runId: _runId,
312
+ status: 'succeeded',
313
+ startedAt: new Date().toISOString(),
314
+ endedAt: new Date().toISOString(),
315
+ }),
316
+ onFetchOutput: (_runId) => ({
317
+ runId: _runId,
318
+ payload: {
319
+ taskId: opts.taskId,
320
+ sourceRolloutReviewerArtifactId: capturedSourceRolloutReviewerArtifactId,
321
+ ruleCandidate: {
322
+ toolScope: 'src/**/*.ts',
323
+ triggerCondition: 'TypeScript file edit with schema mismatch',
324
+ proposedDecision: 'auto_correct',
325
+ proposedCorrection: {
326
+ description: 'Auto-correct by adding input validation before processing',
327
+ proposedParams: {
328
+ strategy: 'prepend',
329
+ snippet: 'const validated = schema.parse(input); if (!validated.success) throw new ValidationError(validated.error);',
330
+ },
331
+ },
332
+ rationale: 'Auto-correct validates input before processing to prevent downstream errors',
333
+ confidence: 0.88,
334
+ },
335
+ safety: {
336
+ limitations: ['Requires schema definition for all input types', 'May not handle complex nested structures'],
337
+ falsePositiveRisks: ['Could over-correct on intentional dynamic patterns'],
338
+ requiredReplayCases: ['Schema validation edge case', 'Nested object validation'],
339
+ },
340
+ sourceTrace: {
341
+ rolloutReviewerArtifactId: capturedSourceRolloutReviewerArtifactId,
342
+ },
343
+ risks: [],
344
+ generatedAt: new Date().toISOString(),
345
+ },
346
+ }),
347
+ });
348
+ }
349
+ return new TestDoubleRuntimeAdapter({
350
+ onPollRun: (_runId) => ({
351
+ runId: _runId,
352
+ status: 'succeeded',
353
+ startedAt: new Date().toISOString(),
354
+ endedAt: new Date().toISOString(),
355
+ }),
356
+ onFetchOutput: (_runId) => ({
357
+ runId: _runId,
358
+ payload: {
359
+ valid: true,
360
+ taskId: opts.taskId,
361
+ candidates: [{
362
+ candidateIndex: 0,
363
+ badDecision: 'Ignored input validation requirement',
364
+ betterDecision: 'Validate all inputs against schema before processing',
365
+ rationale: 'Input validation prevents downstream errors and data corruption',
366
+ confidence: 0.85,
367
+ riskLevel: 'low',
368
+ strategicPerspective: 'defensive-programming',
369
+ }],
370
+ contextRefs: [],
371
+ generatedAt: new Date().toISOString(),
372
+ },
373
+ }),
374
+ });
375
+ }
376
+ const stateDir = path.join(opts.workspaceDir, '.state');
377
+ const configResult = resolveRuntimeConfig(stateDir, { requestedRuntimeKind: opts.runtimeKind });
378
+ if (isRuntimeConfigError(configResult)) {
379
+ throw new ConfigResolutionError(`Config resolution failed: ${configResult.reason}. ` +
380
+ `${configResult.message}. nextAction: ${configResult.nextAction}`);
381
+ }
382
+ if (opts.runtimeKind === 'pi-ai' || (opts.runtimeKind === 'config' && configResult.runtimeKind === 'pi-ai')) {
383
+ validateRuntimeConfig(configResult);
384
+ // CLI --timeout-ms overrides workflows.yaml timeoutMs
385
+ const adapterTimeoutMs = opts.timeoutMs ?? configResult.timeoutMs;
386
+ return new PiAiRuntimeAdapter({
387
+ provider: String(configResult.provider),
388
+ model: String(configResult.model),
389
+ apiKeyEnv: String(configResult.apiKeyEnv),
390
+ maxRetries: configResult.maxRetries,
391
+ timeoutMs: adapterTimeoutMs,
392
+ baseUrl: configResult.baseUrl,
393
+ workspace: opts.workspaceDir,
394
+ });
395
+ }
396
+ if (opts.runtimeKind === 'openclaw-cli' || (opts.runtimeKind === 'config' && configResult.runtimeKind === 'openclaw-cli')) {
397
+ const { openclawMode } = configResult;
398
+ if (!openclawMode) {
399
+ throw new ConfigResolutionError(`runtimeKind 'openclaw-cli' requires openclawMode. ` +
400
+ `Provide --openclaw-local or --openclaw-gateway, or set openclawMode in workflows.yaml. ` +
401
+ `nextAction: Add openclawMode: local|gateway to your funnel policy or use CLI flags.`);
402
+ }
403
+ return new OpenClawCliRuntimeAdapter({
404
+ runtimeMode: openclawMode,
405
+ workspaceDir: opts.workspaceDir,
406
+ });
407
+ }
408
+ throw new Error(`Unsupported runtime kind: ${opts.runtimeKind}. Supported: test-double, pi-ai, openclaw-cli, config`);
409
+ }
410
+ export async function handleRuntimeInternalizationRunOnce(opts) {
411
+ const workspaceDir = opts.workspace ? path.resolve(opts.workspace) : resolveWorkspaceDir();
412
+ const runtimeKind = opts.runtime ?? 'config';
413
+ const runnerKind = opts.runner ?? 'dreamer';
414
+ // Resolve effective timeout: CLI flag > runner default (300_000)
415
+ const cliTimeoutMs = opts.timeoutMs;
416
+ if (cliTimeoutMs !== undefined && (!Number.isFinite(cliTimeoutMs) || cliTimeoutMs <= 0)) {
417
+ console.error(`Error: --timeout-ms must be a positive integer, got: ${opts.timeoutMs}`);
418
+ process.exitCode = 1;
419
+ return;
420
+ }
421
+ const defaultRunnerTimeoutMs = 300_000;
422
+ const effectiveTimeoutMs = cliTimeoutMs ?? defaultRunnerTimeoutMs;
423
+ if (runtimeKind === 'test-double' && !opts.allowTestDouble) {
424
+ console.error('Error: test-double runtime mutates real queue state (leases tasks, marks them succeeded with empty output).');
425
+ console.error('Use --runtime test-double --allow-test-double to acknowledge this risk.');
426
+ console.error('For production use, use --runtime config (reads from workflows.yaml) or --runtime pi-ai / openclaw-cli.');
427
+ process.exitCode = 1;
428
+ return;
429
+ }
430
+ if (!SUPPORTED_RUNNERS.has(runnerKind)) {
431
+ console.error(`Error: unsupported runner kind: ${runnerKind}. Supported: ${[...SUPPORTED_RUNNERS].join(', ')}`);
432
+ process.exitCode = 1;
433
+ return;
434
+ }
435
+ const stateManager = new RuntimeStateManager({ workspaceDir });
436
+ await stateManager.initialize();
437
+ try {
438
+ const orchestrator = new InternalizationOrchestrator({ stateManager }, { owner: OWNER, runtimeKind: RUNTIME_KIND, dryRun: true });
439
+ let wakeResult = { decision: 'no_ready_tasks', reason: 'no_candidates', inspectedCount: 0 };
440
+ try {
441
+ wakeResult = await orchestrator.wakeOnce(runnerKind);
442
+ }
443
+ catch (err) {
444
+ const message = err instanceof Error ? err.message : String(err);
445
+ console.error(`Error: wake-once failed: ${message}`);
446
+ process.exitCode = 1;
447
+ return;
448
+ }
449
+ let runnerResult = undefined;
450
+ let skipReason = undefined;
451
+ if (wakeResult.decision === 'would_lease') {
452
+ if (wakeResult.taskKind !== runnerKind) {
453
+ throw new Error(`Invariant violation: wakeOnce returned taskKind=${wakeResult.taskKind} but runnerKind=${runnerKind}`);
454
+ }
455
+ const eventEmitter = new StoreEventEmitter();
456
+ const artifactStore = stateManager.piArtifactStore;
457
+ const runtimeAdapter = resolveRuntimeAdapter({ runtimeKind, taskId: wakeResult.taskId, workspaceDir, runnerKind, timeoutMs: cliTimeoutMs });
458
+ if (runnerKind === 'dreamer') {
459
+ const validator = new DefaultDreamerValidator();
460
+ const runner = new DreamerRunner({ stateManager, runtimeAdapter, eventEmitter, validator, artifactStore }, { owner: OWNER, runtimeKind: RUNTIME_KIND, pollIntervalMs: 100, timeoutMs: effectiveTimeoutMs });
461
+ runnerResult = await runner.run(wakeResult.taskId);
462
+ }
463
+ else if (runnerKind === 'philosopher') {
464
+ const validator = new DefaultPhilosopherValidator();
465
+ const runner = new PhilosopherRunner({ stateManager, runtimeAdapter, eventEmitter, validator, artifactStore }, { owner: OWNER, runtimeKind: RUNTIME_KIND, pollIntervalMs: 100, timeoutMs: effectiveTimeoutMs });
466
+ runnerResult = await runner.run(wakeResult.taskId);
467
+ }
468
+ else if (runnerKind === 'scribe') {
469
+ const validator = new DefaultScribeValidator();
470
+ const runner = new ScribeRunner({ stateManager, runtimeAdapter, eventEmitter, validator, artifactStore }, { owner: OWNER, runtimeKind: RUNTIME_KIND, pollIntervalMs: 100, timeoutMs: effectiveTimeoutMs });
471
+ runnerResult = await runner.run(wakeResult.taskId);
472
+ }
473
+ else if (runnerKind === 'artificer') {
474
+ const validator = new DefaultArtificerValidator();
475
+ const runner = new ArtificerRunner({ stateManager, runtimeAdapter, eventEmitter, validator, artifactStore }, { owner: OWNER, runtimeKind: RUNTIME_KIND, pollIntervalMs: 100, timeoutMs: effectiveTimeoutMs });
476
+ runnerResult = await runner.run(wakeResult.taskId);
477
+ }
478
+ else if (runnerKind === 'evaluator') {
479
+ const validator = new DefaultEvaluatorValidator();
480
+ const runner = new EvaluatorRunner({ stateManager, runtimeAdapter, eventEmitter, validator, artifactStore }, { owner: OWNER, runtimeKind: RUNTIME_KIND, pollIntervalMs: 100, timeoutMs: effectiveTimeoutMs });
481
+ runnerResult = await runner.run(wakeResult.taskId);
482
+ }
483
+ else if (runnerKind === 'rollout_reviewer') {
484
+ const validator = new DefaultRolloutReviewerValidator();
485
+ const runner = new RolloutReviewerRunner({ stateManager, runtimeAdapter, eventEmitter, validator, artifactStore }, { owner: OWNER, runtimeKind: RUNTIME_KIND, pollIntervalMs: 100, timeoutMs: effectiveTimeoutMs });
486
+ runnerResult = await runner.run(wakeResult.taskId);
487
+ }
488
+ else if (runnerKind === 'trainer') {
489
+ const validator = new DefaultTrainerValidator();
490
+ const runner = new TrainerRunner({ stateManager, runtimeAdapter, eventEmitter, validator, artifactStore }, { owner: OWNER, runtimeKind: RUNTIME_KIND, pollIntervalMs: 100, timeoutMs: effectiveTimeoutMs });
491
+ runnerResult = await runner.run(wakeResult.taskId);
492
+ }
493
+ else {
494
+ skipReason = 'no_runner_implemented';
495
+ }
496
+ }
497
+ const output = buildOutput(wakeResult, runnerResult, skipReason);
498
+ output.runnerKind = runnerKind;
499
+ output.effectiveTimeoutMs = effectiveTimeoutMs;
500
+ if (runnerResult?.failureReason?.includes('timeoutSource=')) {
501
+ const match = /timeoutSource=(\w+)/.exec(runnerResult.failureReason);
502
+ if (match) {
503
+ const [, source] = match;
504
+ output.timeoutSource = source;
505
+ }
506
+ }
507
+ if (opts.enqueueNext && runnerResult?.status === 'succeeded' && wakeResult.decision === 'would_lease') {
508
+ const commitResult = await orchestrator.commitNextTaskProposal(wakeResult.taskId);
509
+ output.enqueueDecision = commitResult.decision;
510
+ if (commitResult.decision === 'successor_created' || commitResult.decision === 'successor_exists') {
511
+ output.successorTaskId = commitResult.successorTaskId;
512
+ output.successorKind = commitResult.successorKind;
513
+ }
514
+ }
515
+ if (opts.json) {
516
+ console.log(JSON.stringify(output, null, 2));
517
+ }
518
+ else {
519
+ console.log(formatTextOutput(output));
520
+ }
521
+ if (wakeResult.decision === 'no_ready_tasks' || wakeResult.decision === 'lease_conflict') {
522
+ process.exitCode = 1;
523
+ }
524
+ }
525
+ catch (err) {
526
+ const message = err instanceof Error ? err.message : String(err);
527
+ const isConfigError = err instanceof ConfigResolutionError;
528
+ if (opts.json) {
529
+ console.log(JSON.stringify({
530
+ decision: isConfigError ? 'config_error' : 'runtime_error',
531
+ reason: message,
532
+ nextAction: isConfigError
533
+ ? 'Fix the workflows.yaml funnel policy, or use --runtime pi-ai / openclaw-cli with explicit flags'
534
+ : 'Check runner logs and workspace state; re-run with --runtime test-double to isolate',
535
+ }, null, 2));
536
+ }
537
+ else {
538
+ console.error(`Error: ${message}`);
539
+ }
540
+ process.exitCode = 1;
541
+ }
542
+ finally {
543
+ await stateManager.close();
544
+ }
545
+ }
546
+ //# sourceMappingURL=runtime-internalization-run-once.js.map