@exaudeus/workrail 1.4.0 → 1.5.1

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 (168) hide show
  1. package/dist/manifest.json +464 -200
  2. package/dist/mcp/handlers/v2-advance-core/event-builders.d.ts +37 -0
  3. package/dist/mcp/handlers/v2-advance-core/event-builders.js +114 -0
  4. package/dist/mcp/handlers/v2-advance-core/index.d.ts +67 -0
  5. package/dist/mcp/handlers/v2-advance-core/index.js +100 -0
  6. package/dist/mcp/handlers/v2-advance-core/input-validation.d.ts +44 -0
  7. package/dist/mcp/handlers/v2-advance-core/input-validation.js +58 -0
  8. package/dist/mcp/handlers/v2-advance-core/outcome-blocked.d.ts +16 -0
  9. package/dist/mcp/handlers/v2-advance-core/outcome-blocked.js +64 -0
  10. package/dist/mcp/handlers/v2-advance-core/outcome-success.d.ts +15 -0
  11. package/dist/mcp/handlers/v2-advance-core/outcome-success.js +136 -0
  12. package/dist/mcp/handlers/v2-advance-core.d.ts +3 -45
  13. package/dist/mcp/handlers/v2-advance-core.js +3 -431
  14. package/dist/mcp/handlers/v2-advance-events.d.ts +61 -0
  15. package/dist/mcp/handlers/v2-advance-events.js +126 -0
  16. package/dist/mcp/handlers/v2-checkpoint.js +5 -4
  17. package/dist/mcp/handlers/v2-context-budget.js +2 -2
  18. package/dist/mcp/handlers/v2-execution/advance.d.ts +32 -0
  19. package/dist/mcp/handlers/v2-execution/advance.js +50 -0
  20. package/dist/mcp/handlers/v2-execution/continue-advance.d.ts +29 -0
  21. package/dist/mcp/handlers/v2-execution/continue-advance.js +170 -0
  22. package/dist/mcp/handlers/v2-execution/continue-rehydrate.d.ts +22 -0
  23. package/dist/mcp/handlers/v2-execution/continue-rehydrate.js +146 -0
  24. package/dist/mcp/handlers/v2-execution/index.d.ts +23 -0
  25. package/dist/mcp/handlers/v2-execution/index.js +113 -0
  26. package/dist/mcp/handlers/v2-execution/replay.d.ts +55 -0
  27. package/dist/mcp/handlers/v2-execution/replay.js +227 -0
  28. package/dist/mcp/handlers/v2-execution/start.d.ts +52 -0
  29. package/dist/mcp/handlers/v2-execution/start.js +350 -0
  30. package/dist/mcp/handlers/v2-execution-helpers.d.ts +23 -0
  31. package/dist/mcp/handlers/v2-execution-helpers.js +42 -1
  32. package/dist/mcp/handlers/v2-execution.d.ts +1 -23
  33. package/dist/mcp/handlers/v2-execution.js +5 -898
  34. package/dist/mcp/handlers/v2-resume.d.ts +8 -0
  35. package/dist/mcp/handlers/v2-resume.js +70 -0
  36. package/dist/mcp/handlers/v2-state-conversion.d.ts +0 -5
  37. package/dist/mcp/handlers/v2-state-conversion.js +2 -21
  38. package/dist/mcp/handlers/v2-token-ops.d.ts +1 -1
  39. package/dist/mcp/handlers/v2-workflow.js +76 -64
  40. package/dist/mcp/output-schemas.d.ts +40 -0
  41. package/dist/mcp/output-schemas.js +17 -1
  42. package/dist/mcp/server.js +12 -0
  43. package/dist/mcp/tool-descriptions.js +22 -0
  44. package/dist/mcp/tools.js +6 -0
  45. package/dist/mcp/types/tool-description-types.d.ts +1 -1
  46. package/dist/mcp/types/tool-description-types.js +1 -0
  47. package/dist/mcp/types/workflow-tool-edition.d.ts +1 -1
  48. package/dist/mcp/types.d.ts +6 -0
  49. package/dist/mcp/v2/tool-registry.js +8 -0
  50. package/dist/mcp/v2/tools.d.ts +15 -0
  51. package/dist/mcp/v2/tools.js +8 -1
  52. package/dist/v2/durable-core/constants.d.ts +60 -0
  53. package/dist/v2/durable-core/constants.js +55 -1
  54. package/dist/v2/durable-core/domain/ack-advance-append-plan.d.ts +23 -13
  55. package/dist/v2/durable-core/domain/ack-advance-append-plan.js +160 -113
  56. package/dist/v2/durable-core/domain/blocked-node-builder.js +8 -2
  57. package/dist/v2/durable-core/domain/blocking-decision.d.ts +2 -0
  58. package/dist/v2/durable-core/domain/blocking-decision.js +29 -12
  59. package/dist/v2/durable-core/domain/bundle-builder.d.ts +1 -0
  60. package/dist/v2/durable-core/domain/bundle-builder.js +1 -1
  61. package/dist/v2/durable-core/domain/bundle-validator.js +3 -2
  62. package/dist/v2/durable-core/domain/decision-trace-builder.js +7 -9
  63. package/dist/v2/durable-core/domain/function-definition-expander.js +1 -3
  64. package/dist/v2/durable-core/domain/gap-builder.js +2 -1
  65. package/dist/v2/durable-core/domain/observation-builder.js +2 -1
  66. package/dist/v2/durable-core/domain/outputs.d.ts +2 -1
  67. package/dist/v2/durable-core/domain/outputs.js +3 -2
  68. package/dist/v2/durable-core/domain/reason-model.d.ts +1 -1
  69. package/dist/v2/durable-core/domain/reason-model.js +4 -9
  70. package/dist/v2/durable-core/domain/validation-criteria-validator.js +2 -2
  71. package/dist/v2/durable-core/domain/validation-event-builder.js +4 -6
  72. package/dist/v2/durable-core/domain/validation-loader.js +2 -1
  73. package/dist/v2/durable-core/domain/validation-requirements-extractor.js +12 -18
  74. package/dist/v2/durable-core/encoding/base32-lower.d.ts +13 -1
  75. package/dist/v2/durable-core/encoding/base32-lower.js +13 -3
  76. package/dist/v2/durable-core/encoding/hex-to-bytes.d.ts +6 -0
  77. package/dist/v2/durable-core/encoding/hex-to-bytes.js +19 -0
  78. package/dist/v2/durable-core/ids/attempt-id-derivation.d.ts +6 -1
  79. package/dist/v2/durable-core/ids/attempt-id-derivation.js +9 -19
  80. package/dist/v2/durable-core/ids/event-ids.d.ts +9 -0
  81. package/dist/v2/durable-core/ids/event-ids.js +18 -0
  82. package/dist/v2/durable-core/ids/index.d.ts +13 -33
  83. package/dist/v2/durable-core/ids/index.js +22 -63
  84. package/dist/v2/durable-core/ids/session-ids.d.ts +9 -0
  85. package/dist/v2/durable-core/ids/session-ids.js +18 -0
  86. package/dist/v2/durable-core/ids/snapshot-ids.d.ts +6 -0
  87. package/dist/v2/durable-core/ids/snapshot-ids.js +10 -0
  88. package/dist/v2/durable-core/ids/token-ids.d.ts +3 -0
  89. package/dist/v2/durable-core/ids/token-ids.js +6 -0
  90. package/dist/v2/durable-core/ids/workflow-hash-ref.d.ts +3 -0
  91. package/dist/v2/durable-core/ids/workflow-hash-ref.js +5 -4
  92. package/dist/v2/durable-core/ids/workflow-ids.d.ts +11 -0
  93. package/dist/v2/durable-core/ids/workflow-ids.js +21 -0
  94. package/dist/v2/durable-core/lib/utf8-byte-length.d.ts +1 -0
  95. package/dist/v2/durable-core/lib/utf8-byte-length.js +6 -0
  96. package/dist/v2/durable-core/schemas/artifacts/loop-control.js +2 -1
  97. package/dist/v2/durable-core/schemas/execution-snapshot/blocked-snapshot.d.ts +24 -24
  98. package/dist/v2/durable-core/schemas/execution-snapshot/blocked-snapshot.js +5 -7
  99. package/dist/v2/durable-core/schemas/execution-snapshot/execution-snapshot.v1.d.ts +180 -180
  100. package/dist/v2/durable-core/schemas/export-bundle/index.d.ts +282 -287
  101. package/dist/v2/durable-core/schemas/export-bundle/index.js +0 -8
  102. package/dist/v2/durable-core/schemas/lib/dedupe-key.d.ts +9 -1
  103. package/dist/v2/durable-core/schemas/lib/dedupe-key.js +4 -3
  104. package/dist/v2/durable-core/schemas/lib/utf8-byte-length.d.ts +1 -0
  105. package/dist/v2/durable-core/schemas/lib/utf8-byte-length.js +6 -0
  106. package/dist/v2/durable-core/schemas/session/blockers.d.ts +305 -0
  107. package/dist/v2/durable-core/schemas/session/blockers.js +80 -0
  108. package/dist/v2/durable-core/schemas/session/dag-topology.d.ts +77 -0
  109. package/dist/v2/durable-core/schemas/session/dag-topology.js +45 -0
  110. package/dist/v2/durable-core/schemas/session/events.d.ts +36 -36
  111. package/dist/v2/durable-core/schemas/session/events.js +11 -182
  112. package/dist/v2/durable-core/schemas/session/gaps.d.ts +211 -0
  113. package/dist/v2/durable-core/schemas/session/gaps.js +37 -0
  114. package/dist/v2/durable-core/schemas/session/outputs.d.ts +148 -0
  115. package/dist/v2/durable-core/schemas/session/outputs.js +44 -0
  116. package/dist/v2/durable-core/schemas/session/validation-event.js +5 -7
  117. package/dist/v2/durable-core/tokens/token-codec.d.ts +1 -18
  118. package/dist/v2/durable-core/tokens/token-codec.js +0 -67
  119. package/dist/v2/durable-core/tokens/token-signer.d.ts +1 -8
  120. package/dist/v2/durable-core/tokens/token-signer.js +0 -43
  121. package/dist/v2/infra/local/base32/index.js +1 -23
  122. package/dist/v2/infra/local/bech32m/index.js +1 -1
  123. package/dist/v2/infra/local/data-dir/index.d.ts +7 -6
  124. package/dist/v2/infra/local/data-dir/index.js +3 -3
  125. package/dist/v2/infra/local/directory-listing/index.d.ts +8 -0
  126. package/dist/v2/infra/local/directory-listing/index.js +18 -0
  127. package/dist/v2/infra/local/fs/index.d.ts +1 -0
  128. package/dist/v2/infra/local/fs/index.js +3 -0
  129. package/dist/v2/infra/local/session-store/index.js +198 -182
  130. package/dist/v2/infra/local/session-summary-provider/index.d.ts +18 -0
  131. package/dist/v2/infra/local/session-summary-provider/index.js +144 -0
  132. package/dist/v2/infra/local/snapshot-store/index.js +2 -2
  133. package/dist/v2/ports/data-dir.port.d.ts +7 -6
  134. package/dist/v2/ports/directory-listing.port.d.ts +5 -0
  135. package/dist/v2/ports/directory-listing.port.js +2 -0
  136. package/dist/v2/ports/fs.port.d.ts +19 -7
  137. package/dist/v2/ports/session-event-log-store.port.d.ts +5 -2
  138. package/dist/v2/ports/session-summary-provider.port.d.ts +9 -0
  139. package/dist/v2/ports/session-summary-provider.port.js +2 -0
  140. package/dist/v2/projections/advance-outcomes.d.ts +1 -7
  141. package/dist/v2/projections/advance-outcomes.js +2 -1
  142. package/dist/v2/projections/artifacts.js +3 -2
  143. package/dist/v2/projections/capabilities.d.ts +1 -7
  144. package/dist/v2/projections/capabilities.js +2 -1
  145. package/dist/v2/projections/gaps.d.ts +1 -7
  146. package/dist/v2/projections/gaps.js +2 -1
  147. package/dist/v2/projections/node-outputs.d.ts +1 -7
  148. package/dist/v2/projections/node-outputs.js +4 -3
  149. package/dist/v2/projections/preferences.d.ts +1 -7
  150. package/dist/v2/projections/preferences.js +2 -1
  151. package/dist/v2/projections/projection-error.d.ts +7 -0
  152. package/dist/v2/projections/projection-error.js +2 -0
  153. package/dist/v2/projections/resume-ranking.d.ts +62 -0
  154. package/dist/v2/projections/resume-ranking.js +105 -0
  155. package/dist/v2/projections/run-context.d.ts +1 -7
  156. package/dist/v2/projections/run-context.js +4 -2
  157. package/dist/v2/projections/run-dag.d.ts +9 -9
  158. package/dist/v2/projections/run-dag.js +88 -65
  159. package/dist/v2/projections/run-status-signals.d.ts +1 -7
  160. package/dist/v2/projections/run-status-signals.js +3 -2
  161. package/dist/v2/usecases/enumerate-sessions.d.ts +9 -0
  162. package/dist/v2/usecases/enumerate-sessions.js +13 -0
  163. package/dist/v2/usecases/execution-session-gate.js +2 -5
  164. package/dist/v2/usecases/export-session.js +4 -2
  165. package/dist/v2/usecases/import-session.d.ts +3 -3
  166. package/dist/v2/usecases/resume-session.d.ts +4 -0
  167. package/dist/v2/usecases/resume-session.js +9 -0
  168. package/package.json +1 -1
@@ -5,6 +5,8 @@ export declare const MAX_DECISION_TRACE_ENTRIES = 25;
5
5
  export declare const MAX_DECISION_TRACE_ENTRY_SUMMARY_BYTES = 512;
6
6
  export declare const MAX_DECISION_TRACE_TOTAL_BYTES = 8192;
7
7
  export declare const MAX_OUTPUT_NOTES_MARKDOWN_BYTES = 4096;
8
+ export declare const MAX_VALIDATION_ISSUE_ITEM_BYTES = 512;
9
+ export declare const MAX_VALIDATION_SUGGESTION_ITEM_BYTES = 1024;
8
10
  export declare const MAX_VALIDATION_ISSUES_BYTES = 4096;
9
11
  export declare const MAX_VALIDATION_SUGGESTIONS_BYTES = 4096;
10
12
  export declare const MAX_CONTEXT_BYTES: number;
@@ -16,3 +18,61 @@ export declare const TRUNCATION_MARKER = "\n\n[TRUNCATED]";
16
18
  export declare const RECOVERY_BUDGET_BYTES = 12288;
17
19
  export declare const SHA256_DIGEST_PATTERN: RegExp;
18
20
  export declare const DELIMITER_SAFE_ID_PATTERN: RegExp;
21
+ export declare const EVENT_KIND: {
22
+ readonly SESSION_CREATED: "session_created";
23
+ readonly OBSERVATION_RECORDED: "observation_recorded";
24
+ readonly RUN_STARTED: "run_started";
25
+ readonly NODE_CREATED: "node_created";
26
+ readonly EDGE_CREATED: "edge_created";
27
+ readonly ADVANCE_RECORDED: "advance_recorded";
28
+ readonly VALIDATION_PERFORMED: "validation_performed";
29
+ readonly NODE_OUTPUT_APPENDED: "node_output_appended";
30
+ readonly PREFERENCES_CHANGED: "preferences_changed";
31
+ readonly CAPABILITY_OBSERVED: "capability_observed";
32
+ readonly GAP_RECORDED: "gap_recorded";
33
+ readonly CONTEXT_SET: "context_set";
34
+ readonly DIVERGENCE_RECORDED: "divergence_recorded";
35
+ readonly DECISION_TRACE_APPENDED: "decision_trace_appended";
36
+ };
37
+ export type EventKindV1 = typeof EVENT_KIND[keyof typeof EVENT_KIND];
38
+ export declare const OUTPUT_CHANNEL: {
39
+ readonly RECAP: "recap";
40
+ readonly ARTIFACT: "artifact";
41
+ };
42
+ export type OutputChannelV1 = typeof OUTPUT_CHANNEL[keyof typeof OUTPUT_CHANNEL];
43
+ export declare const EDGE_KIND: {
44
+ readonly ACKED_STEP: "acked_step";
45
+ readonly CHECKPOINT: "checkpoint";
46
+ };
47
+ export type EdgeKindV1 = typeof EDGE_KIND[keyof typeof EDGE_KIND];
48
+ export declare const ENGINE_STATE: {
49
+ readonly INIT: "init";
50
+ readonly RUNNING: "running";
51
+ readonly BLOCKED: "blocked";
52
+ readonly COMPLETE: "complete";
53
+ };
54
+ export type EngineStateKindV1 = typeof ENGINE_STATE[keyof typeof ENGINE_STATE];
55
+ export declare const ADVANCE_OUTCOME: {
56
+ readonly ADVANCED: "advanced";
57
+ readonly BLOCKED: "blocked";
58
+ };
59
+ export declare const EDGE_CAUSE: {
60
+ readonly INTENTIONAL_FORK: "intentional_fork";
61
+ readonly NON_TIP_ADVANCE: "non_tip_advance";
62
+ readonly IDEMPOTENT_REPLAY: "idempotent_replay";
63
+ readonly CHECKPOINT_CREATED: "checkpoint_created";
64
+ };
65
+ export type EdgeCauseKindV1 = typeof EDGE_CAUSE[keyof typeof EDGE_CAUSE];
66
+ export declare const MANIFEST_KIND: {
67
+ readonly SEGMENT_CLOSED: "segment_closed";
68
+ readonly SNAPSHOT_PINNED: "snapshot_pinned";
69
+ };
70
+ export declare const ADVANCE_INTENT: {
71
+ readonly ACK_PENDING: "ack_pending";
72
+ };
73
+ export declare const AUTONOMY_MODE: {
74
+ readonly GUIDED: "guided";
75
+ readonly FULL_AUTO_NEVER_STOP: "full_auto_never_stop";
76
+ readonly FULL_AUTO_STOP_ON_USER_DEPS: "full_auto_stop_on_user_deps";
77
+ };
78
+ export type AutonomyModeV1 = typeof AUTONOMY_MODE[keyof typeof AUTONOMY_MODE];
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DELIMITER_SAFE_ID_PATTERN = exports.SHA256_DIGEST_PATTERN = exports.RECOVERY_BUDGET_BYTES = exports.TRUNCATION_MARKER = exports.DEFAULT_RETRY_AFTER_MS = exports.SESSION_LOCK_RETRY_AFTER_MS = exports.MAX_OBSERVATION_SHORT_STRING_LENGTH = exports.MAX_CONTEXT_DEPTH = exports.MAX_CONTEXT_BYTES = exports.MAX_VALIDATION_SUGGESTIONS_BYTES = exports.MAX_VALIDATION_ISSUES_BYTES = exports.MAX_OUTPUT_NOTES_MARKDOWN_BYTES = exports.MAX_DECISION_TRACE_TOTAL_BYTES = exports.MAX_DECISION_TRACE_ENTRY_SUMMARY_BYTES = exports.MAX_DECISION_TRACE_ENTRIES = exports.MAX_BLOCKER_SUGGESTED_FIX_BYTES = exports.MAX_BLOCKER_MESSAGE_BYTES = exports.MAX_BLOCKERS = void 0;
3
+ exports.AUTONOMY_MODE = exports.ADVANCE_INTENT = exports.MANIFEST_KIND = exports.EDGE_CAUSE = exports.ADVANCE_OUTCOME = exports.ENGINE_STATE = exports.EDGE_KIND = exports.OUTPUT_CHANNEL = exports.EVENT_KIND = exports.DELIMITER_SAFE_ID_PATTERN = exports.SHA256_DIGEST_PATTERN = exports.RECOVERY_BUDGET_BYTES = exports.TRUNCATION_MARKER = exports.DEFAULT_RETRY_AFTER_MS = exports.SESSION_LOCK_RETRY_AFTER_MS = exports.MAX_OBSERVATION_SHORT_STRING_LENGTH = exports.MAX_CONTEXT_DEPTH = exports.MAX_CONTEXT_BYTES = exports.MAX_VALIDATION_SUGGESTIONS_BYTES = exports.MAX_VALIDATION_ISSUES_BYTES = exports.MAX_VALIDATION_SUGGESTION_ITEM_BYTES = exports.MAX_VALIDATION_ISSUE_ITEM_BYTES = exports.MAX_OUTPUT_NOTES_MARKDOWN_BYTES = exports.MAX_DECISION_TRACE_TOTAL_BYTES = exports.MAX_DECISION_TRACE_ENTRY_SUMMARY_BYTES = exports.MAX_DECISION_TRACE_ENTRIES = exports.MAX_BLOCKER_SUGGESTED_FIX_BYTES = exports.MAX_BLOCKER_MESSAGE_BYTES = exports.MAX_BLOCKERS = void 0;
4
4
  exports.MAX_BLOCKERS = 10;
5
5
  exports.MAX_BLOCKER_MESSAGE_BYTES = 512;
6
6
  exports.MAX_BLOCKER_SUGGESTED_FIX_BYTES = 1024;
@@ -8,6 +8,8 @@ exports.MAX_DECISION_TRACE_ENTRIES = 25;
8
8
  exports.MAX_DECISION_TRACE_ENTRY_SUMMARY_BYTES = 512;
9
9
  exports.MAX_DECISION_TRACE_TOTAL_BYTES = 8192;
10
10
  exports.MAX_OUTPUT_NOTES_MARKDOWN_BYTES = 4096;
11
+ exports.MAX_VALIDATION_ISSUE_ITEM_BYTES = 512;
12
+ exports.MAX_VALIDATION_SUGGESTION_ITEM_BYTES = 1024;
11
13
  exports.MAX_VALIDATION_ISSUES_BYTES = 4096;
12
14
  exports.MAX_VALIDATION_SUGGESTIONS_BYTES = 4096;
13
15
  exports.MAX_CONTEXT_BYTES = 256 * 1024;
@@ -19,3 +21,55 @@ exports.TRUNCATION_MARKER = '\n\n[TRUNCATED]';
19
21
  exports.RECOVERY_BUDGET_BYTES = 12288;
20
22
  exports.SHA256_DIGEST_PATTERN = /^sha256:[0-9a-f]{64}$/;
21
23
  exports.DELIMITER_SAFE_ID_PATTERN = /^[a-z0-9_-]+$/;
24
+ exports.EVENT_KIND = {
25
+ SESSION_CREATED: 'session_created',
26
+ OBSERVATION_RECORDED: 'observation_recorded',
27
+ RUN_STARTED: 'run_started',
28
+ NODE_CREATED: 'node_created',
29
+ EDGE_CREATED: 'edge_created',
30
+ ADVANCE_RECORDED: 'advance_recorded',
31
+ VALIDATION_PERFORMED: 'validation_performed',
32
+ NODE_OUTPUT_APPENDED: 'node_output_appended',
33
+ PREFERENCES_CHANGED: 'preferences_changed',
34
+ CAPABILITY_OBSERVED: 'capability_observed',
35
+ GAP_RECORDED: 'gap_recorded',
36
+ CONTEXT_SET: 'context_set',
37
+ DIVERGENCE_RECORDED: 'divergence_recorded',
38
+ DECISION_TRACE_APPENDED: 'decision_trace_appended',
39
+ };
40
+ exports.OUTPUT_CHANNEL = {
41
+ RECAP: 'recap',
42
+ ARTIFACT: 'artifact',
43
+ };
44
+ exports.EDGE_KIND = {
45
+ ACKED_STEP: 'acked_step',
46
+ CHECKPOINT: 'checkpoint',
47
+ };
48
+ exports.ENGINE_STATE = {
49
+ INIT: 'init',
50
+ RUNNING: 'running',
51
+ BLOCKED: 'blocked',
52
+ COMPLETE: 'complete',
53
+ };
54
+ exports.ADVANCE_OUTCOME = {
55
+ ADVANCED: 'advanced',
56
+ BLOCKED: 'blocked',
57
+ };
58
+ exports.EDGE_CAUSE = {
59
+ INTENTIONAL_FORK: 'intentional_fork',
60
+ NON_TIP_ADVANCE: 'non_tip_advance',
61
+ IDEMPOTENT_REPLAY: 'idempotent_replay',
62
+ CHECKPOINT_CREATED: 'checkpoint_created',
63
+ };
64
+ exports.MANIFEST_KIND = {
65
+ SEGMENT_CLOSED: 'segment_closed',
66
+ SNAPSHOT_PINNED: 'snapshot_pinned',
67
+ };
68
+ exports.ADVANCE_INTENT = {
69
+ ACK_PENDING: 'ack_pending',
70
+ };
71
+ exports.AUTONOMY_MODE = {
72
+ GUIDED: 'guided',
73
+ FULL_AUTO_NEVER_STOP: 'full_auto_never_stop',
74
+ FULL_AUTO_STOP_ON_USER_DEPS: 'full_auto_stop_on_user_deps',
75
+ };
@@ -2,31 +2,41 @@ import type { DomainEventV1 } from '../schemas/session/index.js';
2
2
  import { type OutputToAppend } from './outputs.js';
3
3
  import { type Result } from 'neverthrow';
4
4
  import type { SnapshotRef, WorkflowHash } from '../ids/index.js';
5
- type AdvanceOutcomeV1 = Extract<DomainEventV1, {
6
- kind: 'advance_recorded';
7
- }>['data']['outcome'];
8
5
  type EventToAppendV1 = Omit<DomainEventV1, 'eventIndex' | 'sessionId'>;
9
- export declare function buildAckAdvanceAppendPlanV1(args: {
6
+ export type AckAdvanceAppendPlanArgs = {
10
7
  readonly sessionId: string;
11
8
  readonly runId: string;
12
9
  readonly fromNodeId: string;
13
10
  readonly workflowHash: WorkflowHash;
14
11
  readonly attemptId: string;
15
12
  readonly nextEventIndex: number;
16
- readonly outcome?: AdvanceOutcomeV1;
17
13
  readonly extraEventsToAppend?: readonly EventToAppendV1[];
18
- readonly toNodeId?: string;
19
- readonly toNodeKind?: 'step' | 'blocked_attempt';
20
- readonly snapshotRef?: SnapshotRef;
21
- readonly causeKind?: 'intentional_fork' | 'non_tip_advance';
14
+ } & ({
15
+ readonly outcome: {
16
+ kind: 'blocked';
17
+ blockers: import('./reason-model.js').BlockerReportV1;
18
+ };
19
+ readonly minted: {
20
+ readonly advanceRecordedEventId: string;
21
+ };
22
+ } | {
23
+ readonly outcome: {
24
+ kind: 'advanced';
25
+ toNodeId: string;
26
+ };
27
+ readonly toNodeKind: 'step' | 'blocked_attempt';
28
+ readonly toNodeId: string;
29
+ readonly snapshotRef: SnapshotRef;
30
+ readonly causeKind: 'intentional_fork' | 'non_tip_advance';
22
31
  readonly minted: {
23
32
  readonly advanceRecordedEventId: string;
24
- readonly nodeCreatedEventId?: string;
25
- readonly edgeCreatedEventId?: string;
26
- readonly outputEventIds?: readonly string[];
33
+ readonly nodeCreatedEventId: string;
34
+ readonly edgeCreatedEventId: string;
35
+ readonly outputEventIds: readonly string[];
27
36
  };
28
37
  readonly outputsToAppend?: readonly OutputToAppend[];
29
- }): Result<{
38
+ });
39
+ export declare function buildAckAdvanceAppendPlanV1(args: AckAdvanceAppendPlanArgs): Result<{
30
40
  readonly events: readonly DomainEventV1[];
31
41
  readonly snapshotPins: readonly {
32
42
  snapshotRef: SnapshotRef;
@@ -3,157 +3,204 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.buildAckAdvanceAppendPlanV1 = buildAckAdvanceAppendPlanV1;
4
4
  const outputs_js_1 = require("./outputs.js");
5
5
  const neverthrow_1 = require("neverthrow");
6
- function buildAckAdvanceAppendPlanV1(args) {
7
- const { sessionId, runId, fromNodeId, workflowHash, attemptId, nextEventIndex, minted, outputsToAppend, extraEventsToAppend, } = args;
8
- const outcome = args.outcome ??
9
- (args.toNodeId
10
- ? { kind: 'advanced', toNodeId: args.toNodeId }
11
- :
12
- (() => {
13
- throw new Error('INVARIANT: buildAckAdvanceAppendPlanV1 requires toNodeId when outcome is omitted');
14
- })());
15
- const advanceDedupeKey = `advance_recorded:${sessionId}:${fromNodeId}:${attemptId}`;
16
- const advanceRecorded = {
6
+ const constants_js_1 = require("../constants.js");
7
+ function buildAdvanceRecordedEvent(args) {
8
+ const advanceDedupeKey = `advance_recorded:${args.sessionId}:${args.fromNodeId}:${args.attemptId}`;
9
+ return {
17
10
  v: 1,
18
- eventId: minted.advanceRecordedEventId,
19
- eventIndex: nextEventIndex,
20
- sessionId,
21
- kind: 'advance_recorded',
11
+ eventId: args.eventId,
12
+ eventIndex: args.eventIndex,
13
+ sessionId: args.sessionId,
14
+ kind: constants_js_1.EVENT_KIND.ADVANCE_RECORDED,
22
15
  dedupeKey: advanceDedupeKey,
23
- scope: { runId, nodeId: fromNodeId },
16
+ scope: { runId: args.runId, nodeId: args.fromNodeId },
17
+ data: {
18
+ attemptId: args.attemptId,
19
+ intent: constants_js_1.ADVANCE_INTENT.ACK_PENDING,
20
+ outcome: args.outcome,
21
+ },
22
+ };
23
+ }
24
+ function buildNodeCreatedEvent(args) {
25
+ return {
26
+ v: 1,
27
+ eventId: args.eventId,
28
+ eventIndex: args.eventIndex,
29
+ sessionId: args.sessionId,
30
+ kind: constants_js_1.EVENT_KIND.NODE_CREATED,
31
+ dedupeKey: `node_created:${args.sessionId}:${args.runId}:${args.toNodeId}`,
32
+ scope: { runId: args.runId, nodeId: args.toNodeId },
33
+ data: {
34
+ nodeKind: args.toNodeKind,
35
+ parentNodeId: args.fromNodeId,
36
+ workflowHash: args.workflowHash,
37
+ snapshotRef: args.snapshotRef,
38
+ },
39
+ };
40
+ }
41
+ function buildEdgeCreatedEvent(args) {
42
+ return {
43
+ v: 1,
44
+ eventId: args.eventId,
45
+ eventIndex: args.eventIndex,
46
+ sessionId: args.sessionId,
47
+ kind: constants_js_1.EVENT_KIND.EDGE_CREATED,
48
+ dedupeKey: `edge_created:${args.sessionId}:${args.runId}:${args.fromNodeId}->${args.toNodeId}:acked_step`,
49
+ scope: { runId: args.runId },
24
50
  data: {
25
- attemptId,
26
- intent: 'ack_pending',
27
- outcome,
51
+ edgeKind: constants_js_1.EDGE_KIND.ACKED_STEP,
52
+ fromNodeId: args.fromNodeId,
53
+ toNodeId: args.toNodeId,
54
+ cause: { kind: args.causeKind, eventId: args.causeEventId },
28
55
  },
29
56
  };
57
+ }
58
+ function buildOutputEvents(args) {
59
+ const normalizedOutputs = (0, outputs_js_1.normalizeOutputsForAppend)(args.outputs);
60
+ if (args.outputEventIds.length !== normalizedOutputs.length) {
61
+ return (0, neverthrow_1.err)({
62
+ code: 'INVARIANT_VIOLATION',
63
+ message: 'outputEventIds length mismatch (caller must supply exactly one eventId per output event)',
64
+ });
65
+ }
66
+ const outputEvents = normalizedOutputs.map((o, idx) => {
67
+ const base = {
68
+ v: 1,
69
+ eventId: args.outputEventIds[idx],
70
+ eventIndex: args.startEventIndex + idx,
71
+ sessionId: args.sessionId,
72
+ kind: constants_js_1.EVENT_KIND.NODE_OUTPUT_APPENDED,
73
+ dedupeKey: `node_output_appended:${args.sessionId}:${o.outputId}`,
74
+ scope: { runId: args.runId, nodeId: args.fromNodeId },
75
+ data: {
76
+ outputId: o.outputId,
77
+ outputChannel: o.outputChannel,
78
+ payload: o.payload,
79
+ },
80
+ };
81
+ return o.supersedesOutputId
82
+ ? {
83
+ ...base,
84
+ data: { ...base.data, supersedesOutputId: o.supersedesOutputId },
85
+ }
86
+ : base;
87
+ });
88
+ return (0, neverthrow_1.ok)(outputEvents);
89
+ }
90
+ function processExtraEvents(extraEventsToAppend, sessionId, startEventIndex) {
30
91
  const extra = [];
31
92
  if (extraEventsToAppend && extraEventsToAppend.length > 0) {
32
93
  for (let i = 0; i < extraEventsToAppend.length; i++) {
33
94
  const raw = extraEventsToAppend[i];
34
95
  if ('eventIndex' in raw) {
35
- return (0, neverthrow_1.err)({ code: 'INVARIANT_VIOLATION', message: 'extraEventsToAppend must not include eventIndex (assigned by append plan builder)' });
96
+ return (0, neverthrow_1.err)({
97
+ code: 'INVARIANT_VIOLATION',
98
+ message: 'extraEventsToAppend must not include eventIndex (assigned by append plan builder)'
99
+ });
36
100
  }
37
101
  if ('sessionId' in raw) {
38
- return (0, neverthrow_1.err)({ code: 'INVARIANT_VIOLATION', message: 'extraEventsToAppend must not include sessionId (assigned by append plan builder)' });
102
+ return (0, neverthrow_1.err)({
103
+ code: 'INVARIANT_VIOLATION',
104
+ message: 'extraEventsToAppend must not include sessionId (assigned by append plan builder)'
105
+ });
39
106
  }
40
107
  extra.push({
41
108
  ...extraEventsToAppend[i],
42
109
  sessionId,
43
- eventIndex: nextEventIndex + 1 + i,
110
+ eventIndex: startEventIndex + i,
44
111
  });
45
112
  }
46
113
  }
114
+ return (0, neverthrow_1.ok)(extra);
115
+ }
116
+ function buildAckAdvanceAppendPlanV1(args) {
117
+ const { sessionId, runId, fromNodeId, workflowHash, attemptId, nextEventIndex, minted, extraEventsToAppend, outcome, } = args;
118
+ const advanceRecorded = buildAdvanceRecordedEvent({
119
+ sessionId,
120
+ runId,
121
+ fromNodeId,
122
+ attemptId,
123
+ eventIndex: nextEventIndex,
124
+ eventId: minted.advanceRecordedEventId,
125
+ outcome,
126
+ });
127
+ const extraResult = processExtraEvents(extraEventsToAppend, sessionId, nextEventIndex + 1);
128
+ if (extraResult.isErr()) {
129
+ return (0, neverthrow_1.err)(extraResult.error);
130
+ }
131
+ const extra = extraResult.value;
47
132
  const nextIndexAfterExtra = nextEventIndex + 1 + extra.length;
48
133
  if (outcome.kind === 'blocked') {
49
- if (typeof console !== 'undefined' && console.warn) {
50
- console.warn('[DEPRECATED] Creating advance_recorded with blocked outcome. ' +
51
- 'Use blocked_attempt nodes instead (see ADR 008). ' +
52
- 'This path will be removed in 2 releases. ' +
53
- 'Set USE_BLOCKED_NODES=true to use the new model.');
54
- }
55
- if (outputsToAppend && outputsToAppend.length > 0) {
56
- return (0, neverthrow_1.err)({
57
- code: 'INVARIANT_VIOLATION',
58
- message: 'blocked outcome cannot include outputsToAppend (no node advancement occurs)',
59
- });
60
- }
61
134
  return (0, neverthrow_1.ok)({
62
135
  events: [advanceRecorded, ...extra],
63
136
  snapshotPins: [],
64
137
  });
65
138
  }
66
- if (!args.toNodeId || !args.snapshotRef || !args.causeKind) {
67
- return (0, neverthrow_1.err)({
68
- code: 'INVARIANT_VIOLATION',
69
- message: 'advanced outcome requires toNodeId + snapshotRef + causeKind',
70
- });
139
+ if (outcome.kind !== 'advanced') {
140
+ const _exhaustive = outcome;
141
+ return (0, neverthrow_1.err)({ code: 'INVARIANT_VIOLATION', message: `Unknown outcome kind` });
71
142
  }
72
- if (!minted.nodeCreatedEventId || !minted.edgeCreatedEventId || !minted.outputEventIds) {
73
- return (0, neverthrow_1.err)({
74
- code: 'INVARIANT_VIOLATION',
75
- message: 'advanced outcome requires minted.nodeCreatedEventId + minted.edgeCreatedEventId + minted.outputEventIds',
76
- });
143
+ if (!('toNodeId' in args) || !('snapshotRef' in args) || !('causeKind' in args) || !('toNodeKind' in args) || !('minted' in args) || !('nodeCreatedEventId' in args.minted)) {
144
+ return (0, neverthrow_1.err)({ code: 'INVARIANT_VIOLATION', message: 'Advanced outcome requires toNodeId, snapshotRef, causeKind, toNodeKind, and minted event IDs' });
77
145
  }
78
- const toNodeId = args.toNodeId;
79
- const snapshotRef = args.snapshotRef;
80
- const causeKind = args.causeKind;
81
- const toNodeKind = args.toNodeKind ?? 'step';
82
- const nodeCreatedEventIndex = nextIndexAfterExtra;
83
- const edgeCreatedEventIndex = nextIndexAfterExtra + 1;
146
+ const advancedArgs = args;
147
+ const toNodeId = advancedArgs.toNodeId;
148
+ const snapshotRef = advancedArgs.snapshotRef;
149
+ const causeKind = advancedArgs.causeKind;
150
+ const toNodeKind = advancedArgs.toNodeKind;
151
+ const outputsToAppend = advancedArgs.outputsToAppend;
152
+ const advancedMinted = advancedArgs.minted;
84
153
  if (toNodeKind !== 'step' && toNodeKind !== 'blocked_attempt') {
85
154
  return (0, neverthrow_1.err)({ code: 'INVARIANT_VIOLATION', message: 'toNodeKind must be step|blocked_attempt' });
86
155
  }
87
- const advancedEvents = [
88
- {
89
- v: 1,
90
- eventId: minted.nodeCreatedEventId,
91
- eventIndex: nodeCreatedEventIndex,
92
- sessionId,
93
- kind: 'node_created',
94
- dedupeKey: `node_created:${sessionId}:${runId}:${toNodeId}`,
95
- scope: { runId, nodeId: toNodeId },
96
- data: {
97
- nodeKind: toNodeKind,
98
- parentNodeId: fromNodeId,
99
- workflowHash,
100
- snapshotRef,
101
- },
102
- },
103
- {
104
- v: 1,
105
- eventId: minted.edgeCreatedEventId,
106
- eventIndex: edgeCreatedEventIndex,
107
- sessionId,
108
- kind: 'edge_created',
109
- dedupeKey: `edge_created:${sessionId}:${runId}:${fromNodeId}->${toNodeId}:acked_step`,
110
- scope: { runId },
111
- data: {
112
- edgeKind: 'acked_step',
113
- fromNodeId,
114
- toNodeId,
115
- cause: { kind: causeKind, eventId: minted.advanceRecordedEventId },
116
- },
117
- },
118
- ];
119
- const normalizedOutputs = (0, outputs_js_1.normalizeOutputsForAppend)(outputsToAppend ?? []);
120
- const outputEventIds = minted.outputEventIds ?? [];
121
- if (outputEventIds.length !== normalizedOutputs.length) {
122
- return (0, neverthrow_1.err)({
123
- code: 'INVARIANT_VIOLATION',
124
- message: 'outputEventIds length mismatch (caller must supply exactly one eventId per output event)',
125
- });
126
- }
127
- const outputEvents = normalizedOutputs.map((o, idx) => {
128
- const base = {
129
- v: 1,
130
- eventId: outputEventIds[idx],
131
- eventIndex: nextIndexAfterExtra + 2 + idx,
132
- sessionId,
133
- kind: 'node_output_appended',
134
- dedupeKey: `node_output_appended:${sessionId}:${o.outputId}`,
135
- scope: { runId, nodeId: fromNodeId },
136
- data: {
137
- outputId: o.outputId,
138
- outputChannel: o.outputChannel,
139
- payload: o.payload,
140
- },
141
- };
142
- return o.supersedesOutputId
143
- ? {
144
- ...base,
145
- data: { ...base.data, supersedesOutputId: o.supersedesOutputId },
146
- }
147
- : base;
156
+ const nodeCreatedEventIndex = nextIndexAfterExtra;
157
+ const edgeCreatedEventIndex = nextIndexAfterExtra + 1;
158
+ const nodeCreated = buildNodeCreatedEvent({
159
+ sessionId,
160
+ runId,
161
+ toNodeId,
162
+ fromNodeId,
163
+ toNodeKind,
164
+ workflowHash,
165
+ snapshotRef,
166
+ eventId: advancedMinted.nodeCreatedEventId,
167
+ eventIndex: nodeCreatedEventIndex,
148
168
  });
149
- const events = [advanceRecorded, ...extra, ...advancedEvents, ...outputEvents];
169
+ const edgeCreated = buildEdgeCreatedEvent({
170
+ sessionId,
171
+ runId,
172
+ fromNodeId,
173
+ toNodeId,
174
+ causeKind,
175
+ causeEventId: minted.advanceRecordedEventId,
176
+ eventId: advancedMinted.edgeCreatedEventId,
177
+ eventIndex: edgeCreatedEventIndex,
178
+ });
179
+ const outputEventsResult = buildOutputEvents({
180
+ outputs: outputsToAppend ?? [],
181
+ outputEventIds: advancedMinted.outputEventIds,
182
+ sessionId,
183
+ runId,
184
+ fromNodeId,
185
+ startEventIndex: nextIndexAfterExtra + 2,
186
+ });
187
+ if (outputEventsResult.isErr()) {
188
+ return (0, neverthrow_1.err)(outputEventsResult.error);
189
+ }
190
+ const events = [
191
+ advanceRecorded,
192
+ ...extra,
193
+ nodeCreated,
194
+ edgeCreated,
195
+ ...outputEventsResult.value,
196
+ ];
150
197
  return (0, neverthrow_1.ok)({
151
198
  events,
152
199
  snapshotPins: [
153
200
  {
154
201
  snapshotRef,
155
202
  eventIndex: nodeCreatedEventIndex,
156
- createdByEventId: minted.nodeCreatedEventId,
203
+ createdByEventId: advancedMinted.nodeCreatedEventId,
157
204
  },
158
205
  ],
159
206
  });
@@ -38,11 +38,17 @@ function toTerminalReason(reason) {
38
38
  function buildBlockedPayload(args) {
39
39
  const retryable = toContractViolationReason(args.primaryReason);
40
40
  if (retryable) {
41
- const retryAttemptId = (0, attempt_id_derivation_js_1.deriveChildAttemptId)(args.attemptId, args.sha256);
41
+ const retryAttemptIdRes = (0, attempt_id_derivation_js_1.deriveChildAttemptId)(args.attemptId, args.sha256);
42
+ if (retryAttemptIdRes.isErr()) {
43
+ return (0, neverthrow_1.err)({
44
+ code: 'BLOCKED_NODE_INVARIANT_VIOLATION',
45
+ message: `Failed to derive retry attemptId: ${retryAttemptIdRes.error.message}`,
46
+ });
47
+ }
42
48
  return (0, neverthrow_1.ok)({
43
49
  kind: 'retryable_block',
44
50
  reason: retryable,
45
- retryAttemptId: String(retryAttemptId),
51
+ retryAttemptId: String(retryAttemptIdRes.value),
46
52
  validationRef: args.validationRef,
47
53
  blockers: args.blockers,
48
54
  });
@@ -7,6 +7,8 @@ export type BlockingDecisionError = {
7
7
  };
8
8
  export type OutputRequirementStatus = {
9
9
  readonly kind: 'not_required';
10
+ } | {
11
+ readonly kind: 'satisfied';
10
12
  } | {
11
13
  readonly kind: 'missing';
12
14
  readonly contractRef: string;
@@ -20,21 +20,38 @@ function detectBlockingReasonsV1(args) {
20
20
  }
21
21
  }
22
22
  const outReq = args.outputRequirement;
23
- if (outReq && outReq.kind !== 'not_required') {
24
- if (outReq.kind === 'missing') {
25
- reasons.push({ kind: 'missing_required_output', contractRef: outReq.contractRef });
26
- }
27
- if (outReq.kind === 'invalid') {
28
- reasons.push({ kind: 'invalid_required_output', contractRef: outReq.contractRef });
23
+ if (outReq) {
24
+ switch (outReq.kind) {
25
+ case 'not_required':
26
+ case 'satisfied':
27
+ break;
28
+ case 'missing':
29
+ reasons.push({ kind: 'missing_required_output', contractRef: outReq.contractRef });
30
+ break;
31
+ case 'invalid':
32
+ reasons.push({ kind: 'invalid_required_output', contractRef: outReq.contractRef });
33
+ break;
34
+ default: {
35
+ const _exhaustive = outReq;
36
+ return _exhaustive;
37
+ }
29
38
  }
30
39
  }
31
40
  const capReq = args.capabilityRequirement;
32
- if (capReq && capReq.kind !== 'not_required') {
33
- if (capReq.kind === 'unknown') {
34
- reasons.push({ kind: 'required_capability_unknown', capability: capReq.capability });
35
- }
36
- if (capReq.kind === 'unavailable') {
37
- reasons.push({ kind: 'required_capability_unavailable', capability: capReq.capability });
41
+ if (capReq) {
42
+ switch (capReq.kind) {
43
+ case 'not_required':
44
+ break;
45
+ case 'unknown':
46
+ reasons.push({ kind: 'required_capability_unknown', capability: capReq.capability });
47
+ break;
48
+ case 'unavailable':
49
+ reasons.push({ kind: 'required_capability_unavailable', capability: capReq.capability });
50
+ break;
51
+ default: {
52
+ const _exhaustive = capReq;
53
+ return _exhaustive;
54
+ }
38
55
  }
39
56
  }
40
57
  return (0, neverthrow_1.ok)(reasons);
@@ -16,6 +16,7 @@ export interface BuildExportBundleArgs {
16
16
  readonly appliedConfigHash?: string;
17
17
  };
18
18
  readonly sha256: (bytes: Uint8Array) => Sha256Digest;
19
+ readonly exportedAt: string;
19
20
  }
20
21
  export type BundleBuilderError = {
21
22
  readonly code: 'BUNDLE_BUILD_EMPTY_EVENTS';
@@ -30,7 +30,7 @@ function buildExportBundle(args) {
30
30
  const bundle = {
31
31
  bundleSchemaVersion: 1,
32
32
  bundleId: args.bundleId,
33
- exportedAt: new Date().toISOString(),
33
+ exportedAt: args.exportedAt,
34
34
  producer: {
35
35
  appVersion: args.producer.appVersion,
36
36
  ...(args.producer.appliedConfigHash != null
@@ -4,6 +4,7 @@ exports.validateBundle = validateBundle;
4
4
  const neverthrow_1 = require("neverthrow");
5
5
  const index_js_1 = require("../schemas/export-bundle/index.js");
6
6
  const jcs_js_1 = require("../canonical/jcs.js");
7
+ const constants_js_1 = require("../constants.js");
7
8
  function validateBundle(raw, sha256) {
8
9
  const schemaResult = validateSchema(raw);
9
10
  if (schemaResult.isErr())
@@ -95,7 +96,7 @@ function validateReferences(bundle) {
95
96
  const referencedWorkflows = new Set();
96
97
  for (const event of bundle.session.events) {
97
98
  const evt = event;
98
- if (evt.kind === 'node_created') {
99
+ if (evt.kind === constants_js_1.EVENT_KIND.NODE_CREATED) {
99
100
  if (typeof evt.data.snapshotRef === 'string') {
100
101
  referencedSnapshots.add(evt.data.snapshotRef);
101
102
  }
@@ -103,7 +104,7 @@ function validateReferences(bundle) {
103
104
  referencedWorkflows.add(evt.data.workflowHash);
104
105
  }
105
106
  }
106
- if (evt.kind === 'run_started' && typeof evt.data.workflowHash === 'string') {
107
+ if (evt.kind === constants_js_1.EVENT_KIND.RUN_STARTED && typeof evt.data.workflowHash === 'string') {
107
108
  referencedWorkflows.add(evt.data.workflowHash);
108
109
  }
109
110
  }