@relayflows/sdk 2.0.28 → 2.0.30

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 (120) hide show
  1. package/dist/authored-flow-executor.d.ts.map +1 -1
  2. package/dist/authored-flow-executor.js +10 -1
  3. package/dist/authored-flow-executor.js.map +1 -1
  4. package/dist/authored-step-index.d.ts +6 -0
  5. package/dist/authored-step-index.d.ts.map +1 -1
  6. package/dist/authored-step-index.js +42 -14
  7. package/dist/authored-step-index.js.map +1 -1
  8. package/dist/bundle-extensions.d.ts.map +1 -1
  9. package/dist/bundle-extensions.js +4 -7
  10. package/dist/bundle-extensions.js.map +1 -1
  11. package/dist/bundle.d.ts.map +1 -1
  12. package/dist/bundle.js +41 -7
  13. package/dist/bundle.js.map +1 -1
  14. package/dist/canonical.d.ts.map +1 -1
  15. package/dist/canonical.js +18 -6
  16. package/dist/canonical.js.map +1 -1
  17. package/dist/cli/status.d.ts +12 -0
  18. package/dist/cli/status.d.ts.map +1 -1
  19. package/dist/cli/status.js +39 -1
  20. package/dist/cli/status.js.map +1 -1
  21. package/dist/flow-extension-compat.d.ts.map +1 -1
  22. package/dist/flow-extension-compat.js +26 -8
  23. package/dist/flow-extension-compat.js.map +1 -1
  24. package/dist/flow-extension-loader.d.ts +7 -0
  25. package/dist/flow-extension-loader.d.ts.map +1 -1
  26. package/dist/flow-extension-loader.js +48 -22
  27. package/dist/flow-extension-loader.js.map +1 -1
  28. package/dist/fs-descriptor.d.ts +17 -0
  29. package/dist/fs-descriptor.d.ts.map +1 -0
  30. package/dist/fs-descriptor.js +96 -0
  31. package/dist/fs-descriptor.js.map +1 -0
  32. package/dist/hosted-base-snapshot.d.ts +25 -0
  33. package/dist/hosted-base-snapshot.d.ts.map +1 -0
  34. package/dist/hosted-base-snapshot.js +278 -0
  35. package/dist/hosted-base-snapshot.js.map +1 -0
  36. package/dist/hosted-extension-declarations.d.ts +10 -0
  37. package/dist/hosted-extension-declarations.d.ts.map +1 -0
  38. package/dist/hosted-extension-declarations.js +272 -0
  39. package/dist/hosted-extension-declarations.js.map +1 -0
  40. package/dist/hosted-extension-isolation.d.ts +82 -0
  41. package/dist/hosted-extension-isolation.d.ts.map +1 -0
  42. package/dist/hosted-extension-isolation.js +322 -0
  43. package/dist/hosted-extension-isolation.js.map +1 -0
  44. package/dist/hosted-extension-manifest.d.ts +9 -0
  45. package/dist/hosted-extension-manifest.d.ts.map +1 -0
  46. package/dist/hosted-extension-manifest.js +235 -0
  47. package/dist/hosted-extension-manifest.js.map +1 -0
  48. package/dist/hosted-extension-protocol.d.ts +16 -0
  49. package/dist/hosted-extension-protocol.d.ts.map +1 -0
  50. package/dist/hosted-extension-protocol.js +224 -0
  51. package/dist/hosted-extension-protocol.js.map +1 -0
  52. package/dist/hosted-extension-runtime.d.ts +30 -0
  53. package/dist/hosted-extension-runtime.d.ts.map +1 -0
  54. package/dist/hosted-extension-runtime.js +167 -0
  55. package/dist/hosted-extension-runtime.js.map +1 -0
  56. package/dist/hosted-extension-sandbox-source.d.ts +9 -0
  57. package/dist/hosted-extension-sandbox-source.d.ts.map +1 -0
  58. package/dist/hosted-extension-sandbox-source.js +95 -0
  59. package/dist/hosted-extension-sandbox-source.js.map +1 -0
  60. package/dist/hosted-extension-sandbox.d.ts +39 -0
  61. package/dist/hosted-extension-sandbox.d.ts.map +1 -0
  62. package/dist/hosted-extension-sandbox.js +418 -0
  63. package/dist/hosted-extension-sandbox.js.map +1 -0
  64. package/dist/hosted-project.d.ts +3 -0
  65. package/dist/hosted-project.d.ts.map +1 -0
  66. package/dist/hosted-project.js +19 -0
  67. package/dist/hosted-project.js.map +1 -0
  68. package/dist/hosted-promise-safety.d.ts +12 -0
  69. package/dist/hosted-promise-safety.d.ts.map +1 -0
  70. package/dist/hosted-promise-safety.js +63 -0
  71. package/dist/hosted-promise-safety.js.map +1 -0
  72. package/dist/index.d.ts +2 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +2 -0
  75. package/dist/index.js.map +1 -1
  76. package/dist/intrinsic-array.d.ts +3 -0
  77. package/dist/intrinsic-array.d.ts.map +1 -0
  78. package/dist/intrinsic-array.js +14 -0
  79. package/dist/intrinsic-array.js.map +1 -0
  80. package/dist/json-value.d.ts +6 -1
  81. package/dist/json-value.d.ts.map +1 -1
  82. package/dist/json-value.js +155 -36
  83. package/dist/json-value.js.map +1 -1
  84. package/dist/llm-worker.d.ts +9 -0
  85. package/dist/llm-worker.d.ts.map +1 -1
  86. package/dist/llm-worker.js +15 -1
  87. package/dist/llm-worker.js.map +1 -1
  88. package/dist/plugin-store.d.ts +8 -2
  89. package/dist/plugin-store.d.ts.map +1 -1
  90. package/dist/plugin-store.js +233 -56
  91. package/dist/plugin-store.js.map +1 -1
  92. package/dist/semver-range.d.ts.map +1 -1
  93. package/dist/semver-range.js +27 -15
  94. package/dist/semver-range.js.map +1 -1
  95. package/package.json +2 -2
  96. package/src/authored-flow-executor.ts +10 -1
  97. package/src/authored-step-index.ts +46 -12
  98. package/src/bundle-extensions.ts +6 -5
  99. package/src/bundle.ts +52 -7
  100. package/src/canonical.ts +20 -6
  101. package/src/cli/status.ts +50 -1
  102. package/src/flow-extension-compat.ts +32 -7
  103. package/src/flow-extension-loader.ts +56 -21
  104. package/src/fs-descriptor.ts +127 -0
  105. package/src/hosted-base-snapshot.ts +351 -0
  106. package/src/hosted-extension-declarations.ts +387 -0
  107. package/src/hosted-extension-isolation.ts +457 -0
  108. package/src/hosted-extension-manifest.ts +249 -0
  109. package/src/hosted-extension-protocol.ts +262 -0
  110. package/src/hosted-extension-runtime.ts +266 -0
  111. package/src/hosted-extension-sandbox-source.ts +94 -0
  112. package/src/hosted-extension-sandbox.ts +489 -0
  113. package/src/hosted-project.ts +18 -0
  114. package/src/hosted-promise-safety.ts +68 -0
  115. package/src/index.ts +18 -0
  116. package/src/intrinsic-array.ts +14 -0
  117. package/src/json-value.ts +184 -32
  118. package/src/llm-worker.ts +15 -1
  119. package/src/plugin-store.ts +323 -56
  120. package/src/semver-range.ts +39 -14
@@ -1,6 +1,12 @@
1
- import { lstat, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';
1
+ import { constants } from 'node:fs';
2
+ import { mkdir, mkdtemp, rename, rm, writeFile } from 'node:fs/promises';
2
3
  import { dirname, join, resolve } from 'node:path';
3
4
  import { payloadManifest, safePath, sha256 } from './bundle.js';
5
+ import { closeDescriptor, closeDirectory, descriptorIsDirectory, descriptorIsFile, directoryEntryIsDirectory, directoryEntryIsFile, lstatPath, openDirectory, openDescriptor, readDescriptor, readDirectoryEntry, statDescriptor, } from './fs-descriptor.js';
6
+ import { frozenHostedPromiseValue, hostedPromiseValue } from './hosted-promise-safety.js';
7
+ import { appendIntrinsicArray } from './intrinsic-array.js';
8
+ import { snapshotJsonValue } from './json-value.js';
9
+ import { MAX_PLUGIN_FILE_BYTES, MAX_PLUGIN_FILES, MAX_PLUGIN_TOTAL_BYTES } from './plugin-github.js';
4
10
  import { PluginError } from './plugin-manifest.js';
5
11
  /**
6
12
  * Where a flow-extension plugin's bytes live inside a project:
@@ -12,9 +18,40 @@ import { PluginError } from './plugin-manifest.js';
12
18
  * refusal, not a surprise.
13
19
  */
14
20
  export const PLUGIN_STORE = '.flows/plugins';
21
+ const MKDIR = mkdir;
22
+ const MKDTEMP = mkdtemp;
23
+ const RENAME = rename;
24
+ const RM = rm;
25
+ const WRITE_FILE = writeFile;
26
+ const PATH_DIRNAME = dirname;
27
+ const PATH_JOIN = join;
28
+ const PATH_RESOLVE = resolve;
29
+ const PROCESS_PLATFORM = process.platform;
30
+ const ERROR = Error;
31
+ const MAX_PLUGIN_MANIFEST_BYTES = 4_000_000;
32
+ const MAX_PLUGIN_STORE_ENTRIES = 10_000;
33
+ const ARRAY_IS_ARRAY = Array.isArray;
34
+ const BIG_INT = BigInt;
35
+ const BUFFER_ALLOC_UNSAFE = Buffer.allocUnsafe;
36
+ const BUFFER_TO_STRING = Function.prototype.call.bind(Buffer.prototype.toString);
37
+ const JSON_PARSE = JSON.parse;
38
+ const NUMBER = Number;
39
+ const NUMBER_IS_SAFE_INTEGER = Number.isSafeInteger;
40
+ const OBJECT_CREATE = Object.create;
41
+ const OBJECT_FREEZE = Object.freeze;
42
+ const OBJECT_GET_OWN_PROPERTY_DESCRIPTOR = Object.getOwnPropertyDescriptor;
43
+ const REGEXP_TEST = Function.prototype.call.bind(RegExp.prototype.test);
44
+ const SET = Set;
45
+ const SET_ADD = Function.prototype.call.bind(Set.prototype.add);
46
+ const SET_FOR_EACH = Function.prototype.call.bind(Set.prototype.forEach);
47
+ const SET_HAS = Function.prototype.call.bind(Set.prototype.has);
48
+ const STRING_SPLIT = Function.prototype.call.bind(String.prototype.split);
49
+ const STRING_STARTS_WITH = Function.prototype.call.bind(String.prototype.startsWith);
50
+ const READ_FLAGS = constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0);
15
51
  export function pluginStoreDirectory(root, name, digest) {
16
- return join(resolve(root), PLUGIN_STORE, `${name}@sha256:${digest}`);
52
+ return PATH_JOIN(PATH_RESOLVE(root), PLUGIN_STORE, `${name}@sha256:${digest}`);
17
53
  }
54
+ const EMPTY_STORED_PLUGIN_HOOKS = OBJECT_FREEZE(OBJECT_CREATE(null));
18
55
  /** Write the files atomically; an existing directory is verified instead of overwritten. */
19
56
  export async function materializePlugin(root, name, files) {
20
57
  const manifest = payloadManifest(files);
@@ -22,7 +59,7 @@ export async function materializePlugin(root, name, files) {
22
59
  const directory = pluginStoreDirectory(root, name, digest);
23
60
  let exists = false;
24
61
  try {
25
- await lstat(directory);
62
+ await lstatPath(directory);
26
63
  exists = true;
27
64
  }
28
65
  catch (error) {
@@ -31,103 +68,243 @@ export async function materializePlugin(root, name, files) {
31
68
  }
32
69
  if (exists) {
33
70
  await verifyStoredPlugin(directory, digest);
34
- return { directory, digest };
71
+ return frozenHostedPromiseValue({ directory, digest });
35
72
  }
36
- const parent = dirname(directory);
37
- await mkdir(parent, { recursive: true });
38
- const staging = await mkdtemp(join(parent, '.install-'));
73
+ const parent = PATH_DIRNAME(directory);
74
+ await MKDIR(parent, { recursive: true });
75
+ const staging = await MKDTEMP(PATH_JOIN(parent, '.install-'));
39
76
  try {
40
- for (const file of files) {
77
+ for (let index = 0; index < files.length; index += 1) {
78
+ const file = files[index];
41
79
  if (!safePath(file.path) || file.path === 'manifest.json')
42
80
  throw new PluginError('plugin_path_invalid', `${file.path}: invalid plugin path.`);
43
- await mkdir(dirname(join(staging, file.path)), { recursive: true });
44
- await writeFile(join(staging, file.path), file.data, { mode: 0o644 });
81
+ await MKDIR(PATH_DIRNAME(PATH_JOIN(staging, file.path)), {
82
+ recursive: true,
83
+ });
84
+ await WRITE_FILE(PATH_JOIN(staging, file.path), file.data, {
85
+ mode: 0o644,
86
+ });
45
87
  }
46
- await writeFile(join(staging, 'manifest.json'), manifest);
88
+ await WRITE_FILE(PATH_JOIN(staging, 'manifest.json'), manifest);
47
89
  try {
48
- await rename(staging, directory);
90
+ await RENAME(staging, directory);
49
91
  }
50
92
  catch (error) {
51
- if (!['EEXIST', 'ENOTEMPTY'].includes(error.code ?? ''))
93
+ const code = error.code;
94
+ if (code !== 'EEXIST' && code !== 'ENOTEMPTY')
52
95
  throw error;
53
96
  await verifyStoredPlugin(directory, digest);
54
97
  }
55
98
  }
56
99
  finally {
57
- await rm(staging, { recursive: true, force: true });
100
+ await RM(staging, { recursive: true, force: true });
58
101
  }
59
- return { directory, digest };
102
+ return frozenHostedPromiseValue({ directory, digest });
60
103
  }
61
- async function regularFile(root, path) {
62
- const parts = path.split('/');
63
- for (let i = 1; i <= parts.length; i++) {
64
- const stat = await lstat(join(root, ...parts.slice(0, i)));
65
- if (i === parts.length ? !stat.isFile() : !stat.isDirectory())
66
- throw new PluginError('plugin_source_drift', `${path}: expected a regular file, without symlinks.`);
67
- }
68
- return readFile(join(root, path));
104
+ async function regularFile(root, path, maxBytes, expectedBytes, hooks = EMPTY_STORED_PLUGIN_HOOKS) {
105
+ const absolute = PATH_JOIN(root, path);
106
+ const handle = await openStoredFile(root, path, hooks);
107
+ try {
108
+ const before = await statDescriptor(handle, { bigint: true });
109
+ if (!descriptorIsFile(before) ||
110
+ before.size < 0n ||
111
+ before.size > BIG_INT(maxBytes) ||
112
+ (expectedBytes !== undefined && before.size !== BIG_INT(expectedBytes))) {
113
+ throw new PluginError('plugin_source_drift', `${path}: expected a bounded regular file.`);
114
+ }
115
+ await ownHook(hooks, 'afterStat')?.(absolute);
116
+ const size = NUMBER(before.size);
117
+ const bytes = BUFFER_ALLOC_UNSAFE(size);
118
+ let offset = 0;
119
+ while (offset < size) {
120
+ const bytesRead = await readDescriptor(handle, bytes, offset, size - offset, offset);
121
+ if (bytesRead === 0) {
122
+ throw new PluginError('plugin_source_drift', `${path}: changed while reading.`);
123
+ }
124
+ offset += bytesRead;
125
+ }
126
+ const extra = BUFFER_ALLOC_UNSAFE(1);
127
+ if ((await readDescriptor(handle, extra, 0, 1, size)) !== 0) {
128
+ throw new PluginError('plugin_source_drift', `${path}: changed while reading.`);
129
+ }
130
+ const after = await statDescriptor(handle, { bigint: true });
131
+ if (after.size !== before.size || after.mtimeNs !== before.mtimeNs || after.ctimeNs !== before.ctimeNs) {
132
+ throw new PluginError('plugin_source_drift', `${path}: changed while reading.`);
133
+ }
134
+ return hostedPromiseValue(bytes);
135
+ }
136
+ finally {
137
+ await closeDescriptor(handle);
138
+ }
139
+ }
140
+ async function openStoredFile(root, path, hooks) {
141
+ const parts = STRING_SPLIT(path, '/');
142
+ if (PROCESS_PLATFORM !== 'linux') {
143
+ for (let i = 1; i < parts.length; i++) {
144
+ let parent = root;
145
+ for (let index = 0; index < i; index += 1)
146
+ parent = PATH_JOIN(parent, parts[index]);
147
+ if (!descriptorIsDirectory(await lstatPath(parent))) {
148
+ throw new PluginError('plugin_source_drift', `${path}: expected a regular file, without symlinks.`);
149
+ }
150
+ }
151
+ await ownHook(hooks, 'beforeOpen')?.(PATH_JOIN(root, path));
152
+ return await openDescriptor(PATH_JOIN(root, path), READ_FLAGS);
153
+ }
154
+ let directory = await openDescriptor(PATH_RESOLVE(root), READ_FLAGS);
155
+ try {
156
+ if (!descriptorIsDirectory(await statDescriptor(directory, { bigint: true }))) {
157
+ throw new PluginError('plugin_source_drift', `${path}: plugin store root is not a directory.`);
158
+ }
159
+ for (let index = 0; index < parts.length - 1; index += 1) {
160
+ const part = parts[index];
161
+ const child = await openDescriptor(`/proc/self/fd/${directory}/${part}`, READ_FLAGS);
162
+ let adopted = false;
163
+ try {
164
+ await ownHook(hooks, 'beforeDirectoryStat')?.();
165
+ if (!descriptorIsDirectory(await statDescriptor(child, { bigint: true }))) {
166
+ throw new PluginError('plugin_source_drift', `${path}: expected a regular file, without symlinks.`);
167
+ }
168
+ await closeDescriptor(directory);
169
+ directory = child;
170
+ adopted = true;
171
+ }
172
+ finally {
173
+ if (!adopted)
174
+ await closeDescriptor(child);
175
+ }
176
+ }
177
+ await ownHook(hooks, 'beforeOpen')?.(PATH_JOIN(root, path));
178
+ return await openDescriptor(`/proc/self/fd/${directory}/${parts[parts.length - 1]}`, READ_FLAGS);
179
+ }
180
+ finally {
181
+ await closeDescriptor(directory);
182
+ }
69
183
  }
70
184
  /** Re-hash a materialized plugin and compare with the digest the lockfile recorded. */
71
- export async function verifyStoredPlugin(directory, expectedDigest) {
72
- const drift = (message) => { throw new PluginError('plugin_source_drift', `${directory}: ${message}`); };
73
- let raw;
185
+ export async function verifyStoredPlugin(directory, expectedDigest, hooks = EMPTY_STORED_PLUGIN_HOOKS) {
186
+ await readVerifiedStoredPluginFiles(directory, expectedDigest, hooks);
187
+ }
188
+ async function readVerifiedStoredPluginFiles(directory, expectedDigest, hooks) {
189
+ const drift = (message) => {
190
+ throw new PluginError('plugin_source_drift', `${directory}: ${message}`);
191
+ };
192
+ let manifest;
74
193
  try {
75
- if (!(await lstat(directory)).isDirectory())
194
+ if (!descriptorIsDirectory(await lstatPath(directory)))
76
195
  return drift('not a directory');
77
- raw = (await regularFile(directory, 'manifest.json')).toString('utf8');
196
+ manifest = await regularFile(directory, 'manifest.json', MAX_PLUGIN_MANIFEST_BYTES, undefined, hooks);
78
197
  }
79
198
  catch (error) {
80
199
  return drift(error instanceof PluginError ? error.message : 'manifest.json is missing');
81
200
  }
201
+ const raw = BUFFER_TO_STRING(manifest, 'utf8');
82
202
  if (sha256(raw) !== expectedDigest)
83
203
  return drift('manifest.json digest differs from the lockfile');
84
204
  let entries;
85
205
  try {
86
- entries = JSON.parse(raw);
87
- if (!Array.isArray(entries))
88
- throw new Error();
206
+ const value = snapshotJsonValue(JSON_PARSE(raw), 'stored plugin manifest', {
207
+ maxBytes: MAX_PLUGIN_MANIFEST_BYTES,
208
+ maxDepth: 3,
209
+ maxNodes: 1 + MAX_PLUGIN_FILES * 4,
210
+ });
211
+ if (!ARRAY_IS_ARRAY(value))
212
+ throw new ERROR();
213
+ entries = value;
89
214
  }
90
215
  catch {
91
216
  return drift('manifest.json is not a manifest');
92
217
  }
93
- const paths = new Set();
94
- for (const entry of entries) {
95
- if (typeof entry?.path !== 'string' || !safePath(entry.path))
96
- return drift('manifest.json lists an invalid path');
218
+ if (entries.length > MAX_PLUGIN_FILES)
219
+ return drift(`manifest.json lists more than ${MAX_PLUGIN_FILES} files`);
220
+ const paths = new SET();
221
+ const files = [{ path: 'manifest.json', data: manifest }];
222
+ let totalBytes = 0;
223
+ for (let index = 0; index < entries.length; index += 1) {
224
+ const entry = entries[index];
225
+ if (typeof entry !== 'object' ||
226
+ entry === null ||
227
+ ARRAY_IS_ARRAY(entry))
228
+ return drift('manifest.json lists an invalid file');
229
+ const path = entry.path;
230
+ const digest = entry.sha256;
231
+ const bytes = entry.bytes;
232
+ if (typeof path !== 'string' ||
233
+ !safePath(path) ||
234
+ typeof digest !== 'string' ||
235
+ !REGEXP_TEST(/^[a-f0-9]{64}$/, digest) ||
236
+ typeof bytes !== 'number' ||
237
+ !NUMBER_IS_SAFE_INTEGER(bytes) ||
238
+ bytes < 0 ||
239
+ bytes > MAX_PLUGIN_FILE_BYTES ||
240
+ SET_HAS(paths, path))
241
+ return drift('manifest.json lists an invalid file');
242
+ totalBytes += bytes;
243
+ if (totalBytes > MAX_PLUGIN_TOTAL_BYTES)
244
+ return drift(`plugin exceeds ${MAX_PLUGIN_TOTAL_BYTES} bytes`);
97
245
  let data;
98
246
  try {
99
- data = await regularFile(directory, entry.path);
247
+ data = await regularFile(directory, path, MAX_PLUGIN_FILE_BYTES, bytes, hooks);
100
248
  }
101
249
  catch (error) {
102
- return drift(error instanceof PluginError ? error.message : `${entry.path} is missing`);
250
+ return drift(error instanceof PluginError ? error.message : `${path} is missing`);
103
251
  }
104
- if (data.length !== entry.bytes || sha256(data) !== entry.sha256)
105
- return drift(`${entry.path} changed since installation`);
106
- paths.add(entry.path);
252
+ if (sha256(data) !== digest)
253
+ return drift(`${path} changed since installation`);
254
+ SET_ADD(paths, path);
255
+ appendIntrinsicArray(files, { path, data });
107
256
  }
108
- await rejectExtras(directory, '', new Set([...paths, 'manifest.json']), drift);
257
+ SET_ADD(paths, 'manifest.json');
258
+ await rejectExtras(directory, '', paths, drift);
259
+ const frozen = [];
260
+ for (let index = 0; index < files.length; index += 1) {
261
+ appendIntrinsicArray(frozen, OBJECT_FREEZE(files[index]));
262
+ }
263
+ return frozenHostedPromiseValue(frozen);
109
264
  }
110
265
  /** Re-verify, then return every stored file including the payload `manifest.json`. */
111
- export async function readStoredPluginFiles(directory, expectedDigest) {
112
- await verifyStoredPlugin(directory, expectedDigest);
113
- const manifest = await regularFile(directory, 'manifest.json');
114
- const entries = JSON.parse(manifest.toString('utf8'));
115
- const files = [{ path: 'manifest.json', data: manifest }];
116
- for (const entry of entries)
117
- files.push({ path: entry.path, data: await regularFile(directory, entry.path) });
118
- return files;
266
+ export async function readStoredPluginFiles(directory, expectedDigest, hooks = EMPTY_STORED_PLUGIN_HOOKS) {
267
+ return await readVerifiedStoredPluginFiles(directory, expectedDigest, hooks);
268
+ }
269
+ function ownHook(hooks, name) {
270
+ const descriptor = OBJECT_GET_OWN_PROPERTY_DESCRIPTOR(hooks, name);
271
+ return descriptor !== undefined && 'value' in descriptor && typeof descriptor.value === 'function'
272
+ ? descriptor.value
273
+ : undefined;
119
274
  }
120
275
  /** Drop a materialized plugin directory. Missing is a no-op. */
121
276
  export async function removeStoredPlugin(directory) {
122
- await rm(directory, { recursive: true, force: true });
277
+ await RM(directory, { recursive: true, force: true });
123
278
  }
124
279
  async function rejectExtras(root, prefix, paths, drift) {
125
- for (const entry of await readdir(join(root, prefix), { withFileTypes: true })) {
126
- const path = prefix + entry.name;
127
- if (entry.isDirectory() && [...paths].some(file => file.startsWith(`${path}/`)))
128
- await rejectExtras(root, `${path}/`, paths, drift);
129
- else if (!entry.isFile() || !paths.has(path))
130
- drift(`${path}: unlisted file or unsupported file type`);
280
+ let entries = 0;
281
+ async function visit(currentPrefix) {
282
+ const directory = await openDirectory(PATH_JOIN(root, currentPrefix));
283
+ try {
284
+ for (;;) {
285
+ const entry = await readDirectoryEntry(directory);
286
+ if (entry === null)
287
+ break;
288
+ entries += 1;
289
+ if (entries > MAX_PLUGIN_STORE_ENTRIES)
290
+ drift('plugin store contains too many entries');
291
+ const path = currentPrefix + entry.name;
292
+ let declaredDescendant = false;
293
+ SET_FOR_EACH(paths, file => {
294
+ if (STRING_STARTS_WITH(file, `${path}/`))
295
+ declaredDescendant = true;
296
+ });
297
+ if (directoryEntryIsDirectory(entry) && declaredDescendant)
298
+ await visit(`${path}/`);
299
+ else if (!directoryEntryIsFile(entry) || !SET_HAS(paths, path)) {
300
+ drift(`${path}: unlisted file or unsupported file type`);
301
+ }
302
+ }
303
+ }
304
+ finally {
305
+ await closeDirectory(directory);
306
+ }
131
307
  }
308
+ await visit(prefix);
132
309
  }
133
310
  //# sourceMappingURL=plugin-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-store.js","sourceRoot":"","sources":["../src/plugin-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-store.js","sourceRoot":"","sources":["../src/plugin-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"semver-range.d.ts","sourceRoot":"","sources":["../src/semver-range.ts"],"names":[],"mappings":"AAYA,UAAU,MAAM;IAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAE9F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM9D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAgCD,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAgBtE"}
1
+ {"version":3,"file":"semver-range.d.ts","sourceRoot":"","sources":["../src/semver-range.ts"],"names":[],"mappings":"AAgCA,UAAU,MAAM;IAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAE9F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ9D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAgCD,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAmBtE"}
@@ -9,17 +9,26 @@
9
9
  */
10
10
  const VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;
11
11
  const RANGE = /^(\*|(?:[\^~]|>=)?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?: <\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)?)$/;
12
+ const MATH_MAX = Math.max;
13
+ const NUMBER = Number;
14
+ const NUMBER_IS_SAFE_INTEGER = Number.isSafeInteger;
15
+ const REGEXP_EXEC = Function.prototype.call.bind(RegExp.prototype.exec);
16
+ const REGEXP_TEST = Function.prototype.call.bind(RegExp.prototype.test);
17
+ const STRING_SLICE = Function.prototype.call.bind(String.prototype.slice);
18
+ const STRING_SPLIT = Function.prototype.call.bind(String.prototype.split);
12
19
  export function parseVersion(value) {
13
- const m = VERSION.exec(value);
20
+ const m = REGEXP_EXEC(VERSION, value);
14
21
  if (!m)
15
22
  return undefined;
16
- const triple = [Number(m[1]), Number(m[2]), Number(m[3])];
17
- if (triple.some(n => !Number.isSafeInteger(n)))
18
- return undefined;
23
+ const triple = [NUMBER(m[1]), NUMBER(m[2]), NUMBER(m[3])];
24
+ for (let index = 0; index < triple.length; index += 1) {
25
+ if (!NUMBER_IS_SAFE_INTEGER(triple[index]))
26
+ return undefined;
27
+ }
19
28
  return m[4] === undefined ? { triple } : { triple, pre: m[4] };
20
29
  }
21
30
  export function isVersionRange(value) {
22
- return RANGE.test(value);
31
+ return REGEXP_TEST(RANGE, value);
23
32
  }
24
33
  function compare(a, b) {
25
34
  for (let i = 0; i < 3; i++)
@@ -34,9 +43,9 @@ function compare(a, b) {
34
43
  return comparePrerelease(a.pre, b.pre);
35
44
  }
36
45
  function comparePrerelease(a, b) {
37
- const as = a.split('.');
38
- const bs = b.split('.');
39
- const n = Math.max(as.length, bs.length);
46
+ const as = STRING_SPLIT(a, '.');
47
+ const bs = STRING_SPLIT(b, '.');
48
+ const n = MATH_MAX(as.length, bs.length);
40
49
  for (let i = 0; i < n; i++) {
41
50
  const left = as[i];
42
51
  const right = bs[i];
@@ -44,8 +53,8 @@ function comparePrerelease(a, b) {
44
53
  return -1;
45
54
  if (right === undefined)
46
55
  return 1;
47
- const leftNum = /^\d+$/.test(left) ? Number(left) : undefined;
48
- const rightNum = /^\d+$/.test(right) ? Number(right) : undefined;
56
+ const leftNum = REGEXP_TEST(/^\d+$/, left) ? NUMBER(left) : undefined;
57
+ const rightNum = REGEXP_TEST(/^\d+$/, right) ? NUMBER(right) : undefined;
49
58
  if (leftNum !== undefined && rightNum !== undefined) {
50
59
  if (leftNum !== rightNum)
51
60
  return leftNum - rightNum;
@@ -67,18 +76,21 @@ export function satisfiesRange(version, range) {
67
76
  return false;
68
77
  if (range === '*')
69
78
  return true;
70
- const [lowerText, upperText] = range.split(' ');
71
- const operator = /^[\^~]|^>=/.exec(lowerText)?.[0] ?? '';
72
- const lower = parseVersion(lowerText.slice(operator.length));
79
+ const parts = STRING_SPLIT(range, ' ');
80
+ const lowerText = parts[0];
81
+ const upperText = parts[1];
82
+ const operator = REGEXP_EXEC(/^[\^~]|^>=/, lowerText)?.[0] ?? '';
83
+ const lower = parseVersion(STRING_SLICE(lowerText, operator.length));
73
84
  if (compare(v, lower) < 0)
74
85
  return false;
75
86
  if (operator === '')
76
87
  return compare(v, lower) === 0;
77
88
  let upper;
78
89
  if (upperText !== undefined)
79
- upper = parseVersion(upperText.slice(1));
90
+ upper = parseVersion(STRING_SLICE(upperText, 1));
80
91
  else if (operator === '^') {
81
- const [major, minor] = lower.triple;
92
+ const major = lower.triple[0];
93
+ const minor = lower.triple[1];
82
94
  upper = major > 0 ? { triple: [major + 1, 0, 0] } : minor > 0 ? { triple: [0, minor + 1, 0] } : { triple: [0, 0, lower.triple[2] + 1] };
83
95
  }
84
96
  else if (operator === '~')
@@ -1 +1 @@
1
- {"version":3,"file":"semver-range.js","sourceRoot":"","sources":["../src/semver-range.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semver-range.js","sourceRoot":"","sources":["../src/semver-range.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relayflows/sdk",
3
- "version": "2.0.28",
3
+ "version": "2.0.30",
4
4
  "description": "TypeScript-first authoring SDK for Relayflows. Compiles specs; speaks the journal protocol.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -49,7 +49,7 @@
49
49
  "@modelcontextprotocol/sdk": "^1.30.0",
50
50
  "@relayfile/adapter-core": "0.6.2",
51
51
  "@relayfile/relay-helpers": "0.4.12",
52
- "@relayflows/surface": "2.0.28",
52
+ "@relayflows/surface": "2.0.30",
53
53
  "@types/js-yaml": "^4.0.9",
54
54
  "ai-hist": "0.4.1",
55
55
  "ajv": "^8.17.1",
@@ -325,7 +325,16 @@ export async function executeAuthoredFlow<Input = undefined>(
325
325
  (await recordedVerdicts)?.set(id, record);
326
326
  }
327
327
  }
328
- const literal = `'${JSON.stringify(record).replaceAll("'", "'\\''")}'`;
328
+ // Fixed field order, never the record as it came back: the journal stores
329
+ // stream messages with sorted keys, so JSON.stringify of a resumed record
330
+ // would lower a different command than the first run did, and the gate
331
+ // run's admission key would refuse it as bound to a different spec.
332
+ const canonical: PredicateRecord = {
333
+ gate: 'predicate', step: record.step, verdict: record.verdict,
334
+ ...(record.because === undefined ? {} : { because: record.because }),
335
+ ...(record.threw === undefined ? {} : { threw: record.threw }),
336
+ };
337
+ const literal = `'${JSON.stringify(canonical).replaceAll("'", "'\\''")}'`;
329
338
  const command = record.verdict === 'pass' ? `printf '%s' ${literal}` : `printf '%s' ${literal} >&2; exit 1`;
330
339
  try {
331
340
  await observeStep(`${id}.gate`, 'deterministic', () => lowerDeterministic(`${id}.gate`, command, false), options.onProgress);
@@ -161,24 +161,58 @@ export async function readAuthoredStepIndex(
161
161
  let offset = 0;
162
162
  for (;;) {
163
163
  const page = await journal.streamRead(rootRunId, AUTHORED_STEP_STREAM, offset, 1000);
164
- for (const message of page.messages) {
165
- // `stream.read` returns either the envelope or the bare message,
166
- // matching how the executor reads predicate verdicts.
167
- const raw = (message as { message?: unknown }).message ?? message;
168
- if (!isAuthoredStepRecord(raw)) continue;
169
- const previous = index.get(raw.step);
170
- // An `admitted` record arriving after a `completed` one (a resumed body
171
- // re-admitting the same child under its stable admission key) must not
172
- // un-complete it.
173
- if (previous?.state === 'completed' && raw.state === 'admitted') continue;
174
- index.set(raw.step, raw);
175
- }
164
+ // `stream.read` returns either the envelope or the bare message,
165
+ // matching how the executor reads predicate verdicts.
166
+ foldAuthoredStepRecords(page.messages.map((message) => (message as { message?: unknown }).message ?? message), index);
176
167
  if (page.messages.length === 0 || page.next_offset <= offset) break;
177
168
  offset = page.next_offset;
178
169
  }
179
170
  return [...index.values()];
180
171
  }
181
172
 
173
+ /**
174
+ * The fold itself, over messages already read from the stream in append
175
+ * order — by `readAuthoredStepIndex` through the daemon, or by `flows status`
176
+ * straight from the journal file, which must agree with it record for record.
177
+ */
178
+ export function foldAuthoredStepRecords(
179
+ messages: Iterable<unknown>,
180
+ index: Map<string, AuthoredStepRecord> = new Map(),
181
+ ): Map<string, AuthoredStepRecord> {
182
+ for (const raw of messages) {
183
+ if (!isAuthoredStepRecord(raw)) continue;
184
+ const previous = index.get(raw.step);
185
+ if (previous === undefined) {
186
+ index.set(raw.step, raw);
187
+ continue;
188
+ }
189
+ // An `admitted` record arriving after a `completed` one (a resumed body
190
+ // re-admitting the same child under its stable admission key) must not
191
+ // un-complete it. Either way, graph fields one record lacks are taken from
192
+ // the other: a completion written without them (or a re-admission that
193
+ // adds them, over a root an older runtime began) must not erase them.
194
+ const keepPrevious = previous.state === 'completed' && raw.state === 'admitted';
195
+ index.set(raw.step, withGraphFrom(keepPrevious ? previous : raw, keepPrevious ? raw : previous));
196
+ }
197
+ return index;
198
+ }
199
+
200
+ /** `primary`, with any `label` / `after` it lacks taken from `fallback`. */
201
+ function withGraphFrom(primary: AuthoredStepRecord, fallback: AuthoredStepRecord): AuthoredStepRecord {
202
+ const label = primary.label ?? fallback.label;
203
+ // `after` and `afterTruncated` travel together: a truncated walk that found
204
+ // no predecessor journals the flag alone, and it must survive the fold.
205
+ const hasEdges = (record: AuthoredStepRecord) => record.after !== undefined || record.afterTruncated === true;
206
+ const edges = hasEdges(primary) ? primary : fallback;
207
+ const { label: _label, after: _after, afterTruncated: _truncated, ...lifecycle } = primary;
208
+ return {
209
+ ...lifecycle,
210
+ ...(label === undefined ? {} : { label }),
211
+ ...(edges.after === undefined ? {} : { after: edges.after }),
212
+ ...(edges.afterTruncated === true ? { afterTruncated: true as const } : {}),
213
+ };
214
+ }
215
+
182
216
  function isAuthoredStepRecord(value: unknown): value is AuthoredStepRecord {
183
217
  if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;
184
218
  const record = value as Partial<AuthoredStepRecord>;