@relayflows/sdk 2.0.64 → 2.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cloud-answer.d.ts +11 -8
- package/dist/cloud-answer.d.ts.map +1 -1
- package/dist/cloud-answer.js +44 -16
- package/dist/cloud-answer.js.map +1 -1
- package/dist/cloud-repository-grant.d.ts +18 -0
- package/dist/cloud-repository-grant.d.ts.map +1 -0
- package/dist/cloud-repository-grant.js +61 -0
- package/dist/cloud-repository-grant.js.map +1 -0
- package/package.json +2 -2
- package/src/cloud-answer.ts +61 -16
- package/src/cloud-repository-grant.ts +77 -0
package/dist/cloud-answer.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CloudConnectionOptions } from './cloud-http.js';
|
|
2
|
+
import { readCloudHumanWaitValue } from './cloud-human-wait.js';
|
|
2
3
|
export interface CloudAnswerOptions extends CloudConnectionOptions {
|
|
3
4
|
note?: string;
|
|
4
5
|
/** Exact original source, including a copy pulled with flows sync. Never executed locally. */
|
|
@@ -17,19 +18,21 @@ export declare class CloudAnswerError extends Error {
|
|
|
17
18
|
readonly cause: unknown;
|
|
18
19
|
constructor(answerRecorded: boolean, cause: unknown);
|
|
19
20
|
}
|
|
21
|
+
interface CloudRecordedHumanAnswer {
|
|
22
|
+
waitId: string;
|
|
23
|
+
answer: boolean;
|
|
24
|
+
note?: string;
|
|
25
|
+
}
|
|
20
26
|
/**
|
|
21
27
|
* Accepted answer route shapes are explicit: humanWait (or wait), or openWaits,
|
|
22
|
-
* and an optional recorded answer { waitId, answer, note? }.
|
|
23
|
-
*
|
|
28
|
+
* and an optional recorded humanAnswer (legacy: answer) { waitId, answer, note? }.
|
|
29
|
+
* Unknown fields are additive, but competing or cross-run/wait shapes refuse.
|
|
24
30
|
*/
|
|
25
31
|
export declare function readCloudHumanWait(runId: string, options?: CloudConnectionOptions): Promise<{
|
|
26
|
-
wait
|
|
27
|
-
recorded
|
|
28
|
-
waitId: string;
|
|
29
|
-
answer: boolean;
|
|
30
|
-
note: string | undefined;
|
|
31
|
-
} | undefined;
|
|
32
|
+
wait?: ReturnType<typeof readCloudHumanWaitValue>;
|
|
33
|
+
recorded?: CloudRecordedHumanAnswer;
|
|
32
34
|
}>;
|
|
33
35
|
/** Record a decision and resume only if Cloud still reports the original park. No POST retries. */
|
|
34
36
|
export declare function answerCloudFlow(runId: string, answer: boolean, options?: CloudAnswerOptions): Promise<CloudResumeReceipt>;
|
|
37
|
+
export {};
|
|
35
38
|
//# sourceMappingURL=cloud-answer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-answer.d.ts","sourceRoot":"","sources":["../src/cloud-answer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyD,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud-answer.d.ts","sourceRoot":"","sources":["../src/cloud-answer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyD,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAErH,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAKhE,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,0FAA0F;AAC1F,qBAAa,gBAAiB,SAAQ,KAAK;IAC7B,QAAQ,CAAC,cAAc,EAAE,OAAO;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO;gBAAhD,cAAc,EAAE,OAAO,EAAW,KAAK,EAAE,OAAO;CAKtE;AAED,UAAU,wBAAwB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqDD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;WAjDnF,UAAU,CAAC,OAAO,uBAAuB,CAAC;eACtC,wBAAwB;GAmDpC;AAgGD,mGAAmG;AACnG,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoDnI"}
|
package/dist/cloud-answer.js
CHANGED
|
@@ -3,6 +3,7 @@ import { readFile } from 'node:fs/promises';
|
|
|
3
3
|
import { CloudFlowError, cloudFetch, cloudRunId, isCloudRecord } from './cloud-http.js';
|
|
4
4
|
import { cloudRunState } from './cloud-run-record.js';
|
|
5
5
|
import { readCloudHumanWaitValue } from './cloud-human-wait.js';
|
|
6
|
+
import { readCloudRepositoryGrant } from './cloud-repository-grant.js';
|
|
6
7
|
import { readSurfaceAuthority } from './authored-flow-loader.js';
|
|
7
8
|
/** Preserves partial success without claiming a failed/ambiguous resume did not start. */
|
|
8
9
|
export class CloudAnswerError extends Error {
|
|
@@ -19,19 +20,18 @@ export class CloudAnswerError extends Error {
|
|
|
19
20
|
const route = (runId) => `/api/v1/workflows/runs/${runId}`;
|
|
20
21
|
const get = (path, options) => cloudFetch(path, options, { method: 'GET', detail: true });
|
|
21
22
|
const post = (path, body, options) => cloudFetch(path, options, { method: 'POST', body: JSON.stringify(body), detail: true });
|
|
22
|
-
|
|
23
|
-
* Accepted answer route shapes are explicit: humanWait (or wait), or openWaits,
|
|
24
|
-
* and an optional recorded answer { waitId, answer, note? }. Unknown/ambiguous
|
|
25
|
-
* shapes refuse before writes. A closed wait is retryable only with that proof.
|
|
26
|
-
*/
|
|
27
|
-
export async function readCloudHumanWait(runId, options = {}) {
|
|
28
|
-
cloudRunId(runId);
|
|
29
|
-
const body = await get(`${route(runId)}/answer`, options);
|
|
23
|
+
function readCloudHumanAnswerRecord(body, runId) {
|
|
30
24
|
if (!isCloudRecord(body))
|
|
31
25
|
throw new CloudFlowError('invalid_response', 'Cloud returned no human answer record.');
|
|
32
|
-
if (body.runId !==
|
|
26
|
+
if (body.runId !== runId) {
|
|
33
27
|
throw new CloudFlowError('invalid_response', 'Cloud returned a human answer record for a different run.');
|
|
34
28
|
}
|
|
29
|
+
if (body.error !== undefined && body.error !== null) {
|
|
30
|
+
throw new CloudFlowError('invalid_response', 'Cloud returned an error beside a human answer record.');
|
|
31
|
+
}
|
|
32
|
+
if (body.ok !== undefined && body.ok !== true) {
|
|
33
|
+
throw new CloudFlowError('invalid_response', 'Cloud explicitly refused the human answer record.');
|
|
34
|
+
}
|
|
35
35
|
// An absent and a null field mean the same thing everywhere below.
|
|
36
36
|
const present = (key) => body[key] !== undefined && body[key] !== null;
|
|
37
37
|
if (['humanWait', 'wait', 'openWaits'].filter(present).length > 1) {
|
|
@@ -45,18 +45,40 @@ export async function readCloudHumanWait(runId, options = {}) {
|
|
|
45
45
|
const wait = readCloudHumanWaitValue(candidates[0]);
|
|
46
46
|
if (candidates.length === 1 && !wait)
|
|
47
47
|
throw new CloudFlowError('invalid_response', 'Cloud returned an invalid open human wait.');
|
|
48
|
-
|
|
48
|
+
if (['humanAnswer', 'answer'].filter(present).length > 1) {
|
|
49
|
+
throw new CloudFlowError('invalid_response', 'Cloud returned competing recorded human answer fields.');
|
|
50
|
+
}
|
|
51
|
+
const recorded = body.humanAnswer ?? body.answer;
|
|
49
52
|
if (recorded !== undefined && recorded !== null
|
|
50
53
|
&& (!isCloudRecord(recorded) || !readCloudHumanWaitValue(recorded) || typeof recorded.answer !== 'boolean'
|
|
51
54
|
|| (recorded.note !== undefined && recorded.note !== null && typeof recorded.note !== 'string'))) {
|
|
52
55
|
throw new CloudFlowError('invalid_response', 'Cloud returned an invalid recorded human answer.');
|
|
53
56
|
}
|
|
57
|
+
if (wait && isCloudRecord(recorded) && recorded.waitId !== wait.waitId) {
|
|
58
|
+
throw new CloudFlowError('invalid_response', 'Cloud returned a human answer for a different wait.');
|
|
59
|
+
}
|
|
54
60
|
return { wait, recorded: isCloudRecord(recorded)
|
|
55
61
|
// Like the wait fields, a null note means absent.
|
|
56
62
|
? { waitId: recorded.waitId, answer: recorded.answer,
|
|
57
63
|
note: typeof recorded.note === 'string' ? recorded.note : undefined }
|
|
58
64
|
: undefined };
|
|
59
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Accepted answer route shapes are explicit: humanWait (or wait), or openWaits,
|
|
68
|
+
* and an optional recorded humanAnswer (legacy: answer) { waitId, answer, note? }.
|
|
69
|
+
* Unknown fields are additive, but competing or cross-run/wait shapes refuse.
|
|
70
|
+
*/
|
|
71
|
+
export async function readCloudHumanWait(runId, options = {}) {
|
|
72
|
+
cloudRunId(runId);
|
|
73
|
+
return readCloudHumanAnswerRecord(await get(`${route(runId)}/answer`, options), runId);
|
|
74
|
+
}
|
|
75
|
+
function normalizedAnswerNote(note) {
|
|
76
|
+
const normalized = note?.trim();
|
|
77
|
+
return normalized === undefined || normalized.length === 0 ? undefined : normalized;
|
|
78
|
+
}
|
|
79
|
+
function sameRecordedAnswer(recorded, waitId, answer, note) {
|
|
80
|
+
return recorded.waitId === waitId && recorded.answer === answer && recorded.note === note;
|
|
81
|
+
}
|
|
60
82
|
const HEX64 = /^[a-f0-9]{64}$/u;
|
|
61
83
|
function isSurfaceAuthority(value) {
|
|
62
84
|
return isCloudRecord(value) && value.packageName === '@relayflows/surface'
|
|
@@ -111,6 +133,10 @@ async function resumeBody(record, runId, source) {
|
|
|
111
133
|
throw new CloudFlowError('unsupported_source', 'Cannot resume a run with extensions: Cloud must expose their original submissions.');
|
|
112
134
|
}
|
|
113
135
|
}
|
|
136
|
+
const repositoryGrant = readCloudRepositoryGrant(authority.repository);
|
|
137
|
+
if (authority.repository !== undefined && repositoryGrant === undefined) {
|
|
138
|
+
throw new CloudFlowError('invalid_response', 'Cloud run carries an invalid repository grant; refusing to widen or alter it.');
|
|
139
|
+
}
|
|
114
140
|
let workflow = record.workflow;
|
|
115
141
|
if (source !== undefined) {
|
|
116
142
|
try {
|
|
@@ -134,6 +160,7 @@ async function resumeBody(record, runId, source) {
|
|
|
134
160
|
surface: await resumeSurface(authority.source.surface, source),
|
|
135
161
|
});
|
|
136
162
|
return { workflow, authoredAuthority, fileType: 'ts', relayflowVersion: 'v2', resume: runId,
|
|
163
|
+
...(repositoryGrant === undefined ? {} : { repositoryGrant }),
|
|
137
164
|
...(typeof record.workspaceId === 'string' ? { workspaceId: record.workspaceId } : {}) };
|
|
138
165
|
}
|
|
139
166
|
/** Record a decision and resume only if Cloud still reports the original park. No POST retries. */
|
|
@@ -150,18 +177,19 @@ export async function answerCloudFlow(runId, answer, options = {}) {
|
|
|
150
177
|
if (!waitId || (state.humanWait && state.humanWait.waitId !== waitId)) {
|
|
151
178
|
throw new CloudFlowError('invalid_response', 'Cloud answer record does not identify the run’s parked wait.');
|
|
152
179
|
}
|
|
153
|
-
|
|
154
|
-
if (recorded && (recorded
|
|
155
|
-
|| (recorded.note !== undefined && recorded.note !== options.note))) {
|
|
180
|
+
const note = normalizedAnswerNote(options.note);
|
|
181
|
+
if (recorded && !sameRecordedAnswer(recorded, waitId, answer, note)) {
|
|
156
182
|
throw new CloudFlowError('invalid_input', 'The recorded answer differs; a closed human wait cannot be changed.');
|
|
157
183
|
}
|
|
158
184
|
const body = await resumeBody(record, runId, options.source);
|
|
159
185
|
let answerRecorded = recorded !== undefined;
|
|
160
186
|
try {
|
|
161
187
|
if (!answerRecorded) {
|
|
162
|
-
const accepted = await post(`${route(runId)}/answer`, { waitId, answer, ...(
|
|
163
|
-
|
|
164
|
-
if (!
|
|
188
|
+
const accepted = await post(`${route(runId)}/answer`, { waitId, answer, ...(note === undefined ? {} : { note }) }, options);
|
|
189
|
+
const acknowledged = readCloudHumanAnswerRecord(accepted, runId);
|
|
190
|
+
if (!acknowledged.wait || !acknowledged.recorded
|
|
191
|
+
|| acknowledged.wait.waitId !== waitId
|
|
192
|
+
|| !sameRecordedAnswer(acknowledged.recorded, waitId, answer, note)) {
|
|
165
193
|
throw new CloudFlowError('invalid_response', 'Cloud did not confirm the human answer.');
|
|
166
194
|
}
|
|
167
195
|
answerRecorded = true;
|
package/dist/cloud-answer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-answer.js","sourceRoot":"","sources":["../src/cloud-answer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cloud-answer.js","sourceRoot":"","sources":["../src/cloud-answer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface CloudRepositoryGrant {
|
|
2
|
+
host?: 'gitlab';
|
|
3
|
+
owner: string;
|
|
4
|
+
repo: string;
|
|
5
|
+
baseBranch: string;
|
|
6
|
+
baseSha: string;
|
|
7
|
+
branch: string;
|
|
8
|
+
mode?: 'head';
|
|
9
|
+
workflows?: true;
|
|
10
|
+
access?: 'read';
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Rebuild the request portion of persisted Cloud repository authority.
|
|
14
|
+
* Cloud re-admits this request against the persisted identity and current
|
|
15
|
+
* connection; the SDK must neither infer missing authority nor widen it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readCloudRepositoryGrant(value: unknown): CloudRepositoryGrant | undefined;
|
|
18
|
+
//# sourceMappingURL=cloud-repository-grant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-repository-grant.d.ts","sourceRoot":"","sources":["../src/cloud-repository-grant.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAuBD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CAoCzF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { isCloudRecord } from './cloud-http.js';
|
|
2
|
+
const coordinate = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/u;
|
|
3
|
+
function validGitlabNamespace(value) {
|
|
4
|
+
if (typeof value !== 'string' || value.length > 255)
|
|
5
|
+
return false;
|
|
6
|
+
const parts = value.split('/');
|
|
7
|
+
return parts.length >= 1 && parts.length <= 20 && parts.every(part => (coordinate.test(part) && !part.endsWith('.') && !part.endsWith('.git') && !part.endsWith('.atom')));
|
|
8
|
+
}
|
|
9
|
+
function validRepositoryBranch(value) {
|
|
10
|
+
return typeof value === 'string'
|
|
11
|
+
&& /^[A-Za-z0-9][A-Za-z0-9._/-]{0,199}$/u.test(value)
|
|
12
|
+
&& value !== 'HEAD'
|
|
13
|
+
&& !value.includes('..')
|
|
14
|
+
&& !value.includes('//')
|
|
15
|
+
&& value.split('/').every(part => (part !== '' && !part.startsWith('.') && !part.endsWith('.') && !part.endsWith('.lock')));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Rebuild the request portion of persisted Cloud repository authority.
|
|
19
|
+
* Cloud re-admits this request against the persisted identity and current
|
|
20
|
+
* connection; the SDK must neither infer missing authority nor widen it.
|
|
21
|
+
*/
|
|
22
|
+
export function readCloudRepositoryGrant(value) {
|
|
23
|
+
if (value === undefined)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (!isCloudRecord(value))
|
|
26
|
+
return undefined;
|
|
27
|
+
const gitlab = value.host === 'gitlab';
|
|
28
|
+
if ((value.host !== undefined && value.host !== 'github' && value.host !== 'gitlab')
|
|
29
|
+
|| typeof value.owner !== 'string'
|
|
30
|
+
|| !(gitlab ? validGitlabNamespace(value.owner) : coordinate.test(value.owner))
|
|
31
|
+
|| typeof value.repo !== 'string'
|
|
32
|
+
|| !/^[A-Za-z0-9_.-]{1,100}$/u.test(value.repo)
|
|
33
|
+
|| value.repo === '.' || value.repo === '..'
|
|
34
|
+
|| (gitlab && (value.repo.endsWith('.git') || value.repo.endsWith('.atom') || value.repo.endsWith('.')))
|
|
35
|
+
|| !validRepositoryBranch(value.baseBranch)
|
|
36
|
+
|| !validRepositoryBranch(value.branch)
|
|
37
|
+
|| (value.mode !== undefined && value.mode !== 'new' && value.mode !== 'head')
|
|
38
|
+
|| (value.workflows !== undefined && typeof value.workflows !== 'boolean')
|
|
39
|
+
|| (gitlab && value.workflows === true)
|
|
40
|
+
|| (value.access !== undefined && value.access !== 'read')
|
|
41
|
+
|| (value.access === 'read' && value.workflows === true)
|
|
42
|
+
|| (gitlab && value.access === 'read')
|
|
43
|
+
|| (value.mode !== 'head' && !value.branch.startsWith('relayflow/'))
|
|
44
|
+
|| value.branch === value.baseBranch
|
|
45
|
+
|| typeof value.baseSha !== 'string'
|
|
46
|
+
|| !/^[a-f0-9]{40}$/u.test(value.baseSha)) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
...(gitlab ? { host: 'gitlab' } : {}),
|
|
51
|
+
owner: value.owner.toLowerCase(),
|
|
52
|
+
repo: value.repo.toLowerCase(),
|
|
53
|
+
baseBranch: value.baseBranch,
|
|
54
|
+
baseSha: value.baseSha,
|
|
55
|
+
branch: value.branch,
|
|
56
|
+
...(value.mode === 'head' ? { mode: 'head' } : {}),
|
|
57
|
+
...(value.workflows === true ? { workflows: true } : {}),
|
|
58
|
+
...(value.access === 'read' ? { access: 'read' } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=cloud-repository-grant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-repository-grant.js","sourceRoot":"","sources":["../src/cloud-repository-grant.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relayflows/sdk",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.65",
|
|
4
4
|
"description": "TypeScript-first authoring SDK for Relayflows. Compiles specs; speaks the journal protocol.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
51
51
|
"@relayfile/adapter-core": "0.8.5",
|
|
52
52
|
"@relayfile/relay-helpers": "0.6.1",
|
|
53
|
-
"@relayflows/surface": "2.0.
|
|
53
|
+
"@relayflows/surface": "2.0.65",
|
|
54
54
|
"@types/js-yaml": "^4.0.9",
|
|
55
55
|
"acorn": "^8.18.0",
|
|
56
56
|
"ai-hist": "0.4.1",
|
package/src/cloud-answer.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { readFile } from 'node:fs/promises';
|
|
|
3
3
|
import { CloudFlowError, cloudFetch, cloudRunId, isCloudRecord, type CloudConnectionOptions } from './cloud-http.js';
|
|
4
4
|
import { cloudRunState } from './cloud-run-record.js';
|
|
5
5
|
import { readCloudHumanWaitValue } from './cloud-human-wait.js';
|
|
6
|
+
import { readCloudRepositoryGrant } from './cloud-repository-grant.js';
|
|
6
7
|
import { readSurfaceAuthority, type SurfaceModuleAuthority } from './authored-flow-loader.js';
|
|
7
8
|
import type { CloudAuthoredAuthority } from './cloud-run.js';
|
|
8
9
|
|
|
@@ -29,24 +30,32 @@ export class CloudAnswerError extends Error {
|
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
|
|
33
|
+
interface CloudRecordedHumanAnswer {
|
|
34
|
+
waitId: string;
|
|
35
|
+
answer: boolean;
|
|
36
|
+
note?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
32
39
|
const route = (runId: string): string => `/api/v1/workflows/runs/${runId}`;
|
|
33
40
|
const get = (path: string, options: CloudConnectionOptions): Promise<unknown> =>
|
|
34
41
|
cloudFetch(path, options, { method: 'GET', detail: true });
|
|
35
42
|
const post = (path: string, body: unknown, options: CloudConnectionOptions): Promise<unknown> =>
|
|
36
43
|
cloudFetch(path, options, { method: 'POST', body: JSON.stringify(body), detail: true });
|
|
37
44
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
*/
|
|
43
|
-
export async function readCloudHumanWait(runId: string, options: CloudConnectionOptions = {}) {
|
|
44
|
-
cloudRunId(runId);
|
|
45
|
-
const body = await get(`${route(runId)}/answer`, options);
|
|
45
|
+
function readCloudHumanAnswerRecord(body: unknown, runId: string): {
|
|
46
|
+
wait?: ReturnType<typeof readCloudHumanWaitValue>;
|
|
47
|
+
recorded?: CloudRecordedHumanAnswer;
|
|
48
|
+
} {
|
|
46
49
|
if (!isCloudRecord(body)) throw new CloudFlowError('invalid_response', 'Cloud returned no human answer record.');
|
|
47
|
-
if (body.runId !==
|
|
50
|
+
if (body.runId !== runId) {
|
|
48
51
|
throw new CloudFlowError('invalid_response', 'Cloud returned a human answer record for a different run.');
|
|
49
52
|
}
|
|
53
|
+
if (body.error !== undefined && body.error !== null) {
|
|
54
|
+
throw new CloudFlowError('invalid_response', 'Cloud returned an error beside a human answer record.');
|
|
55
|
+
}
|
|
56
|
+
if (body.ok !== undefined && body.ok !== true) {
|
|
57
|
+
throw new CloudFlowError('invalid_response', 'Cloud explicitly refused the human answer record.');
|
|
58
|
+
}
|
|
50
59
|
// An absent and a null field mean the same thing everywhere below.
|
|
51
60
|
const present = (key: string): boolean => body[key] !== undefined && body[key] !== null;
|
|
52
61
|
if (['humanWait', 'wait', 'openWaits'].filter(present).length > 1) {
|
|
@@ -59,12 +68,18 @@ export async function readCloudHumanWait(runId: string, options: CloudConnection
|
|
|
59
68
|
}
|
|
60
69
|
const wait = readCloudHumanWaitValue(candidates[0]);
|
|
61
70
|
if (candidates.length === 1 && !wait) throw new CloudFlowError('invalid_response', 'Cloud returned an invalid open human wait.');
|
|
62
|
-
|
|
71
|
+
if (['humanAnswer', 'answer'].filter(present).length > 1) {
|
|
72
|
+
throw new CloudFlowError('invalid_response', 'Cloud returned competing recorded human answer fields.');
|
|
73
|
+
}
|
|
74
|
+
const recorded = body.humanAnswer ?? body.answer;
|
|
63
75
|
if (recorded !== undefined && recorded !== null
|
|
64
76
|
&& (!isCloudRecord(recorded) || !readCloudHumanWaitValue(recorded) || typeof recorded.answer !== 'boolean'
|
|
65
77
|
|| (recorded.note !== undefined && recorded.note !== null && typeof recorded.note !== 'string'))) {
|
|
66
78
|
throw new CloudFlowError('invalid_response', 'Cloud returned an invalid recorded human answer.');
|
|
67
79
|
}
|
|
80
|
+
if (wait && isCloudRecord(recorded) && recorded.waitId !== wait.waitId) {
|
|
81
|
+
throw new CloudFlowError('invalid_response', 'Cloud returned a human answer for a different wait.');
|
|
82
|
+
}
|
|
68
83
|
return { wait, recorded: isCloudRecord(recorded)
|
|
69
84
|
// Like the wait fields, a null note means absent.
|
|
70
85
|
? { waitId: recorded.waitId as string, answer: recorded.answer as boolean,
|
|
@@ -72,6 +87,30 @@ export async function readCloudHumanWait(runId: string, options: CloudConnection
|
|
|
72
87
|
: undefined };
|
|
73
88
|
}
|
|
74
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Accepted answer route shapes are explicit: humanWait (or wait), or openWaits,
|
|
92
|
+
* and an optional recorded humanAnswer (legacy: answer) { waitId, answer, note? }.
|
|
93
|
+
* Unknown fields are additive, but competing or cross-run/wait shapes refuse.
|
|
94
|
+
*/
|
|
95
|
+
export async function readCloudHumanWait(runId: string, options: CloudConnectionOptions = {}) {
|
|
96
|
+
cloudRunId(runId);
|
|
97
|
+
return readCloudHumanAnswerRecord(await get(`${route(runId)}/answer`, options), runId);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function normalizedAnswerNote(note: string | undefined): string | undefined {
|
|
101
|
+
const normalized = note?.trim();
|
|
102
|
+
return normalized === undefined || normalized.length === 0 ? undefined : normalized;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function sameRecordedAnswer(
|
|
106
|
+
recorded: CloudRecordedHumanAnswer,
|
|
107
|
+
waitId: string,
|
|
108
|
+
answer: boolean,
|
|
109
|
+
note: string | undefined,
|
|
110
|
+
): boolean {
|
|
111
|
+
return recorded.waitId === waitId && recorded.answer === answer && recorded.note === note;
|
|
112
|
+
}
|
|
113
|
+
|
|
75
114
|
const HEX64 = /^[a-f0-9]{64}$/u;
|
|
76
115
|
|
|
77
116
|
function isSurfaceAuthority(value: unknown): value is SurfaceModuleAuthority {
|
|
@@ -125,6 +164,10 @@ async function resumeBody(record: Record<string, unknown>, runId: string, source
|
|
|
125
164
|
throw new CloudFlowError('unsupported_source', 'Cannot resume a run with extensions: Cloud must expose their original submissions.');
|
|
126
165
|
}
|
|
127
166
|
}
|
|
167
|
+
const repositoryGrant = readCloudRepositoryGrant(authority.repository);
|
|
168
|
+
if (authority.repository !== undefined && repositoryGrant === undefined) {
|
|
169
|
+
throw new CloudFlowError('invalid_response', 'Cloud run carries an invalid repository grant; refusing to widen or alter it.');
|
|
170
|
+
}
|
|
128
171
|
let workflow = record.workflow;
|
|
129
172
|
if (source !== undefined) {
|
|
130
173
|
try { workflow = await readFile(source, 'utf8'); }
|
|
@@ -144,6 +187,7 @@ async function resumeBody(record: Record<string, unknown>, runId: string, source
|
|
|
144
187
|
surface: await resumeSurface(authority.source.surface, source),
|
|
145
188
|
});
|
|
146
189
|
return { workflow, authoredAuthority, fileType: 'ts', relayflowVersion: 'v2', resume: runId,
|
|
190
|
+
...(repositoryGrant === undefined ? {} : { repositoryGrant }),
|
|
147
191
|
...(typeof record.workspaceId === 'string' ? { workspaceId: record.workspaceId } : {}) };
|
|
148
192
|
}
|
|
149
193
|
|
|
@@ -160,18 +204,19 @@ export async function answerCloudFlow(runId: string, answer: boolean, options: C
|
|
|
160
204
|
if (!waitId || (state.humanWait && state.humanWait.waitId !== waitId)) {
|
|
161
205
|
throw new CloudFlowError('invalid_response', 'Cloud answer record does not identify the run’s parked wait.');
|
|
162
206
|
}
|
|
163
|
-
|
|
164
|
-
if (recorded && (recorded
|
|
165
|
-
|| (recorded.note !== undefined && recorded.note !== options.note))) {
|
|
207
|
+
const note = normalizedAnswerNote(options.note);
|
|
208
|
+
if (recorded && !sameRecordedAnswer(recorded, waitId, answer, note)) {
|
|
166
209
|
throw new CloudFlowError('invalid_input', 'The recorded answer differs; a closed human wait cannot be changed.');
|
|
167
210
|
}
|
|
168
211
|
const body = await resumeBody(record as Record<string, unknown>, runId, options.source);
|
|
169
212
|
let answerRecorded = recorded !== undefined;
|
|
170
213
|
try {
|
|
171
214
|
if (!answerRecorded) {
|
|
172
|
-
const accepted = await post(`${route(runId)}/answer`, { waitId, answer, ...(
|
|
173
|
-
|
|
174
|
-
if (!
|
|
215
|
+
const accepted = await post(`${route(runId)}/answer`, { waitId, answer, ...(note === undefined ? {} : { note }) }, options);
|
|
216
|
+
const acknowledged = readCloudHumanAnswerRecord(accepted, runId);
|
|
217
|
+
if (!acknowledged.wait || !acknowledged.recorded
|
|
218
|
+
|| acknowledged.wait.waitId !== waitId
|
|
219
|
+
|| !sameRecordedAnswer(acknowledged.recorded, waitId, answer, note)) {
|
|
175
220
|
throw new CloudFlowError('invalid_response', 'Cloud did not confirm the human answer.');
|
|
176
221
|
}
|
|
177
222
|
answerRecorded = true;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { isCloudRecord } from './cloud-http.js';
|
|
2
|
+
|
|
3
|
+
export interface CloudRepositoryGrant {
|
|
4
|
+
host?: 'gitlab';
|
|
5
|
+
owner: string;
|
|
6
|
+
repo: string;
|
|
7
|
+
baseBranch: string;
|
|
8
|
+
baseSha: string;
|
|
9
|
+
branch: string;
|
|
10
|
+
mode?: 'head';
|
|
11
|
+
workflows?: true;
|
|
12
|
+
access?: 'read';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const coordinate = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/u;
|
|
16
|
+
|
|
17
|
+
function validGitlabNamespace(value: unknown): value is string {
|
|
18
|
+
if (typeof value !== 'string' || value.length > 255) return false;
|
|
19
|
+
const parts = value.split('/');
|
|
20
|
+
return parts.length >= 1 && parts.length <= 20 && parts.every(part => (
|
|
21
|
+
coordinate.test(part) && !part.endsWith('.') && !part.endsWith('.git') && !part.endsWith('.atom')
|
|
22
|
+
));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function validRepositoryBranch(value: unknown): value is string {
|
|
26
|
+
return typeof value === 'string'
|
|
27
|
+
&& /^[A-Za-z0-9][A-Za-z0-9._/-]{0,199}$/u.test(value)
|
|
28
|
+
&& value !== 'HEAD'
|
|
29
|
+
&& !value.includes('..')
|
|
30
|
+
&& !value.includes('//')
|
|
31
|
+
&& value.split('/').every(part => (
|
|
32
|
+
part !== '' && !part.startsWith('.') && !part.endsWith('.') && !part.endsWith('.lock')
|
|
33
|
+
));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Rebuild the request portion of persisted Cloud repository authority.
|
|
38
|
+
* Cloud re-admits this request against the persisted identity and current
|
|
39
|
+
* connection; the SDK must neither infer missing authority nor widen it.
|
|
40
|
+
*/
|
|
41
|
+
export function readCloudRepositoryGrant(value: unknown): CloudRepositoryGrant | undefined {
|
|
42
|
+
if (value === undefined) return undefined;
|
|
43
|
+
if (!isCloudRecord(value)) return undefined;
|
|
44
|
+
const gitlab = value.host === 'gitlab';
|
|
45
|
+
if ((value.host !== undefined && value.host !== 'github' && value.host !== 'gitlab')
|
|
46
|
+
|| typeof value.owner !== 'string'
|
|
47
|
+
|| !(gitlab ? validGitlabNamespace(value.owner) : coordinate.test(value.owner))
|
|
48
|
+
|| typeof value.repo !== 'string'
|
|
49
|
+
|| !/^[A-Za-z0-9_.-]{1,100}$/u.test(value.repo)
|
|
50
|
+
|| value.repo === '.' || value.repo === '..'
|
|
51
|
+
|| (gitlab && (value.repo.endsWith('.git') || value.repo.endsWith('.atom') || value.repo.endsWith('.')))
|
|
52
|
+
|| !validRepositoryBranch(value.baseBranch)
|
|
53
|
+
|| !validRepositoryBranch(value.branch)
|
|
54
|
+
|| (value.mode !== undefined && value.mode !== 'new' && value.mode !== 'head')
|
|
55
|
+
|| (value.workflows !== undefined && typeof value.workflows !== 'boolean')
|
|
56
|
+
|| (gitlab && value.workflows === true)
|
|
57
|
+
|| (value.access !== undefined && value.access !== 'read')
|
|
58
|
+
|| (value.access === 'read' && value.workflows === true)
|
|
59
|
+
|| (gitlab && value.access === 'read')
|
|
60
|
+
|| (value.mode !== 'head' && !value.branch.startsWith('relayflow/'))
|
|
61
|
+
|| value.branch === value.baseBranch
|
|
62
|
+
|| typeof value.baseSha !== 'string'
|
|
63
|
+
|| !/^[a-f0-9]{40}$/u.test(value.baseSha)) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
...(gitlab ? { host: 'gitlab' as const } : {}),
|
|
68
|
+
owner: value.owner.toLowerCase(),
|
|
69
|
+
repo: value.repo.toLowerCase(),
|
|
70
|
+
baseBranch: value.baseBranch,
|
|
71
|
+
baseSha: value.baseSha,
|
|
72
|
+
branch: value.branch,
|
|
73
|
+
...(value.mode === 'head' ? { mode: 'head' as const } : {}),
|
|
74
|
+
...(value.workflows === true ? { workflows: true as const } : {}),
|
|
75
|
+
...(value.access === 'read' ? { access: 'read' as const } : {}),
|
|
76
|
+
};
|
|
77
|
+
}
|