@zaalipro/dsh-workflows 0.1.0-rc.12

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 (229) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +224 -0
  3. package/README.i18n.yaml +4 -0
  4. package/README.md +111 -0
  5. package/README.zh.md +111 -0
  6. package/cordis.patch.yml +10 -0
  7. package/docs/architecture.i18n.yaml +4 -0
  8. package/docs/architecture.md +177 -0
  9. package/docs/architecture.zh.md +177 -0
  10. package/docs/testing.i18n.yaml +4 -0
  11. package/docs/testing.md +125 -0
  12. package/docs/testing.zh.md +125 -0
  13. package/docs/user-guide.i18n.yaml +4 -0
  14. package/docs/user-guide.md +351 -0
  15. package/docs/user-guide.zh.md +351 -0
  16. package/lib/client-types/WorkflowMemberInspector.d.ts +28 -0
  17. package/lib/client-types/WorkflowMemberInspector.d.ts.map +1 -0
  18. package/lib/client-types/WorkflowMemberInspector.js +181 -0
  19. package/lib/client-types/WorkflowMemberInspector.js.map +1 -0
  20. package/lib/client-types/WorkflowRunPanel.d.ts +43 -0
  21. package/lib/client-types/WorkflowRunPanel.d.ts.map +1 -0
  22. package/lib/client-types/WorkflowRunPanel.js +130 -0
  23. package/lib/client-types/WorkflowRunPanel.js.map +1 -0
  24. package/lib/client-types/WorkflowsDashboard.d.ts +49 -0
  25. package/lib/client-types/WorkflowsDashboard.d.ts.map +1 -0
  26. package/lib/client-types/WorkflowsDashboard.js +942 -0
  27. package/lib/client-types/WorkflowsDashboard.js.map +1 -0
  28. package/lib/client-types/adapter.d.ts +60 -0
  29. package/lib/client-types/adapter.d.ts.map +1 -0
  30. package/lib/client-types/adapter.js +117 -0
  31. package/lib/client-types/adapter.js.map +1 -0
  32. package/lib/client-types/chat-renderer.d.ts +10 -0
  33. package/lib/client-types/chat-renderer.d.ts.map +1 -0
  34. package/lib/client-types/chat-renderer.js +11 -0
  35. package/lib/client-types/chat-renderer.js.map +1 -0
  36. package/lib/client-types/contract.d.ts +210 -0
  37. package/lib/client-types/contract.d.ts.map +1 -0
  38. package/lib/client-types/contract.js +37 -0
  39. package/lib/client-types/contract.js.map +1 -0
  40. package/lib/client-types/controller.d.ts +83 -0
  41. package/lib/client-types/controller.d.ts.map +1 -0
  42. package/lib/client-types/controller.js +705 -0
  43. package/lib/client-types/controller.js.map +1 -0
  44. package/lib/client-types/index.d.ts +19 -0
  45. package/lib/client-types/index.d.ts.map +1 -0
  46. package/lib/client-types/index.js +731 -0
  47. package/lib/client-types/index.js.map +1 -0
  48. package/lib/client-types/locales.d.ts +257 -0
  49. package/lib/client-types/locales.d.ts.map +1 -0
  50. package/lib/client-types/locales.js +270 -0
  51. package/lib/client-types/locales.js.map +1 -0
  52. package/lib/client-types/slot-components.d.ts +38 -0
  53. package/lib/client-types/slot-components.d.ts.map +1 -0
  54. package/lib/client-types/slot-components.js +22 -0
  55. package/lib/client-types/slot-components.js.map +1 -0
  56. package/lib/client-types/store.d.ts +69 -0
  57. package/lib/client-types/store.d.ts.map +1 -0
  58. package/lib/client-types/store.js +135 -0
  59. package/lib/client-types/store.js.map +1 -0
  60. package/lib/client-types/workflow-definition.d.ts +52 -0
  61. package/lib/client-types/workflow-definition.d.ts.map +1 -0
  62. package/lib/client-types/workflow-definition.js +135 -0
  63. package/lib/client-types/workflow-definition.js.map +1 -0
  64. package/lib/client.js +11065 -0
  65. package/lib/client.js.map +1 -0
  66. package/lib/compat-engine/index.js +1926 -0
  67. package/lib/compat-engine/index.js.map +1 -0
  68. package/lib/compat-engine/worker.cjs +1500 -0
  69. package/lib/compat-engine/worker.cjs.map +1 -0
  70. package/lib/typert.host.d.ts +3 -0
  71. package/lib/typert.host.js +1709 -0
  72. package/lib/typert.remote-client.d.ts +57 -0
  73. package/lib/typert.remote-client.js +1662 -0
  74. package/lib/types/commands/aliases.d.ts +4 -0
  75. package/lib/types/commands/aliases.d.ts.map +1 -0
  76. package/lib/types/commands/aliases.js +25 -0
  77. package/lib/types/commands/aliases.js.map +1 -0
  78. package/lib/types/commands/index.d.ts +66 -0
  79. package/lib/types/commands/index.d.ts.map +1 -0
  80. package/lib/types/commands/index.js +550 -0
  81. package/lib/types/commands/index.js.map +1 -0
  82. package/lib/types/commands/parser.d.ts +17 -0
  83. package/lib/types/commands/parser.d.ts.map +1 -0
  84. package/lib/types/commands/parser.js +45 -0
  85. package/lib/types/commands/parser.js.map +1 -0
  86. package/lib/types/config.d.ts +71 -0
  87. package/lib/types/config.d.ts.map +1 -0
  88. package/lib/types/config.js +109 -0
  89. package/lib/types/config.js.map +1 -0
  90. package/lib/types/index.d.ts +41 -0
  91. package/lib/types/index.d.ts.map +1 -0
  92. package/lib/types/index.js +483 -0
  93. package/lib/types/index.js.map +1 -0
  94. package/lib/types/invariant.d.ts +21 -0
  95. package/lib/types/invariant.d.ts.map +1 -0
  96. package/lib/types/invariant.js +85 -0
  97. package/lib/types/invariant.js.map +1 -0
  98. package/lib/types/registry/definition.d.ts +24 -0
  99. package/lib/types/registry/definition.d.ts.map +1 -0
  100. package/lib/types/registry/definition.js +189 -0
  101. package/lib/types/registry/definition.js.map +1 -0
  102. package/lib/types/registry/index.d.ts +100 -0
  103. package/lib/types/registry/index.d.ts.map +1 -0
  104. package/lib/types/registry/index.js +899 -0
  105. package/lib/types/registry/index.js.map +1 -0
  106. package/lib/types/registry/names.d.ts +19 -0
  107. package/lib/types/registry/names.d.ts.map +1 -0
  108. package/lib/types/registry/names.js +69 -0
  109. package/lib/types/registry/names.js.map +1 -0
  110. package/lib/types/registry/remote.d.ts +15 -0
  111. package/lib/types/registry/remote.d.ts.map +1 -0
  112. package/lib/types/registry/remote.js +128 -0
  113. package/lib/types/registry/remote.js.map +1 -0
  114. package/lib/types/registry/roots.d.ts +44 -0
  115. package/lib/types/registry/roots.d.ts.map +1 -0
  116. package/lib/types/registry/roots.js +118 -0
  117. package/lib/types/registry/roots.js.map +1 -0
  118. package/lib/types/registry/types.d.ts +62 -0
  119. package/lib/types/registry/types.d.ts.map +1 -0
  120. package/lib/types/registry/types.js +2 -0
  121. package/lib/types/registry/types.js.map +1 -0
  122. package/lib/types/registry/watchers.d.ts +70 -0
  123. package/lib/types/registry/watchers.d.ts.map +1 -0
  124. package/lib/types/registry/watchers.js +152 -0
  125. package/lib/types/registry/watchers.js.map +1 -0
  126. package/lib/types/remote-events.d.ts +42 -0
  127. package/lib/types/remote-events.d.ts.map +1 -0
  128. package/lib/types/remote-events.js +21 -0
  129. package/lib/types/remote-events.js.map +1 -0
  130. package/lib/types/run-recorder.d.ts +44 -0
  131. package/lib/types/run-recorder.d.ts.map +1 -0
  132. package/lib/types/run-recorder.js +356 -0
  133. package/lib/types/run-recorder.js.map +1 -0
  134. package/lib/types/supervisor/canned-validate.d.ts +25 -0
  135. package/lib/types/supervisor/canned-validate.d.ts.map +1 -0
  136. package/lib/types/supervisor/canned-validate.js +122 -0
  137. package/lib/types/supervisor/canned-validate.js.map +1 -0
  138. package/lib/types/supervisor/completion-notice.d.ts +49 -0
  139. package/lib/types/supervisor/completion-notice.d.ts.map +1 -0
  140. package/lib/types/supervisor/completion-notice.js +281 -0
  141. package/lib/types/supervisor/completion-notice.js.map +1 -0
  142. package/lib/types/supervisor/cursors.d.ts +68 -0
  143. package/lib/types/supervisor/cursors.d.ts.map +1 -0
  144. package/lib/types/supervisor/cursors.js +158 -0
  145. package/lib/types/supervisor/cursors.js.map +1 -0
  146. package/lib/types/supervisor/engine-compat.d.ts +48 -0
  147. package/lib/types/supervisor/engine-compat.d.ts.map +1 -0
  148. package/lib/types/supervisor/engine-compat.js +116 -0
  149. package/lib/types/supervisor/engine-compat.js.map +1 -0
  150. package/lib/types/supervisor/index.d.ts +183 -0
  151. package/lib/types/supervisor/index.d.ts.map +1 -0
  152. package/lib/types/supervisor/index.js +2040 -0
  153. package/lib/types/supervisor/index.js.map +1 -0
  154. package/lib/types/supervisor/parallel-compat.d.ts +36 -0
  155. package/lib/types/supervisor/parallel-compat.d.ts.map +1 -0
  156. package/lib/types/supervisor/parallel-compat.js +180 -0
  157. package/lib/types/supervisor/parallel-compat.js.map +1 -0
  158. package/lib/types/supervisor/remote.d.ts +25 -0
  159. package/lib/types/supervisor/remote.d.ts.map +1 -0
  160. package/lib/types/supervisor/remote.js +478 -0
  161. package/lib/types/supervisor/remote.js.map +1 -0
  162. package/lib/types/supervisor/storage/bounded-file.d.ts +41 -0
  163. package/lib/types/supervisor/storage/bounded-file.d.ts.map +1 -0
  164. package/lib/types/supervisor/storage/bounded-file.js +186 -0
  165. package/lib/types/supervisor/storage/bounded-file.js.map +1 -0
  166. package/lib/types/supervisor/storage/details-codec.d.ts +14 -0
  167. package/lib/types/supervisor/storage/details-codec.d.ts.map +1 -0
  168. package/lib/types/supervisor/storage/details-codec.js +359 -0
  169. package/lib/types/supervisor/storage/details-codec.js.map +1 -0
  170. package/lib/types/supervisor/storage/index.d.ts +26 -0
  171. package/lib/types/supervisor/storage/index.d.ts.map +1 -0
  172. package/lib/types/supervisor/storage/index.js +100 -0
  173. package/lib/types/supervisor/storage/index.js.map +1 -0
  174. package/lib/types/supervisor/storage/lease.d.ts +34 -0
  175. package/lib/types/supervisor/storage/lease.d.ts.map +1 -0
  176. package/lib/types/supervisor/storage/lease.js +289 -0
  177. package/lib/types/supervisor/storage/lease.js.map +1 -0
  178. package/lib/types/supervisor/storage/manifest-codec.d.ts +10 -0
  179. package/lib/types/supervisor/storage/manifest-codec.d.ts.map +1 -0
  180. package/lib/types/supervisor/storage/manifest-codec.js +335 -0
  181. package/lib/types/supervisor/storage/manifest-codec.js.map +1 -0
  182. package/lib/types/supervisor/storage/manifest-store.d.ts +99 -0
  183. package/lib/types/supervisor/storage/manifest-store.d.ts.map +1 -0
  184. package/lib/types/supervisor/storage/manifest-store.js +1606 -0
  185. package/lib/types/supervisor/storage/manifest-store.js.map +1 -0
  186. package/lib/types/supervisor/storage/manifest-types.d.ts +269 -0
  187. package/lib/types/supervisor/storage/manifest-types.d.ts.map +1 -0
  188. package/lib/types/supervisor/storage/manifest-types.js +2 -0
  189. package/lib/types/supervisor/storage/manifest-types.js.map +1 -0
  190. package/lib/types/supervisor/storage/private-root.d.ts +143 -0
  191. package/lib/types/supervisor/storage/private-root.d.ts.map +1 -0
  192. package/lib/types/supervisor/storage/private-root.js +860 -0
  193. package/lib/types/supervisor/storage/private-root.js.map +1 -0
  194. package/lib/types/supervisor/storage/recovery.d.ts +14 -0
  195. package/lib/types/supervisor/storage/recovery.d.ts.map +1 -0
  196. package/lib/types/supervisor/storage/recovery.js +126 -0
  197. package/lib/types/supervisor/storage/recovery.js.map +1 -0
  198. package/lib/types/supervisor/storage/run-files.d.ts +67 -0
  199. package/lib/types/supervisor/storage/run-files.d.ts.map +1 -0
  200. package/lib/types/supervisor/storage/run-files.js +346 -0
  201. package/lib/types/supervisor/storage/run-files.js.map +1 -0
  202. package/lib/types/supervisor/types.d.ts +295 -0
  203. package/lib/types/supervisor/types.d.ts.map +1 -0
  204. package/lib/types/supervisor/types.js +3 -0
  205. package/lib/types/supervisor/types.js.map +1 -0
  206. package/lib/types/supervisor/value-view.d.ts +19 -0
  207. package/lib/types/supervisor/value-view.d.ts.map +1 -0
  208. package/lib/types/supervisor/value-view.js +183 -0
  209. package/lib/types/supervisor/value-view.js.map +1 -0
  210. package/lib/types/tool/index.d.ts +86 -0
  211. package/lib/types/tool/index.d.ts.map +1 -0
  212. package/lib/types/tool/index.js +810 -0
  213. package/lib/types/tool/index.js.map +1 -0
  214. package/lib/types/tool/schema.d.ts +158 -0
  215. package/lib/types/tool/schema.d.ts.map +1 -0
  216. package/lib/types/tool/schema.js +137 -0
  217. package/lib/types/tool/schema.js.map +1 -0
  218. package/lib/types/types.d.ts +9 -0
  219. package/lib/types/types.d.ts.map +1 -0
  220. package/lib/types/types.js +3 -0
  221. package/lib/types/types.js.map +1 -0
  222. package/lib/types/user-questions.d.ts +9 -0
  223. package/lib/types/user-questions.d.ts.map +1 -0
  224. package/lib/types/user-questions.js +91 -0
  225. package/lib/types/user-questions.js.map +1 -0
  226. package/package.json +291 -0
  227. package/skills/create-workflow/SKILL.md +166 -0
  228. package/vendor/workflow-engine/LICENSE +21 -0
  229. package/vendor/workflow-engine/README.md +1 -0
@@ -0,0 +1,335 @@
1
+ import { BoundedFileError } from './bounded-file.js';
2
+ import { isWorkflowDefinitionName } from '../../registry/names.js';
3
+ const COMPONENT = /^[a-f0-9]{32}$/u;
4
+ const SHA256 = /^[a-f0-9]{64}$/u;
5
+ const STATUSES = new Set([
6
+ 'running', 'pausing', 'stopping', 'needs-input', 'paused', 'budget-limited',
7
+ 'completed', 'failed', 'cancelled', 'interrupted',
8
+ ]);
9
+ const STOP_REASONS = new Set(['completed', 'cancelled', 'error', 'interrupted', 'budget-limited']);
10
+ const TERMINAL = new Set(['completed', 'failed', 'cancelled', 'interrupted']);
11
+ const ACTIVE = new Set(['running', 'pausing', 'stopping', 'needs-input', 'paused', 'budget-limited']);
12
+ const MEMBER_STATUSES = new Set(['running', 'completed', 'failed', 'cancelled']);
13
+ const ACTIONS = new Set(['pause', 'resume', 'stop', 'save']);
14
+ function corrupt(message) {
15
+ throw new BoundedFileError(message, 'WORKFLOW_STORAGE_CORRUPT');
16
+ }
17
+ const NUMBERED_ORDINAL = /^(?:[2-9]|[1-9][0-9]+)$/u;
18
+ /** Parse a display handle back to its session-local launch ordinal.
19
+ * The unnumbered first handle is `name` itself (ordinal 1), including kebab
20
+ * names that already end in digits such as `gpt-4` or `review-2`. */
21
+ export function displayOrdinal(name, displayName) {
22
+ if (displayName === name)
23
+ return 1;
24
+ const prefix = `${name}-`;
25
+ if (!displayName.startsWith(prefix)) {
26
+ throw new BoundedFileError(`workflow display name "${displayName}" does not belong to "${name}"`, 'WORKFLOW_STORAGE_CORRUPT');
27
+ }
28
+ const suffix = displayName.slice(prefix.length);
29
+ if (!NUMBERED_ORDINAL.test(suffix)) {
30
+ throw new BoundedFileError(`workflow display name "${displayName}" has an invalid ordinal`, 'WORKFLOW_STORAGE_CORRUPT');
31
+ }
32
+ const ordinal = Number(suffix);
33
+ if (!Number.isSafeInteger(ordinal) || ordinal < 2) {
34
+ throw new BoundedFileError(`workflow display name "${displayName}" has an unsafe ordinal`, 'WORKFLOW_STORAGE_CORRUPT');
35
+ }
36
+ return ordinal;
37
+ }
38
+ function limit(message) {
39
+ throw new BoundedFileError(message, 'WORKFLOW_STORAGE_LIMIT');
40
+ }
41
+ function isRecord(value) {
42
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
43
+ }
44
+ function own(value, key) {
45
+ return Object.prototype.hasOwnProperty.call(value, key);
46
+ }
47
+ function exactKeys(value, allowed, required, path) {
48
+ const allowedSet = new Set(allowed);
49
+ for (const key of Object.keys(value))
50
+ if (!allowedSet.has(key))
51
+ corrupt(`${path}.${key} is not allowed`);
52
+ for (const key of required)
53
+ if (!own(value, key))
54
+ corrupt(`${path}.${key} is required`);
55
+ }
56
+ function text(value, path, options = {}) {
57
+ if (typeof value !== 'string' || (options.nonEmpty && value.length === 0))
58
+ corrupt(`${path} must be ${options.nonEmpty ? 'a non-empty ' : 'a '}string`);
59
+ if (options.max !== undefined && new TextEncoder().encode(value).byteLength > options.max)
60
+ corrupt(`${path} exceeds ${options.max} UTF-8 bytes`);
61
+ return value;
62
+ }
63
+ function safeNonNegative(value, path) {
64
+ if (!Number.isSafeInteger(value) || Number(value) < 0)
65
+ corrupt(`${path} must be a non-negative safe integer`);
66
+ return value;
67
+ }
68
+ function safePositive(value, path) {
69
+ if (!Number.isSafeInteger(value) || Number(value) <= 0)
70
+ corrupt(`${path} must be a positive safe integer`);
71
+ return value;
72
+ }
73
+ function assertComponent(value, label) {
74
+ if (typeof value !== 'string' || !COMPONENT.test(value))
75
+ corrupt(`${label} is not a lowercase 32-hex component`);
76
+ }
77
+ function assertNotice(value, terminal, path) {
78
+ if (!isRecord(value))
79
+ corrupt(`${path} must be an object`);
80
+ const state = value.state;
81
+ if (typeof state !== 'string')
82
+ corrupt(`${path}.state must be a string`);
83
+ if (state === 'none') {
84
+ exactKeys(value, ['state'], ['state'], path);
85
+ if (terminal)
86
+ corrupt('terminal row has completionNotice state none');
87
+ return;
88
+ }
89
+ if (state === 'claimed') {
90
+ exactKeys(value, ['state', 'claimId', 'processEpoch', 'claimedAt'], ['state', 'claimId', 'processEpoch', 'claimedAt'], path);
91
+ assertComponent(value.claimId, `${path}.claimId`);
92
+ assertComponent(value.processEpoch, `${path}.processEpoch`);
93
+ safeNonNegative(value.claimedAt, `${path}.claimedAt`);
94
+ if (!terminal)
95
+ corrupt('non-terminal row cannot claim a completion notice');
96
+ return;
97
+ }
98
+ if (state === 'delivered') {
99
+ exactKeys(value, ['state', 'claimId', 'processEpoch', 'claimedAt', 'finalizedAt', 'lane'], ['state', 'claimId', 'processEpoch', 'claimedAt', 'finalizedAt', 'lane'], path);
100
+ assertComponent(value.claimId, `${path}.claimId`);
101
+ assertComponent(value.processEpoch, `${path}.processEpoch`);
102
+ const claimedAt = safeNonNegative(value.claimedAt, `${path}.claimedAt`);
103
+ const finalizedAt = safeNonNegative(value.finalizedAt, `${path}.finalizedAt`);
104
+ if (finalizedAt < claimedAt)
105
+ corrupt(`${path}.finalizedAt precedes claimedAt`);
106
+ if (value.lane !== 'followup' && value.lane !== 'inject')
107
+ corrupt(`${path}.lane is invalid`);
108
+ if (!terminal)
109
+ corrupt('non-terminal row cannot finalize a completion notice');
110
+ return;
111
+ }
112
+ if (state === 'abandoned') {
113
+ exactKeys(value, ['state', 'finalizedAt', 'reason', 'claimId', 'processEpoch', 'claimedAt', 'error'], ['state', 'finalizedAt', 'reason'], path);
114
+ const finalizedAt = safeNonNegative(value.finalizedAt, `${path}.finalizedAt`);
115
+ if (!['process-lost', 'owner-disposed', 'enqueue-failed', 'teardown'].includes(String(value.reason)))
116
+ corrupt(`${path}.reason is invalid`);
117
+ const tuple = ['claimId', 'processEpoch', 'claimedAt'].map(key => own(value, key));
118
+ if (tuple.some(Boolean) && !tuple.every(Boolean))
119
+ corrupt(`${path} claim tuple is incomplete`);
120
+ if (tuple.every(Boolean)) {
121
+ assertComponent(value.claimId, `${path}.claimId`);
122
+ assertComponent(value.processEpoch, `${path}.processEpoch`);
123
+ const claimedAt = safeNonNegative(value.claimedAt, `${path}.claimedAt`);
124
+ if (finalizedAt < claimedAt)
125
+ corrupt(`${path}.finalizedAt precedes claimedAt`);
126
+ }
127
+ if (own(value, 'error'))
128
+ text(value.error, `${path}.error`);
129
+ if (!terminal)
130
+ corrupt('non-terminal row cannot abandon a completion notice');
131
+ return;
132
+ }
133
+ corrupt(`${path}.state is invalid`);
134
+ }
135
+ function assertHead(value, path = 'heads[]') {
136
+ if (!isRecord(value))
137
+ corrupt(`${path} must be an object`);
138
+ exactKeys(value, ['runId', 'name', 'displayName', 'numberedHandle', 'description', 'status', 'stopReason', 'error', 'phase', 'terminalPreview', 'budget', 'memberCounts', 'startedAt', 'settledAt', 'runDirectory', 'revision', 'detail', 'detailRevision', 'membersRevision', 'logsRevision', 'resultRevision', 'artifactsRevision', 'completionNotice', 'executionAvailable', 'scriptPath', 'saveAvailable', 'allowedActions'], ['runId', 'name', 'displayName', 'numberedHandle', 'status', 'budget', 'memberCounts', 'startedAt', 'runDirectory', 'revision', 'detail', 'detailRevision', 'membersRevision', 'logsRevision', 'resultRevision', 'artifactsRevision', 'completionNotice'], path);
139
+ text(value.runId, `${path}.runId`, { nonEmpty: true, max: 512 });
140
+ if (typeof value.name !== 'string' || !isWorkflowDefinitionName(value.name))
141
+ corrupt(`${path}.name is not a valid workflow definition name`);
142
+ text(value.displayName, `${path}.displayName`, { nonEmpty: true, max: 512 });
143
+ if (typeof value.numberedHandle !== 'boolean')
144
+ corrupt(`${path}.numberedHandle must be boolean`);
145
+ if (own(value, 'description'))
146
+ text(value.description, `${path}.description`, { max: 65_536 });
147
+ if (!STATUSES.has(value.status))
148
+ corrupt(`${path}.status is invalid`);
149
+ if (own(value, 'stopReason')) {
150
+ if (!STOP_REASONS.has(String(value.stopReason)))
151
+ corrupt(`${path}.stopReason is invalid`);
152
+ }
153
+ if (own(value, 'error'))
154
+ text(value.error, `${path}.error`, { max: 65_536 });
155
+ if (own(value, 'phase'))
156
+ text(value.phase, `${path}.phase`, { max: 65_536 });
157
+ if (own(value, 'terminalPreview'))
158
+ text(value.terminalPreview, `${path}.terminalPreview`, { max: 131_072 });
159
+ if (!isRecord(value.budget))
160
+ corrupt(`${path}.budget must be an object`);
161
+ exactKeys(value.budget, ['total', 'spent', 'remaining'], ['total', 'spent', 'remaining'], `${path}.budget`);
162
+ const total = safePositive(value.budget.total, `${path}.budget.total`);
163
+ const spent = safeNonNegative(value.budget.spent, `${path}.budget.spent`);
164
+ const remaining = safeNonNegative(value.budget.remaining, `${path}.budget.remaining`);
165
+ if (spent > total || remaining !== total - spent)
166
+ corrupt(`${path}.budget is inconsistent`);
167
+ if (!isRecord(value.memberCounts))
168
+ corrupt(`${path}.memberCounts must be an object`);
169
+ const memberCounts = value.memberCounts;
170
+ exactKeys(memberCounts, ['total', 'running', 'completed', 'failed', 'cancelled'], ['total', 'running', 'completed', 'failed', 'cancelled'], `${path}.memberCounts`);
171
+ const counts = ['total', 'running', 'completed', 'failed', 'cancelled'].map(key => safeNonNegative(memberCounts[key], `${path}.memberCounts.${key}`));
172
+ if (counts[1] + counts[2] + counts[3] + counts[4] !== counts[0])
173
+ corrupt(`${path}.memberCounts are inconsistent`);
174
+ const startedAt = safeNonNegative(value.startedAt, `${path}.startedAt`);
175
+ if (own(value, 'settledAt')) {
176
+ const settledAt = safeNonNegative(value.settledAt, `${path}.settledAt`);
177
+ if (settledAt < startedAt)
178
+ corrupt(`${path}.settledAt precedes startedAt`);
179
+ }
180
+ assertComponent(value.runDirectory, `${path}.runDirectory`);
181
+ safeNonNegative(value.revision, `${path}.revision`);
182
+ if (!isRecord(value.detail))
183
+ corrupt(`${path}.detail must be an object`);
184
+ exactKeys(value.detail, ['id', 'bytes', 'sha256', 'snapshotRevision'], ['id', 'bytes', 'sha256', 'snapshotRevision'], `${path}.detail`);
185
+ assertComponent(value.detail.id, `${path}.detail.id`);
186
+ safeNonNegative(value.detail.bytes, `${path}.detail.bytes`);
187
+ if (typeof value.detail.sha256 !== 'string' || !SHA256.test(value.detail.sha256))
188
+ corrupt(`${path}.detail.sha256 is invalid`);
189
+ safeNonNegative(value.detail.snapshotRevision, `${path}.detail.snapshotRevision`);
190
+ if (value.detail.snapshotRevision !== value.detailRevision)
191
+ corrupt(`${path}.detail.snapshotRevision must equal detailRevision`);
192
+ for (const key of ['detailRevision', 'membersRevision', 'logsRevision', 'resultRevision', 'artifactsRevision'])
193
+ safeNonNegative(value[key], `${path}.${key}`);
194
+ if (own(value, 'executionAvailable') && typeof value.executionAvailable !== 'boolean')
195
+ corrupt(`${path}.executionAvailable must be boolean`);
196
+ if (own(value, 'scriptPath')) {
197
+ const pathValue = text(value.scriptPath, `${path}.scriptPath`, { nonEmpty: true, max: 512 });
198
+ if (pathValue.includes('/') || pathValue.includes('\\') || pathValue.startsWith('.') || pathValue.startsWith('/'))
199
+ corrupt(`${path}.scriptPath must be a relative single component`);
200
+ }
201
+ if (own(value, 'saveAvailable') && typeof value.saveAvailable !== 'boolean')
202
+ corrupt(`${path}.saveAvailable must be boolean`);
203
+ if (own(value, 'allowedActions')) {
204
+ if (!Array.isArray(value.allowedActions) || value.allowedActions.some(action => typeof action !== 'string' || !ACTIONS.has(action)))
205
+ corrupt(`${path}.allowedActions is invalid`);
206
+ if (new Set(value.allowedActions).size !== value.allowedActions.length)
207
+ corrupt(`${path}.allowedActions contains duplicates`);
208
+ }
209
+ const terminal = TERMINAL.has(value.status);
210
+ const active = ACTIVE.has(value.status);
211
+ if (active && (own(value, 'settledAt') || own(value, 'stopReason')))
212
+ corrupt(`${path} active row has terminal fields`);
213
+ if (terminal) {
214
+ if (!own(value, 'settledAt'))
215
+ corrupt(`${path} terminal row requires settledAt`);
216
+ if (!own(value, 'stopReason'))
217
+ corrupt(`${path} terminal row requires stopReason`);
218
+ const expected = value.status === 'completed' ? 'completed' : value.status === 'cancelled' ? 'cancelled' : value.status === 'interrupted' ? 'interrupted' : 'error';
219
+ if (value.stopReason !== expected)
220
+ corrupt(`${path}.stopReason is incompatible with status`);
221
+ }
222
+ if (own(value, 'terminalPreview') && !terminal)
223
+ corrupt(`${path}.terminalPreview is only valid on terminal rows`);
224
+ assertNotice(value.completionNotice, terminal, `${path}.completionNotice`);
225
+ }
226
+ function validateRoot(value) {
227
+ if (!isRecord(value))
228
+ corrupt('manifest must be an object');
229
+ exactKeys(value, ['version', 'sessionId', 'revision', 'nextOrdinal', 'ordinals', 'heads'], ['version', 'sessionId', 'revision', 'nextOrdinal', 'ordinals', 'heads'], 'manifest');
230
+ if (value.version !== 2)
231
+ corrupt('manifest.version must be 2');
232
+ text(value.sessionId, 'manifest.sessionId', { nonEmpty: true, max: 512 });
233
+ safeNonNegative(value.revision, 'manifest.revision');
234
+ const nextOrdinal = safePositive(value.nextOrdinal, 'manifest.nextOrdinal');
235
+ if (!Array.isArray(value.ordinals))
236
+ corrupt('manifest.ordinals must be an array');
237
+ if (!Array.isArray(value.heads))
238
+ corrupt('manifest.heads must be an array');
239
+ const ordinalNames = new Set();
240
+ for (let index = 0; index < value.ordinals.length; index += 1) {
241
+ const path = `manifest.ordinals[${index}]`;
242
+ const ordinal = value.ordinals[index];
243
+ if (!isRecord(ordinal))
244
+ corrupt(`${path} must be an object`);
245
+ exactKeys(ordinal, ['name', 'next'], ['name', 'next'], path);
246
+ if (typeof ordinal.name !== 'string' || !isWorkflowDefinitionName(ordinal.name))
247
+ corrupt(`${path}.name is invalid`);
248
+ if (ordinalNames.has(ordinal.name))
249
+ corrupt(`${path}.name is duplicated`);
250
+ ordinalNames.add(ordinal.name);
251
+ safePositive(ordinal.next, `${path}.next`);
252
+ }
253
+ const runIds = new Set();
254
+ const displayNames = new Set();
255
+ const directories = new Set();
256
+ const details = new Set();
257
+ for (let index = 0; index < value.heads.length; index += 1) {
258
+ const path = `manifest.heads[${index}]`;
259
+ assertHead(value.heads[index], path);
260
+ const current = value.heads[index];
261
+ if (runIds.has(current.runId))
262
+ corrupt(`${path}.runId is duplicated`);
263
+ if (displayNames.has(current.displayName))
264
+ corrupt(`${path}.displayName is duplicated`);
265
+ if (directories.has(current.runDirectory))
266
+ corrupt(`${path}.runDirectory is duplicated`);
267
+ if (details.has(current.detail.id))
268
+ corrupt(`${path}.detail.id is duplicated`);
269
+ runIds.add(current.runId);
270
+ displayNames.add(current.displayName);
271
+ directories.add(current.runDirectory);
272
+ details.add(current.detail.id);
273
+ if (!ordinalNames.has(current.name))
274
+ corrupt(`${path}.name has no ordinal high-water mark`);
275
+ let ordinal;
276
+ try {
277
+ ordinal = displayOrdinal(current.name, current.displayName);
278
+ }
279
+ catch (error) {
280
+ if (error instanceof BoundedFileError && error.code === 'WORKFLOW_STORAGE_CORRUPT') {
281
+ if (current.numberedHandle)
282
+ corrupt(`${path}.displayName is not a numbered handle`);
283
+ corrupt(`${path}.displayName must equal name for the first handle`);
284
+ }
285
+ throw error;
286
+ }
287
+ if (current.numberedHandle) {
288
+ if (ordinal < 2)
289
+ corrupt(`${path}.displayName is not a numbered handle`);
290
+ }
291
+ else if (ordinal !== 1 || current.displayName !== current.name) {
292
+ corrupt(`${path}.displayName must equal name for the first handle`);
293
+ }
294
+ const highWater = value.ordinals.find(item => item.name === current.name)?.next ?? 0;
295
+ if (ordinal >= highWater)
296
+ corrupt(`${path}.displayName exceeds ordinal high-water mark`);
297
+ }
298
+ if (nextOrdinal <= value.heads.length && value.heads.length > 0)
299
+ corrupt('manifest.nextOrdinal is not monotonic');
300
+ }
301
+ /** Decode a bounded canonical version-2 Session manifest. */
302
+ export function decodeWorkflowSessionManifest(input, file, maxBytes) {
303
+ if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0)
304
+ limit('manifest maxBytes must be a positive safe integer');
305
+ const bytes = typeof input === 'string' ? new TextEncoder().encode(input) : input;
306
+ if (bytes.byteLength > maxBytes)
307
+ limit(`${file} exceeds the ${maxBytes}-byte manifest limit`);
308
+ let value;
309
+ try {
310
+ value = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
311
+ }
312
+ catch (error) {
313
+ throw new BoundedFileError(`${file} is malformed UTF-8 or JSON`, 'WORKFLOW_STORAGE_CORRUPT', { cause: error });
314
+ }
315
+ validateRoot(value);
316
+ return value;
317
+ }
318
+ function sortObject(value) {
319
+ if (Array.isArray(value))
320
+ return value.map(sortObject);
321
+ if (!isRecord(value))
322
+ return value;
323
+ return Object.fromEntries(Object.keys(value).sort().map(key => [key, sortObject(value[key])]));
324
+ }
325
+ /** Encode a canonical version-2 Session manifest. */
326
+ export function encodeWorkflowSessionManifest(value, maxBytes) {
327
+ if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0)
328
+ limit('manifest maxBytes must be a positive safe integer');
329
+ validateRoot(value);
330
+ const bytes = new TextEncoder().encode(`${JSON.stringify(sortObject(value), null, 2)}\n`);
331
+ if (bytes.byteLength > maxBytes)
332
+ limit(`manifest exceeds the ${maxBytes}-byte limit`);
333
+ return bytes;
334
+ }
335
+ //# sourceMappingURL=manifest-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-codec.js","sourceRoot":"","sources":["../../../../src/supervisor/storage/manifest-codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import type { DetailReadRequest, DetailReadResult, RecoveredRun, WorkflowCompletionNoticeFinalization, WorkflowRunCommitRequest, WorkflowRunDetailPayloadV2, WorkflowRunArtifactIdentity, WorkflowRunArtifactInventory, WorkflowRunArtifactRead, WorkflowRunHeadRecord, WorkflowRunIdentity, WorkflowRunInsertRequest, WorkflowRunStore, WorkflowStoreOptions, WorkflowTerminalCommitRequest } from './manifest-types.js';
2
+ import type { WorkflowStorageLayout } from './private-root.js';
3
+ export declare class FileWorkflowRunStore implements WorkflowRunStore {
4
+ private readonly options;
5
+ private readonly lease?;
6
+ private readonly layout?;
7
+ private readonly sessions;
8
+ private readonly details;
9
+ private mutationTail;
10
+ private disposed;
11
+ private initialized;
12
+ private recovered;
13
+ constructor(options: WorkflowStoreOptions, lease?: {
14
+ assertCurrent(): Promise<void>;
15
+ } | undefined, layout?: WorkflowStorageLayout | undefined);
16
+ private guard;
17
+ private mutate;
18
+ private manifestPath;
19
+ private runPath;
20
+ private empty;
21
+ /** Traverse a retained storage capability and close only capabilities this
22
+ * operation opened. The root/category descriptors belong to the bootstrap
23
+ * layout and are never closed here. */
24
+ private withDirectory;
25
+ private withRunDirectory;
26
+ private withCategory;
27
+ /** Remove a manifest-selected tree only through retained directory
28
+ * capabilities. The local path helpers below are reserved for the
29
+ * standalone fallback store; a Host layout without a removal primitive
30
+ * fails closed instead of recursing through strings. */
31
+ private removeCapabilityTree;
32
+ private removeCapabilitySubtree;
33
+ private capabilityTreeBytes;
34
+ private committedBytes;
35
+ private removeRunTree;
36
+ private removeStagingTree;
37
+ /** Rename an identity-pinned run or staging tree into quarantine, then
38
+ * delete only through the quarantined child. An identity change aborts
39
+ * cleanup with UNSAFE rather than following a substituted path. */
40
+ private quarantineThenRemove;
41
+ private readCapabilityFile;
42
+ private writeCapabilityFile;
43
+ private removeCapabilityFile;
44
+ private persist;
45
+ private load;
46
+ private readDetail;
47
+ /** Read the editable projection through the retained storage capability.
48
+ * The caller supplies only the manifest-selected single component; no
49
+ * absolute path is opened here. */
50
+ readRunScript(runDirectory: string, maxBytes: number, signal?: AbortSignal): Promise<string>;
51
+ /** Inventory scratch files relative to a descriptor-pinned run directory. */
52
+ listRunArtifacts(runDirectory: string, maxItems: number, signal?: AbortSignal): Promise<WorkflowRunArtifactInventory>;
53
+ /** Read a bounded UTF-8 artifact window while retaining the descriptor for
54
+ * both identity checks. */
55
+ readRunArtifact(runDirectory: string, name: string, offsetBytes: number, maxBytes: number, expected: WorkflowRunArtifactIdentity, signal?: AbortSignal): Promise<WorkflowRunArtifactRead>;
56
+ readRunReport(runDirectory: string, maxBytes: number, signal?: AbortSignal): Promise<string | undefined>;
57
+ private validateRunFiles;
58
+ /** Read and decode every detail sidecar in one run during the read-only
59
+ * recovery preflight. In particular, unreferenced immutable snapshots are
60
+ * decoded too: silently deleting a malformed transaction residue would turn
61
+ * a corrupt store into a successful partial recovery. */
62
+ private validateLocalRunInventory;
63
+ private capabilityEntries;
64
+ private validateCapabilityRunInventory;
65
+ /** Complete, read-only recovery validation. Nothing is cached or removed
66
+ * until this method has checked every category, manifest, run, and detail
67
+ * sidecar. */
68
+ private validateRecoveryInventory;
69
+ /** Remove only residue whose complete identity/shape was validated by the
70
+ * preflight. A referenced run is retained; only its superseded immutable
71
+ * detail snapshots are removed. */
72
+ private reconcileRecoveryResidue;
73
+ private initializeUnlocked;
74
+ initialize(signal?: AbortSignal): Promise<readonly RecoveredRun[]>;
75
+ private ensureInitialized;
76
+ private evictForSession;
77
+ private enforceGlobalLimit;
78
+ /**
79
+ * Make the *next* insert fit before its run directory or manifest row is
80
+ * published. The old implementation enforced the root cap only after the
81
+ * durable callback, which could report an admitted run and then reject the
82
+ * insertion. This preflight keeps the durable linearization point honest:
83
+ * eligible terminal rows are evicted in the same deterministic order as
84
+ * normal retention, and an impossible insert fails while it is still in
85
+ * staging.
86
+ */
87
+ private preflightTransactionCapacity;
88
+ insertWithNextDisplayName(request: WorkflowRunInsertRequest, create: (identity: WorkflowRunIdentity) => {
89
+ readonly head: any;
90
+ readonly detail: WorkflowRunDetailPayloadV2;
91
+ }, signal?: AbortSignal): Promise<WorkflowRunHeadRecord>;
92
+ commitRun(request: WorkflowRunCommitRequest, signal?: AbortSignal): Promise<WorkflowRunHeadRecord>;
93
+ commitTerminalAndClaimNotice(request: WorkflowTerminalCommitRequest, signal?: AbortSignal): Promise<WorkflowRunHeadRecord>;
94
+ finalizeCompletionNotice(sessionId: string, runId: string, expectedRevision: number, finalization: WorkflowCompletionNoticeFinalization, signal?: AbortSignal): Promise<WorkflowRunHeadRecord>;
95
+ readSession(sessionId: string, signal?: AbortSignal): Promise<readonly WorkflowRunHeadRecord[]>;
96
+ readDetails(runId: string, request: DetailReadRequest, signal?: AbortSignal): Promise<DetailReadResult>;
97
+ dispose(): Promise<void>;
98
+ }
99
+ //# sourceMappingURL=manifest-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-store.d.ts","sourceRoot":"","sources":["../../../../src/supervisor/storage/manifest-store.ts"],"names":[],"mappings":"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"}