@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
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadAndPinWorkflow = loadAndPinWorkflow;
4
+ exports.buildInitialEvents = buildInitialEvents;
5
+ exports.mintStartTokens = mintStartTokens;
6
+ exports.executeStartWorkflow = executeStartWorkflow;
7
+ const output_schemas_js_1 = require("../../output-schemas.js");
8
+ const step_instance_key_js_1 = require("../../../v2/durable-core/schemas/execution-snapshot/step-instance-key.js");
9
+ const workflow_js_1 = require("../../../types/workflow.js");
10
+ const index_js_1 = require("../../../v2/durable-core/ids/index.js");
11
+ const workflow_hash_ref_js_1 = require("../../../v2/durable-core/ids/workflow-hash-ref.js");
12
+ const neverthrow_1 = require("neverthrow");
13
+ const v1_to_v2_shim_js_1 = require("../../../v2/read-only/v1-to-v2-shim.js");
14
+ const hashing_js_1 = require("../../../v2/durable-core/canonical/hashing.js");
15
+ const observation_builder_js_1 = require("../../../v2/durable-core/domain/observation-builder.js");
16
+ const workflow_source_js_1 = require("../../../types/workflow-source.js");
17
+ const workflow_definition_js_1 = require("../../../types/workflow-definition.js");
18
+ const v2_execution_helpers_js_1 = require("../v2-execution-helpers.js");
19
+ const v2_token_ops_js_1 = require("../v2-token-ops.js");
20
+ const v2_state_conversion_js_1 = require("../v2-state-conversion.js");
21
+ const v2_execution_helpers_js_2 = require("../v2-execution-helpers.js");
22
+ const v2_context_budget_js_1 = require("../v2-context-budget.js");
23
+ const constants_js_1 = require("../../../v2/durable-core/constants.js");
24
+ const index_js_2 = require("./index.js");
25
+ function loadAndPinWorkflow(args) {
26
+ const { workflowId, workflowService, crypto, pinnedStore } = args;
27
+ return neverthrow_1.ResultAsync.fromPromise(workflowService.getWorkflowById(workflowId), (e) => ({
28
+ kind: 'precondition_failed',
29
+ message: e instanceof Error ? e.message : String(e),
30
+ }))
31
+ .andThen((workflow) => {
32
+ if (!workflow) {
33
+ return (0, neverthrow_1.errAsync)({ kind: 'workflow_not_found', workflowId: (0, index_js_1.asWorkflowId)(workflowId) });
34
+ }
35
+ const firstStep = workflow.definition.steps[0];
36
+ if (!firstStep) {
37
+ return (0, neverthrow_1.errAsync)({ kind: 'workflow_has_no_steps', workflowId: (0, index_js_1.asWorkflowId)(workflowId) });
38
+ }
39
+ return (0, neverthrow_1.okAsync)({ workflow, firstStep });
40
+ })
41
+ .andThen(({ workflow, firstStep }) => {
42
+ const compiled = (0, v1_to_v2_shim_js_1.compileV1WorkflowToPinnedSnapshot)(workflow);
43
+ const workflowHashRes = (0, hashing_js_1.workflowHashForCompiledSnapshot)(compiled, crypto);
44
+ if (workflowHashRes.isErr()) {
45
+ return (0, neverthrow_1.errAsync)({ kind: 'hash_computation_failed', message: workflowHashRes.error.message });
46
+ }
47
+ const workflowHash = workflowHashRes.value;
48
+ return pinnedStore.get(workflowHash)
49
+ .mapErr((cause) => ({ kind: 'pinned_workflow_store_failed', cause }))
50
+ .andThen((existingPinned) => {
51
+ if (!existingPinned) {
52
+ return pinnedStore.put(workflowHash, compiled)
53
+ .mapErr((cause) => ({ kind: 'pinned_workflow_store_failed', cause }));
54
+ }
55
+ return (0, neverthrow_1.okAsync)(undefined);
56
+ })
57
+ .andThen(() => pinnedStore.get(workflowHash).mapErr((cause) => ({ kind: 'pinned_workflow_store_failed', cause })))
58
+ .andThen((pinned) => {
59
+ if (!pinned || pinned.sourceKind !== 'v1_pinned' || !(0, workflow_definition_js_1.hasWorkflowDefinitionShape)(pinned.definition)) {
60
+ return (0, neverthrow_1.errAsync)({
61
+ kind: 'invariant_violation',
62
+ message: 'Failed to pin executable workflow snapshot (missing or invalid pinned workflow).',
63
+ suggestion: 'Retry start_workflow; if this persists, treat as invariant violation.',
64
+ });
65
+ }
66
+ const pinnedWorkflow = (0, workflow_js_1.createWorkflow)(pinned.definition, (0, workflow_source_js_1.createBundledSource)());
67
+ return (0, neverthrow_1.okAsync)({ workflow, firstStep, workflowHash, pinnedWorkflow });
68
+ });
69
+ });
70
+ }
71
+ function buildInitialEvents(args) {
72
+ const { sessionId, runId, nodeId, workflowId, workflowHash, workflowSourceKind, workflowSourceRef, snapshotRef, context, observations, idFactory, } = args;
73
+ const evtSessionCreated = idFactory.mintEventId();
74
+ const evtRunStarted = idFactory.mintEventId();
75
+ const evtNodeCreated = idFactory.mintEventId();
76
+ const evtPreferencesChanged = idFactory.mintEventId();
77
+ const changeId = idFactory.mintEventId();
78
+ const baseEvents = [
79
+ {
80
+ v: 1,
81
+ eventId: evtSessionCreated,
82
+ eventIndex: 0,
83
+ sessionId,
84
+ kind: constants_js_1.EVENT_KIND.SESSION_CREATED,
85
+ dedupeKey: `session_created:${sessionId}`,
86
+ data: {},
87
+ },
88
+ {
89
+ v: 1,
90
+ eventId: evtRunStarted,
91
+ eventIndex: 1,
92
+ sessionId,
93
+ kind: constants_js_1.EVENT_KIND.RUN_STARTED,
94
+ dedupeKey: `run_started:${sessionId}:${runId}`,
95
+ scope: { runId },
96
+ data: {
97
+ workflowId,
98
+ workflowHash,
99
+ workflowSourceKind,
100
+ workflowSourceRef,
101
+ },
102
+ },
103
+ {
104
+ v: 1,
105
+ eventId: evtNodeCreated,
106
+ eventIndex: 2,
107
+ sessionId,
108
+ kind: constants_js_1.EVENT_KIND.NODE_CREATED,
109
+ dedupeKey: `node_created:${sessionId}:${runId}:${nodeId}`,
110
+ scope: { runId, nodeId },
111
+ data: {
112
+ nodeKind: 'step',
113
+ parentNodeId: null,
114
+ workflowHash,
115
+ snapshotRef,
116
+ },
117
+ },
118
+ {
119
+ v: 1,
120
+ eventId: evtPreferencesChanged,
121
+ eventIndex: 3,
122
+ sessionId,
123
+ kind: constants_js_1.EVENT_KIND.PREFERENCES_CHANGED,
124
+ dedupeKey: `preferences_changed:${sessionId}:${runId}:${nodeId}:${changeId}`,
125
+ scope: { runId, nodeId },
126
+ data: {
127
+ changeId,
128
+ source: 'system',
129
+ delta: [
130
+ { key: 'autonomy', value: v2_execution_helpers_js_2.defaultPreferences.autonomy },
131
+ { key: 'riskPolicy', value: v2_execution_helpers_js_2.defaultPreferences.riskPolicy },
132
+ ],
133
+ effective: {
134
+ autonomy: v2_execution_helpers_js_2.defaultPreferences.autonomy,
135
+ riskPolicy: v2_execution_helpers_js_2.defaultPreferences.riskPolicy,
136
+ },
137
+ },
138
+ },
139
+ ];
140
+ const mutableEvents = [...baseEvents];
141
+ if (context) {
142
+ const evtContextSet = idFactory.mintEventId();
143
+ const contextId = idFactory.mintEventId();
144
+ mutableEvents.push({
145
+ v: 1,
146
+ eventId: evtContextSet,
147
+ eventIndex: mutableEvents.length,
148
+ sessionId,
149
+ kind: constants_js_1.EVENT_KIND.CONTEXT_SET,
150
+ dedupeKey: `context_set:${sessionId}:${runId}:${contextId}`,
151
+ scope: { runId },
152
+ data: {
153
+ contextId,
154
+ context: context,
155
+ source: 'initial',
156
+ },
157
+ });
158
+ }
159
+ for (const obs of observations) {
160
+ const obsEventId = idFactory.mintEventId();
161
+ mutableEvents.push({
162
+ v: 1,
163
+ eventId: obsEventId,
164
+ eventIndex: mutableEvents.length,
165
+ sessionId,
166
+ kind: constants_js_1.EVENT_KIND.OBSERVATION_RECORDED,
167
+ dedupeKey: `observation_recorded:${sessionId}:${obs.key}`,
168
+ scope: undefined,
169
+ data: {
170
+ key: obs.key,
171
+ value: obs.value,
172
+ confidence: obs.confidence,
173
+ },
174
+ });
175
+ }
176
+ return mutableEvents;
177
+ }
178
+ function mintStartTokens(args) {
179
+ const { sessionId, runId, nodeId, attemptId, workflowHashRef, ports } = args;
180
+ const statePayload = {
181
+ tokenVersion: 1,
182
+ tokenKind: 'state',
183
+ sessionId,
184
+ runId,
185
+ nodeId,
186
+ workflowHashRef,
187
+ };
188
+ const ackPayload = {
189
+ tokenVersion: 1,
190
+ tokenKind: 'ack',
191
+ sessionId,
192
+ runId,
193
+ nodeId,
194
+ attemptId,
195
+ };
196
+ const checkpointPayload = {
197
+ tokenVersion: 1,
198
+ tokenKind: 'checkpoint',
199
+ sessionId,
200
+ runId,
201
+ nodeId,
202
+ attemptId,
203
+ };
204
+ const stateTokenRes = (0, v2_token_ops_js_1.signTokenOrErr)({ payload: statePayload, ports });
205
+ if (stateTokenRes.isErr()) {
206
+ return (0, neverthrow_1.errAsync)({ kind: 'token_signing_failed', cause: stateTokenRes.error });
207
+ }
208
+ const ackTokenRes = (0, v2_token_ops_js_1.signTokenOrErr)({ payload: ackPayload, ports });
209
+ if (ackTokenRes.isErr()) {
210
+ return (0, neverthrow_1.errAsync)({ kind: 'token_signing_failed', cause: ackTokenRes.error });
211
+ }
212
+ const checkpointTokenRes = (0, v2_token_ops_js_1.signTokenOrErr)({ payload: checkpointPayload, ports });
213
+ if (checkpointTokenRes.isErr()) {
214
+ return (0, neverthrow_1.errAsync)({ kind: 'token_signing_failed', cause: checkpointTokenRes.error });
215
+ }
216
+ return (0, neverthrow_1.okAsync)({
217
+ stateToken: stateTokenRes.value,
218
+ ackToken: ackTokenRes.value,
219
+ checkpointToken: checkpointTokenRes.value,
220
+ });
221
+ }
222
+ function executeStartWorkflow(input, ctx) {
223
+ if (!ctx.v2) {
224
+ return (0, neverthrow_1.errAsync)({ kind: 'precondition_failed', message: 'v2 tools disabled', suggestion: 'Enable v2Tools flag' });
225
+ }
226
+ const { gate, sessionStore, snapshotStore, pinnedStore, crypto, tokenCodecPorts, idFactory } = ctx.v2;
227
+ if (!idFactory) {
228
+ return (0, neverthrow_1.errAsync)({
229
+ kind: 'precondition_failed',
230
+ message: 'v2 context missing idFactory',
231
+ suggestion: 'Reinitialize v2 tool context (idFactory must be provided when v2Tools are enabled).',
232
+ });
233
+ }
234
+ if (!tokenCodecPorts) {
235
+ return (0, neverthrow_1.errAsync)({
236
+ kind: 'precondition_failed',
237
+ message: 'v2 context missing tokenCodecPorts dependency',
238
+ suggestion: 'Reinitialize v2 tool context (tokenCodecPorts must be provided when v2Tools are enabled).',
239
+ });
240
+ }
241
+ const ctxCheck = (0, v2_context_budget_js_1.checkContextBudget)({ tool: 'start_workflow', context: input.context });
242
+ if (!ctxCheck.ok)
243
+ return (0, neverthrow_1.errAsync)({ kind: 'validation_failed', failure: ctxCheck.error });
244
+ return loadAndPinWorkflow({
245
+ workflowId: input.workflowId,
246
+ workflowService: ctx.workflowService,
247
+ crypto,
248
+ pinnedStore,
249
+ })
250
+ .andThen(({ workflow, firstStep, workflowHash, pinnedWorkflow }) => {
251
+ const workspaceAnchor = ctx.v2?.workspaceAnchor;
252
+ const anchorsRA = workspaceAnchor
253
+ ? workspaceAnchor.resolveAnchors()
254
+ .map((anchors) => (0, observation_builder_js_1.anchorsToObservations)(anchors))
255
+ .orElse(() => (0, neverthrow_1.okAsync)([]))
256
+ : (0, neverthrow_1.okAsync)([]);
257
+ return anchorsRA.andThen((observations) => {
258
+ const sessionId = idFactory.mintSessionId();
259
+ const runId = idFactory.mintRunId();
260
+ const nodeId = idFactory.mintNodeId();
261
+ const snapshot = {
262
+ v: 1,
263
+ kind: 'execution_snapshot',
264
+ enginePayload: {
265
+ v: 1,
266
+ engineState: {
267
+ kind: 'running',
268
+ completed: { kind: 'set', values: [] },
269
+ loopStack: [],
270
+ pending: { kind: 'some', step: { stepId: (0, step_instance_key_js_1.asDelimiterSafeIdV1)(firstStep.id), loopPath: [] } },
271
+ },
272
+ },
273
+ };
274
+ return snapshotStore.putExecutionSnapshotV1(snapshot)
275
+ .mapErr((cause) => ({ kind: 'snapshot_creation_failed', cause }))
276
+ .andThen((snapshotRef) => {
277
+ const workflowSourceRef = workflow.source.kind === 'user' || workflow.source.kind === 'project' || workflow.source.kind === 'custom'
278
+ ? workflow.source.directoryPath
279
+ : workflow.source.kind === 'git'
280
+ ? `${workflow.source.repositoryUrl}#${workflow.source.branch}`
281
+ : workflow.source.kind === 'remote'
282
+ ? workflow.source.registryUrl
283
+ : workflow.source.kind === 'plugin'
284
+ ? `${workflow.source.pluginName}@${workflow.source.pluginVersion}`
285
+ : '(bundled)';
286
+ const events = buildInitialEvents({
287
+ sessionId,
288
+ runId,
289
+ nodeId,
290
+ workflowId: workflow.definition.id,
291
+ workflowHash,
292
+ workflowSourceKind: (0, v2_state_conversion_js_1.mapWorkflowSourceKind)(workflow.source.kind),
293
+ workflowSourceRef,
294
+ snapshotRef,
295
+ context: input.context,
296
+ observations,
297
+ idFactory,
298
+ });
299
+ return gate.withHealthySessionLock(sessionId, (lock) => sessionStore.append(lock, {
300
+ events,
301
+ snapshotPins: [{ snapshotRef, eventIndex: 2, createdByEventId: events[2].eventId }],
302
+ }))
303
+ .mapErr((cause) => ({ kind: 'session_append_failed', cause }))
304
+ .map(() => ({ workflow, firstStep, workflowHash, pinnedWorkflow, sessionId, runId, nodeId }));
305
+ });
306
+ });
307
+ })
308
+ .andThen(({ pinnedWorkflow, firstStep, workflowHash, sessionId, runId, nodeId }) => {
309
+ const wfRefRes = (0, workflow_hash_ref_js_1.deriveWorkflowHashRef)(workflowHash);
310
+ if (wfRefRes.isErr()) {
311
+ return (0, neverthrow_1.errAsync)({
312
+ kind: 'precondition_failed',
313
+ message: wfRefRes.error.message,
314
+ suggestion: 'Ensure the pinned workflowHash is a valid sha256 digest.',
315
+ });
316
+ }
317
+ const attemptId = (0, v2_token_ops_js_1.newAttemptId)(idFactory);
318
+ return mintStartTokens({
319
+ sessionId,
320
+ runId,
321
+ nodeId,
322
+ attemptId,
323
+ workflowHashRef: wfRefRes.value,
324
+ ports: tokenCodecPorts,
325
+ }).andThen((tokens) => {
326
+ const meta = (0, v2_execution_helpers_js_1.renderPendingPromptOrDefault)({
327
+ workflow: pinnedWorkflow,
328
+ stepId: firstStep.id,
329
+ loopPath: [],
330
+ truth: { events: [], manifest: [] },
331
+ runId: (0, index_js_1.asRunId)(String(runId)),
332
+ nodeId: (0, index_js_1.asNodeId)(String(nodeId)),
333
+ rehydrateOnly: false,
334
+ });
335
+ const pending = { stepId: meta.stepId, title: meta.title, prompt: meta.prompt };
336
+ const preferences = v2_execution_helpers_js_2.defaultPreferences;
337
+ const nextIntent = (0, v2_state_conversion_js_1.deriveNextIntent)({ rehydrateOnly: false, isComplete: false, pending: meta });
338
+ return (0, neverthrow_1.okAsync)(output_schemas_js_1.V2StartWorkflowOutputSchema.parse({
339
+ stateToken: tokens.stateToken,
340
+ ackToken: tokens.ackToken,
341
+ checkpointToken: tokens.checkpointToken,
342
+ isComplete: false,
343
+ pending,
344
+ preferences,
345
+ nextIntent,
346
+ nextCall: (0, index_js_2.buildNextCall)({ stateToken: tokens.stateToken, ackToken: tokens.ackToken, isComplete: false, pending }),
347
+ }));
348
+ });
349
+ });
350
+ }
@@ -97,3 +97,26 @@ export declare function mapExecutionSessionGateErrorToToolError(e: ExecutionSess
97
97
  export declare function mapSnapshotStoreErrorToToolError(e: SnapshotStoreError, suggestion?: string): ToolFailure;
98
98
  export declare function mapPinnedWorkflowStoreErrorToToolError(e: PinnedWorkflowStoreError, suggestion?: string): ToolFailure;
99
99
  export declare function mapSessionOrGateErrorToToolError(e: SessionEventLogStoreError | ExecutionSessionGateErrorV2): ToolFailure;
100
+ import type { LoopPathFrameV1 } from '../../v2/durable-core/schemas/execution-snapshot/index.js';
101
+ import type { RunId, NodeId } from '../../v2/durable-core/ids/index.js';
102
+ import type { LoadedSessionTruthV2 } from '../../v2/ports/session-event-log-store.port.js';
103
+ import { type StepMetadata } from '../../v2/durable-core/domain/prompt-renderer.js';
104
+ export declare function renderPendingPromptOrDefault(args: {
105
+ readonly workflow: ReturnType<typeof import('../../types/workflow.js').createWorkflow>;
106
+ readonly stepId: string;
107
+ readonly loopPath: readonly LoopPathFrameV1[];
108
+ readonly truth: LoadedSessionTruthV2;
109
+ readonly runId: RunId;
110
+ readonly nodeId: NodeId;
111
+ readonly rehydrateOnly: boolean;
112
+ }): StepMetadata;
113
+ export type PreferencesV2 = {
114
+ readonly autonomy: 'guided' | 'full_auto_stop_on_user_deps' | 'full_auto_never_stop';
115
+ readonly riskPolicy: 'conservative' | 'balanced' | 'aggressive';
116
+ };
117
+ export declare const defaultPreferences: PreferencesV2;
118
+ export declare function derivePreferencesOrDefault(args: {
119
+ readonly truth: LoadedSessionTruthV2;
120
+ readonly runId: RunId;
121
+ readonly nodeId: NodeId;
122
+ }): PreferencesV2;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultPreferences = void 0;
3
4
  exports.mapStartWorkflowErrorToToolError = mapStartWorkflowErrorToToolError;
4
5
  exports.mapContinueWorkflowErrorToToolError = mapContinueWorkflowErrorToToolError;
5
6
  exports.mapTokenDecodeErrorToToolError = mapTokenDecodeErrorToToolError;
@@ -11,6 +12,8 @@ exports.mapExecutionSessionGateErrorToToolError = mapExecutionSessionGateErrorTo
11
12
  exports.mapSnapshotStoreErrorToToolError = mapSnapshotStoreErrorToToolError;
12
13
  exports.mapPinnedWorkflowStoreErrorToToolError = mapPinnedWorkflowStoreErrorToToolError;
13
14
  exports.mapSessionOrGateErrorToToolError = mapSessionOrGateErrorToToolError;
15
+ exports.renderPendingPromptOrDefault = renderPendingPromptOrDefault;
16
+ exports.derivePreferencesOrDefault = derivePreferencesOrDefault;
14
17
  const types_js_1 = require("../types.js");
15
18
  const types_js_2 = require("../types.js");
16
19
  function mapStartWorkflowErrorToToolError(e) {
@@ -91,7 +94,7 @@ function mapTokenDecodeErrorToToolError(e) {
91
94
  suggestion: 'Copy the entire token string exactly as returned. Use triple-click to select the complete line.',
92
95
  details: {
93
96
  errorType: 'corruption_detected',
94
- estimatedPosition: bech32mErr.position,
97
+ estimatedPosition: bech32mErr.position ?? null,
95
98
  tokenFormat: 'binary+bech32m',
96
99
  },
97
100
  });
@@ -279,3 +282,41 @@ function mapSessionOrGateErrorToToolError(e) {
279
282
  const _exhaustive = e;
280
283
  return _exhaustive;
281
284
  }
285
+ const prompt_renderer_js_1 = require("../../v2/durable-core/domain/prompt-renderer.js");
286
+ function renderPendingPromptOrDefault(args) {
287
+ return (0, prompt_renderer_js_1.renderPendingPrompt)({
288
+ workflow: args.workflow,
289
+ stepId: args.stepId,
290
+ loopPath: args.loopPath,
291
+ truth: args.truth,
292
+ runId: args.runId,
293
+ nodeId: args.nodeId,
294
+ rehydrateOnly: args.rehydrateOnly,
295
+ }).unwrapOr({
296
+ stepId: args.stepId,
297
+ title: args.stepId,
298
+ prompt: `Pending step: ${args.stepId}`,
299
+ requireConfirmation: false,
300
+ });
301
+ }
302
+ const constants_js_1 = require("../../v2/durable-core/constants.js");
303
+ const preferences_js_1 = require("../../v2/projections/preferences.js");
304
+ exports.defaultPreferences = {
305
+ autonomy: 'guided',
306
+ riskPolicy: 'conservative'
307
+ };
308
+ function derivePreferencesOrDefault(args) {
309
+ const parentByNodeId = {};
310
+ for (const e of args.truth.events) {
311
+ if (e.kind !== constants_js_1.EVENT_KIND.NODE_CREATED)
312
+ continue;
313
+ if (e.scope?.runId !== String(args.runId))
314
+ continue;
315
+ parentByNodeId[String(e.scope.nodeId)] = e.data.parentNodeId;
316
+ }
317
+ const prefs = (0, preferences_js_1.projectPreferencesV2)(args.truth.events, parentByNodeId);
318
+ if (prefs.isErr())
319
+ return exports.defaultPreferences;
320
+ const p = prefs.value.byNodeId[String(args.nodeId)]?.effective;
321
+ return p ? { autonomy: p.autonomy, riskPolicy: p.riskPolicy } : exports.defaultPreferences;
322
+ }
@@ -1,23 +1 @@
1
- import type { ToolContext, ToolResult } from '../types.js';
2
- import type { V2ContinueWorkflowInput, V2StartWorkflowInput } from '../v2/tools.js';
3
- type NextCallTemplate = {
4
- readonly tool: 'continue_workflow';
5
- readonly params: {
6
- readonly intent: 'advance';
7
- readonly stateToken: string;
8
- readonly ackToken: string;
9
- };
10
- };
11
- export declare function buildNextCall(args: {
12
- readonly stateToken: string;
13
- readonly ackToken: string | undefined;
14
- readonly isComplete: boolean;
15
- readonly pending: {
16
- readonly stepId: string;
17
- } | null;
18
- readonly retryable?: boolean;
19
- readonly retryAckToken?: string;
20
- }): NextCallTemplate | null;
21
- export declare function handleV2StartWorkflow(input: V2StartWorkflowInput, ctx: ToolContext): Promise<ToolResult<unknown>>;
22
- export declare function handleV2ContinueWorkflow(input: V2ContinueWorkflowInput, ctx: ToolContext): Promise<ToolResult<unknown>>;
23
- export {};
1
+ export { handleV2StartWorkflow, handleV2ContinueWorkflow, buildNextCall } from './v2-execution/index.js';