@inquir/compute 0.3.0 → 0.4.0

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 (50) hide show
  1. package/README.md +161 -6
  2. package/dist/app-observability.d.ts +69 -0
  3. package/dist/app-observability.d.ts.map +1 -0
  4. package/dist/app-observability.js +65 -0
  5. package/dist/app-observability.js.map +1 -0
  6. package/dist/app-observability.types.d.ts +358 -0
  7. package/dist/app-observability.types.d.ts.map +1 -0
  8. package/dist/app-observability.types.js +2 -0
  9. package/dist/app-observability.types.js.map +1 -0
  10. package/dist/apps.d.ts +73 -1
  11. package/dist/apps.d.ts.map +1 -1
  12. package/dist/apps.js +16 -0
  13. package/dist/apps.js.map +1 -1
  14. package/dist/build-timeout-policy.d.ts +13 -0
  15. package/dist/build-timeout-policy.d.ts.map +1 -0
  16. package/dist/build-timeout-policy.js +11 -0
  17. package/dist/build-timeout-policy.js.map +1 -0
  18. package/dist/index.d.ts +6 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +5 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/invocation-observation.d.ts +23 -0
  23. package/dist/invocation-observation.d.ts.map +1 -0
  24. package/dist/invocation-observation.js +79 -0
  25. package/dist/invocation-observation.js.map +1 -0
  26. package/dist/projects.d.ts +10 -1
  27. package/dist/projects.d.ts.map +1 -1
  28. package/dist/projects.js +13 -1
  29. package/dist/projects.js.map +1 -1
  30. package/dist/release-commands.d.ts +80 -0
  31. package/dist/release-commands.d.ts.map +1 -0
  32. package/dist/release-commands.js +147 -0
  33. package/dist/release-commands.js.map +1 -0
  34. package/dist/source-command-http.d.ts +7 -0
  35. package/dist/source-command-http.d.ts.map +1 -0
  36. package/dist/source-command-http.js +87 -0
  37. package/dist/source-command-http.js.map +1 -0
  38. package/dist/source-command-protocol.d.ts +137 -0
  39. package/dist/source-command-protocol.d.ts.map +1 -0
  40. package/dist/source-command-protocol.js +311 -0
  41. package/dist/source-command-protocol.js.map +1 -0
  42. package/dist/source-commands.d.ts +33 -0
  43. package/dist/source-commands.d.ts.map +1 -0
  44. package/dist/source-commands.js +116 -0
  45. package/dist/source-commands.js.map +1 -0
  46. package/dist/transport.d.ts +27 -2
  47. package/dist/transport.d.ts.map +1 -1
  48. package/dist/transport.js +56 -7
  49. package/dist/transport.js.map +1 -1
  50. package/package.json +10 -10
@@ -0,0 +1,87 @@
1
+ const FINITE_BYTES = 2 * 1024 * 1024, DISCOVERY_BYTES = 4 * 1024 * 1024;
2
+ function dispose(body) {
3
+ try {
4
+ void body?.cancel().catch(() => undefined);
5
+ }
6
+ catch { /* Disposal cannot delay or reject observation. */ }
7
+ }
8
+ function abortable(pending, signal) {
9
+ if (signal.aborted) {
10
+ void pending.catch(() => undefined);
11
+ signal.throwIfAborted();
12
+ }
13
+ return new Promise((resolve, reject) => {
14
+ const abort = () => { signal.removeEventListener('abort', abort); reject(signal.reason); };
15
+ signal.addEventListener('abort', abort, { once: true });
16
+ pending.then(value => { signal.removeEventListener('abort', abort); resolve(value); }, error => { signal.removeEventListener('abort', abort); reject(error); });
17
+ if (signal.aborted)
18
+ abort();
19
+ });
20
+ }
21
+ /** Binds every discovery/action request to a finite whole-body wait. Late replies
22
+ * are disposed without awaiting body cancellation or triggering another action.
23
+ */
24
+ export function boundedSourceCommandFetch(fetchImpl, options = {}) {
25
+ const responseLimitBytes = options.responseLimitBytes;
26
+ if (responseLimitBytes !== undefined && (!Number.isSafeInteger(responseLimitBytes) || responseLimitBytes < 1 || responseLimitBytes > 64 * 1024 * 1024))
27
+ throw new Error('Invalid response byte limit');
28
+ return async (input, init) => {
29
+ const inherited = init?.signal ?? (input instanceof Request ? input.signal : undefined);
30
+ const signal = AbortSignal.any([AbortSignal.timeout(60_000), ...(inherited ? [inherited] : [])]);
31
+ const pending = Promise.resolve().then(() => { signal.throwIfAborted(); return fetchImpl(input, { ...init, signal, redirect: 'error' }); });
32
+ void pending.then(response => { if (signal.aborted)
33
+ dispose(response.body); }, () => undefined);
34
+ const response = await abortable(pending, signal);
35
+ const pathname = new URL(input instanceof Request ? input.url : String(input)).pathname;
36
+ const limit = responseLimitBytes ?? (pathname.includes('/source-commands') ? FINITE_BYTES : DISCOVERY_BYTES);
37
+ const length = response.headers.get('content-length');
38
+ if (length && /^\d+$/.test(length) && Number(length) > limit) {
39
+ dispose(response.body);
40
+ throw new Error('Source command response exceeds byte limit');
41
+ }
42
+ const reader = response.body?.getReader(), chunks = [];
43
+ let bytes = 0, slab, used = 0;
44
+ try {
45
+ if (reader)
46
+ for (;;) {
47
+ const chunk = await abortable(reader.read(), signal);
48
+ if (chunk.done)
49
+ break;
50
+ bytes += chunk.value.byteLength;
51
+ if (bytes > limit)
52
+ throw new Error('Source command response exceeds byte limit');
53
+ let offset = 0;
54
+ while (offset < chunk.value.length) {
55
+ slab ??= Buffer.allocUnsafe(16 * 1024);
56
+ const count = Math.min(slab.length - used, chunk.value.length - offset);
57
+ slab.set(chunk.value.subarray(offset, offset + count), used);
58
+ used += count;
59
+ offset += count;
60
+ if (used === slab.length) {
61
+ chunks.push(slab);
62
+ slab = undefined;
63
+ used = 0;
64
+ }
65
+ }
66
+ }
67
+ signal.throwIfAborted();
68
+ if (slab)
69
+ chunks.push(slab.subarray(0, used));
70
+ const data = Buffer.concat(chunks, bytes);
71
+ // Refuse malformed UTF8 rather than silently changing signed identities.
72
+ new TextDecoder('utf-8', { fatal: true }).decode(data);
73
+ return new Response([204, 205, 304].includes(response.status) ? null : data, { status: response.status, statusText: response.statusText, headers: response.headers });
74
+ }
75
+ catch (error) {
76
+ dispose(reader);
77
+ throw error;
78
+ }
79
+ finally {
80
+ try {
81
+ reader?.releaseLock();
82
+ }
83
+ catch { /* A pending aborted read owns completion. */ }
84
+ }
85
+ };
86
+ }
87
+ //# sourceMappingURL=source-command-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-command-http.js","sourceRoot":"","sources":["../src/source-command-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ export interface SourceCommandScope {
2
+ tenantId: string;
3
+ functionId: string;
4
+ }
5
+ export interface SourceCommandInput {
6
+ command: string;
7
+ timeoutMs?: number;
8
+ env?: Record<string, string>;
9
+ }
10
+ export interface SourceCommandRecord {
11
+ version: 1;
12
+ scope: SourceCommandScope;
13
+ requestId: string;
14
+ input: {
15
+ command: string;
16
+ timeoutMs: number;
17
+ env: Record<string, string>;
18
+ };
19
+ /** Observed server identity. Persist record() after acceptance to retain it across reloads. */
20
+ acceptedManifestDigest?: string;
21
+ }
22
+ export type SourceCommandState = 'PREPARING' | 'CANCEL_REQUESTED' | 'RESERVED' | 'CREATE_INTENT' | 'CREATED' | 'START_INTENT' | 'RUNNING' | 'EXITED' | 'CLEANUP_PENDING' | 'REMOVED';
23
+ export interface SourceWorkspaceOutput {
24
+ baseSnapshotDigest: string;
25
+ snapshotDigest: string;
26
+ sizeBytes: number;
27
+ }
28
+ export interface SourceWorkspaceFailure {
29
+ baseSnapshotDigest: string;
30
+ code: 'UNSAFE_PATH' | 'UNSAFE_LINK' | 'UNSUPPORTED_ENTRY' | 'INVALID_METADATA' | 'TREE_LIMIT_EXCEEDED';
31
+ }
32
+ export interface SourceLogFailure {
33
+ code: 'LOG_LAYOUT_INVALID' | 'LOG_RECORD_INVALID' | 'LOG_RECORD_INCOMPLETE' | 'LOG_LIMIT_EXCEEDED';
34
+ }
35
+ export interface SourceCommandResult {
36
+ attemptId: string;
37
+ manifestDigest: string;
38
+ termination: 'EXITED' | 'TIMEOUT' | 'CANCELLED' | 'HOST_REBOOT';
39
+ exitCode: number | null;
40
+ durationMs: number;
41
+ stdoutBase64: string;
42
+ stderrBase64: string;
43
+ truncated: boolean;
44
+ outputSource: 'nerdctl-json-file';
45
+ workspaceOutput: SourceWorkspaceOutput | null;
46
+ workspaceFailure: SourceWorkspaceFailure | null;
47
+ /** Present only when terminal log capture failed; empty payloads are not captured output. */
48
+ logFailure?: SourceLogFailure;
49
+ }
50
+ export interface SourceCommandPublication {
51
+ id: string;
52
+ captureId: string;
53
+ status: 'APPLIED' | 'CONFLICT';
54
+ revision: string | null;
55
+ outputDigest: string;
56
+ baseSnapshotDigest: string;
57
+ sizeBytes: number;
58
+ }
59
+ export interface SourceCommandPublicationBinding {
60
+ /** The authenticated, scope-bound transport remains authority for these server journal values. */
61
+ tenantId: string;
62
+ functionId: string;
63
+ requestId: string;
64
+ manifestDigest: string;
65
+ baseSnapshotDigest: string;
66
+ }
67
+ export interface SourceCommandOutcome {
68
+ command: {
69
+ requestId: string;
70
+ functionId: string;
71
+ kind: 'EXEC_SOURCE';
72
+ state: SourceCommandState;
73
+ cancelled: boolean;
74
+ };
75
+ result: SourceCommandResult | null;
76
+ publication: SourceCommandPublication | null;
77
+ publicationBinding?: SourceCommandPublicationBinding | null;
78
+ }
79
+ export interface SourceCommandCancellation {
80
+ command: {
81
+ requestId: string;
82
+ functionId: string;
83
+ kind: 'EXEC_SOURCE';
84
+ };
85
+ state: 'CANCEL_REQUESTED' | 'PUBLICATION_COMMITTED';
86
+ publication: SourceCommandPublication | null;
87
+ }
88
+ /** The adapter must bind this scope to product auth/workspace headers, not a mutable current workspace. */
89
+ export type SourceCommandTransport = (scope: SourceCommandScope, path: string, init: RequestInit) => Promise<unknown>;
90
+ export declare class SourceCommandClientError extends Error {
91
+ readonly code: 'INVALID_RECORD' | 'PROTOCOL' | 'CONFLICT' | 'REJECTED' | 'UNCERTAIN' | 'WAIT_ENDED' | 'RETENTION';
92
+ readonly uncertain: boolean;
93
+ constructor(code: 'INVALID_RECORD' | 'PROTOCOL' | 'CONFLICT' | 'REJECTED' | 'UNCERTAIN' | 'WAIT_ENDED' | 'RETENTION', message: string, uncertain: boolean, cause?: unknown);
94
+ }
95
+ /** Execution and publication are separate: a nonzero exit alone does not describe source publication. */
96
+ export declare function sourcePublicationState(value: SourceCommandOutcome): 'APPLIED' | 'CONFLICT' | 'CAPTURE_FAILED' | 'OUTPUT_FAILED' | 'NOT_PUBLISHED';
97
+ export interface SourceCommandOperation {
98
+ record(): SourceCommandRecord;
99
+ /** Retry pending acceptance retention without making an HTTP request. */
100
+ persist(): Promise<void>;
101
+ submit(signal?: AbortSignal): Promise<{
102
+ command: {
103
+ requestId: string;
104
+ functionId: string;
105
+ kind: 'EXEC_SOURCE';
106
+ state: SourceCommandState;
107
+ cancelled: boolean;
108
+ attemptId: string;
109
+ manifestDigest: string;
110
+ };
111
+ }>;
112
+ status(signal?: AbortSignal): Promise<SourceCommandOutcome>;
113
+ reconcile(signal?: AbortSignal): Promise<SourceCommandOutcome>;
114
+ cancel(signal?: AbortSignal): Promise<SourceCommandCancellation>;
115
+ /** GET only. A wait deadline/abort stops observation, never execution or publication. */
116
+ poll(options?: {
117
+ signal?: AbortSignal;
118
+ maxWaitMs?: number;
119
+ intervalMs?: number;
120
+ }): Promise<SourceCommandOutcome>;
121
+ }
122
+ /** Retain must durably store the record (including secrets securely) before any HTTP call. */
123
+ export declare function prepareSourceCommand(options: {
124
+ scope: SourceCommandScope;
125
+ input: SourceCommandInput;
126
+ requestId?: string;
127
+ retain(record: SourceCommandRecord): Promise<void>;
128
+ retainAcceptance?(record: SourceCommandRecord): Promise<void>;
129
+ transport: SourceCommandTransport;
130
+ }): Promise<SourceCommandOperation>;
131
+ /** Restoring an operation never submits it; callers explicitly choose observe/retry/reconcile/cancel. */
132
+ export declare function restoreSourceCommand(value: unknown, options: {
133
+ scope: SourceCommandScope;
134
+ transport: SourceCommandTransport;
135
+ retainAcceptance?(record: SourceCommandRecord): Promise<void>;
136
+ }): SourceCommandOperation;
137
+ //# sourceMappingURL=source-command-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-command-protocol.d.ts","sourceRoot":"","sources":["../src/source-command-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,311 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ export class SourceCommandClientError extends Error {
3
+ code;
4
+ uncertain;
5
+ constructor(code, message, uncertain, cause) {
6
+ super(message, { cause });
7
+ this.code = code;
8
+ this.uncertain = uncertain;
9
+ this.name = 'SourceCommandClientError';
10
+ }
11
+ }
12
+ const UUID = /^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/;
13
+ const DIGEST = /^[a-f0-9]{64}$/;
14
+ const STATES = ['PREPARING', 'CANCEL_REQUESTED', 'RESERVED', 'CREATE_INTENT', 'CREATED', 'START_INTENT', 'RUNNING', 'EXITED', 'CLEANUP_PENDING', 'REMOVED'];
15
+ const FAILURE_CODES = ['UNSAFE_PATH', 'UNSAFE_LINK', 'UNSUPPORTED_ENTRY', 'INVALID_METADATA', 'TREE_LIMIT_EXCEEDED'];
16
+ const LOG_FAILURE_CODES = ['LOG_LAYOUT_INVALID', 'LOG_RECORD_INVALID', 'LOG_RECORD_INCOMPLETE', 'LOG_LIMIT_EXCEEDED'];
17
+ function object(value) {
18
+ if (!value || typeof value !== 'object' || Array.isArray(value))
19
+ throw new Error('Expected object');
20
+ return value;
21
+ }
22
+ function exact(value, keys) {
23
+ if (Object.keys(value).some(key => !keys.includes(key)))
24
+ throw new Error('Unexpected field');
25
+ }
26
+ function identifier(value) {
27
+ if (typeof value !== 'string' || !value || value.length > 256
28
+ || Array.from(value).some(character => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127))
29
+ throw new Error('Invalid identifier');
30
+ return value;
31
+ }
32
+ function match(value, pattern) {
33
+ if (typeof value !== 'string' || !pattern.test(value))
34
+ throw new Error('Invalid identity');
35
+ return value;
36
+ }
37
+ function integer(value, minimum, maximum = Number.MAX_SAFE_INTEGER) {
38
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < minimum || value > maximum)
39
+ throw new Error('Invalid integer');
40
+ return value;
41
+ }
42
+ function parseRecord(value) {
43
+ try {
44
+ const record = object(value), scope = object(record.scope), input = object(record.input);
45
+ exact(record, ['version', 'scope', 'requestId', 'input', 'acceptedManifestDigest']);
46
+ exact(scope, ['tenantId', 'functionId']);
47
+ exact(input, ['command', 'timeoutMs', 'env']);
48
+ if (record.version !== 1 || typeof input.command !== 'string' || !input.command.trim() || input.command.includes('\0')
49
+ || Buffer.byteLength(input.command) > 8192)
50
+ throw new Error('Invalid command');
51
+ const env = object(input.env ?? {});
52
+ if (Object.keys(env).length > 64 || Object.entries(env).some(([key, item]) => !/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(key)
53
+ || typeof item !== 'string' || item.length > 2048 || /[\0\r\n]/.test(item) || item.trim() !== item))
54
+ throw new Error('Invalid environment');
55
+ const parsed = { version: 1, scope: { tenantId: identifier(scope.tenantId), functionId: identifier(scope.functionId) },
56
+ requestId: match(record.requestId, UUID), input: { command: input.command, timeoutMs: integer(input.timeoutMs ?? 60_000, 1, 900_000),
57
+ env: Object.fromEntries(Object.entries(env).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) },
58
+ ...(record.acceptedManifestDigest === undefined ? {} : { acceptedManifestDigest: match(record.acceptedManifestDigest, DIGEST) }) };
59
+ if (Buffer.byteLength(JSON.stringify({ version: 1, id: parsed.requestId, scope: parsed.scope, input: parsed.input })) > 12 * 1024)
60
+ throw new Error('Request exceeds bound');
61
+ return parsed;
62
+ }
63
+ catch (cause) {
64
+ throw new SourceCommandClientError('INVALID_RECORD', 'Invalid retained source command', false, cause);
65
+ }
66
+ }
67
+ function command(value, record) {
68
+ const parsed = object(value);
69
+ if (parsed.requestId !== record.requestId || parsed.functionId !== record.scope.functionId || parsed.kind !== 'EXEC_SOURCE')
70
+ throw new Error('Command identity mismatch');
71
+ return { requestId: record.requestId, functionId: record.scope.functionId, kind: 'EXEC_SOURCE' };
72
+ }
73
+ function publication(value, record) {
74
+ if (value === null)
75
+ return null;
76
+ const parsed = object(value);
77
+ if (parsed.id !== record.requestId || parsed.captureId !== record.requestId || !['APPLIED', 'CONFLICT'].includes(String(parsed.status)))
78
+ throw new Error('Publication identity mismatch');
79
+ const status = parsed.status;
80
+ const revision = status === 'APPLIED' ? match(parsed.revision, UUID) : null;
81
+ if (status === 'CONFLICT' && parsed.revision !== null)
82
+ throw new Error('Invalid conflict revision');
83
+ return { id: record.requestId, captureId: record.requestId, status, revision, outputDigest: match(parsed.outputDigest, DIGEST),
84
+ baseSnapshotDigest: match(parsed.baseSnapshotDigest, DIGEST), sizeBytes: integer(parsed.sizeBytes, 1, 512 * 1024 * 1024) };
85
+ }
86
+ function result(value) {
87
+ if (value === null)
88
+ return null;
89
+ const parsed = object(value);
90
+ if (typeof parsed.termination !== 'string' || !['EXITED', 'TIMEOUT', 'CANCELLED', 'HOST_REBOOT'].includes(parsed.termination) || parsed.outputSource !== 'nerdctl-json-file'
91
+ || typeof parsed.truncated !== 'boolean' || typeof parsed.stdoutBase64 !== 'string' || typeof parsed.stderrBase64 !== 'string')
92
+ throw new Error('Invalid result');
93
+ const exitCode = parsed.exitCode === null ? null : integer(parsed.exitCode, 0, 255);
94
+ if (parsed.termination === 'EXITED' && exitCode === null)
95
+ throw new Error('Missing exited result code');
96
+ const outputLimit = 1024 * 1024;
97
+ let outputBytes = 0;
98
+ for (const encoded of [parsed.stdoutBase64, parsed.stderrBase64]) {
99
+ // Bound allocation before decoding as well as the combined decoded output.
100
+ if (encoded.length > 4 * Math.ceil(outputLimit / 3))
101
+ throw new Error('Result output exceeds bound');
102
+ const bytes = Buffer.from(encoded, 'base64');
103
+ outputBytes += bytes.length;
104
+ if (bytes.toString('base64') !== encoded || outputBytes > outputLimit)
105
+ throw new Error('Invalid result output encoding or size');
106
+ }
107
+ let workspaceOutput = null, workspaceFailure = null;
108
+ if (parsed.workspaceOutput != null) {
109
+ const output = object(parsed.workspaceOutput);
110
+ workspaceOutput = { baseSnapshotDigest: match(output.baseSnapshotDigest, DIGEST), snapshotDigest: match(output.snapshotDigest, DIGEST), sizeBytes: integer(output.sizeBytes, 1, 512 * 1024 * 1024) };
111
+ }
112
+ if (parsed.workspaceFailure != null) {
113
+ const failure = object(parsed.workspaceFailure);
114
+ if (!FAILURE_CODES.includes(String(failure.code)) || workspaceOutput)
115
+ throw new Error('Invalid workspace failure');
116
+ workspaceFailure = { baseSnapshotDigest: match(failure.baseSnapshotDigest, DIGEST), code: failure.code };
117
+ }
118
+ let logFailure;
119
+ if (Object.hasOwn(parsed, 'logFailure')) {
120
+ exact(parsed, ['attemptId', 'manifestDigest', 'termination', 'exitCode', 'durationMs', 'stdoutBase64', 'stderrBase64',
121
+ 'truncated', 'outputSource', 'workspaceOutput', 'workspaceFailure', 'logFailure']);
122
+ const failure = object(parsed.logFailure);
123
+ exact(failure, ['code']);
124
+ if (typeof failure.code !== 'string' || !LOG_FAILURE_CODES.includes(failure.code) || parsed.workspaceOutput !== null || parsed.workspaceFailure !== null
125
+ || parsed.stdoutBase64 !== '' || parsed.stderrBase64 !== '' || parsed.truncated !== true)
126
+ throw new Error('Invalid log capture failure');
127
+ logFailure = { code: failure.code };
128
+ }
129
+ return { attemptId: match(parsed.attemptId, UUID), manifestDigest: match(parsed.manifestDigest, DIGEST),
130
+ termination: parsed.termination, exitCode,
131
+ durationMs: integer(parsed.durationMs, 0), stdoutBase64: parsed.stdoutBase64, stderrBase64: parsed.stderrBase64,
132
+ truncated: parsed.truncated, outputSource: 'nerdctl-json-file', workspaceOutput, workspaceFailure,
133
+ ...(logFailure ? { logFailure } : {}) };
134
+ }
135
+ function outcome(value, record, readOnly) {
136
+ const parsed = object(value), meta = object(parsed.command), identity = command(meta, record);
137
+ if (!STATES.includes(String(meta.state)) || typeof meta.cancelled !== 'boolean')
138
+ throw new Error('Invalid command state');
139
+ const output = result(parsed.result), receipt = publication(parsed.publication, record);
140
+ let binding = null;
141
+ if (parsed.publicationBinding != null) {
142
+ const candidate = object(parsed.publicationBinding);
143
+ exact(candidate, ['tenantId', 'functionId', 'requestId', 'manifestDigest', 'baseSnapshotDigest']);
144
+ if (!receipt || candidate.tenantId !== record.scope.tenantId || candidate.functionId !== record.scope.functionId
145
+ || candidate.requestId !== record.requestId || candidate.baseSnapshotDigest !== receipt.baseSnapshotDigest)
146
+ throw new Error('Publication binding mismatch');
147
+ binding = { tenantId: record.scope.tenantId, functionId: record.scope.functionId, requestId: record.requestId,
148
+ manifestDigest: match(candidate.manifestDigest, DIGEST), baseSnapshotDigest: match(candidate.baseSnapshotDigest, DIGEST) };
149
+ if (output && binding.manifestDigest !== output.manifestDigest)
150
+ throw new Error('Publication manifest mismatch');
151
+ }
152
+ if (readOnly && (receipt || parsed.publicationBinding !== undefined) || receipt && (meta.state !== 'REMOVED'
153
+ || !output && !binding || parsed.publicationBinding !== undefined && !binding
154
+ || output && (!output.workspaceOutput || receipt.outputDigest !== output.workspaceOutput.snapshotDigest
155
+ || receipt.baseSnapshotDigest !== output.workspaceOutput.baseSnapshotDigest || receipt.sizeBytes !== output.workspaceOutput.sizeBytes)
156
+ || meta.cancelled && receipt.status === 'APPLIED'))
157
+ throw new Error('Invalid publication outcome');
158
+ if (output || binding)
159
+ bindManifest(record, output?.manifestDigest ?? binding.manifestDigest);
160
+ return { command: { ...identity, state: meta.state, cancelled: meta.cancelled }, result: output, publication: receipt,
161
+ ...(parsed.publicationBinding === undefined ? {} : { publicationBinding: binding }) };
162
+ }
163
+ function bindManifest(record, digest) {
164
+ if (record.acceptedManifestDigest !== undefined && record.acceptedManifestDigest !== digest)
165
+ throw new Error('Accepted manifest changed');
166
+ record.acceptedManifestDigest = digest;
167
+ }
168
+ /** Execution and publication are separate: a nonzero exit alone does not describe source publication. */
169
+ export function sourcePublicationState(value) {
170
+ return value.result?.logFailure ? 'CAPTURE_FAILED' : value.publication?.status ?? (value.result?.workspaceFailure ? 'OUTPUT_FAILED' : 'NOT_PUBLISHED');
171
+ }
172
+ function operation(record, transport, retainAcceptance) {
173
+ const base = `/functions/${encodeURIComponent(record.scope.functionId)}/source-commands`, url = `${base}/${record.requestId}`;
174
+ let pending = false, retainedDigest = record.acceptedManifestDigest, tail = Promise.resolve();
175
+ const persist = async () => {
176
+ if (!pending)
177
+ return;
178
+ try {
179
+ await retainAcceptance?.(structuredClone(record));
180
+ }
181
+ catch (cause) {
182
+ throw new SourceCommandClientError('RETENTION', 'Accepted source identity could not be retained; persist it before another request', true, cause);
183
+ }
184
+ retainedDigest = record.acceptedManifestDigest;
185
+ pending = false;
186
+ };
187
+ const serialized = (work) => {
188
+ const result = tail.then(work);
189
+ tail = result.then(() => undefined, () => undefined);
190
+ return result;
191
+ };
192
+ const call = (path, init, decode) => {
193
+ const queued = serialized(async () => {
194
+ init.signal?.throwIfAborted();
195
+ await persist();
196
+ init.signal?.throwIfAborted();
197
+ let response;
198
+ try {
199
+ init.signal?.throwIfAborted();
200
+ const pending = transport(structuredClone(record.scope), path, init);
201
+ // Even an adapter that cannot abort its HTTP request must let the caller
202
+ // stop waiting. Its eventual reply never triggers another action here.
203
+ response = !init.signal ? await pending : await new Promise((resolve, reject) => {
204
+ const signal = init.signal;
205
+ const abort = () => { signal.removeEventListener('abort', abort); reject(signal.reason); };
206
+ signal.addEventListener('abort', abort, { once: true });
207
+ pending.then(value => { signal.removeEventListener('abort', abort); resolve(value); }, error => { signal.removeEventListener('abort', abort); reject(error); });
208
+ if (signal.aborted)
209
+ abort();
210
+ });
211
+ }
212
+ catch (cause) {
213
+ const status = cause && typeof cause === 'object' && 'status' in cause ? Number(cause.status) : 0;
214
+ if (status === 409)
215
+ throw new SourceCommandClientError('CONFLICT', 'Request ID or source revision conflict; inspect this operation', false, cause);
216
+ if (status >= 400 && status < 500)
217
+ throw new SourceCommandClientError('REJECTED', 'Source command request rejected', false, cause);
218
+ throw new SourceCommandClientError('UNCERTAIN', 'Reply unavailable; retain this request ID and inspect or retry the same action', true, cause);
219
+ }
220
+ let decoded;
221
+ try {
222
+ decoded = decode(response);
223
+ }
224
+ catch (cause) {
225
+ throw new SourceCommandClientError('PROTOCOL', 'Invalid source command response; retain this request ID', true, cause);
226
+ }
227
+ if (record.acceptedManifestDigest !== retainedDigest) {
228
+ pending = true;
229
+ await persist();
230
+ }
231
+ return decoded;
232
+ });
233
+ // Ending observation must not wait for an earlier HTTP/storage operation.
234
+ // The queued transaction still checks this signal before any later dispatch.
235
+ if (!init.signal)
236
+ return queued;
237
+ return new Promise((resolve, reject) => {
238
+ const signal = init.signal, abort = () => { signal.removeEventListener('abort', abort); reject(new SourceCommandClientError('UNCERTAIN', 'Observation stopped; retain this request ID', true, signal.reason)); };
239
+ signal.addEventListener('abort', abort, { once: true });
240
+ queued.then(value => { signal.removeEventListener('abort', abort); resolve(value); }, error => { signal.removeEventListener('abort', abort); reject(error); });
241
+ if (signal.aborted)
242
+ abort();
243
+ });
244
+ };
245
+ const post = (signal, body = {}) => ({ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal });
246
+ const status = (signal) => call(url, { method: 'GET', signal }, value => outcome(value, record, true));
247
+ return {
248
+ record: () => structuredClone(record),
249
+ persist: () => serialized(persist),
250
+ submit: signal => call(base, post(signal, { requestId: record.requestId, ...record.input }), value => {
251
+ const meta = object(object(value).command), identity = command(meta, record);
252
+ if (!STATES.includes(String(meta.state)) || typeof meta.cancelled !== 'boolean')
253
+ throw new Error('Invalid assignment');
254
+ const attemptId = match(meta.attemptId, UUID), manifestDigest = match(meta.manifestDigest, DIGEST);
255
+ bindManifest(record, manifestDigest);
256
+ return { command: { ...identity, state: meta.state, cancelled: meta.cancelled,
257
+ attemptId, manifestDigest } };
258
+ }),
259
+ status,
260
+ reconcile: signal => call(`${url}/reconcile`, post(signal), value => outcome(value, record, false)),
261
+ cancel: signal => call(`${url}/cancel`, post(signal), value => {
262
+ const parsed = object(value), identity = command(parsed.command, record), receipt = publication(parsed.publication, record);
263
+ if (parsed.state === 'PUBLICATION_COMMITTED' ? receipt?.status !== 'APPLIED'
264
+ : parsed.state !== 'CANCEL_REQUESTED' || receipt?.status === 'APPLIED')
265
+ throw new Error('Invalid cancellation outcome');
266
+ return { command: identity, state: parsed.state, publication: receipt };
267
+ }),
268
+ async poll(options = {}) {
269
+ const timeout = integer(options.maxWaitMs ?? 60_000, 1, 900_000), interval = integer(options.intervalMs ?? 1000, 1, 60_000);
270
+ const signal = AbortSignal.any([AbortSignal.timeout(timeout), ...(options.signal ? [options.signal] : [])]);
271
+ try {
272
+ for (;;) {
273
+ signal.throwIfAborted();
274
+ const observed = await status(signal);
275
+ signal.throwIfAborted();
276
+ // CANCEL_REQUESTED without an observable attempt is durable intent,
277
+ // not a removal/capacity receipt. Return it without claiming quiescence.
278
+ if (observed.command.state === 'REMOVED' || observed.command.state === 'CANCEL_REQUESTED')
279
+ return observed;
280
+ await new Promise((resolve, reject) => {
281
+ const abort = () => { clearTimeout(timer); signal.removeEventListener('abort', abort); reject(signal.reason); };
282
+ const timer = setTimeout(() => { signal.removeEventListener('abort', abort); resolve(); }, interval);
283
+ signal.addEventListener('abort', abort, { once: true });
284
+ if (signal.aborted)
285
+ abort();
286
+ });
287
+ }
288
+ }
289
+ catch (cause) {
290
+ if (signal.aborted)
291
+ throw new SourceCommandClientError('WAIT_ENDED', 'Observation stopped; this does not cancel the command', true, cause);
292
+ throw cause;
293
+ }
294
+ },
295
+ };
296
+ }
297
+ /** Retain must durably store the record (including secrets securely) before any HTTP call. */
298
+ export async function prepareSourceCommand(options) {
299
+ const record = parseRecord({ version: 1, scope: options.scope, requestId: options.requestId ?? randomUUID(), input: options.input });
300
+ await options.retain(structuredClone(record));
301
+ return operation(record, options.transport, options.retainAcceptance);
302
+ }
303
+ /** Restoring an operation never submits it; callers explicitly choose observe/retry/reconcile/cancel. */
304
+ export function restoreSourceCommand(value, options) {
305
+ const record = parseRecord(value);
306
+ if (record.scope.tenantId !== options.scope.tenantId || record.scope.functionId !== options.scope.functionId) {
307
+ throw new SourceCommandClientError('INVALID_RECORD', 'Retained source command belongs to another scope', false);
308
+ }
309
+ return operation(record, options.transport, options.retainAcceptance);
310
+ }
311
+ //# sourceMappingURL=source-command-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-command-protocol.js","sourceRoot":"","sources":["../src/source-command-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type TransportClient } from './transport.js';
2
+ import { type SourceCommandRecord as ProtocolRecord, type SourceCommandOperation as ProtocolOperation, type SourceCommandInput } from './source-command-protocol.js';
3
+ export { SourceCommandClientError, sourcePublicationState, prepareSourceCommand as prepareSourceCommandProtocol, restoreSourceCommand as restoreSourceCommandProtocol } from './source-command-protocol.js';
4
+ export type { SourceCommandScope, SourceCommandInput, SourceCommandState, SourceCommandResult, SourceCommandOutcome, SourceCommandCancellation, SourceCommandPublication, SourceCommandPublicationBinding, SourceWorkspaceOutput, SourceWorkspaceFailure, SourceLogFailure, SourceCommandTransport, SourceCommandRecord as SourceCommandProtocolRecord, SourceCommandOperation as SourceCommandProtocolOperation } from './source-command-protocol.js';
5
+ export interface SourceCommandRecord extends ProtocolRecord {
6
+ apiUrl: string;
7
+ /** Raw secret hash; credentials themselves are never stored in the record. */
8
+ credentialHash: string;
9
+ /** Original selector. Actions use the resolved immutable scope.tenantId. */
10
+ selector: string | null;
11
+ }
12
+ export interface SourceCommandOperation extends Omit<ProtocolOperation, 'record'> {
13
+ record(): SourceCommandRecord;
14
+ }
15
+ export type SourceCommandRetain = (record: SourceCommandRecord) => Promise<void>;
16
+ /** Securely persist every supplied record, atomically binding UUID to its input.
17
+ * This prepares only; caller explicitly invokes submit. The callback also persists
18
+ * learned acceptance before an action/poll can return or issue another request.
19
+ */
20
+ export declare function prepareSourceCommand(client: TransportClient, options: {
21
+ function: string;
22
+ requestId: string;
23
+ input: SourceCommandInput;
24
+ retain: SourceCommandRetain;
25
+ signal?: AbortSignal;
26
+ }): Promise<SourceCommandOperation>;
27
+ /** No discovery or submission. The current selector/context must match the record;
28
+ * all subsequent actions use its retained resolved workspace and function IDs.
29
+ */
30
+ export declare function restoreSourceCommand(client: TransportClient, value: unknown, options: {
31
+ retain: SourceCommandRetain;
32
+ }): Promise<SourceCommandOperation>;
33
+ //# sourceMappingURL=source-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-commands.d.ts","sourceRoot":"","sources":["../src/source-commands.ts"],"names":[],"mappings":"AACA,OAAO,EAA+D,KAAK,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAElH,OAAO,EACL,KAAK,mBAAmB,IAAI,cAAc,EAAC,KAAK,sBAAsB,IAAI,iBAAiB,EAAC,KAAK,kBAAkB,EAAC,MAAM,8BAA8B,CAAC;AAC3J,OAAO,EAAC,wBAAwB,EAAC,sBAAsB,EACrD,oBAAoB,IAAI,4BAA4B,EAAC,oBAAoB,IAAI,4BAA4B,EAAC,MAAM,8BAA8B,CAAC;AACjJ,YAAY,EAAC,kBAAkB,EAAC,kBAAkB,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,oBAAoB,EAC5G,yBAAyB,EAAC,wBAAwB,EAAC,+BAA+B,EAAC,qBAAqB,EAAC,sBAAsB,EAAC,gBAAgB,EAChJ,sBAAsB,EAAC,mBAAmB,IAAI,2BAA2B,EAAC,sBAAsB,IAAI,8BAA8B,EAAC,MAAM,8BAA8B,CAAC;AAE1K,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,MAAM,EAAC,MAAM,CAAC;IACd,8EAA8E;IAC9E,cAAc,EAAC,MAAM,CAAC;IACtB,4EAA4E;IAC5E,QAAQ,EAAC,MAAM,GAAC,IAAI,CAAC;CACtB;AACD,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,iBAAiB,EAAC,QAAQ,CAAC;IAAE,MAAM,IAAG,mBAAmB,CAAA;CAAC;AAC/G,MAAM,MAAM,mBAAmB,GAAC,CAAC,MAAM,EAAC,mBAAmB,KAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAkD5E;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAC,eAAe,EAAC,OAAO,EAAC;IAAC,QAAQ,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,kBAAkB,CAAC;IACnI,MAAM,EAAC,mBAAmB,CAAC;IAAA,MAAM,CAAC,EAAC,WAAW,CAAA;CAAC,GAAE,OAAO,CAAC,sBAAsB,CAAC,CAqBjF;AACD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAC,eAAe,EAAC,KAAK,EAAC,OAAO,EAAC,OAAO,EAAC;IAAC,MAAM,EAAC,mBAAmB,CAAA;CAAC,GAAE,OAAO,CAAC,sBAAsB,CAAC,CAOpJ"}