@relayflows/sdk 2.0.24 → 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.
Files changed (162) hide show
  1. package/dist/authored-flow-executor.d.ts +3 -0
  2. package/dist/authored-flow-executor.d.ts.map +1 -1
  3. package/dist/authored-flow-executor.js +29 -1
  4. package/dist/authored-flow-executor.js.map +1 -1
  5. package/dist/authored-flow-loader.d.ts +15 -2
  6. package/dist/authored-flow-loader.d.ts.map +1 -1
  7. package/dist/authored-flow-loader.js +33 -4
  8. package/dist/authored-flow-loader.js.map +1 -1
  9. package/dist/authored-hooks.d.ts +29 -0
  10. package/dist/authored-hooks.d.ts.map +1 -0
  11. package/dist/authored-hooks.js +117 -0
  12. package/dist/authored-hooks.js.map +1 -0
  13. package/dist/authored-node-entry.js +1 -0
  14. package/dist/authored-node-entry.js.map +1 -1
  15. package/dist/authored-root.d.ts +7 -0
  16. package/dist/authored-root.d.ts.map +1 -1
  17. package/dist/authored-root.js +14 -1
  18. package/dist/authored-root.js.map +1 -1
  19. package/dist/authored-source-authority.d.ts.map +1 -1
  20. package/dist/authored-source-authority.js +6 -0
  21. package/dist/authored-source-authority.js.map +1 -1
  22. package/dist/bundle-extensions.d.ts +19 -0
  23. package/dist/bundle-extensions.d.ts.map +1 -0
  24. package/dist/bundle-extensions.js +95 -0
  25. package/dist/bundle-extensions.js.map +1 -0
  26. package/dist/bundle-typescript.js +1 -1
  27. package/dist/bundle-typescript.js.map +1 -1
  28. package/dist/bundle.d.ts +11 -0
  29. package/dist/bundle.d.ts.map +1 -1
  30. package/dist/bundle.js +13 -4
  31. package/dist/bundle.js.map +1 -1
  32. package/dist/cli/add-extension.d.ts +28 -0
  33. package/dist/cli/add-extension.d.ts.map +1 -0
  34. package/dist/cli/add-extension.js +135 -0
  35. package/dist/cli/add-extension.js.map +1 -0
  36. package/dist/cli/add.d.ts +3 -0
  37. package/dist/cli/add.d.ts.map +1 -1
  38. package/dist/cli/add.js +8 -0
  39. package/dist/cli/add.js.map +1 -1
  40. package/dist/cli/build.d.ts.map +1 -1
  41. package/dist/cli/build.js +7 -2
  42. package/dist/cli/build.js.map +1 -1
  43. package/dist/cli/check-helper-body.d.ts.map +1 -1
  44. package/dist/cli/check-helper-body.js +4 -0
  45. package/dist/cli/check-helper-body.js.map +1 -1
  46. package/dist/cli/check-triggers.d.ts.map +1 -1
  47. package/dist/cli/check-triggers.js +25 -2
  48. package/dist/cli/check-triggers.js.map +1 -1
  49. package/dist/cli/check-typescript.d.ts.map +1 -1
  50. package/dist/cli/check-typescript.js +5 -1
  51. package/dist/cli/check-typescript.js.map +1 -1
  52. package/dist/cli/check.d.ts +24 -0
  53. package/dist/cli/check.d.ts.map +1 -1
  54. package/dist/cli/check.js.map +1 -1
  55. package/dist/cli/cloud-deploy.d.ts +1 -0
  56. package/dist/cli/cloud-deploy.d.ts.map +1 -1
  57. package/dist/cli/cloud-deploy.js +11 -1
  58. package/dist/cli/cloud-deploy.js.map +1 -1
  59. package/dist/cli/plugin.d.ts +50 -0
  60. package/dist/cli/plugin.d.ts.map +1 -0
  61. package/dist/cli/plugin.js +295 -0
  62. package/dist/cli/plugin.js.map +1 -0
  63. package/dist/cli-commands.d.ts +46 -3
  64. package/dist/cli-commands.d.ts.map +1 -1
  65. package/dist/cli-commands.js +32 -2
  66. package/dist/cli-commands.js.map +1 -1
  67. package/dist/cli.d.ts +2 -1
  68. package/dist/cli.d.ts.map +1 -1
  69. package/dist/cli.js +26 -1
  70. package/dist/cli.js.map +1 -1
  71. package/dist/cloud-deploy.d.ts +5 -0
  72. package/dist/cloud-deploy.d.ts.map +1 -1
  73. package/dist/cloud-deploy.js +7 -6
  74. package/dist/cloud-deploy.js.map +1 -1
  75. package/dist/cloud-run.d.ts +2 -0
  76. package/dist/cloud-run.d.ts.map +1 -1
  77. package/dist/cloud-run.js +14 -4
  78. package/dist/cloud-run.js.map +1 -1
  79. package/dist/failure-kinds.d.ts +2 -2
  80. package/dist/failure-kinds.d.ts.map +1 -1
  81. package/dist/flow-extension-compat.d.ts +18 -0
  82. package/dist/flow-extension-compat.d.ts.map +1 -0
  83. package/dist/flow-extension-compat.js +33 -0
  84. package/dist/flow-extension-compat.js.map +1 -0
  85. package/dist/flow-extension-loader.d.ts +61 -0
  86. package/dist/flow-extension-loader.d.ts.map +1 -0
  87. package/dist/flow-extension-loader.js +173 -0
  88. package/dist/flow-extension-loader.js.map +1 -0
  89. package/dist/flow-extension-manifest.d.ts +61 -0
  90. package/dist/flow-extension-manifest.d.ts.map +1 -0
  91. package/dist/flow-extension-manifest.js +188 -0
  92. package/dist/flow-extension-manifest.js.map +1 -0
  93. package/dist/flow-extension-submit.d.ts +38 -0
  94. package/dist/flow-extension-submit.d.ts.map +1 -0
  95. package/dist/flow-extension-submit.js +94 -0
  96. package/dist/flow-extension-submit.js.map +1 -0
  97. package/dist/flow-requirements.d.ts +13 -3
  98. package/dist/flow-requirements.d.ts.map +1 -1
  99. package/dist/flow-requirements.js +30 -0
  100. package/dist/flow-requirements.js.map +1 -1
  101. package/dist/plugin-github.d.ts +35 -0
  102. package/dist/plugin-github.d.ts.map +1 -0
  103. package/dist/plugin-github.js +92 -0
  104. package/dist/plugin-github.js.map +1 -0
  105. package/dist/plugin-loader.d.ts.map +1 -1
  106. package/dist/plugin-loader.js +5 -1
  107. package/dist/plugin-loader.js.map +1 -1
  108. package/dist/plugin-lock.d.ts +79 -0
  109. package/dist/plugin-lock.d.ts.map +1 -0
  110. package/dist/plugin-lock.js +203 -0
  111. package/dist/plugin-lock.js.map +1 -0
  112. package/dist/plugin-manifest.d.ts +5 -1
  113. package/dist/plugin-manifest.d.ts.map +1 -1
  114. package/dist/plugin-manifest.js +17 -0
  115. package/dist/plugin-manifest.js.map +1 -1
  116. package/dist/plugin-source.d.ts +38 -0
  117. package/dist/plugin-source.d.ts.map +1 -0
  118. package/dist/plugin-source.js +84 -0
  119. package/dist/plugin-source.js.map +1 -0
  120. package/dist/plugin-store.d.ts +30 -0
  121. package/dist/plugin-store.d.ts.map +1 -0
  122. package/dist/plugin-store.js +133 -0
  123. package/dist/plugin-store.js.map +1 -0
  124. package/dist/semver-range.d.ts +10 -0
  125. package/dist/semver-range.d.ts.map +1 -0
  126. package/dist/semver-range.js +88 -0
  127. package/dist/semver-range.js.map +1 -0
  128. package/package.json +2 -2
  129. package/src/authored-flow-executor.ts +36 -1
  130. package/src/authored-flow-loader.ts +49 -6
  131. package/src/authored-hooks.ts +136 -0
  132. package/src/authored-node-entry.ts +1 -0
  133. package/src/authored-root.ts +22 -1
  134. package/src/authored-source-authority.ts +6 -0
  135. package/src/bundle-extensions.ts +85 -0
  136. package/src/bundle-typescript.ts +1 -1
  137. package/src/bundle.ts +14 -4
  138. package/src/cli/add-extension.ts +134 -0
  139. package/src/cli/add.ts +9 -0
  140. package/src/cli/build.ts +7 -2
  141. package/src/cli/check-helper-body.ts +4 -0
  142. package/src/cli/check-triggers.ts +27 -2
  143. package/src/cli/check-typescript.ts +5 -1
  144. package/src/cli/check.ts +23 -0
  145. package/src/cli/cloud-deploy.ts +11 -1
  146. package/src/cli/plugin.ts +286 -0
  147. package/src/cli-commands.ts +32 -2
  148. package/src/cli.ts +23 -1
  149. package/src/cloud-deploy.ts +18 -8
  150. package/src/cloud-run.ts +16 -6
  151. package/src/flow-extension-compat.ts +35 -0
  152. package/src/flow-extension-loader.ts +217 -0
  153. package/src/flow-extension-manifest.ts +190 -0
  154. package/src/flow-extension-submit.ts +120 -0
  155. package/src/flow-requirements.ts +44 -3
  156. package/src/plugin-github.ts +98 -0
  157. package/src/plugin-loader.ts +5 -1
  158. package/src/plugin-lock.ts +194 -0
  159. package/src/plugin-manifest.ts +17 -0
  160. package/src/plugin-source.ts +91 -0
  161. package/src/plugin-store.ts +105 -0
  162. package/src/semver-range.ts +74 -0
@@ -0,0 +1,61 @@
1
+ import type { Ctx } from '@relayflows/surface';
2
+ import type { AuthoredFlowDefinition, FlowHandle } from './authored-flow.js';
3
+ import { type RuntimeVersions } from './flow-extension-compat.js';
4
+ import { type FlowExtensionManifest } from './flow-extension-manifest.js';
5
+ /**
6
+ * Compose schema-2 flow extensions onto a base authored flow.
7
+ *
8
+ * Order of operations is the security argument, so it is fixed:
9
+ * 1. `flows.json.plugins` and `flows.lock.json` must agree (declaration ⇔
10
+ * provenance, same order);
11
+ * 2. the materialized store is re-hashed against the lock's digest and the
12
+ * manifest bytes against the lock's manifest hash — nothing under
13
+ * `.flows/plugins` is read as code before this passes;
14
+ * 3. the manifest is validated, its compat checked against the runtime and
15
+ * the base flow, and anything this slice does not compose (hooks, `use`,
16
+ * schedule triggers, non-provider webhooks, gates) is refused;
17
+ * 4. only then is the entry imported, and its handlers are checked against
18
+ * the manifest's declared triggers — an entry cannot subscribe to more
19
+ * than it declared.
20
+ * Extensions compose after the base, in lock order; nothing replaces,
21
+ * reorders, or widens a base handler.
22
+ */
23
+ type TriggerHandler = AuthoredFlowDefinition['handlers'][number];
24
+ export type FlowHook = (f: Ctx, input: unknown) => Promise<boolean>;
25
+ export interface LoadedFlowExtension {
26
+ readonly name: string;
27
+ readonly version: string;
28
+ readonly ref: string;
29
+ readonly digest: string;
30
+ readonly directory: string;
31
+ readonly entryPath: string;
32
+ readonly manifest: FlowExtensionManifest;
33
+ readonly handle: FlowHandle;
34
+ /** Bound to the surface copy the entry itself imported; the base's accessor cannot see this handle's WeakMap entry. */
35
+ readonly getDefinition: ImportedFlow<unknown>['getDefinition'];
36
+ readonly handlers: readonly TriggerHandler[];
37
+ readonly hooks: Readonly<Record<string, FlowHook>>;
38
+ }
39
+ export interface ImportedFlow<Authority> {
40
+ readonly handle: FlowHandle;
41
+ readonly getDefinition: <Input = unknown>(handle: FlowHandle) => AuthoredFlowDefinition<Input>;
42
+ readonly surfaceAuthority: Authority;
43
+ readonly hooks: Readonly<Record<string, FlowHook>>;
44
+ }
45
+ export interface LoadFlowExtensionsOptions<Authority> {
46
+ readonly importFlow: (path: string) => Promise<ImportedFlow<Authority>>;
47
+ readonly sameAuthority: (a: Authority, b: Authority) => boolean;
48
+ readonly versions?: RuntimeVersions;
49
+ }
50
+ /** Credentials and servers declared on a flow-extension, probed before the base body starts. */
51
+ export declare function probeFlowExtension(manifest: FlowExtensionManifest, env?: NodeJS.ProcessEnv): Promise<void>;
52
+ export declare function parseHooksExport(module: Record<string, unknown>, name: string): Readonly<Record<string, FlowHook>>;
53
+ /** Extensions declared by the project that owns `flowPath`, verified and loaded in lock order; empty when none are declared. */
54
+ export declare function loadFlowExtensions<Authority>(flowPath: string, base: {
55
+ readonly definition: AuthoredFlowDefinition;
56
+ readonly surfaceAuthority: Authority;
57
+ }, options: LoadFlowExtensionsOptions<Authority>): Promise<readonly LoadedFlowExtension[]>;
58
+ /** The base definition with extension handlers appended in lock order; the base's own fields are untouched. */
59
+ export declare function composeDefinition<Input>(base: AuthoredFlowDefinition<Input>, extensions: readonly LoadedFlowExtension[]): AuthoredFlowDefinition<Input>;
60
+ export {};
61
+ //# sourceMappingURL=flow-extension-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-extension-loader.d.ts","sourceRoot":"","sources":["../src/flow-extension-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { sha256 } from './bundle.js';
4
+ import { assertBaseCompatible, assertCompatible, runtimeVersions } from './flow-extension-compat.js';
5
+ import { validateFlowExtensionManifest } from './flow-extension-manifest.js';
6
+ import { findPluginProject } from './plugin-loader.js';
7
+ import { reconcileDeclaredExtensions } from './plugin-lock.js';
8
+ import { PluginError } from './plugin-manifest.js';
9
+ import { pluginStoreDirectory, verifyStoredPlugin } from './plugin-store.js';
10
+ const EXTENSION_HEADER_FIELDS = new Set(['budget', 'tools']);
11
+ const WALLCLOCK_MS = { ms: 1, s: 1000, m: 60_000, h: 3_600_000, d: 86_400_000 };
12
+ function wallclockMs(value) {
13
+ const match = /^(\d+)(ms|s|m|h|d)$/.exec(value);
14
+ if (!match)
15
+ return undefined;
16
+ const unit = match[2];
17
+ return Number(match[1]) * WALLCLOCK_MS[unit];
18
+ }
19
+ /** Credentials and servers declared on a flow-extension, probed before the base body starts. */
20
+ export async function probeFlowExtension(manifest, env = process.env) {
21
+ for (const credential of manifest.preflight.credentials) {
22
+ if (!env[credential]?.trim())
23
+ throw new PluginError('plugin_credential_missing', `${manifest.name} requires ${credential}.`);
24
+ }
25
+ for (const server of manifest.preflight.servers) {
26
+ try {
27
+ const response = await fetch(server, { method: 'HEAD', signal: AbortSignal.timeout(5000) });
28
+ await response.body?.cancel();
29
+ if (!response.ok)
30
+ throw new Error('unsuccessful response');
31
+ }
32
+ catch {
33
+ throw new PluginError('plugin_server_unreachable', `${manifest.name} cannot reach ${server}.`);
34
+ }
35
+ }
36
+ }
37
+ function unsupported(name, what) {
38
+ throw new PluginError('plugin_unsupported', `${name}: ${what} is not composed by this release.`);
39
+ }
40
+ /** The `{provider, event, action?}` a provider subscription lowers to, or undefined for anything else. */
41
+ function subscriptionOf(handler) {
42
+ const trigger = handler.trigger;
43
+ if (trigger.kind !== 'webhook' || trigger.filter === undefined)
44
+ return undefined;
45
+ const { provider, type, payload } = trigger.filter;
46
+ if (typeof provider !== 'string' || provider !== trigger.name || typeof type !== 'string')
47
+ return undefined;
48
+ const action = typeof payload === 'object' && payload !== null && !Array.isArray(payload) ? payload.action : undefined;
49
+ if (action !== undefined && typeof action !== 'string')
50
+ return undefined;
51
+ return action === undefined ? { provider, event: type } : { provider, event: type, action };
52
+ }
53
+ function assertDeclaredSubscription(name, manifest, handler, index) {
54
+ const subscription = subscriptionOf(handler);
55
+ if (handler.trigger.kind === 'schedule')
56
+ unsupported(name, `handler ${index} (a schedule trigger)`);
57
+ if (subscription === undefined) {
58
+ throw new PluginError('plugin_manifest_invalid', `${name}: handler ${index} is not a provider subscription; extension handlers must be provider triggers declared in flows-plugin.json.`);
59
+ }
60
+ const declared = manifest.triggers.find(t => t.provider === subscription.provider && t.event === subscription.event);
61
+ const covered = declared !== undefined && (subscription.action === undefined ? declared.actions.length === 0 : declared.actions.includes(subscription.action));
62
+ if (!covered) {
63
+ const spelled = `${subscription.provider} ${subscription.event}${subscription.action === undefined ? '' : `.${subscription.action}`}`;
64
+ throw new PluginError('plugin_manifest_invalid', `${name}: handler ${index} subscribes to ${spelled}, which flows-plugin.json does not declare in triggers.`);
65
+ }
66
+ }
67
+ async function loadOne(root, lock, ref, base, options) {
68
+ const directory = pluginStoreDirectory(root, lock.name, lock.digest);
69
+ await verifyStoredPlugin(directory, lock.digest);
70
+ const manifestBytes = readFileSync(join(directory, 'flows-plugin.json'));
71
+ if (sha256(manifestBytes) !== lock.manifestSha256)
72
+ throw new PluginError('plugin_source_drift', `${ref}: flows-plugin.json differs from the lockfile's manifest hash.`);
73
+ let input;
74
+ try {
75
+ input = JSON.parse(manifestBytes.toString('utf8'));
76
+ }
77
+ catch {
78
+ throw new PluginError('plugin_manifest_invalid', `${ref}: flows-plugin.json is not valid JSON.`);
79
+ }
80
+ const manifest = validateFlowExtensionManifest(input);
81
+ if (manifest.name !== lock.name || manifest.version !== lock.version)
82
+ throw new PluginError('plugin_source_drift', `${ref}: manifest names ${manifest.name}@${manifest.version}, lockfile has ${lock.name}@${lock.version}.`);
83
+ assertCompatible(manifest, options.versions ?? runtimeVersions());
84
+ assertBaseCompatible(manifest, { name: base.definition.name, version: base.definition.header.version });
85
+ const baseBudget = base.definition.header.budget;
86
+ const ceiling = manifest.permissions.budget;
87
+ if (ceiling?.dollars !== undefined && typeof baseBudget === 'object' && baseBudget.dollars !== undefined && ceiling.dollars > baseBudget.dollars) {
88
+ throw new PluginError('plugin_incompatible', `${manifest.name} declares a $${ceiling.dollars} budget ceiling above the base flow's $${baseBudget.dollars}.`);
89
+ }
90
+ if (ceiling?.wallclock !== undefined && typeof baseBudget === 'object' && baseBudget.wallclock !== undefined) {
91
+ const pluginMs = wallclockMs(ceiling.wallclock);
92
+ const baseMs = wallclockMs(baseBudget.wallclock);
93
+ if (pluginMs !== undefined && baseMs !== undefined && pluginMs > baseMs) {
94
+ throw new PluginError('plugin_incompatible', `${manifest.name} declares a ${ceiling.wallclock} wallclock ceiling above the base flow's ${baseBudget.wallclock}.`);
95
+ }
96
+ }
97
+ const entryPath = join(directory, manifest.entry);
98
+ let imported;
99
+ try {
100
+ imported = await options.importFlow(entryPath);
101
+ }
102
+ catch (error) {
103
+ throw new PluginError('plugin_manifest_invalid', `${ref}: entry ${manifest.entry} did not load: ${error instanceof Error ? error.message : String(error)}`);
104
+ }
105
+ if (!options.sameAuthority(imported.surfaceAuthority, base.surfaceAuthority)) {
106
+ throw new PluginError('plugin_incompatible', `${manifest.name}: entry resolves a different @relayflows/surface than the base flow.`);
107
+ }
108
+ const definition = imported.getDefinition(imported.handle);
109
+ const foreign = Object.keys(definition.header).filter(key => !EXTENSION_HEADER_FIELDS.has(key));
110
+ if (foreign.length > 0)
111
+ unsupported(manifest.name, `entry header ${foreign.join(', ')}`);
112
+ if (manifest.extends.handlers && definition.handlers.length === 0) {
113
+ throw new PluginError('plugin_manifest_invalid', `${manifest.name}: extends.handlers is true but ${manifest.entry} declares no .on() handlers.`);
114
+ }
115
+ if (!manifest.extends.handlers && definition.handlers.length > 0) {
116
+ throw new PluginError('plugin_manifest_invalid', `${manifest.name}: ${manifest.entry} declares handlers but extends.handlers is false.`);
117
+ }
118
+ definition.handlers.forEach((handler, index) => assertDeclaredSubscription(manifest.name, manifest, handler, index));
119
+ const hooks = imported.hooks;
120
+ const exported = Object.keys(hooks).sort();
121
+ const declared = [...manifest.extends.hooks].sort();
122
+ if (exported.join('\0') !== declared.join('\0')) {
123
+ throw new PluginError('plugin_manifest_invalid', `${manifest.name}: extends.hooks [${manifest.extends.hooks.join(', ')}] does not match exported hooks [${exported.join(', ')}].`);
124
+ }
125
+ const baseHooks = base.definition.header.hooks ?? [];
126
+ for (const hook of manifest.extends.hooks) {
127
+ if (!baseHooks.includes(hook)) {
128
+ throw new PluginError('plugin_incompatible', `${manifest.name}: hook ${hook} is not declared by the base flow.`);
129
+ }
130
+ }
131
+ return Object.freeze({
132
+ name: manifest.name, version: manifest.version, ref, digest: lock.digest, directory, entryPath, manifest,
133
+ handle: imported.handle, getDefinition: imported.getDefinition, handlers: Object.freeze([...definition.handlers]),
134
+ hooks,
135
+ });
136
+ }
137
+ export function parseHooksExport(module, name) {
138
+ const exported = module['hooks'];
139
+ if (exported === undefined)
140
+ return Object.freeze({});
141
+ if (typeof exported !== 'object' || exported === null || Array.isArray(exported)) {
142
+ throw new PluginError('plugin_manifest_invalid', `${name}: hooks export must be a record of functions.`);
143
+ }
144
+ const hooks = {};
145
+ for (const [key, value] of Object.entries(exported)) {
146
+ if (typeof value !== 'function') {
147
+ throw new PluginError('plugin_manifest_invalid', `${name}: hooks.${key} is not a function.`);
148
+ }
149
+ hooks[key] = value;
150
+ }
151
+ return Object.freeze(hooks);
152
+ }
153
+ /** Extensions declared by the project that owns `flowPath`, verified and loaded in lock order; empty when none are declared. */
154
+ export async function loadFlowExtensions(flowPath, base, options) {
155
+ const root = findPluginProject(dirname(flowPath));
156
+ if (root === undefined)
157
+ return Object.freeze([]);
158
+ const declared = reconcileDeclaredExtensions(root);
159
+ const loaded = [];
160
+ for (const { ref, entry } of declared)
161
+ loaded.push(await loadOne(root, entry, ref, base, options));
162
+ return Object.freeze(loaded);
163
+ }
164
+ /** The base definition with extension handlers appended in lock order; the base's own fields are untouched. */
165
+ export function composeDefinition(base, extensions) {
166
+ if (extensions.length === 0)
167
+ return base;
168
+ return Object.freeze({
169
+ ...base,
170
+ handlers: Object.freeze([...base.handlers, ...extensions.flatMap(extension => extension.handlers)]),
171
+ });
172
+ }
173
+ //# sourceMappingURL=flow-extension-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-extension-loader.js","sourceRoot":"","sources":["../src/flow-extension-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { type PluginSourceInput } from './plugin-source.js';
2
+ /**
3
+ * Schema 2, `kind: "flow-extension"`: a plugin whose `entry` default-exports
4
+ * `flow()` and contributes handlers, hooks, and gates to a base flow. It is the
5
+ * same `flows-plugin.json` file and the same preflight covenant as a helper
6
+ * plugin (RFC-0001 decision 13); only the kind decides which validator reads it.
7
+ * Helper manifests (`kind` absent) never reach this module.
8
+ *
9
+ * This slice validates and records the declaration. Runtime composition is
10
+ * refused with `plugin_unsupported` (plugin-loader.ts) until the handlers slice.
11
+ */
12
+ export interface FlowExtensionTrigger {
13
+ readonly provider: string;
14
+ readonly event: string;
15
+ readonly actions: readonly string[];
16
+ }
17
+ export interface FlowExtensionCompat {
18
+ readonly surface: string;
19
+ readonly sdk: string;
20
+ readonly base: readonly {
21
+ readonly name: string;
22
+ readonly version: string;
23
+ }[];
24
+ }
25
+ export interface FlowExtensionPermissions {
26
+ readonly integrations: readonly string[];
27
+ readonly harnesses: readonly string[];
28
+ readonly mcp: readonly string[];
29
+ /** Declared effect classes, shown for review; not enforced by this runtime (gate 8 / #442). */
30
+ readonly writes: readonly string[];
31
+ readonly budget?: {
32
+ readonly dollars?: number;
33
+ readonly wallclock?: string;
34
+ };
35
+ }
36
+ export interface FlowExtensionManifest {
37
+ readonly schema: 2;
38
+ readonly kind: 'flow-extension';
39
+ readonly name: string;
40
+ readonly version: string;
41
+ readonly description?: string;
42
+ /** Authoring copies may omit it; `flows add` records the resolved origin in the lockfile regardless. */
43
+ readonly source?: PluginSourceInput & {
44
+ readonly sha?: string;
45
+ };
46
+ readonly compat: FlowExtensionCompat;
47
+ readonly entry: string;
48
+ readonly extends: {
49
+ readonly handlers: boolean;
50
+ readonly hooks: readonly string[];
51
+ };
52
+ readonly triggers: readonly FlowExtensionTrigger[];
53
+ readonly permissions: FlowExtensionPermissions;
54
+ readonly preflight: {
55
+ readonly credentials: readonly string[];
56
+ readonly servers: readonly string[];
57
+ };
58
+ readonly config?: Record<string, unknown>;
59
+ }
60
+ export declare function validateFlowExtensionManifest(input: unknown): FlowExtensionManifest;
61
+ //# sourceMappingURL=flow-extension-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-extension-manifest.d.ts","sourceRoot":"","sources":["../src/flow-extension-manifest.ts"],"names":[],"mappings":"AAMA,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGpF;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE;AAChI,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/E;AACD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9E;AACD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wGAAwG;IACxG,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IACpF,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACnD,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IACrG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAiGD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CA4CnF"}
@@ -0,0 +1,188 @@
1
+ import { Ajv } from 'ajv';
2
+ import { providerEventTypes } from '@relayflows/surface';
3
+ import { FLOW_HARNESSES } from './flow-requirements.js';
4
+ import { snapshotJsonValue } from './json-value.js';
5
+ import { PluginError, pluginKindOf } from './plugin-manifest.js';
6
+ import { safePath } from './bundle.js';
7
+ import { SHA, parsePluginSource } from './plugin-source.js';
8
+ import { isVersionRange, parseVersion } from './semver-range.js';
9
+ const TOP_LEVEL = new Set(['schema', 'kind', 'name', 'version', 'description', 'source', 'compat', 'entry', 'extends', 'triggers', 'gates', 'verbs', 'permissions', 'preflight', 'config']);
10
+ const NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
11
+ const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
12
+ const PROVIDER = /^[a-z0-9][a-z0-9-]{0,63}$/;
13
+ const WRITE_CLASS = /^[a-z0-9-]+(?::[a-z0-9_-]+)+$/;
14
+ const WALLCLOCK = /^\d+(?:ms|s|m|h|d)$/;
15
+ const MAX_DESCRIPTION = 500;
16
+ const MAX_LIST = 64;
17
+ const object = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
18
+ const invalid = (message) => { throw new PluginError('plugin_manifest_invalid', message); };
19
+ function stringList(value, what, pattern) {
20
+ if (!Array.isArray(value) || value.length > MAX_LIST)
21
+ return invalid(`${what} must be a list of at most ${MAX_LIST} strings.`);
22
+ const out = [];
23
+ for (const entry of value) {
24
+ if (typeof entry !== 'string' || !pattern.test(entry))
25
+ return invalid(`${what} has an invalid entry ${JSON.stringify(entry)}.`);
26
+ if (out.includes(entry))
27
+ return invalid(`${what} lists ${entry} twice.`);
28
+ out.push(entry);
29
+ }
30
+ return Object.freeze(out);
31
+ }
32
+ function compat(value) {
33
+ if (!object(value) || Object.keys(value).some(k => !['surface', 'sdk', 'base'].includes(k)))
34
+ return invalid('compat expects surface, sdk, and base.');
35
+ for (const key of ['surface', 'sdk']) {
36
+ if (typeof value[key] !== 'string' || !isVersionRange(value[key]))
37
+ return invalid(`compat.${key} must be a version range (*, x.y.z, ^x.y.z, ~x.y.z, >=x.y.z [<a.b.c]).`);
38
+ }
39
+ if (!Array.isArray(value.base) || value.base.length === 0 || value.base.length > MAX_LIST)
40
+ return invalid('compat.base must name at least one base flow.');
41
+ const base = value.base.map(entry => {
42
+ if (!object(entry) || Object.keys(entry).some(k => !['name', 'version'].includes(k))
43
+ || typeof entry.name !== 'string' || entry.name.trim().length === 0 || entry.name.length > 100
44
+ || typeof entry.version !== 'string' || !isVersionRange(entry.version))
45
+ return invalid('compat.base entries are { name, version range }.');
46
+ return Object.freeze({ name: entry.name, version: entry.version });
47
+ });
48
+ if (new Set(base.map(b => b.name)).size !== base.length)
49
+ return invalid('compat.base names a base flow twice.');
50
+ return Object.freeze({ surface: value.surface, sdk: value.sdk, base: Object.freeze(base) });
51
+ }
52
+ function triggers(value) {
53
+ if (!Array.isArray(value) || value.length > MAX_LIST)
54
+ return invalid('triggers must be a list.');
55
+ const registry = providerEventTypes;
56
+ const seen = new Set();
57
+ return Object.freeze(value.map(entry => {
58
+ if (!object(entry) || Object.keys(entry).some(k => !['provider', 'event', 'actions'].includes(k))
59
+ || typeof entry.provider !== 'string' || !PROVIDER.test(entry.provider)
60
+ || typeof entry.event !== 'string' || !IDENTIFIER.test(entry.event))
61
+ return invalid('triggers entries are { provider, event, actions }.');
62
+ const actions = stringList(entry.actions, `triggers ${entry.provider}.${entry.event} actions`, IDENTIFIER);
63
+ const known = registry[entry.provider];
64
+ // Fail where ingress would: an event the surface registry cannot lower is
65
+ // refused now, not after deployment on the first real delivery.
66
+ if (known === undefined)
67
+ throw new PluginError('plugin_event_unroutable', `Trigger provider ${entry.provider} is not in the surface event registry.`);
68
+ const unroutable = (actions.length === 0 ? [entry.event] : actions.map(a => `${entry.event}.${a}`)).filter(type => !known.includes(type));
69
+ if (unroutable.length > 0)
70
+ throw new PluginError('plugin_event_unroutable', `Trigger ${entry.provider} ${unroutable.join(', ')} is not in the surface event registry.`);
71
+ const key = `${entry.provider}:${entry.event}`;
72
+ if (seen.has(key))
73
+ return invalid(`Trigger ${key} is declared twice.`);
74
+ seen.add(key);
75
+ return Object.freeze({ provider: entry.provider, event: entry.event, actions });
76
+ }));
77
+ }
78
+ function permissions(value) {
79
+ if (!object(value) || Object.keys(value).some(k => !['integrations', 'harnesses', 'mcp', 'writes', 'budget'].includes(k))) {
80
+ return invalid('permissions expects integrations, harnesses, mcp, writes, and optional budget.');
81
+ }
82
+ const harnesses = stringList(value.harnesses, 'permissions.harnesses', /^[a-z]+$/);
83
+ for (const harness of harnesses)
84
+ if (!FLOW_HARNESSES.includes(harness))
85
+ return invalid(`permissions.harnesses: unknown harness ${harness}.`);
86
+ let budget;
87
+ if (value.budget !== undefined) {
88
+ if (!object(value.budget) || Object.keys(value.budget).some(k => !['dollars', 'wallclock'].includes(k)))
89
+ return invalid('permissions.budget expects dollars and/or wallclock.');
90
+ if (value.budget.dollars !== undefined && (typeof value.budget.dollars !== 'number' || !(value.budget.dollars > 0) || !Number.isFinite(value.budget.dollars)))
91
+ return invalid('permissions.budget.dollars must be a positive number.');
92
+ if (value.budget.wallclock !== undefined && (typeof value.budget.wallclock !== 'string' || !WALLCLOCK.test(value.budget.wallclock)))
93
+ return invalid('permissions.budget.wallclock must be a duration such as 45m.');
94
+ budget = Object.freeze({ ...(value.budget.dollars === undefined ? {} : { dollars: value.budget.dollars }), ...(value.budget.wallclock === undefined ? {} : { wallclock: value.budget.wallclock }) });
95
+ }
96
+ return Object.freeze({
97
+ integrations: stringList(value.integrations, 'permissions.integrations', PROVIDER),
98
+ harnesses,
99
+ mcp: stringList(value.mcp, 'permissions.mcp', /^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/),
100
+ writes: stringList(value.writes, 'permissions.writes', WRITE_CLASS),
101
+ ...(budget === undefined ? {} : { budget }),
102
+ });
103
+ }
104
+ function source(value) {
105
+ if (!object(value) || Object.keys(value).some(k => !['host', 'owner', 'repo', 'sha', 'path'].includes(k))
106
+ || value.host !== 'github' || typeof value.owner !== 'string' || typeof value.repo !== 'string'
107
+ || (value.path !== undefined && typeof value.path !== 'string')
108
+ || (value.sha !== undefined && (typeof value.sha !== 'string' || !SHA.test(value.sha)))) {
109
+ return invalid('source expects { host: "github", owner, repo, path, sha? }.');
110
+ }
111
+ const path = value.path ?? '';
112
+ const parsed = parsePluginSource(`github:${value.owner}/${value.repo}@${value.sha ?? 'HEAD'}${path === '' ? '' : `#${path}`}`);
113
+ return Object.freeze({ ...parsed, ...(value.sha === undefined ? {} : { sha: value.sha }) });
114
+ }
115
+ export function validateFlowExtensionManifest(input) {
116
+ let v;
117
+ try {
118
+ v = snapshotJsonValue(input, 'plugin manifest');
119
+ }
120
+ catch {
121
+ return invalid('Plugin manifest must be JSON data.');
122
+ }
123
+ if (!object(v))
124
+ return invalid('Expected a plugin manifest object.');
125
+ if (pluginKindOf(v) !== 'flow-extension')
126
+ throw new PluginError('plugin_kind_invalid', 'Expected kind "flow-extension".');
127
+ if (v.schema !== 2)
128
+ return invalid('A flow-extension manifest is schema 2.');
129
+ const unknown = Object.keys(v).filter(k => !TOP_LEVEL.has(k));
130
+ if (unknown.length > 0)
131
+ return invalid(`Unknown manifest fields: ${unknown.join(', ')}.`);
132
+ if (!Object.hasOwn(v, 'preflight'))
133
+ throw new PluginError('plugin_preflight_missing', 'Plugin must declare preflight.');
134
+ if (typeof v.name !== 'string' || !NAME.test(v.name) || v.name.startsWith('helper-'))
135
+ return invalid('name must be lowercase kebab-case and must not start with helper-.');
136
+ if (typeof v.version !== 'string' || parseVersion(v.version) === undefined)
137
+ return invalid('version must be semver x.y.z.');
138
+ if (v.description !== undefined && (typeof v.description !== 'string' || v.description.length > MAX_DESCRIPTION))
139
+ return invalid(`description must be a string of at most ${MAX_DESCRIPTION} characters.`);
140
+ if (typeof v.entry !== 'string' || !v.entry.endsWith('.flow.ts') || !safePath(v.entry))
141
+ return invalid('entry must be a plugin-relative .flow.ts path.');
142
+ if (!object(v.extends) || Object.keys(v.extends).some(k => !['handlers', 'hooks', 'verbs', 'gates'].includes(k)) || typeof v.extends.handlers !== 'boolean')
143
+ return invalid('extends expects { handlers: boolean, hooks: [] }.');
144
+ const hooks = stringList(v.extends.hooks ?? [], 'extends.hooks', NAME);
145
+ for (const [field, at] of [['verbs', v.extends.verbs], ['gates', v.extends.gates], ['verbs', v.verbs], ['gates', v.gates]]) {
146
+ if (at !== undefined && (!Array.isArray(at) || at.length > 0))
147
+ return invalid(`A flow extension declares no ${field}; ship a helper plugin beside it.`);
148
+ }
149
+ if (!v.extends.handlers && hooks.length === 0)
150
+ return invalid('A flow extension must contribute handlers or at least one hook.');
151
+ if (!object(v.preflight) || Object.keys(v.preflight).some(k => !['credentials', 'servers'].includes(k)))
152
+ return invalid('Preflight requires credentials and servers arrays.');
153
+ const credentials = stringList(v.preflight.credentials, 'preflight.credentials', IDENTIFIER);
154
+ const servers = stringList(v.preflight.servers, 'preflight.servers', /^https?:\/\/\S+$/);
155
+ for (const server of servers) {
156
+ try {
157
+ if (!['http:', 'https:'].includes(new URL(server).protocol))
158
+ return invalid('Servers must be HTTP(S) URLs.');
159
+ }
160
+ catch {
161
+ return invalid('Servers must be HTTP(S) URLs.');
162
+ }
163
+ }
164
+ let config;
165
+ if (v.config !== undefined) {
166
+ if (!object(v.config))
167
+ return invalid('config must be a JSON Schema object.');
168
+ try {
169
+ new Ajv({ strict: false }).compile(v.config);
170
+ }
171
+ catch {
172
+ return invalid('config is not a valid JSON Schema.');
173
+ }
174
+ config = v.config;
175
+ }
176
+ return Object.freeze({
177
+ schema: 2, kind: 'flow-extension', name: v.name, version: v.version,
178
+ ...(v.description === undefined ? {} : { description: v.description }),
179
+ ...(v.source === undefined ? {} : { source: source(v.source) }),
180
+ compat: compat(v.compat), entry: v.entry,
181
+ extends: Object.freeze({ handlers: v.extends.handlers, hooks }),
182
+ triggers: triggers(v.triggers ?? []),
183
+ permissions: permissions(v.permissions),
184
+ preflight: Object.freeze({ credentials, servers }),
185
+ ...(config === undefined ? {} : { config }),
186
+ });
187
+ }
188
+ //# sourceMappingURL=flow-extension-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-extension-manifest.js","sourceRoot":"","sources":["../src/flow-extension-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { LoadedAuthoredFlow } from './authored-flow-loader.js';
2
+ import type { FlowExtensionManifest } from './flow-extension-manifest.js';
3
+ import { type FetchLike } from './plugin-github.js';
4
+ export declare const MAX_EXTENSIONS_BYTES = 2000000;
5
+ export interface FlowExtensionFileSubmission {
6
+ readonly path: string;
7
+ readonly sha256: string;
8
+ readonly bytes: number;
9
+ readonly encoding: 'utf8' | 'base64';
10
+ readonly content: string;
11
+ }
12
+ export interface FlowExtensionSubmission {
13
+ readonly name: string;
14
+ readonly version: string;
15
+ readonly ref: string;
16
+ readonly digest: string;
17
+ readonly manifestSha256: string;
18
+ readonly manifest: FlowExtensionManifest;
19
+ readonly files: readonly FlowExtensionFileSubmission[];
20
+ }
21
+ /** Resolve a GitHub plugin reference without writing the working tree. */
22
+ export declare function resolveExtensionSubmission(input: string, options?: {
23
+ fetch?: FetchLike;
24
+ versions?: {
25
+ sdk: string;
26
+ surface: string;
27
+ };
28
+ }): Promise<FlowExtensionSubmission>;
29
+ /**
30
+ * Installed extensions plus optional send-only `--plugin` refs. Caps the
31
+ * extensions field at 2 MB separately from the 256 KB source cap.
32
+ */
33
+ export declare function collectExtensionSubmissions(loaded: LoadedAuthoredFlow, extraRefs?: readonly string[], options?: {
34
+ fetch?: FetchLike;
35
+ }): Promise<readonly FlowExtensionSubmission[]>;
36
+ /** Graph nodes besides the root must be the composed extensions, not `use:` children. */
37
+ export declare function assertNoUseDependencies(loaded: LoadedAuthoredFlow): void;
38
+ //# sourceMappingURL=flow-extension-submit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-extension-submit.d.ts","sourceRoot":"","sources":["../src/flow-extension-submit.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAA+D,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAKjH,eAAO,MAAM,oBAAoB,UAAyB,CAAC;AAE3D,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,2BAA2B,EAAE,CAAC;CACxD;AA0BD,0EAA0E;AAC1E,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAO,GAC/E,OAAO,CAAC,uBAAuB,CAAC,CAgBlC;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,kBAAkB,EAC1B,SAAS,GAAE,SAAS,MAAM,EAAO,EACjC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,SAAS,CAAA;CAAO,GAClC,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAuB7C;AAED,yFAAyF;AACzF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAKxE"}