@relayflows/sdk 2.0.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 (231) hide show
  1. package/dist/authored-flow-error.d.ts +9 -0
  2. package/dist/authored-flow-error.d.ts.map +1 -0
  3. package/dist/authored-flow-error.js +13 -0
  4. package/dist/authored-flow-error.js.map +1 -0
  5. package/dist/authored-flow-executor.d.ts +28 -0
  6. package/dist/authored-flow-executor.d.ts.map +1 -0
  7. package/dist/authored-flow-executor.js +203 -0
  8. package/dist/authored-flow-executor.js.map +1 -0
  9. package/dist/authored-flow-lifecycle.d.ts +61 -0
  10. package/dist/authored-flow-lifecycle.d.ts.map +1 -0
  11. package/dist/authored-flow-lifecycle.js +284 -0
  12. package/dist/authored-flow-lifecycle.js.map +1 -0
  13. package/dist/authored-flow-loader.d.ts +7 -0
  14. package/dist/authored-flow-loader.d.ts.map +1 -0
  15. package/dist/authored-flow-loader.js +39 -0
  16. package/dist/authored-flow-loader.js.map +1 -0
  17. package/dist/authored-flow-operation.d.ts +43 -0
  18. package/dist/authored-flow-operation.d.ts.map +1 -0
  19. package/dist/authored-flow-operation.js +176 -0
  20. package/dist/authored-flow-operation.js.map +1 -0
  21. package/dist/authored-flow.d.ts +12 -0
  22. package/dist/authored-flow.d.ts.map +1 -0
  23. package/dist/authored-flow.js +13 -0
  24. package/dist/authored-flow.js.map +1 -0
  25. package/dist/authored-promise-graph.d.ts +67 -0
  26. package/dist/authored-promise-graph.d.ts.map +1 -0
  27. package/dist/authored-promise-graph.js +206 -0
  28. package/dist/authored-promise-graph.js.map +1 -0
  29. package/dist/backlog-picker.d.ts +55 -0
  30. package/dist/backlog-picker.d.ts.map +1 -0
  31. package/dist/backlog-picker.js +117 -0
  32. package/dist/backlog-picker.js.map +1 -0
  33. package/dist/canonical.d.ts +18 -0
  34. package/dist/canonical.d.ts.map +1 -0
  35. package/dist/canonical.js +55 -0
  36. package/dist/canonical.js.map +1 -0
  37. package/dist/cli/check.d.ts +30 -0
  38. package/dist/cli/check.d.ts.map +1 -0
  39. package/dist/cli/check.js +324 -0
  40. package/dist/cli/check.js.map +1 -0
  41. package/dist/cli/direct-run.d.ts +3 -0
  42. package/dist/cli/direct-run.d.ts.map +1 -0
  43. package/dist/cli/direct-run.js +69 -0
  44. package/dist/cli/direct-run.js.map +1 -0
  45. package/dist/cli/hn-monitor.d.ts +107 -0
  46. package/dist/cli/hn-monitor.d.ts.map +1 -0
  47. package/dist/cli/hn-monitor.js +220 -0
  48. package/dist/cli/hn-monitor.js.map +1 -0
  49. package/dist/cli/interruptible-sleep.d.ts +13 -0
  50. package/dist/cli/interruptible-sleep.d.ts.map +1 -0
  51. package/dist/cli/interruptible-sleep.js +31 -0
  52. package/dist/cli/interruptible-sleep.js.map +1 -0
  53. package/dist/cli/run.d.ts +54 -0
  54. package/dist/cli/run.d.ts.map +1 -0
  55. package/dist/cli/run.js +316 -0
  56. package/dist/cli/run.js.map +1 -0
  57. package/dist/cli/tick-runner.d.ts +151 -0
  58. package/dist/cli/tick-runner.d.ts.map +1 -0
  59. package/dist/cli/tick-runner.js +258 -0
  60. package/dist/cli/tick-runner.js.map +1 -0
  61. package/dist/cli-adapter.d.ts +29 -0
  62. package/dist/cli-adapter.d.ts.map +1 -0
  63. package/dist/cli-adapter.js +92 -0
  64. package/dist/cli-adapter.js.map +1 -0
  65. package/dist/cli-executable.d.ts +3 -0
  66. package/dist/cli-executable.d.ts.map +1 -0
  67. package/dist/cli-executable.js +10 -0
  68. package/dist/cli-executable.js.map +1 -0
  69. package/dist/cli.d.ts +9 -0
  70. package/dist/cli.d.ts.map +1 -0
  71. package/dist/cli.js +348 -0
  72. package/dist/cli.js.map +1 -0
  73. package/dist/compile.d.ts +42 -0
  74. package/dist/compile.d.ts.map +1 -0
  75. package/dist/compile.js +515 -0
  76. package/dist/compile.js.map +1 -0
  77. package/dist/demo-hn-monitor.d.ts +2 -0
  78. package/dist/demo-hn-monitor.d.ts.map +1 -0
  79. package/dist/demo-hn-monitor.js +118 -0
  80. package/dist/demo-hn-monitor.js.map +1 -0
  81. package/dist/dir-watcher-poller.d.ts +73 -0
  82. package/dist/dir-watcher-poller.d.ts.map +1 -0
  83. package/dist/dir-watcher-poller.js +80 -0
  84. package/dist/dir-watcher-poller.js.map +1 -0
  85. package/dist/direct-input.d.ts +10 -0
  86. package/dist/direct-input.d.ts.map +1 -0
  87. package/dist/direct-input.js +61 -0
  88. package/dist/direct-input.js.map +1 -0
  89. package/dist/failure-kinds.d.ts +25 -0
  90. package/dist/failure-kinds.d.ts.map +1 -0
  91. package/dist/failure-kinds.js +64 -0
  92. package/dist/failure-kinds.js.map +1 -0
  93. package/dist/gate-contract.d.ts +24 -0
  94. package/dist/gate-contract.d.ts.map +1 -0
  95. package/dist/gate-contract.js +50 -0
  96. package/dist/gate-contract.js.map +1 -0
  97. package/dist/hn-poller.d.ts +50 -0
  98. package/dist/hn-poller.d.ts.map +1 -0
  99. package/dist/hn-poller.js +79 -0
  100. package/dist/hn-poller.js.map +1 -0
  101. package/dist/index.d.ts +21 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +30 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/journal-client.d.ts +122 -0
  106. package/dist/journal-client.d.ts.map +1 -0
  107. package/dist/journal-client.js +277 -0
  108. package/dist/journal-client.js.map +1 -0
  109. package/dist/json-schema-bound.d.ts +7 -0
  110. package/dist/json-schema-bound.d.ts.map +1 -0
  111. package/dist/json-schema-bound.js +353 -0
  112. package/dist/json-schema-bound.js.map +1 -0
  113. package/dist/json-schema.d.ts +5 -0
  114. package/dist/json-schema.d.ts.map +1 -0
  115. package/dist/json-schema.js +72 -0
  116. package/dist/json-schema.js.map +1 -0
  117. package/dist/json-value.d.ts +6 -0
  118. package/dist/json-value.d.ts.map +1 -0
  119. package/dist/json-value.js +94 -0
  120. package/dist/json-value.js.map +1 -0
  121. package/dist/model-name.d.ts +7 -0
  122. package/dist/model-name.d.ts.map +1 -0
  123. package/dist/model-name.js +21 -0
  124. package/dist/model-name.js.map +1 -0
  125. package/dist/output-schema.d.ts +8 -0
  126. package/dist/output-schema.d.ts.map +1 -0
  127. package/dist/output-schema.js +28 -0
  128. package/dist/output-schema.js.map +1 -0
  129. package/dist/preflight.d.ts +80 -0
  130. package/dist/preflight.d.ts.map +1 -0
  131. package/dist/preflight.js +361 -0
  132. package/dist/preflight.js.map +1 -0
  133. package/dist/protocol.d.ts +359 -0
  134. package/dist/protocol.d.ts.map +1 -0
  135. package/dist/protocol.js +15 -0
  136. package/dist/protocol.js.map +1 -0
  137. package/dist/spec.d.ts +294 -0
  138. package/dist/spec.d.ts.map +1 -0
  139. package/dist/spec.js +13 -0
  140. package/dist/spec.js.map +1 -0
  141. package/dist/step-dependencies.d.ts +2 -0
  142. package/dist/step-dependencies.d.ts.map +1 -0
  143. package/dist/step-dependencies.js +88 -0
  144. package/dist/step-dependencies.js.map +1 -0
  145. package/dist/step-fields.d.ts +17 -0
  146. package/dist/step-fields.d.ts.map +1 -0
  147. package/dist/step-fields.js +32 -0
  148. package/dist/step-fields.js.map +1 -0
  149. package/dist/tick-source.d.ts +205 -0
  150. package/dist/tick-source.d.ts.map +1 -0
  151. package/dist/tick-source.js +234 -0
  152. package/dist/tick-source.js.map +1 -0
  153. package/dist/unknown-keys.d.ts +7 -0
  154. package/dist/unknown-keys.d.ts.map +1 -0
  155. package/dist/unknown-keys.js +47 -0
  156. package/dist/unknown-keys.js.map +1 -0
  157. package/dist/validate.d.ts +7 -0
  158. package/dist/validate.d.ts.map +1 -0
  159. package/dist/validate.js +458 -0
  160. package/dist/validate.js.map +1 -0
  161. package/dist/work-package-consumer.d.ts +33 -0
  162. package/dist/work-package-consumer.d.ts.map +1 -0
  163. package/dist/work-package-consumer.js +44 -0
  164. package/dist/work-package-consumer.js.map +1 -0
  165. package/dist/work-package-validator.d.ts +15 -0
  166. package/dist/work-package-validator.d.ts.map +1 -0
  167. package/dist/work-package-validator.js +72 -0
  168. package/dist/work-package-validator.js.map +1 -0
  169. package/dist/worker-cli.d.ts +16 -0
  170. package/dist/worker-cli.d.ts.map +1 -0
  171. package/dist/worker-cli.js +77 -0
  172. package/dist/worker-cli.js.map +1 -0
  173. package/dist/worker.d.ts +57 -0
  174. package/dist/worker.d.ts.map +1 -0
  175. package/dist/worker.js +129 -0
  176. package/dist/worker.js.map +1 -0
  177. package/dist/wrapper-runtime.d.ts +10 -0
  178. package/dist/wrapper-runtime.d.ts.map +1 -0
  179. package/dist/wrapper-runtime.js +83 -0
  180. package/dist/wrapper-runtime.js.map +1 -0
  181. package/dist/wrapper-session.d.ts +16 -0
  182. package/dist/wrapper-session.d.ts.map +1 -0
  183. package/dist/wrapper-session.js +244 -0
  184. package/dist/wrapper-session.js.map +1 -0
  185. package/package.json +50 -0
  186. package/src/authored-flow-error.ts +31 -0
  187. package/src/authored-flow-executor.ts +365 -0
  188. package/src/authored-flow-lifecycle.ts +344 -0
  189. package/src/authored-flow-loader.ts +44 -0
  190. package/src/authored-flow-operation.ts +252 -0
  191. package/src/authored-flow.ts +21 -0
  192. package/src/authored-promise-graph.ts +196 -0
  193. package/src/backlog-picker.ts +153 -0
  194. package/src/canonical.ts +57 -0
  195. package/src/cli/check.ts +391 -0
  196. package/src/cli/direct-run.ts +86 -0
  197. package/src/cli/hn-monitor.ts +286 -0
  198. package/src/cli/interruptible-sleep.ts +27 -0
  199. package/src/cli/run.ts +439 -0
  200. package/src/cli/tick-runner.ts +378 -0
  201. package/src/cli-adapter.ts +115 -0
  202. package/src/cli-executable.ts +12 -0
  203. package/src/cli.ts +364 -0
  204. package/src/compile.ts +573 -0
  205. package/src/demo-hn-monitor.ts +132 -0
  206. package/src/dir-watcher-poller.ts +122 -0
  207. package/src/direct-input.ts +69 -0
  208. package/src/failure-kinds.ts +77 -0
  209. package/src/gate-contract.ts +72 -0
  210. package/src/hn-poller.ts +104 -0
  211. package/src/index.ts +195 -0
  212. package/src/journal-client.ts +379 -0
  213. package/src/json-schema-bound.ts +357 -0
  214. package/src/json-schema.ts +65 -0
  215. package/src/json-value.ts +110 -0
  216. package/src/model-name.ts +20 -0
  217. package/src/output-schema.ts +33 -0
  218. package/src/preflight.ts +482 -0
  219. package/src/protocol.ts +364 -0
  220. package/src/spec.ts +343 -0
  221. package/src/step-dependencies.ts +100 -0
  222. package/src/step-fields.ts +36 -0
  223. package/src/tick-source.ts +334 -0
  224. package/src/unknown-keys.ts +52 -0
  225. package/src/validate.ts +503 -0
  226. package/src/work-package-consumer.ts +73 -0
  227. package/src/work-package-validator.ts +90 -0
  228. package/src/worker-cli.ts +110 -0
  229. package/src/worker.ts +150 -0
  230. package/src/wrapper-runtime.ts +93 -0
  231. package/src/wrapper-session.ts +287 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-run.d.ts","sourceRoot":"","sources":["../../src/cli/direct-run.ts"],"names":[],"mappings":"AAQA,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,mBAAmB,EAEzB,MAAM,UAAU,CAAC;AAElB,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,mBAAwB,GACjC,OAAO,CAAC,YAAY,CAAC,CA6DvB"}
@@ -0,0 +1,69 @@
1
+ import { AuthoredFlowExecutionError, executeAuthoredFlow, } from '../authored-flow-executor.js';
2
+ import { AuthoredFlowLoadError, loadAuthoredFlow } from '../authored-flow-loader.js';
3
+ import { DirectInputError, parseDirectInput } from '../direct-input.js';
4
+ import { JournalClient } from '../journal-client.js';
5
+ import { inputFailureReport } from './check.js';
6
+ import { connect, emptyReport, fromCheckReport, protocolFailure, socketFor, } from './run.js';
7
+ export async function runDirectFlow(path, inputArgument, dataDir, _options = {}) {
8
+ let input;
9
+ try {
10
+ input = parseDirectInput(inputArgument);
11
+ }
12
+ catch (error) {
13
+ const failure = error instanceof DirectInputError ? error : {
14
+ kind: 'input_invalid',
15
+ message: 'Direct input could not be parsed.',
16
+ };
17
+ return {
18
+ exitCode: 2,
19
+ report: fromCheckReport('run', inputFailureReport(failure, path)),
20
+ };
21
+ }
22
+ const socketPath = socketFor(dataDir);
23
+ const base = { ...emptyReport('run'), path };
24
+ const client = new JournalClient(socketPath);
25
+ const connected = await connect(client, 'run', dataDir, base);
26
+ if (connected !== undefined)
27
+ return connected;
28
+ try {
29
+ const handle = await loadAuthoredFlow(path);
30
+ const result = await executeAuthoredFlow(handle, client, input);
31
+ const terminal = result.journalSteps.at(-1);
32
+ if (terminal === undefined) {
33
+ return protocolFailure('run', base, socketPath, new Error(`authored flow "${result.name}" completed without a journal step`));
34
+ }
35
+ return {
36
+ exitCode: 0,
37
+ report: {
38
+ ...base,
39
+ ok: true,
40
+ runId: terminal.runId,
41
+ socketPath,
42
+ status: 'completed',
43
+ completionReason: result.completionReason,
44
+ completedSteps: result.journalSteps.length,
45
+ },
46
+ };
47
+ }
48
+ catch (error) {
49
+ if (error instanceof AuthoredFlowLoadError
50
+ || (error instanceof AuthoredFlowExecutionError && error.code === 'unsupported_header')) {
51
+ return {
52
+ exitCode: 2,
53
+ report: {
54
+ ...fromCheckReport('run', inputFailureReport({
55
+ kind: 'invalid_spec',
56
+ message: error.message,
57
+ }, path)),
58
+ socketPath,
59
+ },
60
+ };
61
+ }
62
+ const runId = error instanceof AuthoredFlowExecutionError ? error.runId : undefined;
63
+ return protocolFailure('run', base, socketPath, error, runId);
64
+ }
65
+ finally {
66
+ client.close();
67
+ }
68
+ }
69
+ //# sourceMappingURL=direct-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-run.js","sourceRoot":"","sources":["../../src/cli/direct-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * `flows hn-monitor start` — CLI-inlined proactive workload for gate 2.
3
+ *
4
+ * runHnMonitor is a public function (not a class) that composes the
5
+ * primitives directly: connect journal → hello → attach agent worker →
6
+ * loop pollHackerNewsOnce → drain on abort → close.
7
+ *
8
+ * Poll errors classify into two shapes only:
9
+ * - `instanceof HnTransientFetchError` → log and continue next tick.
10
+ * - anything else → non-transient (journal failure OR programmer
11
+ * error); log with the actual class name and terminate (fail-closed
12
+ * per covenant 2).
13
+ */
14
+ import { type Fetcher } from '../hn-poller.js';
15
+ import type { EventSubmitResult, HelloResult } from '../protocol.js';
16
+ import type { CliIo } from '../cli.js';
17
+ /**
18
+ * Minimum client surface runHnMonitor uses. Concrete return types come
19
+ * from `protocol.ts`, not `unknown`, so a future rename or shape change
20
+ * in the journal protocol fails to compile here rather than drifting
21
+ * silently past the interface.
22
+ */
23
+ export interface HnMonitorClient {
24
+ hello(client: string): Promise<HelloResult>;
25
+ eventSubmit(spec: unknown, event: {
26
+ type: string;
27
+ payload?: unknown;
28
+ key?: string;
29
+ }): Promise<EventSubmitResult>;
30
+ close(): void;
31
+ }
32
+ /** Minimum worker surface runHnMonitor uses (matches AgentWorker). */
33
+ export interface HnMonitorWorker {
34
+ close(): Promise<void> | void;
35
+ }
36
+ /**
37
+ * Base fields every caller — production and tests — supplies.
38
+ */
39
+ interface HnMonitorArgsBase {
40
+ /** Data directory containing relayflowd.sock. Required. */
41
+ dataDir: string;
42
+ /** Absolute path to the canonical flow spec JSON. Required. */
43
+ specPath: string;
44
+ /** How often to fetch top-stories. Default 60000ms. */
45
+ pollIntervalMs?: number;
46
+ /**
47
+ * Cap on iterations. Undefined = unbounded (production). Any value
48
+ * ≥ 0 caps; 0 means "attach, run zero polls, drain, exit 0" — used
49
+ * by tests that only need to prove the setup/teardown paths.
50
+ */
51
+ maxPolls?: number;
52
+ /** AbortSignal for external cancellation (tests / SIGINT wiring). */
53
+ signal?: AbortSignal;
54
+ }
55
+ /**
56
+ * Injection surface for tests. connectClient AND attachWorker MUST be
57
+ * supplied together — the fallback attach path relies on the client
58
+ * being a real JournalClient, which only the default connect path can
59
+ * guarantee. Enforcing the pairing at the type level catches the
60
+ * "override connect, forget attach" foot-gun the M lens flagged at
61
+ * compile time. Fetcher is orthogonal — it plumbs through to
62
+ * `pollHackerNewsOnce`, not the transport.
63
+ */
64
+ interface HnMonitorInjections {
65
+ connectClient: (socketPath: string) => Promise<HnMonitorClient>;
66
+ attachWorker: (client: HnMonitorClient, onWorkerError: (err: unknown) => void) => Promise<HnMonitorWorker>;
67
+ fetcher?: Fetcher;
68
+ }
69
+ /**
70
+ * Production shape — no injections; runHnMonitor builds a real
71
+ * JournalClient and a real AgentWorker.
72
+ */
73
+ interface HnMonitorProduction {
74
+ connectClient?: never;
75
+ attachWorker?: never;
76
+ fetcher?: Fetcher;
77
+ }
78
+ /** Args parsed by cli.ts and handed to runHnMonitor. */
79
+ export type HnMonitorArgs = HnMonitorArgsBase & (HnMonitorProduction | HnMonitorInjections);
80
+ /**
81
+ * Return a COPY of the spec in which each step's relative `cli` is an
82
+ * absolute path anchored at the spec file's directory. The input is not
83
+ * modified — a caller that still needs the declared relative path (for
84
+ * logging, re-serialization, or handing the spec to another tool) keeps it.
85
+ *
86
+ * `flows check` resolves a declared CLI against the spec's directory
87
+ * (sdk/src/cli/check.ts `probeCli`), but AgentWorker ultimately calls
88
+ * `spawn(cli, ...)`, which resolves a relative path against the WORKER
89
+ * PROCESS's cwd. Those two are the same only when the runner happens to
90
+ * be started from the spec's directory. Without this, a spec that
91
+ * `flows check` passes still dies with ENOENT once launched from
92
+ * anywhere else — preflight-green but unrunnable, the worst shape for a
93
+ * gate that is supposed to prove the workload runs.
94
+ *
95
+ * Bare command names (no separator) are left alone: those are PATH
96
+ * lookups, and both probeCli and spawn already agree on them.
97
+ */
98
+ export declare function resolveSpecCliPaths<T>(spec: T, specPath: string): T;
99
+ /**
100
+ * Run the hn-monitor CLI subcommand. Returns 0 on clean shutdown (signal
101
+ * or maxPolls), 1 on any fail-closed condition (spec unreadable, connect
102
+ * failure, hello failure, worker attach failure, journal failure during
103
+ * poll).
104
+ */
105
+ export declare function runHnMonitor(args: HnMonitorArgs, io: CliIo): Promise<0 | 1>;
106
+ export {};
107
+ //# sourceMappingURL=hn-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hn-monitor.d.ts","sourceRoot":"","sources":["../../src/cli/hn-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAA6C,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAQ,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAIvC;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjH,KAAK,IAAI,IAAI,CAAC;CACf;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,UAAU,iBAAiB;IACzB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,UAAU,mBAAmB;IAC3B,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAChE,YAAY,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3G,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,UAAU,mBAAmB;IAC3B,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wDAAwD;AACxD,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,CAAC;AAE5F;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAgBnE;AAoDD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAmGjF"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * `flows hn-monitor start` — CLI-inlined proactive workload for gate 2.
3
+ *
4
+ * runHnMonitor is a public function (not a class) that composes the
5
+ * primitives directly: connect journal → hello → attach agent worker →
6
+ * loop pollHackerNewsOnce → drain on abort → close.
7
+ *
8
+ * Poll errors classify into two shapes only:
9
+ * - `instanceof HnTransientFetchError` → log and continue next tick.
10
+ * - anything else → non-transient (journal failure OR programmer
11
+ * error); log with the actual class name and terminate (fail-closed
12
+ * per covenant 2).
13
+ */
14
+ import { readFile } from 'node:fs/promises';
15
+ import { dirname, isAbsolute, resolve } from 'node:path';
16
+ import { pollHackerNewsOnce, HnTransientFetchError } from '../hn-poller.js';
17
+ import { AgentWorker } from '../worker.js';
18
+ import { JournalClient } from '../journal-client.js';
19
+ const DEFAULT_POLL_INTERVAL_MS = 60_000;
20
+ /**
21
+ * Return a COPY of the spec in which each step's relative `cli` is an
22
+ * absolute path anchored at the spec file's directory. The input is not
23
+ * modified — a caller that still needs the declared relative path (for
24
+ * logging, re-serialization, or handing the spec to another tool) keeps it.
25
+ *
26
+ * `flows check` resolves a declared CLI against the spec's directory
27
+ * (sdk/src/cli/check.ts `probeCli`), but AgentWorker ultimately calls
28
+ * `spawn(cli, ...)`, which resolves a relative path against the WORKER
29
+ * PROCESS's cwd. Those two are the same only when the runner happens to
30
+ * be started from the spec's directory. Without this, a spec that
31
+ * `flows check` passes still dies with ENOENT once launched from
32
+ * anywhere else — preflight-green but unrunnable, the worst shape for a
33
+ * gate that is supposed to prove the workload runs.
34
+ *
35
+ * Bare command names (no separator) are left alone: those are PATH
36
+ * lookups, and both probeCli and spawn already agree on them.
37
+ */
38
+ export function resolveSpecCliPaths(spec, specPath) {
39
+ if (typeof spec !== 'object' || spec === null)
40
+ return spec;
41
+ const steps = spec.steps;
42
+ if (!Array.isArray(steps))
43
+ return spec;
44
+ const base = dirname(resolve(specPath));
45
+ const resolved = steps.map((step) => {
46
+ if (typeof step !== 'object' || step === null)
47
+ return step;
48
+ const cli = step.cli;
49
+ if (typeof cli !== 'string' || isAbsolute(cli))
50
+ return step;
51
+ // Both separators: on Windows a relative `preflight\analyzer` contains no
52
+ // '/', so a '/'-only test would misread it as a bare PATH command and
53
+ // leave it unresolved.
54
+ if (!cli.includes('/') && !cli.includes('\\'))
55
+ return step;
56
+ return { ...step, cli: resolve(base, cli) };
57
+ });
58
+ return { ...spec, steps: resolved };
59
+ }
60
+ /** Interruptible sleep — wakes on abort as well as timeout. */
61
+ function sleepInterruptible(ms, signal) {
62
+ return new Promise((resolve) => {
63
+ if (signal?.aborted) {
64
+ resolve();
65
+ return;
66
+ }
67
+ let timer;
68
+ const onAbort = () => {
69
+ if (timer !== undefined)
70
+ clearTimeout(timer);
71
+ resolve();
72
+ };
73
+ timer = setTimeout(() => {
74
+ signal?.removeEventListener('abort', onAbort);
75
+ resolve();
76
+ }, ms);
77
+ signal?.addEventListener('abort', onAbort, { once: true });
78
+ });
79
+ }
80
+ async function defaultConnectClient(socketPath) {
81
+ const client = new JournalClient(socketPath);
82
+ await client.connect();
83
+ await client.hello('hn-monitor');
84
+ return client;
85
+ }
86
+ async function defaultAttachWorker(client, onWorkerError) {
87
+ const pins = {
88
+ workspace: [{ surface: 'repo', revision_id: 'live' }],
89
+ streams: [],
90
+ };
91
+ // workerId encodes pid so a same-machine restart shows up as a fresh
92
+ // worker; a container restart that recycles pids before the prior
93
+ // lease expires will collide until `workerRelease` is implemented
94
+ // (documented in worker.ts and tracked as gate-2 follow-up work).
95
+ const worker = new AgentWorker(client, {
96
+ workerId: `hn-monitor-${process.pid}`,
97
+ pins,
98
+ });
99
+ // AgentWorker extends EventEmitter and emits 'error' when a dispatched
100
+ // step's execute() throws. Without a listener, Node re-throws
101
+ // synchronously, bypasses the drain-aware close(), and crashes the
102
+ // process. Subscribe BEFORE attach so an error during attach is not
103
+ // lost.
104
+ worker.on('error', onWorkerError);
105
+ await worker.attach();
106
+ return worker;
107
+ }
108
+ /**
109
+ * Run the hn-monitor CLI subcommand. Returns 0 on clean shutdown (signal
110
+ * or maxPolls), 1 on any fail-closed condition (spec unreadable, connect
111
+ * failure, hello failure, worker attach failure, journal failure during
112
+ * poll).
113
+ */
114
+ export async function runHnMonitor(args, io) {
115
+ const pollIntervalMs = args.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
116
+ const socketPath = `${args.dataDir}/relayflowd.sock`;
117
+ let spec;
118
+ try {
119
+ spec = resolveSpecCliPaths(JSON.parse(await readFile(args.specPath, 'utf8')), args.specPath);
120
+ }
121
+ catch (err) {
122
+ io.stderr(`hn-monitor: cannot read spec at ${args.specPath}: ${String(err)}`);
123
+ return 1;
124
+ }
125
+ // The discriminated union on HnMonitorArgs guarantees connectClient
126
+ // and attachWorker come as a pair OR neither is set. When neither is
127
+ // set, we take the fully-typed default path; when both are set,
128
+ // callers supply their own consistent fake pair. The prior "override
129
+ // one, forget the other" foot-gun no longer typechecks.
130
+ const usingInjections = args.connectClient !== undefined;
131
+ const connect = usingInjections ? args.connectClient : defaultConnectClient;
132
+ const attach = usingInjections
133
+ ? args.attachWorker
134
+ : (c, onErr) => defaultAttachWorker(c, onErr);
135
+ let client;
136
+ try {
137
+ client = await connect(socketPath);
138
+ }
139
+ catch (err) {
140
+ io.stderr(`hn-monitor: cannot connect to relayflowd at ${socketPath}: ${String(err)}`);
141
+ return 1;
142
+ }
143
+ // Async event surface: AgentWorker emits 'error' from step-dispatch
144
+ // callbacks that reject. Bubble those up as a fail-closed termination
145
+ // reason via a shared cell so the main loop notices on its next tick.
146
+ let workerErrorEvent;
147
+ const onWorkerError = (err) => {
148
+ if (workerErrorEvent !== undefined)
149
+ return;
150
+ workerErrorEvent = err;
151
+ };
152
+ let worker;
153
+ try {
154
+ worker = await attach(client, onWorkerError);
155
+ }
156
+ catch (err) {
157
+ io.stderr(`hn-monitor: worker attach failed: ${String(err)}`);
158
+ client.close();
159
+ return 1;
160
+ }
161
+ io.stdout(`hn-monitor: attached worker at ${socketPath}, poll every ${pollIntervalMs}ms`);
162
+ let iterations = 0;
163
+ let exit = 0;
164
+ try {
165
+ while (!(args.signal?.aborted ?? false)) {
166
+ // Cap check FIRST — maxPolls === 0 must exit before dispatching
167
+ // any poll; the prior placement ran one poll before checking,
168
+ // making the "0 = skip" semantics undocumented and surprising.
169
+ if (args.maxPolls !== undefined && iterations >= args.maxPolls)
170
+ break;
171
+ // Worker's async error surface preempts the next poll — an emitted
172
+ // 'error' from a prior tick's dispatch means the worker's contract
173
+ // is broken and the loop must terminate.
174
+ if (workerErrorEvent !== undefined) {
175
+ io.stderr(`hn-monitor: worker emitted error, terminating: ${nameAndMessage(workerErrorEvent)}`);
176
+ exit = 1;
177
+ break;
178
+ }
179
+ let terminate = false;
180
+ try {
181
+ await pollHackerNewsOnce(spec, {
182
+ eventSubmit: (specArg, event) => client.eventSubmit(specArg, event),
183
+ }, args.fetcher ? { fetcher: args.fetcher } : {});
184
+ }
185
+ catch (err) {
186
+ if (err instanceof HnTransientFetchError) {
187
+ io.stderr(`hn-monitor: poll fetch failed (continuing next tick): ${String(err)}`);
188
+ }
189
+ else {
190
+ // Non-transient: journal failure OR programmer bug in the
191
+ // poller. Log the actual class name so a real bug is not
192
+ // silently attributed to the journal.
193
+ io.stderr(`hn-monitor: non-transient error, terminating: ${nameAndMessage(err)}`);
194
+ exit = 1;
195
+ terminate = true;
196
+ }
197
+ }
198
+ if (terminate)
199
+ break;
200
+ iterations++;
201
+ if (args.signal?.aborted)
202
+ break;
203
+ await sleepInterruptible(pollIntervalMs, args.signal);
204
+ }
205
+ }
206
+ finally {
207
+ // Drain in-flight step executions before closing the socket. Worker's
208
+ // close() awaits Promise.allSettled on its own in-flight tracker.
209
+ await worker.close();
210
+ client.close();
211
+ }
212
+ io.stdout(`hn-monitor: shutdown after ${iterations} iteration(s)`);
213
+ return exit;
214
+ }
215
+ function nameAndMessage(err) {
216
+ if (err instanceof Error)
217
+ return `${err.name}: ${err.message}`;
218
+ return String(err);
219
+ }
220
+ //# sourceMappingURL=hn-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hn-monitor.js","sourceRoot":"","sources":["../../src/cli/hn-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Sleep that wakes on abort as well as on timeout.
3
+ *
4
+ * Extracted from `hn-monitor.ts` when `tick-runner.ts` needed the identical
5
+ * behaviour. A long-running event source that sleeps on a bare `setTimeout`
6
+ * cannot be shut down promptly: SIGINT is observed only after the current
7
+ * sleep elapses, which for a schedule polled once a minute means a minute of
8
+ * apparent hang on every Ctrl-C. Both runners therefore share one
9
+ * implementation rather than each carrying a subtly different copy.
10
+ */
11
+ /** Resolve after `ms`, or immediately when `signal` aborts — whichever is first. */
12
+ export declare function sleepInterruptible(ms: number, signal?: AbortSignal): Promise<void>;
13
+ //# sourceMappingURL=interruptible-sleep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interruptible-sleep.d.ts","sourceRoot":"","sources":["../../src/cli/interruptible-sleep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAclF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Sleep that wakes on abort as well as on timeout.
3
+ *
4
+ * Extracted from `hn-monitor.ts` when `tick-runner.ts` needed the identical
5
+ * behaviour. A long-running event source that sleeps on a bare `setTimeout`
6
+ * cannot be shut down promptly: SIGINT is observed only after the current
7
+ * sleep elapses, which for a schedule polled once a minute means a minute of
8
+ * apparent hang on every Ctrl-C. Both runners therefore share one
9
+ * implementation rather than each carrying a subtly different copy.
10
+ */
11
+ /** Resolve after `ms`, or immediately when `signal` aborts — whichever is first. */
12
+ export function sleepInterruptible(ms, signal) {
13
+ return new Promise((resolve) => {
14
+ if (signal?.aborted) {
15
+ resolve();
16
+ return;
17
+ }
18
+ let timer;
19
+ const onAbort = () => {
20
+ if (timer !== undefined)
21
+ clearTimeout(timer);
22
+ resolve();
23
+ };
24
+ timer = setTimeout(() => {
25
+ signal?.removeEventListener('abort', onAbort);
26
+ resolve();
27
+ }, ms);
28
+ signal?.addEventListener('abort', onAbort, { once: true });
29
+ });
30
+ }
31
+ //# sourceMappingURL=interruptible-sleep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interruptible-sleep.js","sourceRoot":"","sources":["../../src/cli/interruptible-sleep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oFAAoF;AACpF,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,MAAoB;IACjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC3C,IAAI,KAAgD,CAAC;QACrD,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,KAAK,KAAK,SAAS;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC7C,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { RunFailureKind } from '../failure-kinds.js';
2
+ import { JournalClient } from '../journal-client.js';
3
+ import type { PreflightDiagnostic } from '../preflight.js';
4
+ import type { RunCompletionReason, RunOutcome, RunStatus } from '../protocol.js';
5
+ import type { StepType } from '../spec.js';
6
+ import { type CheckInputDiagnostic, type CheckReport } from './check.js';
7
+ export type RunExitCode = 0 | 1 | 2 | 3;
8
+ export type RunCommand = 'run' | 'resume';
9
+ export interface ParkedStep {
10
+ id: string;
11
+ type: Extract<StepType, 'llm' | 'agent'>;
12
+ }
13
+ export interface RunDiagnostic {
14
+ severity: 'refusal' | 'failure' | 'parked';
15
+ kind: RunFailureKind | RunCompletionReason;
16
+ message: string;
17
+ }
18
+ export interface RunReport {
19
+ ok: boolean;
20
+ command: RunCommand;
21
+ path?: string;
22
+ runId?: string;
23
+ socketPath?: string;
24
+ status?: RunStatus;
25
+ completionReason?: RunCompletionReason;
26
+ completedSteps?: number;
27
+ parkedStep?: ParkedStep;
28
+ projectConfigPath?: string;
29
+ resolutions: CheckReport['resolutions'];
30
+ diagnostics: Array<PreflightDiagnostic | CheckInputDiagnostic | RunDiagnostic>;
31
+ }
32
+ export interface RunExecution {
33
+ exitCode: RunExitCode;
34
+ report: RunReport;
35
+ }
36
+ export interface RunProgress {
37
+ runId: string;
38
+ stepId: string;
39
+ stepType: Extract<StepType, 'llm' | 'agent'>;
40
+ leaseDeadlineMs: number;
41
+ }
42
+ export interface RunLifecycleOptions {
43
+ signal?: AbortSignal;
44
+ onWait?: (progress: RunProgress) => void;
45
+ }
46
+ export declare function runFlow(path: string, dataDir: string, options?: RunLifecycleOptions): Promise<RunExecution>;
47
+ export declare function resumeFlow(runId: string, dataDir: string, options?: RunLifecycleOptions): Promise<RunExecution>;
48
+ export declare function connect(client: JournalClient, command: RunCommand, dataDir: string, base: CheckReport | RunReport): Promise<RunExecution | undefined>;
49
+ export declare function classifyOutcome(client: JournalClient, command: RunCommand, outcome: RunOutcome, base: CheckReport | RunReport, socketPath: string, options: RunLifecycleOptions): Promise<RunExecution>;
50
+ export declare function protocolFailure(command: RunCommand, base: CheckReport | RunReport, socketPath: string, error: unknown, runId?: string): RunExecution;
51
+ export declare function fromCheckReport(command: RunCommand, report: CheckReport): RunReport;
52
+ export declare function emptyReport(command: RunCommand): RunReport;
53
+ export declare function socketFor(dataDir: string): string;
54
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}