@relayflows/sdk 2.0.44 → 2.0.46

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 (111) hide show
  1. package/dist/authored-flow-error.d.ts +1 -1
  2. package/dist/authored-flow-error.d.ts.map +1 -1
  3. package/dist/authored-flow-error.js.map +1 -1
  4. package/dist/authored-helper-effect.d.ts.map +1 -1
  5. package/dist/authored-helper-effect.js +9 -0
  6. package/dist/authored-helper-effect.js.map +1 -1
  7. package/dist/authored-root.d.ts.map +1 -1
  8. package/dist/authored-root.js +17 -0
  9. package/dist/authored-root.js.map +1 -1
  10. package/dist/cli/direct-run.d.ts.map +1 -1
  11. package/dist/cli/direct-run.js +7 -0
  12. package/dist/cli/direct-run.js.map +1 -1
  13. package/dist/cli/run.d.ts.map +1 -1
  14. package/dist/cli/run.js +31 -2
  15. package/dist/cli/run.js.map +1 -1
  16. package/dist/cloud-mirror-step.d.ts.map +1 -1
  17. package/dist/cloud-mirror-step.js +6 -1
  18. package/dist/cloud-mirror-step.js.map +1 -1
  19. package/dist/compile.d.ts +1 -0
  20. package/dist/compile.d.ts.map +1 -1
  21. package/dist/compile.js +2 -1
  22. package/dist/compile.js.map +1 -1
  23. package/dist/failure-kinds.d.ts +1 -1
  24. package/dist/failure-kinds.d.ts.map +1 -1
  25. package/dist/failure-kinds.js +1 -0
  26. package/dist/failure-kinds.js.map +1 -1
  27. package/dist/flow-tool-adapters.d.ts +56 -0
  28. package/dist/flow-tool-adapters.d.ts.map +1 -0
  29. package/dist/flow-tool-adapters.js +42 -0
  30. package/dist/flow-tool-adapters.js.map +1 -0
  31. package/dist/flow-tool-client.d.ts +38 -0
  32. package/dist/flow-tool-client.d.ts.map +1 -0
  33. package/dist/flow-tool-client.js +105 -0
  34. package/dist/flow-tool-client.js.map +1 -0
  35. package/dist/flow-tool-contract.d.ts +103 -0
  36. package/dist/flow-tool-contract.d.ts.map +1 -0
  37. package/dist/flow-tool-contract.js +75 -0
  38. package/dist/flow-tool-contract.js.map +1 -0
  39. package/dist/flow-tool-definitions.d.ts +19 -0
  40. package/dist/flow-tool-definitions.d.ts.map +1 -0
  41. package/dist/flow-tool-definitions.js +12 -0
  42. package/dist/flow-tool-definitions.js.map +1 -0
  43. package/dist/flow-tool-http.d.ts +14 -0
  44. package/dist/flow-tool-http.d.ts.map +1 -0
  45. package/dist/flow-tool-http.js +175 -0
  46. package/dist/flow-tool-http.js.map +1 -0
  47. package/dist/flow-tool-kernel.d.ts +27 -0
  48. package/dist/flow-tool-kernel.d.ts.map +1 -0
  49. package/dist/flow-tool-kernel.js +310 -0
  50. package/dist/flow-tool-kernel.js.map +1 -0
  51. package/dist/flow-tool-manifest.d.ts +30 -0
  52. package/dist/flow-tool-manifest.d.ts.map +1 -0
  53. package/dist/flow-tool-manifest.js +79 -0
  54. package/dist/flow-tool-manifest.js.map +1 -0
  55. package/dist/flow-tool-schema.d.ts +15 -0
  56. package/dist/flow-tool-schema.d.ts.map +1 -0
  57. package/dist/flow-tool-schema.js +70 -0
  58. package/dist/flow-tool-schema.js.map +1 -0
  59. package/dist/flow-tool-wire.d.ts +26 -0
  60. package/dist/flow-tool-wire.d.ts.map +1 -0
  61. package/dist/flow-tool-wire.js +195 -0
  62. package/dist/flow-tool-wire.js.map +1 -0
  63. package/dist/helper-park.d.ts +14 -0
  64. package/dist/helper-park.d.ts.map +1 -0
  65. package/dist/helper-park.js +40 -0
  66. package/dist/helper-park.js.map +1 -0
  67. package/dist/helper-receipt.d.ts +11 -0
  68. package/dist/helper-receipt.d.ts.map +1 -0
  69. package/dist/helper-receipt.js +100 -0
  70. package/dist/helper-receipt.js.map +1 -0
  71. package/dist/helper-writeback.d.ts.map +1 -1
  72. package/dist/helper-writeback.js +7 -2
  73. package/dist/helper-writeback.js.map +1 -1
  74. package/dist/index.d.ts +9 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +9 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/journal-client.d.ts +7 -0
  79. package/dist/journal-client.d.ts.map +1 -1
  80. package/dist/journal-client.js +22 -1
  81. package/dist/journal-client.js.map +1 -1
  82. package/dist/protocol.d.ts +7 -0
  83. package/dist/protocol.d.ts.map +1 -1
  84. package/dist/yaml-helper-effect.d.ts.map +1 -1
  85. package/dist/yaml-helper-effect.js +32 -23
  86. package/dist/yaml-helper-effect.js.map +1 -1
  87. package/package.json +2 -2
  88. package/src/authored-flow-error.ts +1 -0
  89. package/src/authored-helper-effect.ts +9 -0
  90. package/src/authored-root.ts +17 -0
  91. package/src/cli/direct-run.ts +7 -0
  92. package/src/cli/run.ts +30 -2
  93. package/src/cloud-mirror-step.ts +6 -1
  94. package/src/compile.ts +2 -1
  95. package/src/failure-kinds.ts +1 -0
  96. package/src/flow-tool-adapters.ts +43 -0
  97. package/src/flow-tool-client.ts +115 -0
  98. package/src/flow-tool-contract.ts +153 -0
  99. package/src/flow-tool-definitions.ts +27 -0
  100. package/src/flow-tool-http.ts +134 -0
  101. package/src/flow-tool-kernel.ts +319 -0
  102. package/src/flow-tool-manifest.ts +104 -0
  103. package/src/flow-tool-schema.ts +66 -0
  104. package/src/flow-tool-wire.ts +152 -0
  105. package/src/helper-park.ts +45 -0
  106. package/src/helper-receipt.ts +90 -0
  107. package/src/helper-writeback.ts +8 -3
  108. package/src/index.ts +21 -0
  109. package/src/journal-client.ts +21 -1
  110. package/src/protocol.ts +7 -0
  111. package/src/yaml-helper-effect.ts +12 -5
@@ -0,0 +1,175 @@
1
+ import { canonicalize } from './canonical.js';
2
+ import { cloudConnection } from './cloud-http.js';
3
+ import { FlowToolError } from './flow-tool-contract.js';
4
+ import { flowToolOperationKey } from './flow-tool-client.js';
5
+ import { FLOW_TOOL_ENVELOPE_LIMITS } from './flow-tool-wire.js';
6
+ function pathIsSafe(path) {
7
+ return /^\/api\/v1\/flow-tools(?:\/[A-Za-z_][A-Za-z0-9_-]{0,63}\/invoke)?$/.test(path)
8
+ || /^\/api\/v1\/flow-runs\/[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}(?:\/(?:events|evidence|cancel|resume)|\/human\/[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}\/answer)?$/.test(path);
9
+ }
10
+ async function* chunks(response, maximumBytes) {
11
+ if (!response.body)
12
+ throw new FlowToolError('invalid_contract');
13
+ const reader = response.body.getReader(), decoder = new TextDecoder('utf-8', { fatal: true });
14
+ let size = 0;
15
+ try {
16
+ while (true) {
17
+ const chunk = await reader.read();
18
+ if (chunk.done)
19
+ break;
20
+ size += chunk.value.byteLength;
21
+ if (size > maximumBytes)
22
+ throw new FlowToolError('invalid_contract');
23
+ yield decoder.decode(chunk.value, { stream: true });
24
+ }
25
+ yield decoder.decode();
26
+ }
27
+ finally {
28
+ await reader.cancel().catch(() => { });
29
+ reader.releaseLock();
30
+ }
31
+ }
32
+ function refuse(status) {
33
+ const code = status === 400 || status === 422 ? 'invalid_contract' : status === 401 || status === 403 ? 'not_authorized' : status === 404 ? 'not_found'
34
+ : status === 409 ? 'idempotency_conflict' : status === 501 ? 'unsupported' : 'unavailable';
35
+ throw new FlowToolError(code);
36
+ }
37
+ function safeError(error) {
38
+ if (error instanceof FlowToolError)
39
+ throw error;
40
+ throw new FlowToolError('transport_error');
41
+ }
42
+ /** No automatic retry; the owner can repeat the same operation key after an ambiguous failure. */
43
+ export function createFlowToolHttpTransport(options) {
44
+ // Reuse existing HTTPS/token validation, but never fall back to its ambient login store.
45
+ if (typeof options.apiUrl !== 'string' || typeof options.token !== 'string')
46
+ throw new FlowToolError('invalid_contract');
47
+ let connection;
48
+ try {
49
+ connection = cloudConnection({ apiUrl: options.apiUrl, token: options.token });
50
+ }
51
+ catch {
52
+ throw new FlowToolError('not_authorized');
53
+ }
54
+ const timeout = options.requestTimeoutMs ?? 30_000;
55
+ if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 120_000)
56
+ throw new FlowToolError('invalid_contract');
57
+ const fetcher = options.fetch ?? globalThis.fetch;
58
+ async function response(path, init, accept) {
59
+ if (!pathIsSafe(path))
60
+ throw new FlowToolError('invalid_contract');
61
+ const signal = AbortSignal.any([AbortSignal.timeout(timeout), ...(options.signal ? [options.signal] : [])]);
62
+ const result = await fetcher(`${connection.baseUrl}${path}`, {
63
+ ...init, redirect: 'error', signal,
64
+ headers: { ...init.headers, Authorization: `Bearer ${connection.token}`, Accept: accept },
65
+ });
66
+ if (!result.ok) {
67
+ await result.body?.cancel();
68
+ refuse(result.status);
69
+ }
70
+ if (result.headers.get('content-type')?.toLowerCase().split(';')[0]?.trim() !== accept) {
71
+ await result.body?.cancel();
72
+ throw new FlowToolError('invalid_contract');
73
+ }
74
+ return result;
75
+ }
76
+ return {
77
+ async request(request) {
78
+ try {
79
+ if (request.idempotencyKey !== undefined)
80
+ flowToolOperationKey(request.idempotencyKey);
81
+ if (request.method === 'POST' && request.idempotencyKey === undefined)
82
+ throw new FlowToolError('invalid_contract');
83
+ const result = await response(request.path, {
84
+ method: request.method,
85
+ headers: { ...(request.idempotencyKey === undefined ? {} : { 'Idempotency-Key': request.idempotencyKey }), 'Content-Type': 'application/json' },
86
+ ...(request.body === undefined ? {} : { body: canonicalize(request.body) }),
87
+ }, 'application/json');
88
+ let body = '';
89
+ for await (const chunk of chunks(result, FLOW_TOOL_ENVELOPE_LIMITS.maxBytes))
90
+ body += chunk;
91
+ try {
92
+ return JSON.parse(body);
93
+ }
94
+ catch {
95
+ throw new FlowToolError('invalid_contract');
96
+ }
97
+ }
98
+ catch (error) {
99
+ return safeError(error);
100
+ }
101
+ },
102
+ async *events(path, after) {
103
+ try {
104
+ if (!path.endsWith('/events') || !Number.isSafeInteger(after) || after < 0)
105
+ throw new FlowToolError('invalid_contract');
106
+ const result = await response(path, { method: 'GET', headers: { 'Last-Event-ID': String(after) } }, 'text/event-stream');
107
+ let buffer = '', frame = [], frameSize = 0;
108
+ // Each bounded subscription may reconnect with its last validated cursor.
109
+ for await (const chunk of chunks(result, 4 * 1024 * 1024)) {
110
+ buffer += chunk;
111
+ let newline;
112
+ while ((newline = buffer.indexOf('\n')) >= 0) {
113
+ const line = buffer.slice(0, newline).replace(/\r$/, '');
114
+ buffer = buffer.slice(newline + 1);
115
+ frameSize += line.length;
116
+ if (frameSize > 65536)
117
+ throw new FlowToolError('invalid_contract');
118
+ if (line === '') {
119
+ const event = parseFrame(frame);
120
+ frame = [];
121
+ frameSize = 0;
122
+ if (event !== undefined)
123
+ yield event;
124
+ }
125
+ else
126
+ frame.push(line);
127
+ }
128
+ if (buffer.length > 65536)
129
+ throw new FlowToolError('invalid_contract');
130
+ }
131
+ if (buffer.length || frame.some(line => !line.startsWith(':')))
132
+ throw new FlowToolError('invalid_contract');
133
+ }
134
+ catch (error) {
135
+ safeError(error);
136
+ }
137
+ },
138
+ };
139
+ }
140
+ function parseFrame(lines) {
141
+ const data = [];
142
+ let id, name;
143
+ for (const line of lines) {
144
+ if (line.startsWith(':'))
145
+ continue;
146
+ const separator = line.indexOf(':');
147
+ const field = separator < 0 ? line : line.slice(0, separator);
148
+ const value = separator < 0 ? '' : line.slice(separator + 1).replace(/^ /, '');
149
+ if (field === 'data')
150
+ data.push(value);
151
+ else if (field === 'id' && id === undefined)
152
+ id = value;
153
+ else if (field === 'event' && name === undefined)
154
+ name = value;
155
+ else
156
+ throw new FlowToolError('invalid_contract');
157
+ }
158
+ if (data.length === 0 && id === undefined && name === undefined)
159
+ return undefined;
160
+ if (id === undefined || !/^[1-9][0-9]*$/.test(id) || !Number.isSafeInteger(Number(id)))
161
+ throw new FlowToolError('invalid_contract');
162
+ let parsed;
163
+ try {
164
+ parsed = JSON.parse(data.join('\n'));
165
+ }
166
+ catch {
167
+ throw new FlowToolError('invalid_contract');
168
+ }
169
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)
170
+ || parsed.sequence !== Number(id)
171
+ || parsed.type !== name)
172
+ throw new FlowToolError('invalid_contract');
173
+ return parsed;
174
+ }
175
+ //# sourceMappingURL=flow-tool-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-tool-http.js","sourceRoot":"","sources":["../src/flow-tool-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAgD,MAAM,uBAAuB,CAAC;AAC3G,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAahE,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,oEAAoE,CAAC,IAAI,CAAC,IAAI,CAAC;WACjF,sJAAsJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzK,CAAC;AACD,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC,QAAkB,EAAE,YAAoB;IAC7D,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9F,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI;gBAAE,MAAM;YACtB,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;YAC/B,IAAI,IAAI,GAAG,YAAY;gBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;YACrE,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC;YAAS,CAAC;QAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAAC,CAAC;AAC5E,CAAC;AACD,SAAS,MAAM,CAAC,MAAc;IAC5B,MAAM,IAAI,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW;QACrJ,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;IAC7F,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AACD,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,YAAY,aAAa;QAAE,MAAM,KAAK,CAAC;IAChD,MAAM,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAC7C,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,2BAA2B,CAAC,OAA4B;IACtE,yFAAyF;IACzF,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACzH,IAAI,UAA8C,CAAC;IACnD,IAAI,CAAC;QAAC,UAAU,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAAC,CAAC;IACvF,MAAM,CAAC;QAAC,MAAM,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAAC,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,IAAI,MAAM,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,OAAO;QAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACpH,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAClD,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAiB,EAAE,MAAc;QACrE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5G,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAC3D,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM;YAClC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;SAC1F,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YAAC,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QACvE,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;YACvF,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,OAAwB;YACpC,IAAI,CAAC;gBACH,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;oBAAE,oBAAoB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBACvF,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;oBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;gBACnH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE;oBAC1C,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,OAAO,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/I,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC5E,EAAE,kBAAkB,CAAC,CAAC;gBACvB,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC;oBAAE,IAAI,IAAI,KAAK,CAAC;gBAC5F,IAAI,CAAC;oBAAC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;gBAAC,CAAC;YACzF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;QAC9C,CAAC;QACD,KAAK,CAAC,CAAC,MAAM,CAAC,IAAY,EAAE,KAAa;YACvC,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;oBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;gBACxH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC;gBACzH,IAAI,MAAM,GAAG,EAAE,EAAE,KAAK,GAAa,EAAE,EAAE,SAAS,GAAG,CAAC,CAAC;gBACrD,0EAA0E;gBAC1E,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;oBAC1D,MAAM,IAAI,KAAK,CAAC;oBAChB,IAAI,OAAe,CAAC;oBACpB,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBACzD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;wBACnC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;wBACzB,IAAI,SAAS,GAAG,KAAK;4BAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;wBACnE,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;4BAChB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;4BAChC,KAAK,GAAG,EAAE,CAAC;4BAAC,SAAS,GAAG,CAAC,CAAC;4BAC1B,IAAI,KAAK,KAAK,SAAS;gCAAE,MAAM,KAAK,CAAC;wBACvC,CAAC;;4BAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC1B,CAAC;oBACD,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK;wBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;gBACzE,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;oBAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;YAC9G,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;QACvC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAe;IACjC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,EAAsB,EAAE,IAAwB,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/E,IAAI,KAAK,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAClC,IAAI,KAAK,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS;YAAE,EAAE,GAAG,KAAK,CAAC;aACnD,IAAI,KAAK,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,GAAG,KAAK,CAAC;;YAC1D,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClF,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACpI,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAAC,CAAC;IACpG,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;WACpE,MAAkC,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC;WAC1D,MAAkC,CAAC,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACpG,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type FlowToolCatalogEntryV1 } from './flow-tool-contract.js';
2
+ import type { FlowToolTransport } from './flow-tool-client.js';
3
+ import { JournalClient } from './journal-client.js';
4
+ /** The only executable accepted by the v1 embedded runtime. It receives JSON as argv data. */
5
+ export declare const FLOW_TOOL_INPUT_PLACEHOLDER = "__RELAYFLOWS_FLOW_TOOL_INPUT_V1__";
6
+ export interface KernelFlowToolDeployment {
7
+ readonly entry: FlowToolCatalogEntryV1;
8
+ /** A bundle whose content digest is entry.manifest.flow.digest. */
9
+ readonly bundlePath: string;
10
+ /** Operator-owned outcome label, never selected by invocation input. */
11
+ readonly businessVerdict: string;
12
+ }
13
+ export interface KernelFlowToolControlPlaneOptions {
14
+ readonly journal: JournalClient;
15
+ /** Authenticated server-side identity. This value is hashed before journaling. */
16
+ readonly principal: string;
17
+ readonly deployments: readonly KernelFlowToolDeployment[];
18
+ /** Server-side grants for this principal. Omission grants nothing. */
19
+ readonly authorizedDeploymentIds?: readonly string[];
20
+ }
21
+ /**
22
+ * Build an authenticated embedded control plane over relayflowd's durable journal.
23
+ * This intentionally supports only the effect-free JSON echo/conformance program;
24
+ * arbitrary declarative, authored, LLM, and agent flows remain unsupported.
25
+ */
26
+ export declare function createKernelFlowToolControlPlane(options: KernelFlowToolControlPlaneOptions): Promise<FlowToolTransport>;
27
+ //# sourceMappingURL=flow-tool-kernel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-tool-kernel.d.ts","sourceRoot":"","sources":["../src/flow-tool-kernel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,KAAK,sBAAsB,EACuB,MAAM,yBAAyB,CAAC;AAC1G,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAwB,MAAM,qBAAqB,CAAC;AAM1E,8FAA8F;AAC9F,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAI/E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,kFAAkF;IAClF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC1D,sEAAsE;IACtE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtD;AAkJD;;;;GAIG;AACH,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAmI5B"}
@@ -0,0 +1,310 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { canonicalize } from './canonical.js';
4
+ import { sha256, verifyBundle } from './bundle.js';
5
+ import { FlowToolError } from './flow-tool-contract.js';
6
+ import { flowToolOperationKey } from './flow-tool-client.js';
7
+ import { JournalProtocolError } from './journal-client.js';
8
+ import { parseFlowToolEntry, parseFlowToolInvocation, flowToolRunLinks, toolId } from './flow-tool-wire.js';
9
+ import { validateFlowToolResult } from './flow-tool-manifest.js';
10
+ /** The only executable accepted by the v1 embedded runtime. It receives JSON as argv data. */
11
+ export const FLOW_TOOL_INPUT_PLACEHOLDER = '__RELAYFLOWS_FLOW_TOOL_INPUT_V1__';
12
+ const RESULT_STEP = 'flow-tool-result';
13
+ const MAX_RESULT_BYTES = 60 * 1024; // below relayflowd's 64 KiB stdout tail
14
+ function record(value) {
15
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
16
+ }
17
+ function runtimeFailure(code = 'unsupported') {
18
+ throw new FlowToolError(code);
19
+ }
20
+ function exactKeys(value, allowed) {
21
+ return Object.keys(value).every(key => allowed.includes(key));
22
+ }
23
+ function preflightTemplate(value, entry) {
24
+ if (!record(value) || !exactKeys(value, ['version', 'name', 'description', 'steps'])
25
+ || typeof value['version'] !== 'string' || value['name'] !== entry.manifest.flow.name
26
+ || !Array.isArray(value['steps']) || value['steps'].length !== 1)
27
+ runtimeFailure();
28
+ const step = value['steps'][0];
29
+ if (!record(step) || !exactKeys(step, [
30
+ 'id', 'type', 'command', 'depends_on', 'max_iterations', 'retry', 'verification', 'timeout_ms',
31
+ ]) || step['id'] !== RESULT_STEP || step['type'] !== 'deterministic'
32
+ || !Array.isArray(step['command']) || step['command'].length !== 3
33
+ || !['/usr/bin/printf', '/bin/printf'].includes(step['command'][0])
34
+ || step['command'][1] !== '%s' || step['command'][2] !== FLOW_TOOL_INPUT_PLACEHOLDER
35
+ || !Array.isArray(step['depends_on']) || step['depends_on'].length !== 0
36
+ || step['max_iterations'] !== 1 || !record(step['retry']) || !record(step['verification'])
37
+ || Object.keys(step['verification']).length !== 0
38
+ || !Number.isSafeInteger(step['timeout_ms']) || step['timeout_ms'] < 1
39
+ || step['timeout_ms'] > entry.budget.max_wallclock_ms)
40
+ runtimeFailure();
41
+ const retry = step['retry'];
42
+ if (!exactKeys(retry, ['initial_backoff_ms', 'max_backoff_ms', 'multiplier', 'jitter_percent'])
43
+ || retry['initial_backoff_ms'] !== 0 || retry['max_backoff_ms'] !== 0
44
+ || retry['multiplier'] !== 1 || retry['jitter_percent'] !== 0)
45
+ runtimeFailure();
46
+ return value;
47
+ }
48
+ async function loadDeployment(deployment) {
49
+ let entry;
50
+ try {
51
+ entry = parseFlowToolEntry(deployment.entry);
52
+ }
53
+ catch {
54
+ runtimeFailure('invalid_contract');
55
+ }
56
+ if (entry.effects.length !== 0 || entry.requires_human.length !== 0
57
+ || !entry.business_verdicts.includes(deployment.businessVerdict))
58
+ runtimeFailure();
59
+ // This runtime prints the invocation input and nothing else. A result schema
60
+ // that is not that same document would journal success and then have to
61
+ // invent a different public reason. Refuse the deployment instead.
62
+ if (canonicalize(entry.manifest.inputSchema) !== canonicalize(entry.manifest.resultSchema)) {
63
+ runtimeFailure('unsupported');
64
+ }
65
+ const expected = entry.manifest.flow.digest.slice('sha256:'.length);
66
+ try {
67
+ const before = await readFile(join(deployment.bundlePath, 'spec.canonical.json'));
68
+ const preflightBefore = await readFile(join(deployment.bundlePath, 'preflight.json'));
69
+ await verifyBundle(deployment.bundlePath, expected);
70
+ const after = await readFile(join(deployment.bundlePath, 'spec.canonical.json'));
71
+ const preflightAfter = await readFile(join(deployment.bundlePath, 'preflight.json'));
72
+ if (!before.equals(after) || !preflightBefore.equals(preflightAfter))
73
+ runtimeFailure();
74
+ const report = JSON.parse(preflightAfter.toString('utf8'));
75
+ if (!record(report) || report['ok'] !== true)
76
+ runtimeFailure();
77
+ return { entry, template: preflightTemplate(JSON.parse(after.toString('utf8')), entry),
78
+ businessVerdict: deployment.businessVerdict };
79
+ }
80
+ catch (error) {
81
+ if (error instanceof FlowToolError)
82
+ throw error;
83
+ runtimeFailure();
84
+ }
85
+ }
86
+ function bindingDescription(binding) { return canonicalize(binding); }
87
+ function parseBinding(entries) {
88
+ const spawned = entries.find(entry => entry.entry_type === 'run.spawned');
89
+ const spec = spawned?.payload['spec'];
90
+ const description = record(spec) ? spec['description'] : undefined;
91
+ try {
92
+ const value = JSON.parse(typeof description === 'string' ? description : 'null');
93
+ if (!record(value) || value['kind'] !== 'relayflows.flow-tool-run.v1'
94
+ || typeof value['deployment_id'] !== 'string' || typeof value['manifest_digest'] !== 'string'
95
+ || typeof value['flow_digest'] !== 'string' || typeof value['input_digest'] !== 'string'
96
+ || typeof value['principal_digest'] !== 'string'
97
+ || !/^sha256:[a-f0-9]{64}$/.test(value['manifest_digest'])
98
+ || !/^sha256:[a-f0-9]{64}$/.test(value['flow_digest'])
99
+ || !/^sha256:[a-f0-9]{64}$/.test(value['input_digest'])
100
+ || !/^[a-f0-9]{64}$/.test(value['principal_digest']))
101
+ runtimeFailure('invalid_contract');
102
+ return value;
103
+ }
104
+ catch (error) {
105
+ if (error instanceof FlowToolError)
106
+ throw error;
107
+ runtimeFailure('invalid_contract');
108
+ }
109
+ }
110
+ function journalEntries(value) {
111
+ if (!value.every(item => record(item) && Number.isSafeInteger(item['seq'])
112
+ && typeof item['entry_type'] === 'string' && record(item['payload'])))
113
+ runtimeFailure('invalid_contract');
114
+ return value;
115
+ }
116
+ function terminalReason(reason) {
117
+ if (reason === 'success')
118
+ return 'success';
119
+ if (reason === 'canceled')
120
+ return 'canceled';
121
+ if (reason === 'budget_exceeded')
122
+ return 'budget_exceeded';
123
+ return 'execution_failed';
124
+ }
125
+ function runState(status, reason) {
126
+ if (reason === 'success')
127
+ return 'completed';
128
+ if (reason === 'canceled')
129
+ return 'cancelled';
130
+ if (reason !== null)
131
+ return 'failed';
132
+ if (status === 'parked')
133
+ return 'parked';
134
+ return 'running';
135
+ }
136
+ function mapProtocolError(error, admission = false) {
137
+ if (error instanceof JournalProtocolError) {
138
+ if (error.code === 'run_admission_conflict')
139
+ throw new FlowToolError('idempotency_conflict');
140
+ if (error.code === 'run_not_found')
141
+ throw new FlowToolError('not_authorized');
142
+ throw new FlowToolError('unavailable');
143
+ }
144
+ throw new FlowToolError(admission ? 'transport_error' : 'unavailable');
145
+ }
146
+ /**
147
+ * Build an authenticated embedded control plane over relayflowd's durable journal.
148
+ * This intentionally supports only the effect-free JSON echo/conformance program;
149
+ * arbitrary declarative, authored, LLM, and agent flows remain unsupported.
150
+ */
151
+ export async function createKernelFlowToolControlPlane(options) {
152
+ if (typeof options.principal !== 'string' || options.principal.length < 1 || options.principal.length > 1024) {
153
+ runtimeFailure('invalid_contract');
154
+ }
155
+ const principalDigest = sha256(options.principal);
156
+ const grants = new Set(options.authorizedDeploymentIds ?? []);
157
+ const deployments = new Map();
158
+ const names = new Map();
159
+ for (const candidate of options.deployments) {
160
+ const loaded = await loadDeployment(candidate);
161
+ if (deployments.has(loaded.entry.deployment_id) || names.has(loaded.entry.manifest.name))
162
+ runtimeFailure('invalid_contract');
163
+ deployments.set(loaded.entry.deployment_id, loaded);
164
+ names.set(loaded.entry.manifest.name, loaded);
165
+ }
166
+ const authorized = (deployment) => grants.has(deployment.entry.deployment_id);
167
+ async function readAuthorizedRun(runId) {
168
+ toolId(runId);
169
+ let entries;
170
+ try {
171
+ entries = journalEntries((await options.journal.journalRead(runId, 1, 1000)).entries);
172
+ }
173
+ catch (error) {
174
+ mapProtocolError(error);
175
+ }
176
+ const binding = parseBinding(entries);
177
+ const deployment = deployments.get(binding.deployment_id);
178
+ if (deployment === undefined || !authorized(deployment) || binding.principal_digest !== principalDigest
179
+ || binding.manifest_digest !== deployment.entry.manifest.digest
180
+ || binding.flow_digest !== deployment.entry.manifest.flow.digest)
181
+ throw new FlowToolError('not_authorized');
182
+ return { deployment, binding, entries: entries };
183
+ }
184
+ async function projectRun(runId) {
185
+ const { deployment, binding, entries } = await readAuthorizedRun(runId);
186
+ let snapshot;
187
+ try {
188
+ snapshot = await options.journal.runGet(runId);
189
+ }
190
+ catch (error) {
191
+ mapProtocolError(error);
192
+ }
193
+ const completed = entries.find(entry => entry.entry_type === 'step.completed' && entry.step_id === RESULT_STEP);
194
+ const ended = entries.find(entry => entry.entry_type === 'run.completed');
195
+ let reason = ended === undefined ? null : terminalReason(ended.payload['completionReason']);
196
+ if (reason === null && ['failed', 'interrupted'].includes(snapshot.status))
197
+ reason = 'execution_failed';
198
+ let result = null;
199
+ if (reason === 'success') {
200
+ // The journal already recorded success. Do not publish a different
201
+ // terminal reason from a projection-time check the journal never stored.
202
+ const output = completed?.payload['output'];
203
+ if (!record(output) || typeof output['stdout_tail'] !== 'string')
204
+ throw new FlowToolError('unavailable');
205
+ try {
206
+ result = validateFlowToolResult(deployment.entry.manifest, JSON.parse(output['stdout_tail']));
207
+ }
208
+ catch {
209
+ throw new FlowToolError('unavailable');
210
+ }
211
+ }
212
+ const state = runState(snapshot.status, reason);
213
+ const sequence = Math.max(0, ...entries.map(entry => entry.seq));
214
+ const evidence = { journal_digest: `sha256:${sha256(canonicalize(entries))}`,
215
+ flow_digest: deployment.entry.manifest.flow.digest, artifacts: [], redacted_transcript_refs: [] };
216
+ const terminal = reason === null ? null : {
217
+ terminal_reason: reason,
218
+ business_verdict: reason === 'success' ? deployment.businessVerdict : null,
219
+ result: reason === 'success' ? result : null,
220
+ gates: [], evidence,
221
+ spend: { tokens_in: snapshot.budget.tokens_in, tokens_out: snapshot.budget.tokens_out,
222
+ dollars: snapshot.budget.dollars, dollars_unmetered: snapshot.budget.dollars_unmetered === true },
223
+ };
224
+ return { api_version: 1, accepted: true, run_id: runId, tool_name: deployment.entry.manifest.name,
225
+ deployment_id: deployment.entry.deployment_id, manifest_digest: deployment.entry.manifest.digest,
226
+ flow_digest: deployment.entry.manifest.flow.digest, input_digest: binding.input_digest,
227
+ state, sequence, ...flowToolRunLinks(runId), terminal };
228
+ }
229
+ function eventsFor(run, entries, after) {
230
+ const projected = [];
231
+ for (const entry of entries) {
232
+ if (entry.seq <= after)
233
+ continue;
234
+ if (entry.entry_type === 'run.spawned')
235
+ projected.push({ api_version: 1, run_id: run.run_id,
236
+ flow_digest: run.flow_digest, sequence: entry.seq, type: 'run.accepted', state: 'accepted' });
237
+ else if (entry.entry_type === 'step.completed')
238
+ projected.push({ api_version: 1, run_id: run.run_id,
239
+ flow_digest: run.flow_digest, sequence: entry.seq, type: 'step.completed', state: 'running',
240
+ ...(entry.step_id === null || entry.step_id === undefined ? {} : { step_id: entry.step_id }) });
241
+ else if (entry.entry_type === 'run.completed')
242
+ projected.push({ api_version: 1, run_id: run.run_id,
243
+ flow_digest: run.flow_digest, sequence: entry.seq, type: 'run.terminal', state: run.state,
244
+ terminal_reason: run.terminal.terminal_reason });
245
+ }
246
+ return projected;
247
+ }
248
+ return {
249
+ async request(request) {
250
+ if (request.method === 'GET' && request.path === '/api/v1/flow-tools') {
251
+ return { api_version: 1, tools: [...deployments.values()].filter(authorized).map(value => value.entry) };
252
+ }
253
+ const invoke = request.path.match(/^\/api\/v1\/flow-tools\/([^/]+)\/invoke$/);
254
+ if (request.method === 'POST' && invoke !== null) {
255
+ const deployment = names.get(invoke[1]);
256
+ if (deployment === undefined || !authorized(deployment))
257
+ throw new FlowToolError('not_authorized');
258
+ flowToolOperationKey(request.idempotencyKey);
259
+ const body = parseFlowToolInvocation(request.body, deployment.entry);
260
+ const encoded = canonicalize(body.input);
261
+ if (Buffer.byteLength(encoded) > MAX_RESULT_BYTES)
262
+ throw new FlowToolError('unsupported');
263
+ // Catalog bytes and the operator verdict label are not part of the
264
+ // admitted program. Putting them in the spec description changes the
265
+ // kernel spec hash, so a budget or verdict reload conflicts with the
266
+ // same operation key and the original run can no longer be read.
267
+ const binding = { kind: 'relayflows.flow-tool-run.v1', deployment_id: deployment.entry.deployment_id,
268
+ manifest_digest: deployment.entry.manifest.digest, flow_digest: deployment.entry.manifest.flow.digest,
269
+ input_digest: body.input_digest, principal_digest: principalDigest };
270
+ const step = deployment.template.steps[0];
271
+ const spec = { ...deployment.template, description: bindingDescription(binding), steps: [{
272
+ ...step, command: [step.command[0], '%s', encoded],
273
+ }] };
274
+ const admissionKey = `flow-tool:${sha256(canonicalize([principalDigest, deployment.entry.deployment_id,
275
+ deployment.entry.manifest.flow.digest, deployment.entry.manifest.digest, request.idempotencyKey]))}`;
276
+ let started;
277
+ try {
278
+ started = await options.journal.runStart(spec, undefined, admissionKey);
279
+ }
280
+ catch (error) {
281
+ mapProtocolError(error, true);
282
+ }
283
+ return projectRun(started.run_id);
284
+ }
285
+ const runPath = request.path.match(/^\/api\/v1\/flow-runs\/([^/]+)(.*)$/);
286
+ if (runPath === null)
287
+ throw new FlowToolError('not_found');
288
+ const run = await projectRun(runPath[1]);
289
+ if (request.method === 'GET' && runPath[2] === '')
290
+ return run;
291
+ if (request.method === 'GET' && runPath[2] === '/evidence') {
292
+ if (run.terminal === null)
293
+ throw new FlowToolError('unavailable');
294
+ return { api_version: 1, run_id: run.run_id, evidence: run.terminal.evidence };
295
+ }
296
+ // The conformance program cannot park, so commands are deliberately absent.
297
+ throw new FlowToolError('unsupported');
298
+ },
299
+ async *events(path, after) {
300
+ const match = path.match(/^\/api\/v1\/flow-runs\/([^/]+)\/events$/);
301
+ if (match === null || !Number.isSafeInteger(after) || after < 0)
302
+ throw new FlowToolError('invalid_contract');
303
+ const { entries } = await readAuthorizedRun(match[1]);
304
+ const run = await projectRun(match[1]);
305
+ for (const event of eventsFor(run, entries, after))
306
+ yield event;
307
+ },
308
+ };
309
+ }
310
+ //# sourceMappingURL=flow-tool-kernel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-tool-kernel.js","sourceRoot":"","sources":["../src/flow-tool-kernel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { FLOW_TOOL_SCHEMA_DIALECT } from './flow-tool-schema.js';
2
+ import type { FlowToolJson, FlowToolObjectSchema } from './flow-tool-schema.js';
3
+ export type FlowToolDigest = `sha256:${string}`;
4
+ export interface FlowToolDeclarationV1 {
5
+ readonly name: string;
6
+ readonly description: string;
7
+ /** Author-supplied immutable bundle reference; not proof of bundle verification. */
8
+ readonly flow: Readonly<{
9
+ name: string;
10
+ version: string;
11
+ digest: FlowToolDigest;
12
+ }>;
13
+ readonly inputSchema: FlowToolObjectSchema;
14
+ readonly resultSchema: FlowToolObjectSchema;
15
+ }
16
+ export interface FlowToolManifestV1 extends FlowToolDeclarationV1 {
17
+ readonly manifestVersion: 1;
18
+ readonly schemaDialect: typeof FLOW_TOOL_SCHEMA_DIALECT;
19
+ /** SHA-256 of canonical manifest content excluding this field. Not a signature. */
20
+ readonly digest: FlowToolDigest;
21
+ }
22
+ /** Explicit runtime contract; TypeScript generics are never treated as schemas. */
23
+ export declare function createFlowToolManifest(value: FlowToolDeclarationV1): FlowToolManifestV1;
24
+ /** Verify untrusted JSON and optionally bind it to a caller-trusted catalog digest. */
25
+ export declare function parseFlowToolManifest(value: unknown, expectedDigest?: FlowToolDigest): FlowToolManifestV1;
26
+ export declare function canonicalFlowToolManifest(value: FlowToolManifestV1): string;
27
+ export declare function validateFlowToolInput(manifest: FlowToolManifestV1, input: unknown): Readonly<Record<string, FlowToolJson>>;
28
+ /** Validates structure only, not business truth or successful execution. */
29
+ export declare function validateFlowToolResult(manifest: FlowToolManifestV1, result: unknown): Readonly<Record<string, FlowToolJson>>;
30
+ //# sourceMappingURL=flow-tool-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-tool-manifest.d.ts","sourceRoot":"","sources":["../src/flow-tool-manifest.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,wBAAwB,EAAyC,MAAM,uBAAuB,CAAC;AAC1H,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG,UAAU,MAAM,EAAE,CAAC;AAChD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IACnF,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;CAC7C;AACD,MAAM,WAAW,kBAAmB,SAAQ,qBAAqB;IAC/D,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,wBAAwB,CAAC;IACxD,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAwCD,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,kBAAkB,CAIvF;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,kBAAkB,CAYzG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAE3E;AAYD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAE1H;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAE5H"}