@relayflows/sdk 2.0.35 → 2.0.36

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 (138) hide show
  1. package/dist/adapters/base.d.ts +16 -0
  2. package/dist/adapters/base.d.ts.map +1 -1
  3. package/dist/adapters/claude.d.ts.map +1 -1
  4. package/dist/adapters/claude.js +15 -0
  5. package/dist/adapters/claude.js.map +1 -1
  6. package/dist/adapters/codex.d.ts.map +1 -1
  7. package/dist/adapters/codex.js +4 -0
  8. package/dist/adapters/codex.js.map +1 -1
  9. package/dist/adapters/usage-limit.d.ts +2 -0
  10. package/dist/adapters/usage-limit.d.ts.map +1 -0
  11. package/dist/adapters/usage-limit.js +17 -0
  12. package/dist/adapters/usage-limit.js.map +1 -0
  13. package/dist/authored-activity.d.ts +17 -0
  14. package/dist/authored-activity.d.ts.map +1 -0
  15. package/dist/authored-activity.js +218 -0
  16. package/dist/authored-activity.js.map +1 -0
  17. package/dist/authored-child-run.d.ts +34 -0
  18. package/dist/authored-child-run.d.ts.map +1 -0
  19. package/dist/authored-child-run.js +128 -0
  20. package/dist/authored-child-run.js.map +1 -0
  21. package/dist/authored-flow-error.d.ts +32 -3
  22. package/dist/authored-flow-error.d.ts.map +1 -1
  23. package/dist/authored-flow-error.js +3 -1
  24. package/dist/authored-flow-error.js.map +1 -1
  25. package/dist/authored-flow-executor.d.ts +9 -1
  26. package/dist/authored-flow-executor.d.ts.map +1 -1
  27. package/dist/authored-flow-executor.js +30 -0
  28. package/dist/authored-flow-executor.js.map +1 -1
  29. package/dist/authored-mcp.js +2 -2
  30. package/dist/authored-mcp.js.map +1 -1
  31. package/dist/authored-node-entry.js +3 -1
  32. package/dist/authored-node-entry.js.map +1 -1
  33. package/dist/authored-node-runner.d.ts.map +1 -1
  34. package/dist/authored-node-runner.js +40 -8
  35. package/dist/authored-node-runner.js.map +1 -1
  36. package/dist/authored-plugin-effect.js +2 -2
  37. package/dist/authored-plugin-effect.js.map +1 -1
  38. package/dist/authored-root.d.ts +10 -7
  39. package/dist/authored-root.d.ts.map +1 -1
  40. package/dist/authored-root.js +19 -0
  41. package/dist/authored-root.js.map +1 -1
  42. package/dist/authored-step-output.d.ts +24 -8
  43. package/dist/authored-step-output.d.ts.map +1 -1
  44. package/dist/authored-step-output.js +81 -15
  45. package/dist/authored-step-output.js.map +1 -1
  46. package/dist/authored-subscription-park.d.ts +5 -0
  47. package/dist/authored-subscription-park.d.ts.map +1 -0
  48. package/dist/authored-subscription-park.js +47 -0
  49. package/dist/authored-subscription-park.js.map +1 -0
  50. package/dist/authored-worker-step.d.ts.map +1 -1
  51. package/dist/authored-worker-step.js +7 -2
  52. package/dist/authored-worker-step.js.map +1 -1
  53. package/dist/cli/check-activities.d.ts +8 -0
  54. package/dist/cli/check-activities.d.ts.map +1 -0
  55. package/dist/cli/check-activities.js +155 -0
  56. package/dist/cli/check-activities.js.map +1 -0
  57. package/dist/cli/cli-probe.d.ts.map +1 -1
  58. package/dist/cli/cli-probe.js +14 -2
  59. package/dist/cli/cli-probe.js.map +1 -1
  60. package/dist/cli/direct-run.d.ts.map +1 -1
  61. package/dist/cli/direct-run.js +10 -2
  62. package/dist/cli/direct-run.js.map +1 -1
  63. package/dist/cli/run.d.ts +18 -5
  64. package/dist/cli/run.d.ts.map +1 -1
  65. package/dist/cli/run.js +24 -5
  66. package/dist/cli/run.js.map +1 -1
  67. package/dist/cli/subscription-report.d.ts +5 -0
  68. package/dist/cli/subscription-report.d.ts.map +1 -0
  69. package/dist/cli/subscription-report.js +48 -0
  70. package/dist/cli/subscription-report.js.map +1 -0
  71. package/dist/cli-adapter.d.ts +4 -2
  72. package/dist/cli-adapter.d.ts.map +1 -1
  73. package/dist/cli-adapter.js +4 -0
  74. package/dist/cli-adapter.js.map +1 -1
  75. package/dist/cli.d.ts +1 -1
  76. package/dist/cli.d.ts.map +1 -1
  77. package/dist/cli.js +13 -5
  78. package/dist/cli.js.map +1 -1
  79. package/dist/failure-kinds.d.ts +2 -2
  80. package/dist/failure-kinds.d.ts.map +1 -1
  81. package/dist/failure-kinds.js +2 -0
  82. package/dist/failure-kinds.js.map +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js.map +1 -1
  86. package/dist/journal-client.d.ts +17 -2
  87. package/dist/journal-client.d.ts.map +1 -1
  88. package/dist/journal-client.js +33 -2
  89. package/dist/journal-client.js.map +1 -1
  90. package/dist/journal-reader.d.ts.map +1 -1
  91. package/dist/journal-reader.js +2 -0
  92. package/dist/journal-reader.js.map +1 -1
  93. package/dist/local-agent.d.ts +4 -1
  94. package/dist/local-agent.d.ts.map +1 -1
  95. package/dist/local-agent.js +14 -4
  96. package/dist/local-agent.js.map +1 -1
  97. package/dist/preflight.d.ts +6 -0
  98. package/dist/preflight.d.ts.map +1 -1
  99. package/dist/preflight.js +36 -10
  100. package/dist/preflight.js.map +1 -1
  101. package/dist/protocol.d.ts +166 -1
  102. package/dist/protocol.d.ts.map +1 -1
  103. package/dist/step-settling.d.ts +11 -0
  104. package/dist/step-settling.d.ts.map +1 -0
  105. package/dist/step-settling.js +22 -0
  106. package/dist/step-settling.js.map +1 -0
  107. package/package.json +2 -2
  108. package/src/adapters/base.ts +19 -0
  109. package/src/adapters/claude.ts +15 -0
  110. package/src/adapters/codex.ts +6 -0
  111. package/src/adapters/usage-limit.ts +17 -0
  112. package/src/authored-activity.ts +251 -0
  113. package/src/authored-child-run.ts +138 -0
  114. package/src/authored-flow-error.ts +33 -0
  115. package/src/authored-flow-executor.ts +40 -0
  116. package/src/authored-mcp.ts +2 -2
  117. package/src/authored-node-entry.ts +3 -1
  118. package/src/authored-node-runner.ts +41 -8
  119. package/src/authored-plugin-effect.ts +2 -2
  120. package/src/authored-root.ts +27 -4
  121. package/src/authored-step-output.ts +88 -15
  122. package/src/authored-subscription-park.ts +46 -0
  123. package/src/authored-worker-step.ts +7 -2
  124. package/src/cli/check-activities.ts +144 -0
  125. package/src/cli/cli-probe.ts +15 -3
  126. package/src/cli/direct-run.ts +9 -0
  127. package/src/cli/run.ts +46 -9
  128. package/src/cli/subscription-report.ts +51 -0
  129. package/src/cli-adapter.ts +8 -2
  130. package/src/cli.ts +13 -6
  131. package/src/failure-kinds.ts +2 -0
  132. package/src/index.ts +6 -0
  133. package/src/journal-client.ts +47 -3
  134. package/src/journal-reader.ts +2 -0
  135. package/src/local-agent.ts +17 -3
  136. package/src/preflight.ts +46 -10
  137. package/src/protocol.ts +129 -0
  138. package/src/step-settling.ts +19 -0
@@ -17,6 +17,17 @@ export interface CliInvocation {
17
17
  /** Set only for wrapper readiness probes; raw providers receive a model flag. */
18
18
  modelEnv?: string;
19
19
  }
20
+ /**
21
+ * Why a model-scoped readiness probe exited non-zero, when the CLI's own
22
+ * output says so. `model_unknown` is the only cause that means the model name
23
+ * or the credential's access to it is wrong; the others are the environment.
24
+ */
25
+ export type ModelProbeFailureCause = 'model_unknown' | 'cli_outdated' | 'provider_usage_limited';
26
+ export interface ModelProbeFailure {
27
+ cause: ModelProbeFailureCause;
28
+ /** Minimum CLI version the provider named, for `cli_outdated`. */
29
+ requiredVersion?: string;
30
+ }
20
31
  export interface CliAdapterIdentification {
21
32
  invocation: CliInvocation;
22
33
  expectedStdout?: string;
@@ -44,6 +55,11 @@ export interface HeadlessAdapter {
44
55
  * contract on `modelEnv`.
45
56
  */
46
57
  buildModelReadinessProbe(model: string): CliInvocation;
58
+ /**
59
+ * Classify a failed readiness probe from its combined output. Absent, or an
60
+ * `undefined` answer, means the output named no cause this adapter knows.
61
+ */
62
+ classifyModelProbeFailure?(output: string): ModelProbeFailure | undefined;
47
63
  /** Agent-step worker argv for an instruction under an optional model. */
48
64
  buildAgentInvocation(instruction: string, model?: string): CliInvocation;
49
65
  /** LLM-step worker argv for a prompt under an optional model. */
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B,iEAAiE;IACjE,mBAAmB,IAAI,wBAAwB,CAAC;IAEhD,yCAAyC;IACzC,cAAc,IAAI,aAAa,CAAC;IAEhC;;;;OAIG;IACH,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;IAEvD,yEAAyE;IACzE,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IAEzE,iEAAiE;IACjE,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CACnE"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG,cAAc,GAAG,wBAAwB,CAAC;AAEjG,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,kEAAkE;IAClE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B,iEAAiE;IACjE,mBAAmB,IAAI,wBAAwB,CAAC;IAEhD,yCAAyC;IACzC,cAAc,IAAI,aAAa,CAAC;IAEhC;;;;OAIG;IACH,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;IAEvD;;;OAGG;IACH,yBAAyB,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAE1E,yEAAyE;IACzE,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IAEzE,iEAAiE;IACjE,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CACnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,eAAe,EAChB,MAAM,WAAW,CAAC;AAInB;8EAC8E;AAC9E,eAAO,MAAM,aAAa,EAAE,eA6C3B,CAAC"}
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,eAAe,EAEhB,MAAM,WAAW,CAAC;AAKnB;8EAC8E;AAC9E,eAAO,MAAM,aAAa,EAAE,eA0D3B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { providerUsageLimited } from './usage-limit.js';
1
2
  const MODEL_PROBE_PROMPT = 'Reply with exactly RELAYFLOWS_MODEL_READY and nothing else.';
2
3
  /** Claude Code CLI headless contract. Wire and behavior identical to the
3
4
  * pre-#141 inline shape in `cli-adapter.ts` — only the packaging changed. */
@@ -19,6 +20,20 @@ export const claudeAdapter = {
19
20
  timeoutMs: 60_000,
20
21
  };
21
22
  },
23
+ classifyModelProbeFailure(output) {
24
+ // Checked first: an older Claude Code also prints its own
25
+ // `unrecognized_model` catalog warning for a model newer than it, which
26
+ // must not read as the model being unknown to the provider.
27
+ const outdated = /does not support this model; version (\S+) or newer is required/.exec(output);
28
+ if (outdated !== null)
29
+ return { cause: 'cli_outdated', requiredVersion: outdated[1] };
30
+ if (providerUsageLimited(output))
31
+ return { cause: 'provider_usage_limited' };
32
+ if (/issue with the selected model|not_found_error|may not exist or you may not have access/i.test(output)) {
33
+ return { cause: 'model_unknown' };
34
+ }
35
+ return undefined;
36
+ },
22
37
  buildAgentInvocation(instruction, model) {
23
38
  return {
24
39
  args: [
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"AAMA,MAAM,kBAAkB,GAAG,6DAA6D,CAAC;AAEzF;8EAC8E;AAC9E,MAAM,CAAC,MAAM,aAAa,GAAoB;IAC5C,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,eAAe;IAE7B,mBAAmB;QACjB,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACnF,CAAC;IAED,cAAc;QACZ,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACzD,CAAC;IAED,wBAAwB,CAAC,KAAa;QACpC,OAAO;YACL,IAAI,EAAE;gBACJ,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,0BAA0B;gBACjE,kBAAkB;aACnB;YACD,SAAS,EAAE,MAAM;SAClB,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,WAAmB,EAAE,KAAc;QACtD,OAAO;YACL,IAAI,EAAE;gBACJ,IAAI;gBACJ,sEAAsE;gBACtE,gEAAgE;gBAChE,iEAAiE;gBACjE,uDAAuD;gBACvD,gCAAgC;gBAChC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAClD,WAAW;aACZ;YACD,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,MAAc,EAAE,KAAc;QAC/C,OAAO;YACL,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,0BAA0B;gBACpD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;YAC7D,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,kBAAkB,GAAG,6DAA6D,CAAC;AAEzF;8EAC8E;AAC9E,MAAM,CAAC,MAAM,aAAa,GAAoB;IAC5C,IAAI,EAAE,QAAQ;IACd,YAAY,EAAE,eAAe;IAE7B,mBAAmB;QACjB,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACnF,CAAC;IAED,cAAc;QACZ,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACzD,CAAC;IAED,wBAAwB,CAAC,KAAa;QACpC,OAAO;YACL,IAAI,EAAE;gBACJ,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,0BAA0B;gBACjE,kBAAkB;aACnB;YACD,SAAS,EAAE,MAAM;SAClB,CAAC;IACJ,CAAC;IAED,yBAAyB,CAAC,MAAc;QACtC,0DAA0D;QAC1D,wEAAwE;QACxE,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,iEAAiE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChG,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC;QACvF,IAAI,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QAC7E,IAAI,yFAAyF,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3G,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,oBAAoB,CAAC,WAAmB,EAAE,KAAc;QACtD,OAAO;YACL,IAAI,EAAE;gBACJ,IAAI;gBACJ,sEAAsE;gBACtE,gEAAgE;gBAChE,iEAAiE;gBACjE,uDAAuD;gBACvD,gCAAgC;gBAChC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAClD,WAAW;aACZ;YACD,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,MAAc,EAAE,KAAc;QAC/C,OAAO;YACL,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,0BAA0B;gBACpD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;YAC7D,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,eAAe,EAChB,MAAM,WAAW,CAAC;AAInB;qEACqE;AACrE,eAAO,MAAM,YAAY,EAAE,eA6C1B,CAAC"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,eAAe,EAEhB,MAAM,WAAW,CAAC;AAKnB;qEACqE;AACrE,eAAO,MAAM,YAAY,EAAE,eAiD1B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { providerUsageLimited } from './usage-limit.js';
1
2
  const MODEL_PROBE_PROMPT = 'Reply with exactly RELAYFLOWS_MODEL_READY and nothing else.';
2
3
  /** OpenAI Codex CLI headless contract. Behavior identical to the pre-#141
3
4
  * inline shape in `cli-adapter.ts` — only the packaging changed. */
@@ -18,6 +19,9 @@ export const codexAdapter = {
18
19
  timeoutMs: 60_000,
19
20
  };
20
21
  },
22
+ classifyModelProbeFailure(output) {
23
+ return providerUsageLimited(output) ? { cause: 'provider_usage_limited' } : undefined;
24
+ },
21
25
  buildAgentInvocation(instruction, model) {
22
26
  return {
23
27
  args: [
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAMA,MAAM,kBAAkB,GAAG,6DAA6D,CAAC;AAEzF;qEACqE;AACrE,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,IAAI,EAAE,OAAO;IAEb,mBAAmB;QACjB,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACpF,CAAC;IAED,cAAc;QACZ,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC1D,CAAC;IAED,wBAAwB,CAAC,KAAa;QACpC,OAAO;YACL,IAAI,EAAE;gBACJ,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,uBAAuB;gBACxE,SAAS,EAAE,KAAK,EAAE,kBAAkB;aACrC;YACD,SAAS,EAAE,MAAM;SAClB,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,WAAmB,EAAE,KAAc;QACtD,OAAO;YACL,IAAI,EAAE;gBACJ,MAAM,EAAE,aAAa,EAAE,uBAAuB;gBAC9C,oEAAoE;gBACpE,iEAAiE;gBACjE,qEAAqE;gBACrE,kEAAkE;gBAClE,yCAAyC;gBACzC,4CAA4C;gBAC5C,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAClD,WAAW;aACZ;YACD,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,MAAc,EAAE,KAAc;QAC/C,OAAO;YACL,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,uBAAuB;gBAC7E,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;YAC7D,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,kBAAkB,GAAG,6DAA6D,CAAC;AAEzF;qEACqE;AACrE,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,IAAI,EAAE,OAAO;IAEb,mBAAmB;QACjB,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IACpF,CAAC;IAED,cAAc;QACZ,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC1D,CAAC;IAED,wBAAwB,CAAC,KAAa;QACpC,OAAO;YACL,IAAI,EAAE;gBACJ,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,uBAAuB;gBACxE,SAAS,EAAE,KAAK,EAAE,kBAAkB;aACrC;YACD,SAAS,EAAE,MAAM;SAClB,CAAC;IACJ,CAAC;IAED,yBAAyB,CAAC,MAAc;QACtC,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACxF,CAAC;IAED,oBAAoB,CAAC,WAAmB,EAAE,KAAc;QACtD,OAAO;YACL,IAAI,EAAE;gBACJ,MAAM,EAAE,aAAa,EAAE,uBAAuB;gBAC9C,oEAAoE;gBACpE,iEAAiE;gBACjE,qEAAqE;gBACrE,kEAAkE;gBAClE,yCAAyC;gBACzC,4CAA4C;gBAC5C,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAClD,WAAW;aACZ;YACD,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,MAAc,EAAE,KAAc;QAC/C,OAAO;YACL,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,uBAAuB;gBAC7E,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;YAC7D,SAAS,EAAE,CAAC;SACb,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function providerUsageLimited(output: string): boolean;
2
+ //# sourceMappingURL=usage-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limit.d.ts","sourceRoot":"","sources":["../../src/adapters/usage-limit.ts"],"names":[],"mappings":"AAcA,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Provider refusals that mean "this credential is out of capacity right now",
3
+ * not "this model does not exist". Shared by raw provider adapters because the
4
+ * wording overlaps (HTTP 429, `rate_limit_error`, subscription usage windows).
5
+ */
6
+ const USAGE_LIMITED = [
7
+ /usage limit/i,
8
+ /hit your (?:usage )?limit/i,
9
+ /(?:5-hour|weekly|session) limit reached/i,
10
+ /rate_limit_error/,
11
+ /API Error: 429\b/,
12
+ /credit balance is too low/i,
13
+ ];
14
+ export function providerUsageLimited(output) {
15
+ return USAGE_LIMITED.some(pattern => pattern.test(output));
16
+ }
17
+ //# sourceMappingURL=usage-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-limit.js","sourceRoot":"","sources":["../../src/adapters/usage-limit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,aAAa,GAAG;IACpB,cAAc;IACd,4BAA4B;IAC5B,0CAA0C;IAC1C,kBAAkB;IAClB,kBAAkB;IAClB,4BAA4B;CAC7B,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Activity, ActivityOptions, TriggerSource, Wake } from '@relayflows/surface';
2
+ import type { SubscriptionNextResult } from './protocol.js';
3
+ import { JournalClient } from './journal-client.js';
4
+ type CloseReason = 'closed' | 'run_completed' | 'canceled';
5
+ /** Owns body-local cursors that must close before the authored root completes. */
6
+ export declare class AuthoredActivities {
7
+ private readonly journal;
8
+ private readonly runId;
9
+ private readonly activities;
10
+ constructor(journal: JournalClient, runId: string | undefined);
11
+ open(source: TriggerSource, options: ActivityOptions): Activity;
12
+ closeAll(reason: Exclude<CloseReason, 'closed'>): Promise<void>;
13
+ }
14
+ /** Decode the wire result at the journal boundary so malformed wakes fail closed. */
15
+ export declare function decodeWake(value: SubscriptionNextResult): Wake;
16
+ export {};
17
+ //# sourceMappingURL=authored-activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-activity.d.ts","sourceRoot":"","sources":["../src/authored-activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAER,eAAe,EAEf,aAAa,EAEb,IAAI,EACL,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,KAAK,WAAW,GAAG,QAAQ,GAAG,eAAe,GAAG,UAAU,CAAC;AAO3D,kFAAkF;AAClF,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;gBAG9B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,GAAG,SAAS;IAG5C,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,GAAG,QAAQ;IAczD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAGtE;AAwKD,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAgB9D"}
@@ -0,0 +1,218 @@
1
+ import { AuthoredFlowExecutionError } from './authored-flow-error.js';
2
+ /** Owns body-local cursors that must close before the authored root completes. */
3
+ export class AuthoredActivities {
4
+ journal;
5
+ runId;
6
+ activities = [];
7
+ constructor(journal, runId) {
8
+ this.journal = journal;
9
+ this.runId = runId;
10
+ }
11
+ open(source, options) {
12
+ if (source?.kind !== 'webhook') {
13
+ throw new AuthoredFlowExecutionError('unsupported_header', 'f.on() requires an event source; schedule triggers start runs and cannot be awaited inside a body');
14
+ }
15
+ if (this.runId === undefined) {
16
+ throw new AuthoredFlowExecutionError('journal_protocol_violation', 'f.on() requires a durable authored root run');
17
+ }
18
+ const id = `activity-${this.activities.length + 1}`;
19
+ const activity = new JournalActivity(this.journal, this.runId, id, source, normalizeOptions(options));
20
+ this.activities.push(activity);
21
+ return activity.activity;
22
+ }
23
+ async closeAll(reason) {
24
+ for (const activity of this.activities)
25
+ await activity.close(reason);
26
+ }
27
+ }
28
+ class JournalActivity {
29
+ journal;
30
+ runId;
31
+ subscriptionId;
32
+ source;
33
+ options;
34
+ activity;
35
+ openPromise;
36
+ closed = false;
37
+ nextSequence = 0;
38
+ acknowledgeWaitId;
39
+ constructor(journal, runId, subscriptionId, source, options) {
40
+ this.journal = journal;
41
+ this.runId = runId;
42
+ this.subscriptionId = subscriptionId;
43
+ this.source = source;
44
+ this.options = options;
45
+ this.activity = Object.freeze({
46
+ next: () => this.next(),
47
+ close: () => this.close('closed'),
48
+ });
49
+ // Opening starts at f.on(), rather than at the first next(), so frames
50
+ // arriving while the body reads state or runs another step are inside the
51
+ // router's binding window. next()/close() await this same handshake.
52
+ this.openPromise = this.openNow();
53
+ void this.openPromise.catch(() => undefined);
54
+ }
55
+ async close(reason) {
56
+ if (this.closed)
57
+ return;
58
+ try {
59
+ await this.ensureOpen();
60
+ }
61
+ catch (error) {
62
+ // Failure cleanup has no active binding to close before activation.
63
+ // Re-throwing this handoff would disguise a real body failure as a
64
+ // normal suspension. Root termination fences any later activation.
65
+ if (reason !== 'closed' && error instanceof AuthoredFlowExecutionError
66
+ && error.code === 'subscription_suspended' && error.suspension?.kind === 'activation')
67
+ return;
68
+ throw error;
69
+ }
70
+ await this.journal.subscriptionClose({
71
+ run_id: this.runId,
72
+ subscription_id: this.subscriptionId,
73
+ completion_reason: reason,
74
+ });
75
+ this.closed = true;
76
+ }
77
+ async next() {
78
+ if (this.closed)
79
+ throw new AuthoredFlowExecutionError('activity_closed', 'activity is already closed');
80
+ await this.ensureOpen();
81
+ const result = await this.journal.subscriptionNext({
82
+ run_id: this.runId,
83
+ subscription_id: this.subscriptionId,
84
+ sequence: this.nextSequence,
85
+ ...(this.acknowledgeWaitId === undefined ? {} : { acknowledge_wait_id: this.acknowledgeWaitId }),
86
+ });
87
+ if (result.kind === 'suspended') {
88
+ throw suspended({
89
+ kind: 'event_wait', subscriptionId: result.subscription_id,
90
+ stream: result.stream, deadlineAtMs: result.deadline_at_ms,
91
+ }, this.runId);
92
+ }
93
+ const wake = decodeWake(result);
94
+ if (wake.kind === 'deadline' || wake.kind === 'overflow') {
95
+ this.closed = true;
96
+ }
97
+ else {
98
+ this.acknowledgeWaitId = receiptId(result) ?? `${this.subscriptionId}/next/${this.nextSequence}`;
99
+ this.nextSequence += 1;
100
+ }
101
+ return wake;
102
+ }
103
+ async ensureOpen() {
104
+ await this.openPromise;
105
+ }
106
+ async openNow() {
107
+ const result = await this.journal.subscriptionOpen({
108
+ run_id: this.runId,
109
+ subscription_id: this.subscriptionId,
110
+ event_types: [this.source.name],
111
+ ...(this.source.filter === undefined ? {} : { pattern: this.source.filter }),
112
+ settle_ms: this.options.settleMs,
113
+ idle_ms: this.options.idleMs,
114
+ deadline_ms: this.options.deadlineMs,
115
+ include_self: this.options.includeSelf,
116
+ });
117
+ if (result.state === 'prepared') {
118
+ throw suspended({
119
+ kind: 'activation', subscriptionId: result.subscription_id,
120
+ eventTypes: Object.freeze([...result.event_types]),
121
+ ...(result.pattern === undefined ? {} : { pattern: Object.freeze({ ...result.pattern }) }),
122
+ stream: result.stream, settleMs: result.settle_ms, idleMs: result.idle_ms,
123
+ deadlineAtMs: result.deadline_at_ms, includeSelf: result.include_self,
124
+ }, this.runId);
125
+ }
126
+ }
127
+ }
128
+ function suspended(value, runId) {
129
+ return new AuthoredFlowExecutionError('subscription_suspended', `subscription ${value.subscriptionId} is durably suspended for ${value.kind}`, undefined, runId, undefined, value);
130
+ }
131
+ function receiptId(result) {
132
+ const receipt = result.acknowledge_wait_id;
133
+ return typeof receipt === 'string' && receipt.length > 0 ? receipt : undefined;
134
+ }
135
+ function normalizeOptions(options) {
136
+ if (typeof options !== 'object' || options === null || Array.isArray(options)) {
137
+ throw unboundedSubscription('f.on() requires idle and deadline bounds');
138
+ }
139
+ const value = options;
140
+ const allowed = new Set(['settle', 'idle', 'deadline', 'includeSelf']);
141
+ for (const key of Object.keys(value)) {
142
+ if (!allowed.has(key))
143
+ throw new AuthoredFlowExecutionError('unbounded_subscription', `f.on() has unknown option ${JSON.stringify(key)}`);
144
+ }
145
+ if (!Object.hasOwn(value, 'idle') || !Object.hasOwn(value, 'deadline')) {
146
+ throw unboundedSubscription('f.on() requires both idle and deadline bounds');
147
+ }
148
+ if (value['includeSelf'] !== undefined && typeof value['includeSelf'] !== 'boolean') {
149
+ throw new AuthoredFlowExecutionError('unbounded_subscription', 'f.on() includeSelf must be a boolean');
150
+ }
151
+ return Object.freeze({
152
+ settleMs: parseDuration(value['settle'], 'settle', true),
153
+ idleMs: parseDuration(value['idle'], 'idle', false),
154
+ deadlineMs: parseDuration(value['deadline'], 'deadline', false),
155
+ includeSelf: value['includeSelf'] === true,
156
+ });
157
+ }
158
+ function parseDuration(value, field, zeroAllowed) {
159
+ if (value === undefined && zeroAllowed)
160
+ return 0;
161
+ let milliseconds;
162
+ if (typeof value === 'number')
163
+ milliseconds = value;
164
+ else if (typeof value === 'string') {
165
+ const match = /^(\d+(?:\.\d+)?)(ms|s|m|h|d)$/.exec(value);
166
+ const units = { ms: 1, s: 1_000, m: 60_000, h: 3_600_000, d: 86_400_000 };
167
+ const unit = match?.[2];
168
+ milliseconds = match === null || unit === undefined ? NaN : Math.round(Number(match[1]) * units[unit]);
169
+ }
170
+ else
171
+ milliseconds = NaN;
172
+ if (!Number.isSafeInteger(milliseconds) || milliseconds < 0 || (!zeroAllowed && milliseconds === 0)) {
173
+ throw new AuthoredFlowExecutionError('unbounded_subscription', `f.on() ${field} must be ${zeroAllowed ? 'a non-negative' : 'a positive'} whole number of milliseconds or a duration such as "72h"`);
174
+ }
175
+ return milliseconds;
176
+ }
177
+ function unboundedSubscription(message) {
178
+ return new AuthoredFlowExecutionError('unbounded_subscription', message);
179
+ }
180
+ /** Decode the wire result at the journal boundary so malformed wakes fail closed. */
181
+ export function decodeWake(value) {
182
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
183
+ return invalidWake();
184
+ if (value.kind === 'idle')
185
+ return Object.freeze({ kind: 'idle' });
186
+ if (value.kind === 'events') {
187
+ if (!Array.isArray(value.events) || !isOffset(value.offset) || !value.events.every(isEventFrame))
188
+ return invalidWake();
189
+ return Object.freeze({ kind: 'events', events: Object.freeze([...value.events]), offset: value.offset });
190
+ }
191
+ if (value.kind === 'deadline') {
192
+ if (value.pending !== null && !isPending(value.pending))
193
+ return invalidWake();
194
+ return Object.freeze({ kind: 'deadline', pending: value.pending === null ? null : Object.freeze({ ...value.pending }) });
195
+ }
196
+ if (value.kind === 'overflow') {
197
+ if (!isOffset(value.retained) || !isOffset(value.bytes) || !isOffset(value.from))
198
+ return invalidWake();
199
+ return Object.freeze({ kind: 'overflow', retained: value.retained, bytes: value.bytes, from: value.from });
200
+ }
201
+ return invalidWake();
202
+ }
203
+ function isEventFrame(value) {
204
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
205
+ && typeof value.type === 'string';
206
+ }
207
+ function isPending(value) {
208
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
209
+ && isOffset(value.from)
210
+ && isOffset(value.to);
211
+ }
212
+ function isOffset(value) {
213
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
214
+ }
215
+ function invalidWake() {
216
+ throw new AuthoredFlowExecutionError('journal_protocol_violation', 'subscription.next returned an invalid wake result');
217
+ }
218
+ //# sourceMappingURL=authored-activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-activity.js","sourceRoot":"","sources":["../src/authored-activity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { JournalClient } from './journal-client.js';
2
+ import type { RunStatus } from './protocol.js';
3
+ /**
4
+ * Every entry of a child run's journal, paged.
5
+ *
6
+ * A single unbounded read returns the first 100 entries only, and a reader
7
+ * that needs the LAST completion of a step cannot stop at a page boundary.
8
+ * A short page is the end of the journal.
9
+ */
10
+ export declare function readChildJournal(journal: JournalClient, runId: string): Promise<unknown[]>;
11
+ /**
12
+ * Wait until an authored operation's child run is terminal, and say whether
13
+ * it got there.
14
+ *
15
+ * A child adopted through its admission key is not necessarily finished: on
16
+ * `flows resume` of a root whose daemon survived, `run.start` returns the
17
+ * existing child's CURRENT outcome without driving it, so the child may still
18
+ * be executing an attempt, or sleeping out a retry backoff, on the request
19
+ * that originally started it. Reading its journal then judges a history that
20
+ * is still being written.
21
+ *
22
+ * The wait is read-only on purpose: it never resumes the child. The kernel
23
+ * drives a deterministic attempt inline on the request that started it, and a
24
+ * second driver would presume that attempt dead and run the command again.
25
+ *
26
+ * Bounded by the child's own journaled deadlines, never a fixed one: a running
27
+ * attempt by its lease (renewed as the lease renews) plus the kernel's
28
+ * lease-sweep grace, a backoff by the `sleep.until` it journaled (once that
29
+ * wake has passed, by the settling window). With nothing in flight, only the
30
+ * short settling window above; a child parked on a worker
31
+ * returns at once. Either way the caller gets the status and decides.
32
+ */
33
+ export declare function waitForTerminalChildRun(journal: JournalClient, runId: string, signal?: AbortSignal): Promise<RunStatus>;
34
+ //# sourceMappingURL=authored-child-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-child-run.d.ts","sourceRoot":"","sources":["../src/authored-child-run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,eAAe,CAAC;AAU7D;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAahG;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CA0BpB"}
@@ -0,0 +1,128 @@
1
+ import { delay, LEASE_SWEEP_GRACE_MS } from './cli/run.js';
2
+ /** One `journal.read` page; the kernel caps an unbounded read at 100 entries. */
3
+ const PAGE = 1_000;
4
+ const POLL_MS = 50;
5
+ // A run between two of its own actions can report `running` with nothing in
6
+ // flight for a moment (a wait just completed, the next attempt not yet
7
+ // journaled). The same bound `classifyOutcome` gives that window (#179).
8
+ const MAX_IDLE_POLLS = 40;
9
+ /**
10
+ * Every entry of a child run's journal, paged.
11
+ *
12
+ * A single unbounded read returns the first 100 entries only, and a reader
13
+ * that needs the LAST completion of a step cannot stop at a page boundary.
14
+ * A short page is the end of the journal.
15
+ */
16
+ export async function readChildJournal(journal, runId) {
17
+ const all = [];
18
+ let fromSeq = 1;
19
+ while (true) {
20
+ const { entries } = await journal.journalRead(runId, fromSeq, PAGE);
21
+ all.push(...entries);
22
+ if (entries.length < PAGE)
23
+ return all;
24
+ const last = entries.at(-1);
25
+ if (typeof last?.seq !== 'number' || !Number.isSafeInteger(last.seq) || last.seq < fromSeq) {
26
+ throw new Error(`invalid journal sequence reading child run "${runId}"`);
27
+ }
28
+ fromSeq = last.seq + 1;
29
+ }
30
+ }
31
+ /**
32
+ * Wait until an authored operation's child run is terminal, and say whether
33
+ * it got there.
34
+ *
35
+ * A child adopted through its admission key is not necessarily finished: on
36
+ * `flows resume` of a root whose daemon survived, `run.start` returns the
37
+ * existing child's CURRENT outcome without driving it, so the child may still
38
+ * be executing an attempt, or sleeping out a retry backoff, on the request
39
+ * that originally started it. Reading its journal then judges a history that
40
+ * is still being written.
41
+ *
42
+ * The wait is read-only on purpose: it never resumes the child. The kernel
43
+ * drives a deterministic attempt inline on the request that started it, and a
44
+ * second driver would presume that attempt dead and run the command again.
45
+ *
46
+ * Bounded by the child's own journaled deadlines, never a fixed one: a running
47
+ * attempt by its lease (renewed as the lease renews) plus the kernel's
48
+ * lease-sweep grace, a backoff by the `sleep.until` it journaled (once that
49
+ * wake has passed, by the settling window). With nothing in flight, only the
50
+ * short settling window above; a child parked on a worker
51
+ * returns at once. Either way the caller gets the status and decides.
52
+ */
53
+ export async function waitForTerminalChildRun(journal, runId, signal) {
54
+ let idlePolls = 0;
55
+ while (true) {
56
+ if (signal?.aborted === true)
57
+ throw new Error(`waiting for child run "${runId}" was canceled`);
58
+ const snapshot = await journal.runGet(runId);
59
+ if (snapshot.status === 'completed' || snapshot.status === 'failed')
60
+ return snapshot.status;
61
+ const inFlight = await inFlightDeadline(journal, runId, snapshot);
62
+ if (inFlight === 'parked')
63
+ return snapshot.status;
64
+ const remainingMs = inFlight === undefined ? 0 : inFlight.deadlineMs + inFlight.graceMs - Date.now();
65
+ if (inFlight !== undefined && remainingMs > 0) {
66
+ idlePolls = 0;
67
+ await delay(Math.min(POLL_MS, remainingMs), signal);
68
+ continue;
69
+ }
70
+ // Only a lease past its sweep grace is proof nothing is running the
71
+ // attempt. An elapsed retry wake is the kernel's normal transition to the
72
+ // next attempt — its driver may be folding the timer right now — so it is
73
+ // re-polled inside the settling window like any other in-between state.
74
+ if (inFlight?.what === 'lease') {
75
+ throw new Error(`child run "${runId}" step "${inFlight.stepId}" passed its lease`
76
+ + ` (${inFlight.deadlineMs}) without reaching a terminal state`);
77
+ }
78
+ if (idlePolls >= MAX_IDLE_POLLS)
79
+ return snapshot.status;
80
+ idlePolls += 1;
81
+ await delay(POLL_MS, signal);
82
+ }
83
+ }
84
+ /**
85
+ * What the child is waiting on, and until when; `parked` when it is waiting
86
+ * on nothing this process can wait out.
87
+ *
88
+ * A worker-typed (`agent`/`llm`) step that is runnable, or whose retry
89
+ * backoff has elapsed, with no attempt running, needs a worker — or the
90
+ * `run.resume` a caller like `classifyOutcome` issues — to move. That is the
91
+ * park `classifyOutcome` reports, and waiting on it would only delay the same
92
+ * answer. A deterministic step in that state is the kernel between two of its
93
+ * own actions, which the caller's settling window covers.
94
+ */
95
+ async function inFlightDeadline(journal, runId, snapshot) {
96
+ const steps = Object.entries(snapshot.steps);
97
+ const running = steps.find(([, step]) => step.state === 'running' && step.lease_deadline_ms !== undefined);
98
+ if (running !== undefined) {
99
+ return {
100
+ stepId: running[0], what: 'lease', deadlineMs: running[1].lease_deadline_ms, graceMs: LEASE_SWEEP_GRACE_MS,
101
+ };
102
+ }
103
+ const worker = ([, step]) => step.type !== 'deterministic';
104
+ if (steps.some(entry => worker(entry) && entry[1].state === 'runnable'))
105
+ return 'parked';
106
+ const backoff = steps.find(([, step]) => step.state === 'backoff');
107
+ if (backoff === undefined)
108
+ return undefined;
109
+ const wakeAtMs = (await readChildJournal(journal, runId))
110
+ .map(entry => retryWake(entry, backoff[0]))
111
+ .filter((value) => value !== undefined)
112
+ .at(-1);
113
+ if (wakeAtMs === undefined)
114
+ return undefined;
115
+ if (wakeAtMs <= Date.now())
116
+ return worker(backoff) ? 'parked' : undefined;
117
+ return { stepId: backoff[0], what: 'retry backoff', deadlineMs: wakeAtMs, graceMs: 0 };
118
+ }
119
+ function retryWake(entry, stepId) {
120
+ if (typeof entry !== 'object' || entry === null)
121
+ return undefined;
122
+ const { entry_type: type, step_id: step, payload } = entry;
123
+ if (type !== 'sleep.until' || step !== stepId || typeof payload !== 'object' || payload === null)
124
+ return undefined;
125
+ const wakeAtMs = payload['wake_at_ms'];
126
+ return typeof wakeAtMs === 'number' && Number.isFinite(wakeAtMs) ? wakeAtMs : undefined;
127
+ }
128
+ //# sourceMappingURL=authored-child-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authored-child-run.js","sourceRoot":"","sources":["../src/authored-child-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAI3D,iFAAiF;AACjF,MAAM,IAAI,GAAG,KAAK,CAAC;AACnB,MAAM,OAAO,GAAG,EAAE,CAAC;AACnB,4EAA4E;AAC5E,uEAAuE;AACvE,yEAAyE;AACzE,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAsB,EAAE,KAAa;IAC1E,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACpE,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QACrB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI;YAAE,OAAO,GAAG,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAkC,CAAC;QAC7D,IAAI,OAAO,IAAI,EAAE,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;YAC3F,MAAM,IAAI,KAAK,CAAC,+CAA+C,KAAK,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAsB,EACtB,KAAa,EACb,MAAoB;IAEpB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,MAAM,EAAE,OAAO,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,gBAAgB,CAAC,CAAC;QAC/F,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;QAC5F,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;QAClD,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrG,IAAI,QAAQ,KAAK,SAAS,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAC9C,SAAS,GAAG,CAAC,CAAC;YACd,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QACD,oEAAoE;QACpE,0EAA0E;QAC1E,0EAA0E;QAC1E,wEAAwE;QACxE,IAAI,QAAQ,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,WAAW,QAAQ,CAAC,MAAM,oBAAoB;kBAC7E,KAAK,QAAQ,CAAC,UAAU,qCAAqC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,SAAS,IAAI,cAAc;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;QACxD,SAAS,IAAI,CAAC,CAAC;QACf,MAAM,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AASD;;;;;;;;;;GAUG;AACH,KAAK,UAAU,gBAAgB,CAC7B,OAAsB,EACtB,KAAa,EACb,QAAsB;IAEtB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC;IAC3G,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAkB,EAAE,OAAO,EAAE,oBAAoB;SAC5G,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAA6B,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC;IACvF,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IACnE,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,QAAQ,GAAG,CAAC,MAAM,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACtD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;SAC1C,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;SACvD,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACV,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,MAAc;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAgC,CAAC;IACtF,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnH,MAAM,QAAQ,GAAI,OAAmC,CAAC,YAAY,CAAC,CAAC;IACpE,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC"}