@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.
- package/dist/authored-flow-executor.d.ts.map +1 -1
- package/dist/authored-flow-executor.js +10 -1
- package/dist/authored-flow-executor.js.map +1 -1
- package/dist/authored-step-index.d.ts +6 -0
- package/dist/authored-step-index.d.ts.map +1 -1
- package/dist/authored-step-index.js +42 -14
- package/dist/authored-step-index.js.map +1 -1
- package/dist/bundle-extensions.d.ts.map +1 -1
- package/dist/bundle-extensions.js +4 -7
- package/dist/bundle-extensions.js.map +1 -1
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +41 -7
- package/dist/bundle.js.map +1 -1
- package/dist/canonical.d.ts.map +1 -1
- package/dist/canonical.js +18 -6
- package/dist/canonical.js.map +1 -1
- package/dist/cli/status.d.ts +12 -0
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +39 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/flow-extension-compat.d.ts.map +1 -1
- package/dist/flow-extension-compat.js +26 -8
- package/dist/flow-extension-compat.js.map +1 -1
- package/dist/flow-extension-loader.d.ts +7 -0
- package/dist/flow-extension-loader.d.ts.map +1 -1
- package/dist/flow-extension-loader.js +48 -22
- package/dist/flow-extension-loader.js.map +1 -1
- package/dist/fs-descriptor.d.ts +17 -0
- package/dist/fs-descriptor.d.ts.map +1 -0
- package/dist/fs-descriptor.js +96 -0
- package/dist/fs-descriptor.js.map +1 -0
- package/dist/hosted-base-snapshot.d.ts +25 -0
- package/dist/hosted-base-snapshot.d.ts.map +1 -0
- package/dist/hosted-base-snapshot.js +278 -0
- package/dist/hosted-base-snapshot.js.map +1 -0
- package/dist/hosted-extension-declarations.d.ts +10 -0
- package/dist/hosted-extension-declarations.d.ts.map +1 -0
- package/dist/hosted-extension-declarations.js +272 -0
- package/dist/hosted-extension-declarations.js.map +1 -0
- package/dist/hosted-extension-isolation.d.ts +82 -0
- package/dist/hosted-extension-isolation.d.ts.map +1 -0
- package/dist/hosted-extension-isolation.js +322 -0
- package/dist/hosted-extension-isolation.js.map +1 -0
- package/dist/hosted-extension-manifest.d.ts +9 -0
- package/dist/hosted-extension-manifest.d.ts.map +1 -0
- package/dist/hosted-extension-manifest.js +235 -0
- package/dist/hosted-extension-manifest.js.map +1 -0
- package/dist/hosted-extension-protocol.d.ts +16 -0
- package/dist/hosted-extension-protocol.d.ts.map +1 -0
- package/dist/hosted-extension-protocol.js +224 -0
- package/dist/hosted-extension-protocol.js.map +1 -0
- package/dist/hosted-extension-runtime.d.ts +30 -0
- package/dist/hosted-extension-runtime.d.ts.map +1 -0
- package/dist/hosted-extension-runtime.js +167 -0
- package/dist/hosted-extension-runtime.js.map +1 -0
- package/dist/hosted-extension-sandbox-source.d.ts +9 -0
- package/dist/hosted-extension-sandbox-source.d.ts.map +1 -0
- package/dist/hosted-extension-sandbox-source.js +95 -0
- package/dist/hosted-extension-sandbox-source.js.map +1 -0
- package/dist/hosted-extension-sandbox.d.ts +39 -0
- package/dist/hosted-extension-sandbox.d.ts.map +1 -0
- package/dist/hosted-extension-sandbox.js +418 -0
- package/dist/hosted-extension-sandbox.js.map +1 -0
- package/dist/hosted-project.d.ts +3 -0
- package/dist/hosted-project.d.ts.map +1 -0
- package/dist/hosted-project.js +19 -0
- package/dist/hosted-project.js.map +1 -0
- package/dist/hosted-promise-safety.d.ts +12 -0
- package/dist/hosted-promise-safety.d.ts.map +1 -0
- package/dist/hosted-promise-safety.js +63 -0
- package/dist/hosted-promise-safety.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/intrinsic-array.d.ts +3 -0
- package/dist/intrinsic-array.d.ts.map +1 -0
- package/dist/intrinsic-array.js +14 -0
- package/dist/intrinsic-array.js.map +1 -0
- package/dist/json-value.d.ts +6 -1
- package/dist/json-value.d.ts.map +1 -1
- package/dist/json-value.js +155 -36
- package/dist/json-value.js.map +1 -1
- package/dist/llm-worker.d.ts +9 -0
- package/dist/llm-worker.d.ts.map +1 -1
- package/dist/llm-worker.js +15 -1
- package/dist/llm-worker.js.map +1 -1
- package/dist/plugin-store.d.ts +8 -2
- package/dist/plugin-store.d.ts.map +1 -1
- package/dist/plugin-store.js +233 -56
- package/dist/plugin-store.js.map +1 -1
- package/dist/semver-range.d.ts.map +1 -1
- package/dist/semver-range.js +27 -15
- package/dist/semver-range.js.map +1 -1
- package/package.json +2 -2
- package/src/authored-flow-executor.ts +10 -1
- package/src/authored-step-index.ts +46 -12
- package/src/bundle-extensions.ts +6 -5
- package/src/bundle.ts +52 -7
- package/src/canonical.ts +20 -6
- package/src/cli/status.ts +50 -1
- package/src/flow-extension-compat.ts +32 -7
- package/src/flow-extension-loader.ts +56 -21
- package/src/fs-descriptor.ts +127 -0
- package/src/hosted-base-snapshot.ts +351 -0
- package/src/hosted-extension-declarations.ts +387 -0
- package/src/hosted-extension-isolation.ts +457 -0
- package/src/hosted-extension-manifest.ts +249 -0
- package/src/hosted-extension-protocol.ts +262 -0
- package/src/hosted-extension-runtime.ts +266 -0
- package/src/hosted-extension-sandbox-source.ts +94 -0
- package/src/hosted-extension-sandbox.ts +489 -0
- package/src/hosted-project.ts +18 -0
- package/src/hosted-promise-safety.ts +68 -0
- package/src/index.ts +18 -0
- package/src/intrinsic-array.ts +14 -0
- package/src/json-value.ts +184 -32
- package/src/llm-worker.ts +15 -1
- package/src/plugin-store.ts +323 -56
- package/src/semver-range.ts +39 -14
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { safePath } from './bundle.js';
|
|
2
|
+
import { snapshotJsonValue } from './json-value.js';
|
|
3
|
+
import { frozenHostedPromiseValue } from './hosted-promise-safety.js';
|
|
4
|
+
import { appendIntrinsicArray } from './intrinsic-array.js';
|
|
5
|
+
import { PluginError } from './plugin-manifest.js';
|
|
6
|
+
const ARRAY_IS_ARRAY = Array.isArray;
|
|
7
|
+
const NUMBER_IS_FINITE = Number.isFinite;
|
|
8
|
+
const OBJECT_CREATE = Object.create;
|
|
9
|
+
const OBJECT_FREEZE = Object.freeze;
|
|
10
|
+
const OBJECT_HAS_OWN = Object.hasOwn;
|
|
11
|
+
const OBJECT_KEYS = Object.keys;
|
|
12
|
+
const REGEXP_TEST = Function.prototype.call.bind(RegExp.prototype.test);
|
|
13
|
+
const STRING_ENDS_WITH = Function.prototype.call.bind(String.prototype.endsWith);
|
|
14
|
+
const STRING_STARTS_WITH = Function.prototype.call.bind(String.prototype.startsWith);
|
|
15
|
+
const STRING_TRIM = Function.prototype.call.bind(String.prototype.trim);
|
|
16
|
+
const TOP_LEVEL = [
|
|
17
|
+
'schema', 'kind', 'name', 'version', 'description', 'source', 'compat', 'entry',
|
|
18
|
+
'extends', 'triggers', 'gates', 'verbs', 'permissions', 'preflight', 'config',
|
|
19
|
+
];
|
|
20
|
+
const NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
21
|
+
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
22
|
+
const PROVIDER = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
23
|
+
const WRITE_CLASS = /^[a-z0-9-]+(?::[a-z0-9_-]+)+$/;
|
|
24
|
+
const WALLCLOCK = /^\d+(?:ms|s|m|h|d)$/;
|
|
25
|
+
const VERSION = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
|
|
26
|
+
const VERSION_RANGE = /^(?:\*|(?:[\^~]|>=)?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?: <\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)?)$/;
|
|
27
|
+
const MAX_DESCRIPTION = 500;
|
|
28
|
+
const MAX_LIST = 64;
|
|
29
|
+
/**
|
|
30
|
+
* Hosted manifests are parsed after authored code may have executed. Keep this
|
|
31
|
+
* projection deliberately narrower than the authoring validator and use only
|
|
32
|
+
* module-captured intrinsics. The only manifest that can launch is separately
|
|
33
|
+
* pinned by exact ref, payload digest, and manifest digest.
|
|
34
|
+
*/
|
|
35
|
+
export function validateHostedFlowExtensionManifest(input) {
|
|
36
|
+
let value;
|
|
37
|
+
try {
|
|
38
|
+
value = snapshotJsonValue(input, 'hosted plugin manifest');
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return invalid('Hosted plugin manifest must be JSON data.');
|
|
42
|
+
}
|
|
43
|
+
if (!record(value) || !hasOnlyKeys(value, TOP_LEVEL))
|
|
44
|
+
return invalid('Expected a hosted flow-extension manifest object.');
|
|
45
|
+
if (value.schema !== 2 || value.kind !== 'flow-extension')
|
|
46
|
+
return invalid('Hosted flow extensions require schema 2.');
|
|
47
|
+
if (typeof value.name !== 'string' || !matches(NAME, value.name) || STRING_STARTS_WITH(value.name, 'helper-')) {
|
|
48
|
+
return invalid('name must be lowercase kebab-case and must not start with helper-.');
|
|
49
|
+
}
|
|
50
|
+
if (typeof value.version !== 'string' || !matches(VERSION, value.version))
|
|
51
|
+
return invalid('version must be semver x.y.z.');
|
|
52
|
+
if (value.description !== undefined
|
|
53
|
+
&& (typeof value.description !== 'string' || value.description.length > MAX_DESCRIPTION)) {
|
|
54
|
+
return invalid(`description must be a string of at most ${MAX_DESCRIPTION} characters.`);
|
|
55
|
+
}
|
|
56
|
+
if (value.source !== undefined || value.config !== undefined) {
|
|
57
|
+
throw new PluginError('plugin_unsupported', 'Hosted capability extensions cannot declare source or config metadata.');
|
|
58
|
+
}
|
|
59
|
+
if (typeof value.entry !== 'string' || !STRING_ENDS_WITH(value.entry, '.flow.ts') || !safePath(value.entry)) {
|
|
60
|
+
return invalid('entry must be a plugin-relative .flow.ts path.');
|
|
61
|
+
}
|
|
62
|
+
const extension = extensionShape(value.extends);
|
|
63
|
+
if (!extension.handlers && extension.hooks.length === 0) {
|
|
64
|
+
return invalid('A flow extension must contribute handlers or at least one hook.');
|
|
65
|
+
}
|
|
66
|
+
for (let index = 0; index < 2; index += 1) {
|
|
67
|
+
const field = index === 0 ? 'verbs' : 'gates';
|
|
68
|
+
const at = value[field];
|
|
69
|
+
if (at !== undefined && (!ARRAY_IS_ARRAY(at) || at.length !== 0)) {
|
|
70
|
+
return invalid(`A flow extension declares no ${field}; ship a helper plugin beside it.`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const preflight = preflightShape(value.preflight);
|
|
74
|
+
const output = OBJECT_CREATE(null);
|
|
75
|
+
output.schema = 2;
|
|
76
|
+
output.kind = 'flow-extension';
|
|
77
|
+
output.name = value.name;
|
|
78
|
+
output.version = value.version;
|
|
79
|
+
if (value.description !== undefined)
|
|
80
|
+
output.description = value.description;
|
|
81
|
+
output.compat = compatShape(value.compat);
|
|
82
|
+
output.entry = value.entry;
|
|
83
|
+
output.extends = extension;
|
|
84
|
+
output.triggers = triggerShapes(value.triggers ?? []);
|
|
85
|
+
output.permissions = permissionsShape(value.permissions);
|
|
86
|
+
output.preflight = preflight;
|
|
87
|
+
return frozenHostedPromiseValue(output);
|
|
88
|
+
}
|
|
89
|
+
function extensionShape(value) {
|
|
90
|
+
if (!record(value) || !hasOnlyKeys(value, ['handlers', 'hooks', 'verbs', 'gates'])
|
|
91
|
+
|| typeof value.handlers !== 'boolean') {
|
|
92
|
+
return invalid('extends expects { handlers: boolean, hooks: [] }.');
|
|
93
|
+
}
|
|
94
|
+
for (let index = 0; index < 2; index += 1) {
|
|
95
|
+
const field = index === 0 ? 'verbs' : 'gates';
|
|
96
|
+
const at = value[field];
|
|
97
|
+
if (at !== undefined && (!ARRAY_IS_ARRAY(at) || at.length !== 0)) {
|
|
98
|
+
return invalid(`A flow extension declares no ${field}; ship a helper plugin beside it.`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return OBJECT_FREEZE({ handlers: value.handlers, hooks: stringList(value.hooks ?? [], 'extends.hooks', NAME) });
|
|
102
|
+
}
|
|
103
|
+
function compatShape(value) {
|
|
104
|
+
if (!record(value) || !hasOnlyKeys(value, ['surface', 'sdk', 'base'])
|
|
105
|
+
|| typeof value.surface !== 'string' || !matches(VERSION_RANGE, value.surface)
|
|
106
|
+
|| typeof value.sdk !== 'string' || !matches(VERSION_RANGE, value.sdk)
|
|
107
|
+
|| !ARRAY_IS_ARRAY(value.base) || value.base.length === 0 || value.base.length > MAX_LIST) {
|
|
108
|
+
return invalid('compat expects surface, sdk, and at least one base.');
|
|
109
|
+
}
|
|
110
|
+
const base = [];
|
|
111
|
+
for (let index = 0; index < value.base.length; index += 1) {
|
|
112
|
+
const entry = value.base[index];
|
|
113
|
+
if (!record(entry) || !hasOnlyKeys(entry, ['name', 'version'])
|
|
114
|
+
|| typeof entry.name !== 'string' || STRING_TRIM(entry.name).length === 0 || entry.name.length > 100
|
|
115
|
+
|| typeof entry.version !== 'string' || !matches(VERSION_RANGE, entry.version)) {
|
|
116
|
+
return invalid('compat.base entries are { name, version range }.');
|
|
117
|
+
}
|
|
118
|
+
for (let prior = 0; prior < base.length; prior += 1) {
|
|
119
|
+
if (base[prior].name === entry.name)
|
|
120
|
+
return invalid('compat.base names a base flow twice.');
|
|
121
|
+
}
|
|
122
|
+
appendIntrinsicArray(base, OBJECT_FREEZE({ name: entry.name, version: entry.version }));
|
|
123
|
+
}
|
|
124
|
+
return OBJECT_FREEZE({ surface: value.surface, sdk: value.sdk, base: OBJECT_FREEZE(base) });
|
|
125
|
+
}
|
|
126
|
+
function triggerShapes(value) {
|
|
127
|
+
if (!ARRAY_IS_ARRAY(value) || value.length > MAX_LIST)
|
|
128
|
+
return invalid('triggers must be a list.');
|
|
129
|
+
const output = [];
|
|
130
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
131
|
+
const entry = value[index];
|
|
132
|
+
if (!record(entry) || !hasOnlyKeys(entry, ['provider', 'event', 'actions'])
|
|
133
|
+
|| typeof entry.provider !== 'string' || !matches(PROVIDER, entry.provider)
|
|
134
|
+
|| typeof entry.event !== 'string' || !matches(IDENTIFIER, entry.event)) {
|
|
135
|
+
return invalid('triggers entries are { provider, event, actions }.');
|
|
136
|
+
}
|
|
137
|
+
for (let prior = 0; prior < output.length; prior += 1) {
|
|
138
|
+
if (output[prior].provider === entry.provider && output[prior].event === entry.event) {
|
|
139
|
+
return invalid(`Trigger ${entry.provider}:${entry.event} is declared twice.`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
appendIntrinsicArray(output, OBJECT_FREEZE({
|
|
143
|
+
provider: entry.provider,
|
|
144
|
+
event: entry.event,
|
|
145
|
+
actions: stringList(entry.actions, `triggers ${entry.provider}.${entry.event} actions`, IDENTIFIER),
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
return OBJECT_FREEZE(output);
|
|
149
|
+
}
|
|
150
|
+
function permissionsShape(value) {
|
|
151
|
+
if (!record(value) || !hasOnlyKeys(value, ['integrations', 'harnesses', 'mcp', 'writes', 'budget'])) {
|
|
152
|
+
return invalid('permissions expects integrations, harnesses, mcp, writes, and optional budget.');
|
|
153
|
+
}
|
|
154
|
+
let budget;
|
|
155
|
+
if (value.budget !== undefined) {
|
|
156
|
+
if (!record(value.budget) || !hasOnlyKeys(value.budget, ['dollars', 'wallclock'])) {
|
|
157
|
+
return invalid('permissions.budget expects dollars and/or wallclock.');
|
|
158
|
+
}
|
|
159
|
+
if (value.budget.dollars !== undefined
|
|
160
|
+
&& (typeof value.budget.dollars !== 'number' || value.budget.dollars <= 0
|
|
161
|
+
|| !NUMBER_IS_FINITE(value.budget.dollars))) {
|
|
162
|
+
return invalid('permissions.budget.dollars must be a positive number.');
|
|
163
|
+
}
|
|
164
|
+
if (value.budget.wallclock !== undefined
|
|
165
|
+
&& (typeof value.budget.wallclock !== 'string' || !matches(WALLCLOCK, value.budget.wallclock))) {
|
|
166
|
+
return invalid('permissions.budget.wallclock must be a duration such as 45m.');
|
|
167
|
+
}
|
|
168
|
+
const projected = OBJECT_CREATE(null);
|
|
169
|
+
if (value.budget.dollars !== undefined)
|
|
170
|
+
projected.dollars = value.budget.dollars;
|
|
171
|
+
if (value.budget.wallclock !== undefined)
|
|
172
|
+
projected.wallclock = value.budget.wallclock;
|
|
173
|
+
budget = OBJECT_FREEZE(projected);
|
|
174
|
+
}
|
|
175
|
+
const output = OBJECT_CREATE(null);
|
|
176
|
+
output.integrations = stringList(value.integrations, 'permissions.integrations', PROVIDER);
|
|
177
|
+
output.harnesses = stringList(value.harnesses, 'permissions.harnesses', /^[a-z]+$/);
|
|
178
|
+
output.mcp = stringList(value.mcp, 'permissions.mcp', /^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/);
|
|
179
|
+
output.writes = stringList(value.writes, 'permissions.writes', WRITE_CLASS);
|
|
180
|
+
if (budget !== undefined)
|
|
181
|
+
output.budget = budget;
|
|
182
|
+
return OBJECT_FREEZE(output);
|
|
183
|
+
}
|
|
184
|
+
function preflightShape(value) {
|
|
185
|
+
if (!record(value) || !hasOnlyKeys(value, ['credentials', 'servers'])) {
|
|
186
|
+
return invalid('Preflight requires credentials and servers arrays.');
|
|
187
|
+
}
|
|
188
|
+
const servers = stringList(value.servers, 'preflight.servers', /^https?:\/\/\S+$/);
|
|
189
|
+
return OBJECT_FREEZE({
|
|
190
|
+
credentials: stringList(value.credentials, 'preflight.credentials', IDENTIFIER),
|
|
191
|
+
servers,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
function stringList(value, what, pattern) {
|
|
195
|
+
if (!ARRAY_IS_ARRAY(value) || value.length > MAX_LIST) {
|
|
196
|
+
return invalid(`${what} must be a list of at most ${MAX_LIST} strings.`);
|
|
197
|
+
}
|
|
198
|
+
const output = [];
|
|
199
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
200
|
+
const entry = value[index];
|
|
201
|
+
if (typeof entry !== 'string' || !matches(pattern, entry))
|
|
202
|
+
return invalid(`${what} has an invalid entry.`);
|
|
203
|
+
for (let prior = 0; prior < output.length; prior += 1) {
|
|
204
|
+
if (output[prior] === entry)
|
|
205
|
+
return invalid(`${what} lists ${entry} twice.`);
|
|
206
|
+
}
|
|
207
|
+
appendIntrinsicArray(output, entry);
|
|
208
|
+
}
|
|
209
|
+
return OBJECT_FREEZE(output);
|
|
210
|
+
}
|
|
211
|
+
function record(value) {
|
|
212
|
+
return typeof value === 'object' && value !== null && !ARRAY_IS_ARRAY(value);
|
|
213
|
+
}
|
|
214
|
+
function hasOnlyKeys(value, allowed) {
|
|
215
|
+
const keys = OBJECT_KEYS(value);
|
|
216
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
217
|
+
let found = false;
|
|
218
|
+
for (let allowedIndex = 0; allowedIndex < allowed.length; allowedIndex += 1) {
|
|
219
|
+
if (keys[index] === allowed[allowedIndex]) {
|
|
220
|
+
found = true;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (!found)
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
function matches(pattern, value) {
|
|
230
|
+
return REGEXP_TEST(pattern, value);
|
|
231
|
+
}
|
|
232
|
+
function invalid(message) {
|
|
233
|
+
throw new PluginError('plugin_manifest_invalid', message);
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=hosted-extension-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-extension-manifest.js","sourceRoot":"","sources":["../src/hosted-extension-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ChildProcess } from 'node:child_process';
|
|
2
|
+
import { Readable, Writable } from 'node:stream';
|
|
3
|
+
export interface HostedExtensionProtocolResult {
|
|
4
|
+
readonly completionReason: 'success';
|
|
5
|
+
readonly capabilityCalls: 1;
|
|
6
|
+
}
|
|
7
|
+
/** A bounded JSON copy, stripped of prototypes and behavior. */
|
|
8
|
+
export declare function boundedJsonSnapshot(value: unknown, what: string): unknown;
|
|
9
|
+
/**
|
|
10
|
+
* Exchange hostile child frames for one parent-owned capability invocation.
|
|
11
|
+
* Descriptor 3 is transport, never authority: every frame and both boundary
|
|
12
|
+
* payloads are validated by the parent. A child writing descriptor 3 directly
|
|
13
|
+
* can request only the same exact, single capability its context exposes.
|
|
14
|
+
*/
|
|
15
|
+
export declare function exchangeHostedExtension(child: ChildProcess, protocol: Readable, stdin: Writable, stderr: Readable, timeoutMs: number, request: unknown, invoke: (request: unknown) => Promise<unknown>): Promise<HostedExtensionProtocolResult>;
|
|
16
|
+
//# sourceMappingURL=hosted-extension-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-extension-protocol.d.ts","sourceRoot":"","sources":["../src/hosted-extension-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAoEjD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;CAC7B;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAWzE;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,QAAQ,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAC7C,OAAO,CAAC,6BAA6B,CAAC,CAyIxC"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { ChildProcess } from 'node:child_process';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import { Readable, Writable } from 'node:stream';
|
|
4
|
+
import { clearTimeout as nodeClearTimeout, setTimeout as nodeSetTimeout } from 'node:timers';
|
|
5
|
+
import { snapshotJsonValue } from './json-value.js';
|
|
6
|
+
import { PluginError } from './plugin-manifest.js';
|
|
7
|
+
import { assertHostedPromiseSafety, frozenHostedPromiseValue, } from './hosted-promise-safety.js';
|
|
8
|
+
const HOSTED_WRITE = 'cloud:babysitter-turn';
|
|
9
|
+
const MAX_FRAME_BYTES = 256 * 1024;
|
|
10
|
+
const MAX_STDERR_BYTES = 16 * 1024;
|
|
11
|
+
const ARRAY_IS_ARRAY = Array.isArray;
|
|
12
|
+
const BUFFER_BYTE_LENGTH = Buffer.byteLength;
|
|
13
|
+
const CHILD_PROCESS_KILL = Function.prototype.call.bind(ChildProcess.prototype.kill);
|
|
14
|
+
const EVENT_ON = Function.prototype.call.bind(EventEmitter.prototype.on);
|
|
15
|
+
const ERROR_IS_INSTANCE = Function.prototype.call.bind(Function.prototype[Symbol.hasInstance], Error);
|
|
16
|
+
const JSON_PARSE = JSON.parse;
|
|
17
|
+
const JSON_STRINGIFY = JSON.stringify;
|
|
18
|
+
const OBJECT_CREATE = Object.create;
|
|
19
|
+
const OBJECT_HAS_OWN = Object.hasOwn;
|
|
20
|
+
const OBJECT_KEYS = Object.keys;
|
|
21
|
+
const OBJECT_FREEZE = Object.freeze;
|
|
22
|
+
const PROMISE = Promise;
|
|
23
|
+
const PROMISE_THEN = Function.prototype.call.bind(Promise.prototype.then);
|
|
24
|
+
const READABLE_SET_ENCODING = Function.prototype.call.bind(Readable.prototype.setEncoding);
|
|
25
|
+
const READABLE_RESUME = Function.prototype.call.bind(Readable.prototype.resume);
|
|
26
|
+
const CLEAR_TIMEOUT = nodeClearTimeout;
|
|
27
|
+
const SET_TIMEOUT = nodeSetTimeout;
|
|
28
|
+
const TIMER_SAMPLE = SET_TIMEOUT(() => undefined, 0);
|
|
29
|
+
const TIMER_UNREF = Function.prototype.call.bind(TIMER_SAMPLE.unref);
|
|
30
|
+
CLEAR_TIMEOUT(TIMER_SAMPLE);
|
|
31
|
+
const STRING = String;
|
|
32
|
+
const STRING_INDEX_OF = Function.prototype.call.bind(String.prototype.indexOf);
|
|
33
|
+
const STRING_SLICE = Function.prototype.call.bind(String.prototype.slice);
|
|
34
|
+
const WRITABLE_END = Function.prototype.call.bind(Writable.prototype.end);
|
|
35
|
+
const WRITABLE_WRITE = Function.prototype.call.bind(Writable.prototype.write);
|
|
36
|
+
const SNAPSHOT_LIMITS = Object.freeze({
|
|
37
|
+
maxDepth: 64,
|
|
38
|
+
maxNodes: 262_144,
|
|
39
|
+
maxBytes: MAX_FRAME_BYTES,
|
|
40
|
+
});
|
|
41
|
+
/** A bounded JSON copy, stripped of prototypes and behavior. */
|
|
42
|
+
export function boundedJsonSnapshot(value, what) {
|
|
43
|
+
let snapshot;
|
|
44
|
+
try {
|
|
45
|
+
snapshot = snapshotJsonValue(value, what, SNAPSHOT_LIMITS);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
throw new PluginError('plugin_unsupported', `${what} is not bounded JSON data.`);
|
|
49
|
+
}
|
|
50
|
+
const encoded = JSON_STRINGIFY(snapshot);
|
|
51
|
+
if (BUFFER_BYTE_LENGTH(encoded) > MAX_FRAME_BYTES) {
|
|
52
|
+
throw new PluginError('plugin_unsupported', `${what} is not bounded JSON data.`);
|
|
53
|
+
}
|
|
54
|
+
return snapshot;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Exchange hostile child frames for one parent-owned capability invocation.
|
|
58
|
+
* Descriptor 3 is transport, never authority: every frame and both boundary
|
|
59
|
+
* payloads are validated by the parent. A child writing descriptor 3 directly
|
|
60
|
+
* can request only the same exact, single capability its context exposes.
|
|
61
|
+
*/
|
|
62
|
+
export async function exchangeHostedExtension(child, protocol, stdin, stderr, timeoutMs, request, invoke) {
|
|
63
|
+
assertHostedPromiseSafety('plugin_unsupported');
|
|
64
|
+
const requestSnapshot = boundedJsonSnapshot(request, 'hosted extension request');
|
|
65
|
+
let buffer = '';
|
|
66
|
+
let stderrText = '';
|
|
67
|
+
let calls = 0;
|
|
68
|
+
READABLE_SET_ENCODING(stderr, 'utf8');
|
|
69
|
+
EVENT_ON(stderr, 'data', chunk => {
|
|
70
|
+
stderrText = STRING_SLICE(stderrText + STRING(chunk), -MAX_STDERR_BYTES);
|
|
71
|
+
});
|
|
72
|
+
READABLE_RESUME(stderr);
|
|
73
|
+
READABLE_SET_ENCODING(protocol, 'utf8');
|
|
74
|
+
return await new PROMISE((resolvePromise, rejectPromise) => {
|
|
75
|
+
let settled = false;
|
|
76
|
+
let capabilityState = 'none';
|
|
77
|
+
let capabilityError;
|
|
78
|
+
let deferredProtocolError;
|
|
79
|
+
const finish = (error, result) => {
|
|
80
|
+
if (settled)
|
|
81
|
+
return;
|
|
82
|
+
settled = true;
|
|
83
|
+
CLEAR_TIMEOUT(timeout);
|
|
84
|
+
WRITABLE_END(stdin);
|
|
85
|
+
if (child.exitCode === null && child.signalCode === null)
|
|
86
|
+
CHILD_PROCESS_KILL(child, 'SIGKILL');
|
|
87
|
+
if (error !== undefined)
|
|
88
|
+
rejectPromise(error);
|
|
89
|
+
else
|
|
90
|
+
resolvePromise(result);
|
|
91
|
+
};
|
|
92
|
+
const failure = (error) => ERROR_IS_INSTANCE(error)
|
|
93
|
+
? error
|
|
94
|
+
: new PluginError('plugin_unsupported', 'Hosted capability rejected with a non-error value.');
|
|
95
|
+
const refuse = (message) => {
|
|
96
|
+
const error = new PluginError('plugin_unsupported', message);
|
|
97
|
+
CHILD_PROCESS_KILL(child, 'SIGKILL');
|
|
98
|
+
if (capabilityState === 'pending') {
|
|
99
|
+
deferredProtocolError ??= error;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
finish(capabilityError ?? error);
|
|
103
|
+
};
|
|
104
|
+
const timeout = SET_TIMEOUT(() => {
|
|
105
|
+
CHILD_PROCESS_KILL(child, 'SIGKILL');
|
|
106
|
+
finish(new PluginError('plugin_unsupported', capabilityState === 'pending'
|
|
107
|
+
? 'Hosted capability outcome is in doubt after the sandbox timeout.'
|
|
108
|
+
: 'Hosted extension sandbox timed out.'));
|
|
109
|
+
}, timeoutMs);
|
|
110
|
+
TIMER_UNREF(timeout);
|
|
111
|
+
EVENT_ON(stdin, 'error', () => refuse('Hosted extension capability channel closed.'));
|
|
112
|
+
EVENT_ON(protocol, 'error', () => refuse('Hosted extension protocol channel failed.'));
|
|
113
|
+
EVENT_ON(protocol, 'data', chunk => {
|
|
114
|
+
buffer += STRING(chunk);
|
|
115
|
+
if (BUFFER_BYTE_LENGTH(buffer) > MAX_FRAME_BYTES)
|
|
116
|
+
return refuse('Hosted extension protocol exceeded its size limit.');
|
|
117
|
+
for (;;) {
|
|
118
|
+
const end = STRING_INDEX_OF(buffer, '\n');
|
|
119
|
+
if (end < 0)
|
|
120
|
+
break;
|
|
121
|
+
const line = STRING_SLICE(buffer, 0, end);
|
|
122
|
+
buffer = STRING_SLICE(buffer, end + 1);
|
|
123
|
+
let message;
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON_PARSE(line);
|
|
126
|
+
if (typeof parsed !== 'object' || parsed === null || ARRAY_IS_ARRAY(parsed)) {
|
|
127
|
+
return refuse('Hosted extension emitted a non-object protocol frame.');
|
|
128
|
+
}
|
|
129
|
+
message = boundedJsonSnapshot(parsed, 'hosted extension protocol frame');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return refuse('Hosted extension emitted malformed protocol data.');
|
|
133
|
+
}
|
|
134
|
+
if (message.type === 'capability') {
|
|
135
|
+
if (!hasExactKeys(message, ['type', 'id', 'name', 'request'])) {
|
|
136
|
+
return refuse('Hosted extension emitted a malformed capability frame.');
|
|
137
|
+
}
|
|
138
|
+
calls += 1;
|
|
139
|
+
if (calls !== 1 || capabilityState !== 'none' || message.name !== HOSTED_WRITE || message.id !== 1) {
|
|
140
|
+
return refuse('Hosted extension requested an undeclared or repeated capability.');
|
|
141
|
+
}
|
|
142
|
+
capabilityState = 'pending';
|
|
143
|
+
void PROMISE_THEN(invoke(message.request), value => {
|
|
144
|
+
if (settled)
|
|
145
|
+
return;
|
|
146
|
+
try {
|
|
147
|
+
const snapshot = boundedJsonSnapshot(value, 'hosted capability result');
|
|
148
|
+
capabilityState = 'completed';
|
|
149
|
+
if (deferredProtocolError !== undefined)
|
|
150
|
+
return finish(deferredProtocolError);
|
|
151
|
+
WRITABLE_WRITE(stdin, capabilityResultFrame(true, snapshot));
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
capabilityError = failure(error);
|
|
155
|
+
capabilityState = 'failed';
|
|
156
|
+
WRITABLE_WRITE(stdin, capabilityResultFrame(false));
|
|
157
|
+
finish(capabilityError);
|
|
158
|
+
}
|
|
159
|
+
}, error => {
|
|
160
|
+
if (settled)
|
|
161
|
+
return;
|
|
162
|
+
capabilityError = failure(error);
|
|
163
|
+
capabilityState = 'failed';
|
|
164
|
+
WRITABLE_WRITE(stdin, capabilityResultFrame(false));
|
|
165
|
+
finish(capabilityError);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
else if (message.type === 'result') {
|
|
169
|
+
if (!hasExactKeys(message, ['type', 'completionReason', 'capabilityCalls'])
|
|
170
|
+
|| calls !== 1 || capabilityState !== 'completed'
|
|
171
|
+
|| message.completionReason !== 'success' || message.capabilityCalls !== 1) {
|
|
172
|
+
return refuse('Hosted extension reported a completion without exactly one capability call.');
|
|
173
|
+
}
|
|
174
|
+
finish(undefined, frozenHostedPromiseValue({ completionReason: 'success', capabilityCalls: 1 }));
|
|
175
|
+
}
|
|
176
|
+
else if (message.type === 'error') {
|
|
177
|
+
if (!hasExactKeys(message, ['type', 'message']) || typeof message.message !== 'string') {
|
|
178
|
+
return refuse('Hosted extension emitted a malformed error frame.');
|
|
179
|
+
}
|
|
180
|
+
const error = new PluginError('plugin_unsupported', `Hosted extension failed: ${STRING_SLICE(message.message, 0, 8192)}`);
|
|
181
|
+
if (capabilityState === 'pending') {
|
|
182
|
+
deferredProtocolError ??= error;
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
finish(capabilityError ?? error);
|
|
186
|
+
}
|
|
187
|
+
else
|
|
188
|
+
return refuse('Hosted extension emitted an unknown protocol message.');
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
READABLE_RESUME(protocol);
|
|
192
|
+
EVENT_ON(child, 'error', () => refuse('Hosted extension sandbox could not start.'));
|
|
193
|
+
EVENT_ON(child, 'close', code => {
|
|
194
|
+
if (!settled)
|
|
195
|
+
refuse(`Hosted extension sandbox exited without a valid completion (exit ${code ?? 'signal'})`
|
|
196
|
+
+ (stderrText === '' ? '' : `: ${stderrText}`));
|
|
197
|
+
});
|
|
198
|
+
WRITABLE_WRITE(stdin, `${JSON_STRINGIFY(requestSnapshot)}\n`);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
function capabilityResultFrame(ok, value) {
|
|
202
|
+
// JSON.stringify consults inherited `toJSON` before traversing an object.
|
|
203
|
+
// Protocol envelopes therefore never inherit from the ambient prototype;
|
|
204
|
+
// nested capability data is already a behavior-free bounded snapshot.
|
|
205
|
+
const envelope = OBJECT_CREATE(null);
|
|
206
|
+
envelope.type = 'capability-result';
|
|
207
|
+
envelope.id = 1;
|
|
208
|
+
envelope.ok = ok;
|
|
209
|
+
if (ok)
|
|
210
|
+
envelope.value = value;
|
|
211
|
+
else
|
|
212
|
+
envelope.error = 'hosted capability refused';
|
|
213
|
+
return `${JSON_STRINGIFY(envelope)}\n`;
|
|
214
|
+
}
|
|
215
|
+
function hasExactKeys(value, keys) {
|
|
216
|
+
if (OBJECT_KEYS(value).length !== keys.length)
|
|
217
|
+
return false;
|
|
218
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
219
|
+
if (!OBJECT_HAS_OWN(value, keys[index]))
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=hosted-extension-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-extension-protocol.js","sourceRoot":"","sources":["../src/hosted-extension-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface HostedExtensionArtifact {
|
|
2
|
+
readonly ref: string;
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly version: string;
|
|
5
|
+
readonly directory: string;
|
|
6
|
+
readonly digest: string;
|
|
7
|
+
readonly manifestSha256: string;
|
|
8
|
+
}
|
|
9
|
+
export interface HostedExtensionInstallation {
|
|
10
|
+
readonly artifacts: readonly HostedExtensionArtifact[];
|
|
11
|
+
}
|
|
12
|
+
export interface HostedExtensionBase {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly version?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface HostedExtensionRuntime {
|
|
17
|
+
readonly installation: HostedExtensionInstallation;
|
|
18
|
+
readonly base: HostedExtensionBase;
|
|
19
|
+
}
|
|
20
|
+
/** Load one base/installation generation that cannot be paired across redeploys. */
|
|
21
|
+
export declare function loadHostedExtensionRuntime(flowPath: string): Promise<HostedExtensionRuntime>;
|
|
22
|
+
/** @internal Metadata-only test seam; public hosted callers use the combined loader. */
|
|
23
|
+
export declare function loadHostedExtensionArtifacts(flowPath: string): Promise<HostedExtensionInstallation>;
|
|
24
|
+
/** @internal Base-only test seam; public hosted callers use the combined loader. */
|
|
25
|
+
export declare function loadHostedExtensionBase(flowPath: string): Promise<HostedExtensionBase>;
|
|
26
|
+
/** Validate both opaque values and refuse a cached generation after redeploy. */
|
|
27
|
+
export declare function assertHostedRuntimeAuthority(installation: HostedExtensionInstallation, base: HostedExtensionBase): Promise<void>;
|
|
28
|
+
/** @internal Validate a metadata-only installation used by selection tests. */
|
|
29
|
+
export declare function assertHostedInstallationAuthority(value: unknown): asserts value is HostedExtensionInstallation;
|
|
30
|
+
//# sourceMappingURL=hosted-extension-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-extension-runtime.d.ts","sourceRoot":"","sources":["../src/hosted-extension-runtime.ts"],"names":[],"mappings":"AA2DA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,YAAY,EAAE,2BAA2B,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;CACpC;AAED,oFAAoF;AACpF,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgBlG;AAED,wFAAwF;AACxF,wBAAsB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAOzG;AAED,oFAAoF;AACpF,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAM5F;AAED,iFAAiF;AACjF,wBAAsB,4BAA4B,CAChD,YAAY,EAAE,2BAA2B,EACzC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,+EAA+E;AAC/E,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,2BAA2B,CAS9G"}
|