@relayflows/sdk 2.0.23 → 2.0.25
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 +3 -0
- package/dist/authored-flow-executor.d.ts.map +1 -1
- package/dist/authored-flow-executor.js +29 -1
- package/dist/authored-flow-executor.js.map +1 -1
- package/dist/authored-flow-loader.d.ts +15 -2
- package/dist/authored-flow-loader.d.ts.map +1 -1
- package/dist/authored-flow-loader.js +33 -4
- package/dist/authored-flow-loader.js.map +1 -1
- package/dist/authored-hooks.d.ts +29 -0
- package/dist/authored-hooks.d.ts.map +1 -0
- package/dist/authored-hooks.js +117 -0
- package/dist/authored-hooks.js.map +1 -0
- package/dist/authored-node-entry.js +1 -0
- package/dist/authored-node-entry.js.map +1 -1
- package/dist/authored-root.d.ts +7 -0
- package/dist/authored-root.d.ts.map +1 -1
- package/dist/authored-root.js +14 -1
- package/dist/authored-root.js.map +1 -1
- package/dist/authored-source-authority.d.ts.map +1 -1
- package/dist/authored-source-authority.js +6 -0
- package/dist/authored-source-authority.js.map +1 -1
- package/dist/bundle-extensions.d.ts +19 -0
- package/dist/bundle-extensions.d.ts.map +1 -0
- package/dist/bundle-extensions.js +95 -0
- package/dist/bundle-extensions.js.map +1 -0
- package/dist/bundle-typescript.js +1 -1
- package/dist/bundle-typescript.js.map +1 -1
- package/dist/bundle.d.ts +11 -0
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +13 -4
- package/dist/bundle.js.map +1 -1
- package/dist/cli/add-extension.d.ts +28 -0
- package/dist/cli/add-extension.d.ts.map +1 -0
- package/dist/cli/add-extension.js +135 -0
- package/dist/cli/add-extension.js.map +1 -0
- package/dist/cli/add.d.ts +3 -0
- package/dist/cli/add.d.ts.map +1 -1
- package/dist/cli/add.js +8 -0
- package/dist/cli/add.js.map +1 -1
- package/dist/cli/build.d.ts.map +1 -1
- package/dist/cli/build.js +7 -2
- package/dist/cli/build.js.map +1 -1
- package/dist/cli/check-helper-body.d.ts.map +1 -1
- package/dist/cli/check-helper-body.js +4 -0
- package/dist/cli/check-helper-body.js.map +1 -1
- package/dist/cli/check-triggers.d.ts.map +1 -1
- package/dist/cli/check-triggers.js +25 -2
- package/dist/cli/check-triggers.js.map +1 -1
- package/dist/cli/check-typescript.d.ts.map +1 -1
- package/dist/cli/check-typescript.js +5 -1
- package/dist/cli/check-typescript.js.map +1 -1
- package/dist/cli/check.d.ts +24 -0
- package/dist/cli/check.d.ts.map +1 -1
- package/dist/cli/check.js.map +1 -1
- package/dist/cli/cloud-deploy.d.ts +1 -0
- package/dist/cli/cloud-deploy.d.ts.map +1 -1
- package/dist/cli/cloud-deploy.js +11 -1
- package/dist/cli/cloud-deploy.js.map +1 -1
- package/dist/cli/plugin.d.ts +50 -0
- package/dist/cli/plugin.d.ts.map +1 -0
- package/dist/cli/plugin.js +295 -0
- package/dist/cli/plugin.js.map +1 -0
- package/dist/cli-commands.d.ts +46 -3
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +32 -2
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -1
- package/dist/cli.js.map +1 -1
- package/dist/cloud-deploy.d.ts +5 -0
- package/dist/cloud-deploy.d.ts.map +1 -1
- package/dist/cloud-deploy.js +7 -6
- package/dist/cloud-deploy.js.map +1 -1
- package/dist/cloud-run.d.ts +2 -0
- package/dist/cloud-run.d.ts.map +1 -1
- package/dist/cloud-run.js +14 -4
- package/dist/cloud-run.js.map +1 -1
- package/dist/failure-kinds.d.ts +2 -2
- package/dist/failure-kinds.d.ts.map +1 -1
- package/dist/flow-extension-compat.d.ts +18 -0
- package/dist/flow-extension-compat.d.ts.map +1 -0
- package/dist/flow-extension-compat.js +33 -0
- package/dist/flow-extension-compat.js.map +1 -0
- package/dist/flow-extension-loader.d.ts +61 -0
- package/dist/flow-extension-loader.d.ts.map +1 -0
- package/dist/flow-extension-loader.js +173 -0
- package/dist/flow-extension-loader.js.map +1 -0
- package/dist/flow-extension-manifest.d.ts +61 -0
- package/dist/flow-extension-manifest.d.ts.map +1 -0
- package/dist/flow-extension-manifest.js +188 -0
- package/dist/flow-extension-manifest.js.map +1 -0
- package/dist/flow-extension-submit.d.ts +38 -0
- package/dist/flow-extension-submit.d.ts.map +1 -0
- package/dist/flow-extension-submit.js +94 -0
- package/dist/flow-extension-submit.js.map +1 -0
- package/dist/flow-requirements.d.ts +13 -3
- package/dist/flow-requirements.d.ts.map +1 -1
- package/dist/flow-requirements.js +30 -0
- package/dist/flow-requirements.js.map +1 -1
- package/dist/plugin-github.d.ts +35 -0
- package/dist/plugin-github.d.ts.map +1 -0
- package/dist/plugin-github.js +92 -0
- package/dist/plugin-github.js.map +1 -0
- package/dist/plugin-loader.d.ts.map +1 -1
- package/dist/plugin-loader.js +5 -1
- package/dist/plugin-loader.js.map +1 -1
- package/dist/plugin-lock.d.ts +79 -0
- package/dist/plugin-lock.d.ts.map +1 -0
- package/dist/plugin-lock.js +203 -0
- package/dist/plugin-lock.js.map +1 -0
- package/dist/plugin-manifest.d.ts +5 -1
- package/dist/plugin-manifest.d.ts.map +1 -1
- package/dist/plugin-manifest.js +17 -0
- package/dist/plugin-manifest.js.map +1 -1
- package/dist/plugin-source.d.ts +38 -0
- package/dist/plugin-source.d.ts.map +1 -0
- package/dist/plugin-source.js +84 -0
- package/dist/plugin-source.js.map +1 -0
- package/dist/plugin-store.d.ts +30 -0
- package/dist/plugin-store.d.ts.map +1 -0
- package/dist/plugin-store.js +133 -0
- package/dist/plugin-store.js.map +1 -0
- package/dist/semver-range.d.ts +10 -0
- package/dist/semver-range.d.ts.map +1 -0
- package/dist/semver-range.js +88 -0
- package/dist/semver-range.js.map +1 -0
- package/package.json +2 -2
- package/src/authored-flow-executor.ts +36 -1
- package/src/authored-flow-loader.ts +49 -6
- package/src/authored-hooks.ts +136 -0
- package/src/authored-node-entry.ts +1 -0
- package/src/authored-root.ts +22 -1
- package/src/authored-source-authority.ts +6 -0
- package/src/bundle-extensions.ts +85 -0
- package/src/bundle-typescript.ts +1 -1
- package/src/bundle.ts +14 -4
- package/src/cli/add-extension.ts +134 -0
- package/src/cli/add.ts +9 -0
- package/src/cli/build.ts +7 -2
- package/src/cli/check-helper-body.ts +4 -0
- package/src/cli/check-triggers.ts +27 -2
- package/src/cli/check-typescript.ts +5 -1
- package/src/cli/check.ts +23 -0
- package/src/cli/cloud-deploy.ts +11 -1
- package/src/cli/plugin.ts +286 -0
- package/src/cli-commands.ts +32 -2
- package/src/cli.ts +23 -1
- package/src/cloud-deploy.ts +18 -8
- package/src/cloud-run.ts +16 -6
- package/src/flow-extension-compat.ts +35 -0
- package/src/flow-extension-loader.ts +217 -0
- package/src/flow-extension-manifest.ts +190 -0
- package/src/flow-extension-submit.ts +120 -0
- package/src/flow-requirements.ts +44 -3
- package/src/plugin-github.ts +98 -0
- package/src/plugin-loader.ts +5 -1
- package/src/plugin-lock.ts +194 -0
- package/src/plugin-manifest.ts +17 -0
- package/src/plugin-source.ts +91 -0
- package/src/plugin-store.ts +105 -0
- package/src/semver-range.ts +74 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { PluginError } from './plugin-manifest.js';
|
|
4
|
+
import { SHA, canonicalPluginRef, isGithubPluginRef, parseCanonicalPluginRef } from './plugin-source.js';
|
|
5
|
+
/**
|
|
6
|
+
* `flows.lock.json` — the project's plugin provenance. `flows.json.plugins`
|
|
7
|
+
* says *what* is declared; the lockfile says exactly which bytes that meant:
|
|
8
|
+
* the commit, the content digest, the manifest hash, and the order the
|
|
9
|
+
* operator declared. Version 2 is also the sealed bundle `lockfile.json`
|
|
10
|
+
* shape when the bundle carries plugins (RFC-0001 decision 14).
|
|
11
|
+
*/
|
|
12
|
+
export const PLUGIN_LOCK_FILE = 'flows.lock.json';
|
|
13
|
+
export const PLUGIN_LOCK_VERSION = 2;
|
|
14
|
+
const FLOWS_FILE = 'flows.json';
|
|
15
|
+
const HEX64 = /^[0-9a-f]{64}$/;
|
|
16
|
+
const object = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
17
|
+
const invalid = (message) => { throw new PluginError('plugin_lock_invalid', `${PLUGIN_LOCK_FILE}: ${message}`); };
|
|
18
|
+
export function parsePluginLock(input) {
|
|
19
|
+
if (!object(input) || input.version !== PLUGIN_LOCK_VERSION || !Array.isArray(input.plugins)
|
|
20
|
+
|| Object.keys(input).some(k => !['version', 'plugins'].includes(k)))
|
|
21
|
+
return invalid(`expected { version: ${PLUGIN_LOCK_VERSION}, plugins: [] }.`);
|
|
22
|
+
const names = new Set();
|
|
23
|
+
const plugins = input.plugins.map((entry, index) => {
|
|
24
|
+
if (!object(entry) || Object.keys(entry).sort().join(',') !== 'digest,kind,manifestSha256,name,order,resolvedAt,source,version'
|
|
25
|
+
|| entry.kind !== 'flow-extension' || typeof entry.name !== 'string' || typeof entry.version !== 'string'
|
|
26
|
+
|| typeof entry.digest !== 'string' || !HEX64.test(entry.digest)
|
|
27
|
+
|| typeof entry.manifestSha256 !== 'string' || !HEX64.test(entry.manifestSha256)
|
|
28
|
+
|| entry.order !== index + 1 || typeof entry.resolvedAt !== 'string' || Number.isNaN(Date.parse(entry.resolvedAt))
|
|
29
|
+
|| !object(entry.source) || entry.source.host !== 'github' || typeof entry.source.owner !== 'string'
|
|
30
|
+
|| typeof entry.source.repo !== 'string' || typeof entry.source.sha !== 'string' || !SHA.test(entry.source.sha)
|
|
31
|
+
|| typeof entry.source.path !== 'string')
|
|
32
|
+
return invalid(`plugins[${index}] is malformed.`);
|
|
33
|
+
if (names.has(entry.name))
|
|
34
|
+
return invalid(`plugin ${entry.name} is listed twice.`);
|
|
35
|
+
names.add(entry.name);
|
|
36
|
+
const source = parseCanonicalPluginRef(canonicalPluginRef({ host: 'github', owner: entry.source.owner, repo: entry.source.repo, ref: entry.source.sha, sha: entry.source.sha, path: entry.source.path }));
|
|
37
|
+
return Object.freeze({
|
|
38
|
+
name: entry.name, kind: 'flow-extension', version: entry.version,
|
|
39
|
+
source: Object.freeze({ host: 'github', owner: source.owner, repo: source.repo, sha: source.sha, path: source.path }),
|
|
40
|
+
digest: entry.digest, manifestSha256: entry.manifestSha256, order: entry.order, resolvedAt: entry.resolvedAt,
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
return Object.freeze({ version: PLUGIN_LOCK_VERSION, plugins: Object.freeze(plugins) });
|
|
44
|
+
}
|
|
45
|
+
/** Absent file → empty lock; unreadable or malformed → refusal. */
|
|
46
|
+
export function readPluginLock(root) {
|
|
47
|
+
recoverFlowsAndLock(root);
|
|
48
|
+
const path = join(root, PLUGIN_LOCK_FILE);
|
|
49
|
+
if (!existsSync(path))
|
|
50
|
+
return Object.freeze({ version: PLUGIN_LOCK_VERSION, plugins: Object.freeze([]) });
|
|
51
|
+
let parsed;
|
|
52
|
+
try {
|
|
53
|
+
parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return invalid('not valid JSON.');
|
|
57
|
+
}
|
|
58
|
+
return parsePluginLock(parsed);
|
|
59
|
+
}
|
|
60
|
+
export function writePluginLock(root, lock) {
|
|
61
|
+
writeFileSync(join(root, PLUGIN_LOCK_FILE), `${JSON.stringify(parsePluginLock(lock), null, 2)}\n`);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Finish or abort a two-file update left by a process crash. The lock temp is
|
|
65
|
+
* written first: by itself it is only preparation and can be discarded. Once
|
|
66
|
+
* the config temp exists, both complete snapshots exist and recovery rolls
|
|
67
|
+
* them forward in the same lock-then-declaration order as the writer.
|
|
68
|
+
*/
|
|
69
|
+
export function recoverFlowsAndLock(root, configPath = join(root, FLOWS_FILE)) {
|
|
70
|
+
const jsonTmp = `${configPath}.tmp`;
|
|
71
|
+
const lockPath = join(root, PLUGIN_LOCK_FILE);
|
|
72
|
+
const lockTmp = `${lockPath}.tmp`;
|
|
73
|
+
const hasJson = existsSync(jsonTmp);
|
|
74
|
+
const hasLock = existsSync(lockTmp);
|
|
75
|
+
if (!hasJson && !hasLock)
|
|
76
|
+
return;
|
|
77
|
+
if (!hasJson) {
|
|
78
|
+
unlinkSync(lockTmp);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
let pendingConfig;
|
|
82
|
+
try {
|
|
83
|
+
pendingConfig = JSON.parse(readFileSync(jsonTmp, 'utf8'));
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
if (hasLock) {
|
|
87
|
+
unlinkSync(jsonTmp);
|
|
88
|
+
unlinkSync(lockTmp);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
return invalid('pending transaction has invalid flows.json.tmp.');
|
|
92
|
+
}
|
|
93
|
+
if (!object(pendingConfig) || !Array.isArray(pendingConfig.plugins)
|
|
94
|
+
|| !pendingConfig.plugins.every(plugin => typeof plugin === 'string')) {
|
|
95
|
+
if (hasLock) {
|
|
96
|
+
unlinkSync(jsonTmp);
|
|
97
|
+
unlinkSync(lockTmp);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
return invalid('pending transaction has invalid flows.json.tmp.');
|
|
101
|
+
}
|
|
102
|
+
const lockSource = hasLock ? lockTmp : lockPath;
|
|
103
|
+
let pendingLock;
|
|
104
|
+
try {
|
|
105
|
+
pendingLock = JSON.parse(readFileSync(lockSource, 'utf8'));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
if (hasLock) {
|
|
109
|
+
unlinkSync(jsonTmp);
|
|
110
|
+
unlinkSync(lockTmp);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
return invalid('pending transaction has no valid lock snapshot.');
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
parsePluginLock(pendingLock);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (hasLock) {
|
|
120
|
+
unlinkSync(jsonTmp);
|
|
121
|
+
unlinkSync(lockTmp);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
if (hasLock)
|
|
127
|
+
renameSync(lockTmp, lockPath);
|
|
128
|
+
renameSync(jsonTmp, configPath);
|
|
129
|
+
}
|
|
130
|
+
/** Write complete snapshots, then recover them as one roll-forward transaction. */
|
|
131
|
+
export function writeFlowsAndLock(root, configPath, config, plugins, lock) {
|
|
132
|
+
const jsonTmp = `${configPath}.tmp`;
|
|
133
|
+
const lockPath = join(root, PLUGIN_LOCK_FILE);
|
|
134
|
+
const lockTmp = `${lockPath}.tmp`;
|
|
135
|
+
writeFileSync(lockTmp, `${JSON.stringify(parsePluginLock(lock), null, 2)}\n`);
|
|
136
|
+
writeFileSync(jsonTmp, `${JSON.stringify({ ...config, plugins: [...plugins] }, null, 2)}\n`);
|
|
137
|
+
recoverFlowsAndLock(root, configPath);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Rebuild the entry list in `flows.json.plugins` order: `order` is derived from
|
|
141
|
+
* the declaration list, never stored independently, so the two cannot disagree.
|
|
142
|
+
* Lock entries that are no longer declared are dropped; a declaration with no
|
|
143
|
+
* matching lock entry is a refusal.
|
|
144
|
+
*/
|
|
145
|
+
export function lockForDeclared(lock, declared) {
|
|
146
|
+
const byRef = new Map(lock.plugins.map(p => [canonicalPluginRef({ ...p.source, ref: p.source.sha }), p]));
|
|
147
|
+
const plugins = declared.filter(isGithubPluginRef).map((ref, index) => {
|
|
148
|
+
const found = byRef.get(ref);
|
|
149
|
+
if (found === undefined)
|
|
150
|
+
return invalid(`flows.json declares ${ref} but the lockfile has no entry for it; run flows add ${ref}.`);
|
|
151
|
+
return Object.freeze({ ...found, order: index + 1 });
|
|
152
|
+
});
|
|
153
|
+
return Object.freeze({ version: PLUGIN_LOCK_VERSION, plugins: Object.freeze(plugins) });
|
|
154
|
+
}
|
|
155
|
+
export function lockWithPlugin(lock, declared, entry) {
|
|
156
|
+
const byRef = new Map(lock.plugins.map(p => [canonicalPluginRef({ ...p.source, ref: p.source.sha }), p]));
|
|
157
|
+
byRef.set(canonicalPluginRef({ ...entry.source, ref: entry.source.sha }), { ...entry, kind: 'flow-extension', order: 0 });
|
|
158
|
+
return lockForDeclared({ version: PLUGIN_LOCK_VERSION, plugins: Object.freeze([...byRef.values()]) }, declared);
|
|
159
|
+
}
|
|
160
|
+
/** Lock entries paired with their declared reference, in declaration order. */
|
|
161
|
+
export function lockedPlugins(lock) {
|
|
162
|
+
return lock.plugins.map(entry => {
|
|
163
|
+
const source = { ...entry.source, ref: entry.source.sha };
|
|
164
|
+
return { ref: canonicalPluginRef(source), entry, source };
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/** The `github:` entries of `flows.json.plugins`, in declaration order; helper entries are left out. */
|
|
168
|
+
export function declaredExtensionRefs(root) {
|
|
169
|
+
recoverFlowsAndLock(root);
|
|
170
|
+
let config;
|
|
171
|
+
try {
|
|
172
|
+
config = JSON.parse(readFileSync(join(root, 'flows.json'), 'utf8'));
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
throw new PluginError('plugin_manifest_invalid', 'Invalid flows.json.');
|
|
176
|
+
}
|
|
177
|
+
if (config === null || typeof config !== 'object' || (config.plugins !== undefined && (!Array.isArray(config.plugins) || !config.plugins.every(p => typeof p === 'string')))) {
|
|
178
|
+
throw new PluginError('plugin_manifest_invalid', 'flows.json plugins must be strings.');
|
|
179
|
+
}
|
|
180
|
+
return Object.freeze((config.plugins ?? []).filter(isGithubPluginRef));
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* The three records that must agree before an extension is trusted:
|
|
184
|
+
* `flows.json.plugins` (declaration), `flows.lock.json` (provenance), and —
|
|
185
|
+
* checked by the caller against the returned digests — `.flows/plugins`
|
|
186
|
+
* (bytes). Any declaration without a lock entry, lock entry without a
|
|
187
|
+
* declaration, or order disagreement is `plugin_lock_invalid`.
|
|
188
|
+
*/
|
|
189
|
+
export function reconcileDeclaredExtensions(root) {
|
|
190
|
+
const declared = declaredExtensionRefs(root);
|
|
191
|
+
const locked = lockedPlugins(readPluginLock(root));
|
|
192
|
+
const lockedRefs = locked.map(p => p.ref);
|
|
193
|
+
for (const ref of declared)
|
|
194
|
+
if (!lockedRefs.includes(ref))
|
|
195
|
+
throw new PluginError('plugin_lock_invalid', `flows.json declares ${ref} but flows.lock.json has no entry for it.`);
|
|
196
|
+
for (const ref of lockedRefs)
|
|
197
|
+
if (!declared.includes(ref))
|
|
198
|
+
throw new PluginError('plugin_lock_invalid', `flows.lock.json records ${ref} but flows.json does not declare it.`);
|
|
199
|
+
if (declared.some((ref, index) => lockedRefs[index] !== ref))
|
|
200
|
+
throw new PluginError('plugin_lock_invalid', 'flows.lock.json order differs from flows.json.plugins.');
|
|
201
|
+
return locked;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=plugin-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-lock.js","sourceRoot":"","sources":["../src/plugin-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const PLUGIN_FAILURE_KINDS: readonly ["plugin_unknown", "plugin_unlisted", "plugin_install_failed", "plugin_manifest_missing", "plugin_manifest_invalid", "plugin_preflight_missing", "plugin_verb_unknown_primitive", "plugin_unsupported", "plugin_credential_missing", "plugin_server_unreachable"];
|
|
1
|
+
export declare const PLUGIN_FAILURE_KINDS: readonly ["plugin_unknown", "plugin_unlisted", "plugin_install_failed", "plugin_manifest_missing", "plugin_manifest_invalid", "plugin_preflight_missing", "plugin_verb_unknown_primitive", "plugin_unsupported", "plugin_credential_missing", "plugin_server_unreachable", "plugin_kind_invalid", "plugin_incompatible", "plugin_event_unroutable", "plugin_source_invalid", "plugin_source_unresolved", "plugin_fetch_failed", "plugin_path_invalid", "plugin_too_large", "plugin_source_drift", "plugin_lock_invalid"];
|
|
2
2
|
export type PluginFailureKind = typeof PLUGIN_FAILURE_KINDS[number];
|
|
3
3
|
export declare class PluginError extends Error {
|
|
4
4
|
readonly code: PluginFailureKind;
|
|
@@ -10,6 +10,10 @@ export interface PluginVerb {
|
|
|
10
10
|
lowersTo: 'run' | 'llm' | 'agent' | 'effect' | 'wait';
|
|
11
11
|
args: Record<string, unknown>;
|
|
12
12
|
}
|
|
13
|
+
/** The kind a `flows-plugin.json` declares; absent means the schema-1 helper plugin. */
|
|
14
|
+
export type PluginKind = 'helper' | 'flow-extension';
|
|
15
|
+
export declare function pluginKindOf(input: unknown): PluginKind;
|
|
16
|
+
/** A schema-1 helper plugin: verbs that lower to kernel primitives. */
|
|
13
17
|
export interface PluginManifest {
|
|
14
18
|
name: string;
|
|
15
19
|
version: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-manifest.d.ts","sourceRoot":"","sources":["../src/plugin-manifest.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"plugin-manifest.d.ts","sourceRoot":"","sources":["../src/plugin-manifest.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,0fAQvB,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACpE,qBAAa,WAAY,SAAQ,KAAK;IACxB,QAAQ,CAAC,IAAI,EAAE,iBAAiB;gBAAvB,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM;CAC9D;AACD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AACD,wFAAwF;AACxF,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AACrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAKvD;AACD,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7B,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B,SAAS,EAAE;QAAE,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;CAC3E;AAKD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AACD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CAqC3F;AACD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAIpE"}
|
package/dist/plugin-manifest.js
CHANGED
|
@@ -4,6 +4,10 @@ export const PLUGIN_FAILURE_KINDS = [
|
|
|
4
4
|
'plugin_unknown', 'plugin_unlisted', 'plugin_install_failed', 'plugin_manifest_missing',
|
|
5
5
|
'plugin_manifest_invalid', 'plugin_preflight_missing', 'plugin_verb_unknown_primitive',
|
|
6
6
|
'plugin_unsupported', 'plugin_credential_missing', 'plugin_server_unreachable',
|
|
7
|
+
// schema 2 flow extensions (see flow-extension-manifest.ts, plugin-source.ts, plugin-github.ts)
|
|
8
|
+
'plugin_kind_invalid', 'plugin_incompatible', 'plugin_event_unroutable', 'plugin_source_invalid',
|
|
9
|
+
'plugin_source_unresolved', 'plugin_fetch_failed', 'plugin_path_invalid', 'plugin_too_large',
|
|
10
|
+
'plugin_source_drift', 'plugin_lock_invalid',
|
|
7
11
|
];
|
|
8
12
|
export class PluginError extends Error {
|
|
9
13
|
code;
|
|
@@ -12,6 +16,14 @@ export class PluginError extends Error {
|
|
|
12
16
|
this.code = code;
|
|
13
17
|
}
|
|
14
18
|
}
|
|
19
|
+
export function pluginKindOf(input) {
|
|
20
|
+
const kind = typeof input === 'object' && input !== null && !Array.isArray(input) ? input.kind : undefined;
|
|
21
|
+
if (kind === undefined || kind === 'helper')
|
|
22
|
+
return 'helper';
|
|
23
|
+
if (kind === 'flow-extension')
|
|
24
|
+
return 'flow-extension';
|
|
25
|
+
throw new PluginError('plugin_kind_invalid', `Unknown plugin kind ${JSON.stringify(kind)}; expected "helper" or "flow-extension".`);
|
|
26
|
+
}
|
|
15
27
|
const identifier = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
16
28
|
const reserved = new Set(['run', 'llm', 'agent', 'human', 'dispatch', 'done', 'cloud', 'memory', 'mcp', 'slack', '__proto__', 'constructor', 'prototype', 'then']);
|
|
17
29
|
const object = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
@@ -34,6 +46,11 @@ export function validatePluginManifest(input, packageName) {
|
|
|
34
46
|
const invalid = (message) => { throw new PluginError('plugin_manifest_invalid', message); };
|
|
35
47
|
if (!object(v))
|
|
36
48
|
return invalid('Expected a plugin manifest object.');
|
|
49
|
+
if (pluginKindOf(v) !== 'helper') {
|
|
50
|
+
throw new PluginError('plugin_kind_invalid', 'A flow-extension manifest installs from a GitHub reference (flows add github:<owner>/<repo>@<ref>#<path>), not as a helper package.');
|
|
51
|
+
}
|
|
52
|
+
if (v.schema !== undefined && v.schema !== 1)
|
|
53
|
+
return invalid('Helper plugin manifests are schema 1.');
|
|
37
54
|
if (!Object.hasOwn(v, 'preflight'))
|
|
38
55
|
throw new PluginError('plugin_preflight_missing', 'Plugin must declare preflight.');
|
|
39
56
|
if (typeof v.name !== 'string' || typeof v.version !== 'string' || !v.version.trim())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-manifest.js","sourceRoot":"","sources":["../src/plugin-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,yBAAyB;IACvF,yBAAyB,EAAE,0BAA0B,EAAE,+BAA+B;IACtF,oBAAoB,EAAE,2BAA2B,EAAE,2BAA2B;
|
|
1
|
+
{"version":3,"file":"plugin-manifest.js","sourceRoot":"","sources":["../src/plugin-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a flow-extension plugin comes from: a public GitHub repository, pinned
|
|
3
|
+
* to a commit. A branch or tag is accepted as *input* only; what gets written
|
|
4
|
+
* to `flows.json` and the lockfile is always the canonical 40-hex form,
|
|
5
|
+
* `github:<owner>/<repo>@<sha>#<path>`, so a later reader can never resolve
|
|
6
|
+
* to different bytes than the installer saw.
|
|
7
|
+
*/
|
|
8
|
+
export interface PluginSourceInput {
|
|
9
|
+
readonly host: 'github';
|
|
10
|
+
readonly owner: string;
|
|
11
|
+
readonly repo: string;
|
|
12
|
+
/** Branch, tag, or commit as typed. */
|
|
13
|
+
readonly ref: string;
|
|
14
|
+
/** Directory inside the repository holding `flows-plugin.json`; `''` is the root. */
|
|
15
|
+
readonly path: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PluginSourceRef extends PluginSourceInput {
|
|
18
|
+
/** Exactly 40 lowercase hex characters. */
|
|
19
|
+
readonly sha: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const SHA: RegExp;
|
|
22
|
+
export declare function isGithubPluginRef(value: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Accepts `github:<owner>/<repo>@<ref>#<path>`,
|
|
25
|
+
* `https://github.com/<owner>/<repo>/tree/<ref>/<path>` (or `/blob/`), and
|
|
26
|
+
* `github:<owner>/<repo>@<ref>` for a root-level plugin.
|
|
27
|
+
*
|
|
28
|
+
* In the URL form the ref is the single segment after `tree/`: GitHub itself
|
|
29
|
+
* disambiguates `tree/feat/x/dir` against the repository's refs, which an
|
|
30
|
+
* offline parser cannot. A ref containing `/` must use the `github:` form,
|
|
31
|
+
* where `@ref#path` is unambiguous.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parsePluginSource(input: string): PluginSourceInput;
|
|
34
|
+
/** The one spelling that is ever persisted. */
|
|
35
|
+
export declare function canonicalPluginRef(source: PluginSourceRef): string;
|
|
36
|
+
/** Parses a persisted reference; refuses anything but the canonical sha form. */
|
|
37
|
+
export declare function parseCanonicalPluginRef(value: string): PluginSourceRef;
|
|
38
|
+
//# sourceMappingURL=plugin-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-source.d.ts","sourceRoot":"","sources":["../src/plugin-source.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AACD,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,2CAA2C;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAKD,eAAO,MAAM,GAAG,QAAmB,CAAC;AAMpC,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CA6BlE;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAElE;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAMtE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { safePath } from './bundle.js';
|
|
2
|
+
import { PluginError } from './plugin-manifest.js';
|
|
3
|
+
const OWNER = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$/;
|
|
4
|
+
const REPO = /^[A-Za-z0-9_.-]{1,100}$/;
|
|
5
|
+
const REF = /^[A-Za-z0-9][A-Za-z0-9._/-]{0,254}$/;
|
|
6
|
+
export const SHA = /^[0-9a-f]{40}$/;
|
|
7
|
+
function invalid(message) {
|
|
8
|
+
throw new PluginError('plugin_source_invalid', message);
|
|
9
|
+
}
|
|
10
|
+
export function isGithubPluginRef(value) {
|
|
11
|
+
return value.startsWith('github:') || /^https:\/\/github\.com\//.test(value);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Accepts `github:<owner>/<repo>@<ref>#<path>`,
|
|
15
|
+
* `https://github.com/<owner>/<repo>/tree/<ref>/<path>` (or `/blob/`), and
|
|
16
|
+
* `github:<owner>/<repo>@<ref>` for a root-level plugin.
|
|
17
|
+
*
|
|
18
|
+
* In the URL form the ref is the single segment after `tree/`: GitHub itself
|
|
19
|
+
* disambiguates `tree/feat/x/dir` against the repository's refs, which an
|
|
20
|
+
* offline parser cannot. A ref containing `/` must use the `github:` form,
|
|
21
|
+
* where `@ref#path` is unambiguous.
|
|
22
|
+
*/
|
|
23
|
+
export function parsePluginSource(input) {
|
|
24
|
+
if (input.length > 2048)
|
|
25
|
+
return invalid('Plugin source is too long.');
|
|
26
|
+
let owner, repo, ref, path = '';
|
|
27
|
+
if (input.startsWith('github:')) {
|
|
28
|
+
const m = /^github:([^/@#]+)\/([^/@#]+)@([^#]+)(?:#(.*))?$/.exec(input);
|
|
29
|
+
if (!m)
|
|
30
|
+
return invalid('Expected github:<owner>/<repo>@<ref>[#<path>].');
|
|
31
|
+
[, owner, repo, ref] = m;
|
|
32
|
+
path = m[4] ?? '';
|
|
33
|
+
}
|
|
34
|
+
else if (/^https:\/\/github\.com\//.test(input)) {
|
|
35
|
+
let url;
|
|
36
|
+
try {
|
|
37
|
+
url = new URL(input);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return invalid('Plugin source is not a valid URL.');
|
|
41
|
+
}
|
|
42
|
+
if (url.username || url.password || url.search || url.hash)
|
|
43
|
+
return invalid('Plugin URL must not carry credentials, a query, or a fragment.');
|
|
44
|
+
const m = /^\/([^/]+)\/([^/]+)\/(?:tree|blob)\/([^/]+)(?:\/(.*))?$/.exec(url.pathname);
|
|
45
|
+
if (!m)
|
|
46
|
+
return invalid('Expected https://github.com/<owner>/<repo>/tree/<ref>/<path>.');
|
|
47
|
+
try {
|
|
48
|
+
[, owner, repo, ref] = m.map(part => part === undefined ? part : decodeURIComponent(part));
|
|
49
|
+
path = m[4] === undefined ? '' : decodeURIComponent(m[4]);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return invalid('Plugin URL contains invalid percent-encoding.');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else
|
|
56
|
+
return invalid('Expected a github: reference or a https://github.com/ URL.');
|
|
57
|
+
if (owner === undefined || !OWNER.test(owner))
|
|
58
|
+
return invalid('Invalid GitHub owner.');
|
|
59
|
+
if (repo === undefined || !REPO.test(repo) || repo === '.' || repo === '..')
|
|
60
|
+
return invalid('Invalid GitHub repository name.');
|
|
61
|
+
if (repo.endsWith('.git'))
|
|
62
|
+
repo = repo.slice(0, -4);
|
|
63
|
+
if (ref === undefined || !REF.test(ref) || ref.includes('..') || ref.endsWith('/') || ref.endsWith('.lock'))
|
|
64
|
+
return invalid('Invalid git ref.');
|
|
65
|
+
path = path.replace(/\/+$/, '');
|
|
66
|
+
if (path !== '' && !safePath(path))
|
|
67
|
+
return invalid('Plugin path must be repository-relative without traversal.');
|
|
68
|
+
if (path.split('/').some(part => part === 'flows-plugin.json'))
|
|
69
|
+
return invalid('Plugin path names the directory holding flows-plugin.json, not the file.');
|
|
70
|
+
return Object.freeze({ host: 'github', owner, repo, ref, path });
|
|
71
|
+
}
|
|
72
|
+
/** The one spelling that is ever persisted. */
|
|
73
|
+
export function canonicalPluginRef(source) {
|
|
74
|
+
return `github:${source.owner}/${source.repo}@${source.sha}${source.path === '' ? '' : `#${source.path}`}`;
|
|
75
|
+
}
|
|
76
|
+
/** Parses a persisted reference; refuses anything but the canonical sha form. */
|
|
77
|
+
export function parseCanonicalPluginRef(value) {
|
|
78
|
+
const parsed = parsePluginSource(value);
|
|
79
|
+
if (!value.startsWith('github:') || !SHA.test(parsed.ref)) {
|
|
80
|
+
throw new PluginError('plugin_source_invalid', `Persisted plugin reference must be github:<owner>/<repo>@<sha>[#<path>], got ${value}.`);
|
|
81
|
+
}
|
|
82
|
+
return Object.freeze({ ...parsed, sha: parsed.ref });
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=plugin-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-source.js","sourceRoot":"","sources":["../src/plugin-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a flow-extension plugin's bytes live inside a project:
|
|
3
|
+
* `<project>/.flows/plugins/<name>@sha256:<digest>/`, content-addressed like
|
|
4
|
+
* the bundle cache and never `node_modules`. `manifest.json` in that directory
|
|
5
|
+
* is the payload manifest whose sha256 is the digest, so a directory can be
|
|
6
|
+
* re-verified without the network — and, because the lockfile records the
|
|
7
|
+
* same digest, drift between what was installed and what is on disk is a
|
|
8
|
+
* refusal, not a surprise.
|
|
9
|
+
*/
|
|
10
|
+
export declare const PLUGIN_STORE = ".flows/plugins";
|
|
11
|
+
export declare function pluginStoreDirectory(root: string, name: string, digest: string): string;
|
|
12
|
+
export interface StoredPluginFile {
|
|
13
|
+
readonly path: string;
|
|
14
|
+
readonly data: Uint8Array;
|
|
15
|
+
}
|
|
16
|
+
/** Write the files atomically; an existing directory is verified instead of overwritten. */
|
|
17
|
+
export declare function materializePlugin(root: string, name: string, files: readonly StoredPluginFile[]): Promise<{
|
|
18
|
+
directory: string;
|
|
19
|
+
digest: string;
|
|
20
|
+
}>;
|
|
21
|
+
/** Re-hash a materialized plugin and compare with the digest the lockfile recorded. */
|
|
22
|
+
export declare function verifyStoredPlugin(directory: string, expectedDigest: string): Promise<void>;
|
|
23
|
+
/** Re-verify, then return every stored file including the payload `manifest.json`. */
|
|
24
|
+
export declare function readStoredPluginFiles(directory: string, expectedDigest: string): Promise<readonly {
|
|
25
|
+
path: string;
|
|
26
|
+
data: Buffer;
|
|
27
|
+
}[]>;
|
|
28
|
+
/** Drop a materialized plugin directory. Missing is a no-op. */
|
|
29
|
+
export declare function removeStoredPlugin(directory: string): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=plugin-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-store.d.ts","sourceRoot":"","sources":["../src/plugin-store.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,mBAAmB,CAAC;AAE7C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,MAAM,WAAW,gBAAgB;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE;AAEtF,4FAA4F;AAC5F,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBtJ;AAWD,uFAAuF;AACvF,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBjG;AAED,sFAAsF;AACtF,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAOzI;AAED,gEAAgE;AAChE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { lstat, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { payloadManifest, safePath, sha256 } from './bundle.js';
|
|
4
|
+
import { PluginError } from './plugin-manifest.js';
|
|
5
|
+
/**
|
|
6
|
+
* Where a flow-extension plugin's bytes live inside a project:
|
|
7
|
+
* `<project>/.flows/plugins/<name>@sha256:<digest>/`, content-addressed like
|
|
8
|
+
* the bundle cache and never `node_modules`. `manifest.json` in that directory
|
|
9
|
+
* is the payload manifest whose sha256 is the digest, so a directory can be
|
|
10
|
+
* re-verified without the network — and, because the lockfile records the
|
|
11
|
+
* same digest, drift between what was installed and what is on disk is a
|
|
12
|
+
* refusal, not a surprise.
|
|
13
|
+
*/
|
|
14
|
+
export const PLUGIN_STORE = '.flows/plugins';
|
|
15
|
+
export function pluginStoreDirectory(root, name, digest) {
|
|
16
|
+
return join(resolve(root), PLUGIN_STORE, `${name}@sha256:${digest}`);
|
|
17
|
+
}
|
|
18
|
+
/** Write the files atomically; an existing directory is verified instead of overwritten. */
|
|
19
|
+
export async function materializePlugin(root, name, files) {
|
|
20
|
+
const manifest = payloadManifest(files);
|
|
21
|
+
const digest = sha256(manifest);
|
|
22
|
+
const directory = pluginStoreDirectory(root, name, digest);
|
|
23
|
+
let exists = false;
|
|
24
|
+
try {
|
|
25
|
+
await lstat(directory);
|
|
26
|
+
exists = true;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error.code !== 'ENOENT')
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
if (exists) {
|
|
33
|
+
await verifyStoredPlugin(directory, digest);
|
|
34
|
+
return { directory, digest };
|
|
35
|
+
}
|
|
36
|
+
const parent = dirname(directory);
|
|
37
|
+
await mkdir(parent, { recursive: true });
|
|
38
|
+
const staging = await mkdtemp(join(parent, '.install-'));
|
|
39
|
+
try {
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
if (!safePath(file.path) || file.path === 'manifest.json')
|
|
42
|
+
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 });
|
|
45
|
+
}
|
|
46
|
+
await writeFile(join(staging, 'manifest.json'), manifest);
|
|
47
|
+
try {
|
|
48
|
+
await rename(staging, directory);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (!['EEXIST', 'ENOTEMPTY'].includes(error.code ?? ''))
|
|
52
|
+
throw error;
|
|
53
|
+
await verifyStoredPlugin(directory, digest);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
await rm(staging, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
return { directory, digest };
|
|
60
|
+
}
|
|
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));
|
|
69
|
+
}
|
|
70
|
+
/** 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;
|
|
74
|
+
try {
|
|
75
|
+
if (!(await lstat(directory)).isDirectory())
|
|
76
|
+
return drift('not a directory');
|
|
77
|
+
raw = (await regularFile(directory, 'manifest.json')).toString('utf8');
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return drift(error instanceof PluginError ? error.message : 'manifest.json is missing');
|
|
81
|
+
}
|
|
82
|
+
if (sha256(raw) !== expectedDigest)
|
|
83
|
+
return drift('manifest.json digest differs from the lockfile');
|
|
84
|
+
let entries;
|
|
85
|
+
try {
|
|
86
|
+
entries = JSON.parse(raw);
|
|
87
|
+
if (!Array.isArray(entries))
|
|
88
|
+
throw new Error();
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return drift('manifest.json is not a manifest');
|
|
92
|
+
}
|
|
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');
|
|
97
|
+
let data;
|
|
98
|
+
try {
|
|
99
|
+
data = await regularFile(directory, entry.path);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return drift(error instanceof PluginError ? error.message : `${entry.path} is missing`);
|
|
103
|
+
}
|
|
104
|
+
if (data.length !== entry.bytes || sha256(data) !== entry.sha256)
|
|
105
|
+
return drift(`${entry.path} changed since installation`);
|
|
106
|
+
paths.add(entry.path);
|
|
107
|
+
}
|
|
108
|
+
await rejectExtras(directory, '', new Set([...paths, 'manifest.json']), drift);
|
|
109
|
+
}
|
|
110
|
+
/** 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;
|
|
119
|
+
}
|
|
120
|
+
/** Drop a materialized plugin directory. Missing is a no-op. */
|
|
121
|
+
export async function removeStoredPlugin(directory) {
|
|
122
|
+
await rm(directory, { recursive: true, force: true });
|
|
123
|
+
}
|
|
124
|
+
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`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=plugin-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-store.js","sourceRoot":"","sources":["../src/plugin-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE7C,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAAY,EAAE,MAAc;IAC7E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,WAAW,MAAM,EAAE,CAAC,CAAC;AACvE,CAAC;AAID,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAY,EAAE,KAAkC;IACpG,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3D,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC;IAAC,CAAC;IAC9C,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IAAC,CAAC;IACtF,IAAI,MAAM,EAAE,CAAC;QAAC,MAAM,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe;gBAAE,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC;YAC9I,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAAC,CAAC;QACzC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAE,KAA+B,CAAC,IAAI,IAAI,EAAE,CAAC;gBAAE,MAAM,KAAK,CAAC;YAChG,MAAM,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAClE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,GAAG,IAAI,8CAA8C,CAAC,CAAC;IACrK,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,cAAsB;IAChF,MAAM,KAAK,GAAG,CAAC,OAAe,EAAS,EAAE,GAAG,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxH,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC7E,GAAG,GAAG,CAAC,MAAM,WAAW,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,OAAO,KAAK,CAAC,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;IAAC,CAAC;IAC5G,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,cAAc;QAAE,OAAO,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACnG,IAAI,OAA0D,CAAC;IAC/D,IAAI,CAAC;QAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;IAAC,CAAC;IAClF,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAClH,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YAAC,IAAI,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QACxD,OAAO,KAAK,EAAE,CAAC;YAAC,OAAO,KAAK,CAAC,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC;QAAC,CAAC;QAC1G,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAC3H,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAiB,EAAE,cAAsB;IACnF,MAAM,kBAAkB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAuB,CAAC;IAC5E,MAAM,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9G,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,KAAkB,EAAE,KAA2B;IACvG,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YAAE,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAC/H,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,IAAI,0CAA0C,CAAC,CAAC;IACzG,CAAC;AACH,CAAC"}
|