orizu 0.5.38 → 0.5.39

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 (91) hide show
  1. package/README.md +18 -3
  2. package/dist/app-commands.d.ts.map +1 -1
  3. package/dist/app-commands.js +215 -57
  4. package/dist/app-publish-failure.d.ts +6 -0
  5. package/dist/app-publish-failure.d.ts.map +1 -0
  6. package/dist/app-publish-failure.js +9 -0
  7. package/dist/app-publish-paths.d.ts +4 -0
  8. package/dist/app-publish-paths.d.ts.map +1 -0
  9. package/dist/app-publish-paths.js +32 -0
  10. package/dist/app-publish-workspace.d.ts +16 -0
  11. package/dist/app-publish-workspace.d.ts.map +1 -0
  12. package/dist/app-publish-workspace.js +175 -0
  13. package/dist/artifacts-git-runtime.d.ts +5 -0
  14. package/dist/artifacts-git-runtime.d.ts.map +1 -1
  15. package/dist/artifacts-git-runtime.js +70 -25
  16. package/dist/artifacts-session-merge.d.ts +62 -0
  17. package/dist/artifacts-session-merge.d.ts.map +1 -0
  18. package/dist/artifacts-session-merge.js +123 -0
  19. package/dist/dataset-append-workflow.d.ts +12 -0
  20. package/dist/dataset-append-workflow.d.ts.map +1 -0
  21. package/dist/dataset-append-workflow.js +198 -0
  22. package/dist/dataset-commands.d.ts.map +1 -1
  23. package/dist/dataset-commands.js +11 -130
  24. package/dist/dataset-transfer-download.js +6 -6
  25. package/dist/dataset-transfer-upload.js +8 -8
  26. package/dist/git-credential.d.ts +1 -1
  27. package/dist/git-credential.d.ts.map +1 -1
  28. package/dist/git-credential.js +8 -1
  29. package/dist/help.js +3 -3
  30. package/dist/hosted-boot.d.ts +11 -0
  31. package/dist/hosted-boot.d.ts.map +1 -1
  32. package/dist/hosted-boot.js +46 -1
  33. package/dist/hosted-session-cli.d.ts.map +1 -1
  34. package/dist/hosted-session-cli.js +6 -1
  35. package/dist/hosted-session-seed.d.ts +45 -0
  36. package/dist/hosted-session-seed.d.ts.map +1 -0
  37. package/dist/hosted-session-seed.js +61 -0
  38. package/dist/jsonl-stream.d.ts +1 -0
  39. package/dist/jsonl-stream.d.ts.map +1 -1
  40. package/dist/jsonl-stream.js +7 -0
  41. package/dist/provider-list-workflow.d.ts +3 -0
  42. package/dist/provider-list-workflow.d.ts.map +1 -0
  43. package/dist/provider-list-workflow.js +95 -0
  44. package/dist/provider-wire-record.d.ts +3 -0
  45. package/dist/provider-wire-record.d.ts.map +1 -0
  46. package/dist/provider-wire-record.js +4 -0
  47. package/dist/providers-cli.d.ts.map +1 -1
  48. package/dist/providers-cli.js +5 -15
  49. package/dist/publish-merge-job.d.ts +68 -0
  50. package/dist/publish-merge-job.d.ts.map +1 -0
  51. package/dist/publish-merge-job.js +320 -0
  52. package/dist/publish-merge-timing.d.ts +18 -0
  53. package/dist/publish-merge-timing.d.ts.map +1 -0
  54. package/dist/publish-merge-timing.js +23 -0
  55. package/dist/workbench-cli.d.ts +4 -0
  56. package/dist/workbench-cli.d.ts.map +1 -1
  57. package/dist/workbench-cli.js +11 -1
  58. package/dist/workspace-bootstrap-job.d.ts +1 -0
  59. package/dist/workspace-bootstrap-job.d.ts.map +1 -1
  60. package/dist/workspace-bootstrap-job.js +1 -1
  61. package/package.json +5 -2
  62. package/src/app-commands.ts +234 -66
  63. package/src/app-publish-failure.ts +7 -0
  64. package/src/app-publish-paths.ts +27 -0
  65. package/src/app-publish-workspace.ts +207 -0
  66. package/src/artifacts-git-runtime.ts +73 -31
  67. package/src/artifacts-session-merge.ts +253 -0
  68. package/src/dataset-append-workflow.ts +205 -0
  69. package/src/dataset-commands.ts +10 -170
  70. package/src/dataset-transfer-download.ts +5 -5
  71. package/src/dataset-transfer-upload.ts +7 -7
  72. package/src/git-credential.ts +8 -1
  73. package/src/help.ts +3 -3
  74. package/src/hosted-boot.ts +56 -1
  75. package/src/hosted-session-cli.ts +6 -1
  76. package/src/hosted-session-seed.ts +78 -0
  77. package/src/jsonl-stream.ts +8 -0
  78. package/src/provider-list-workflow.ts +108 -0
  79. package/src/provider-wire-record.ts +4 -0
  80. package/src/providers-cli.ts +5 -13
  81. package/src/publish-merge-job.ts +350 -0
  82. package/src/publish-merge-timing.ts +27 -0
  83. package/src/workbench-cli.ts +15 -1
  84. package/src/workspace-bootstrap-job.ts +1 -1
  85. package/vendor/skills/orizu/flows/onboard.md +1 -1
  86. package/vendor/skills/orizu/references/authority-map.md +2 -2
  87. package/vendor/skills/orizu/references/building-apps.md +24 -0
  88. package/vendor/skills/orizu/references/cli-reference.md +13 -4
  89. package/vendor/skills/orizu/references/optimization-reports.md +1 -1
  90. package/vendor/skills/orizu/references/primer.md +1 -0
  91. package/vendor/skills/orizu/references/prompt-control-plane.md +9 -5
@@ -0,0 +1,320 @@
1
+ /** ORI-2280: the agent-free publish merge one-shot. The coordinator runs it
2
+ * in a sandbox with network access to Artifacts only. It merges one session
3
+ * copy into its team copy with `publishSessionMerge`, getting one scoped key
4
+ * at a time from the web app and revoking every key before it reports. */
5
+ import { execFile } from 'node:child_process';
6
+ import { mkdtemp, rm } from 'node:fs/promises';
7
+ import { tmpdir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ import { promisify } from 'node:util';
10
+ import { createEphemeralAskPass } from './artifacts-git-runtime.js';
11
+ import { publishSessionMerge } from './artifacts-session-merge.js';
12
+ import { CLOUDFLARE_ARTIFACTS_HOST_PATTERN } from './cloudflare-artifacts-git-remote.js';
13
+ import { assertSecureTokenTransport } from './http.js';
14
+ import { assertWorkspaceBootstrapRemote, isLoopbackOrigin } from './workspace-bootstrap-job.js';
15
+ import { PUBLISH_MERGE_CONFLICT_FILES_LIMIT, PUBLISH_MERGE_CONFLICT_PATH_MAX, PUBLISH_MERGE_COORDINATOR_WALL_MS, PUBLISH_MERGE_WALL_AT_ENV, } from './publish-merge-timing.js';
16
+ import { DEFAULT_REPOSITORY_BACKUP_LIMITS } from './repository-backup-core.js';
17
+ const PUBLISH_MERGE_JOB_CAPABILITY = 'publish-merge-job:v1';
18
+ /** Timing. The job's wall is the earlier of:
19
+ * - ORIZU_PUBLISH_MERGE_WALL_AT, when set: the epoch-ms moment the
20
+ * coordinator stops the sandbox (its createdAt + 120 s, so sandbox create
21
+ * and CLI boot are already counted);
22
+ * - 110 s from the job's own start, the fallback when it is not set.
23
+ * Within it:
24
+ * - the merge ends by 90 s from start, and always 10 s before the wall;
25
+ * - revoking the keys still live ends 10 s before the wall, each call at
26
+ * most 15 s or whatever is left;
27
+ * - the last 10 s are kept for posting the result, so it always goes out.
28
+ * All of this is well below the read keys' five-minute life, so no key is
29
+ * ever renewed. */
30
+ const JOB_DEADLINE_MS = 90_000;
31
+ const RESULT_RESERVE_MS = 10_000;
32
+ const JOB_WALL_MS = PUBLISH_MERGE_COORDINATOR_WALL_MS - RESULT_RESERVE_MS;
33
+ const LATE_CALL_TIMEOUT_MS = 15_000;
34
+ const GIT_TIMEOUT_MS = 60_000;
35
+ /** ADR-012's envelope for a repository's whole object graph. The graph is
36
+ * always larger than the content it was seeded from, so ADR-011's 1 GiB
37
+ * content limit is not the measure here. */
38
+ const ADMISSION = {
39
+ totalBytes: DEFAULT_REPOSITORY_BACKUP_LIMITS.maxObjectBytes,
40
+ objectBytes: DEFAULT_REPOSITORY_BACKUP_LIMITS.maxSingleObjectBytes,
41
+ objects: DEFAULT_REPOSITORY_BACKUP_LIMITS.maxObjects,
42
+ commits: DEFAULT_REPOSITORY_BACKUP_LIMITS.maxCommits,
43
+ };
44
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
45
+ const IDENTITY = {
46
+ GIT_AUTHOR_NAME: 'Orizu',
47
+ GIT_AUTHOR_EMAIL: 'publish@orizu.invalid',
48
+ GIT_COMMITTER_NAME: 'Orizu',
49
+ GIT_COMMITTER_EMAIL: 'publish@orizu.invalid',
50
+ };
51
+ class JobFailure extends Error {
52
+ code;
53
+ constructor(code) {
54
+ super(code);
55
+ this.code = code;
56
+ }
57
+ }
58
+ function resolvePublishMergeJobEnv(env) {
59
+ const value = (name) => env[name]?.trim() ?? '';
60
+ const resolved = {
61
+ bootSecret: value('ORIZU_BOOT_SECRET'),
62
+ jobId: value('ORIZU_PUBLISH_MERGE_JOB_ID'),
63
+ coordinatorUrl: value('ORIZU_COORDINATOR_URL').replace(/\/+$/, ''),
64
+ baseUrl: value('ORIZU_BASE_URL').replace(/\/+$/, ''),
65
+ expectedGitHost: value('ORIZU_PUBLISH_MERGE_GIT_HOST').toLowerCase(),
66
+ };
67
+ if (Object.values(resolved).some((item) => item.length === 0))
68
+ return 'missing required env';
69
+ const wallAtText = value(PUBLISH_MERGE_WALL_AT_ENV);
70
+ const wallAt = wallAtText ? Number(wallAtText) : undefined;
71
+ if (wallAt !== undefined && (!/^[0-9]{13}$/.test(wallAtText) || !Number.isSafeInteger(wallAt)))
72
+ return 'invalid wall deadline';
73
+ try {
74
+ assertSecureTokenTransport(resolved.coordinatorUrl);
75
+ assertSecureTokenTransport(resolved.baseUrl);
76
+ }
77
+ catch {
78
+ return 'insecure coordinator or base URL';
79
+ }
80
+ const localGitAllowed = isLoopbackOrigin(resolved.coordinatorUrl) && isLoopbackOrigin(resolved.baseUrl) && resolved.expectedGitHost === 'localhost';
81
+ if (!UUID_PATTERN.test(resolved.jobId) || (!CLOUDFLARE_ARTIFACTS_HOST_PATTERN.test(resolved.expectedGitHost) && !localGitAllowed)) {
82
+ return 'invalid job id or git host';
83
+ }
84
+ return wallAt === undefined ? resolved : { ...resolved, wallAt };
85
+ }
86
+ /** Every remote must be an https repository in the hosted namespace on the expected host. */
87
+ function assertRemote(remote, expectedGitHost) {
88
+ try {
89
+ assertWorkspaceBootstrapRemote(String(remote), expectedGitHost);
90
+ }
91
+ catch {
92
+ throw new JobFailure('scope_refused');
93
+ }
94
+ return new URL(String(remote)).toString();
95
+ }
96
+ async function post(url, bearer, body, signal) {
97
+ let response;
98
+ try {
99
+ response = await fetch(url, {
100
+ method: 'POST',
101
+ redirect: 'error',
102
+ signal,
103
+ headers: { authorization: `Bearer ${bearer}`, 'content-type': 'application/json' },
104
+ body: JSON.stringify(body),
105
+ });
106
+ }
107
+ catch {
108
+ throw new JobFailure(signal?.aborted ? 'job_timed_out' : 'api_unavailable');
109
+ }
110
+ const value = await response.json().catch(() => null);
111
+ const record = value && typeof value === 'object' && !Array.isArray(value) ? value : null;
112
+ // The session lost its authority while a key was being minted: a refusal.
113
+ if (response.status === 403 && record?.error === 'gate_denied')
114
+ throw new JobFailure('denied');
115
+ if (response.status === 401 || response.status === 403)
116
+ throw new JobFailure('scope_refused');
117
+ if (!response.ok || !record)
118
+ throw new JobFailure('api_unavailable');
119
+ return record;
120
+ }
121
+ /** The permission check's answer, or unavailable for anything else. */
122
+ function gateAllows(value) {
123
+ const keys = Object.keys(value).sort().join(',');
124
+ if (keys === 'allowed' && value.allowed === true)
125
+ return true;
126
+ if (keys === 'allowed,reason' && value.allowed === false && typeof value.reason === 'string')
127
+ return false;
128
+ throw new JobFailure('api_unavailable');
129
+ }
130
+ /** ADR-012: the team copy is canonical state, so the merged graph must fit
131
+ * the admission envelope before a write key is asked for. The merge folder
132
+ * holds exactly both copies' fetched objects and the merge commit. */
133
+ async function assertMergeAdmitted(worktree, signal, narrower = {}) {
134
+ const { stdout } = await promisify(execFile)('git', ['cat-file', '--batch-all-objects', '--batch-check=%(objecttype) %(objectsize)'], { cwd: worktree, maxBuffer: 64 * 1024 * 1024, signal });
135
+ if (!isMergeInventoryAdmitted(stdout, narrower))
136
+ throw new JobFailure('admission_refused');
137
+ }
138
+ /** One `<type> <size>` line per object, as `git cat-file --batch-check` prints them. */
139
+ export function isMergeInventoryAdmitted(inventory, narrower = {}) {
140
+ const limits = Object.fromEntries(Object.entries(ADMISSION).map(([key, max]) => [key, Math.min(max, narrower[key] ?? max)]));
141
+ let totalBytes = 0;
142
+ let objects = 0;
143
+ let commits = 0;
144
+ for (const line of inventory.split('\n')) {
145
+ if (!line)
146
+ continue;
147
+ const [type, size] = line.split(' ');
148
+ const bytes = Number(size);
149
+ objects += 1;
150
+ totalBytes += bytes;
151
+ if (type === 'commit')
152
+ commits += 1;
153
+ if (!Number.isSafeInteger(bytes) || bytes > limits.objectBytes)
154
+ return false;
155
+ }
156
+ return totalBytes <= limits.totalBytes && objects <= limits.objects && commits <= limits.commits;
157
+ }
158
+ /** A post with its own time limit. An AbortController and timer, as for the
159
+ * deadline: AbortSignal.timeout did not fire inside the job under bun test. */
160
+ async function postWithin(timeoutMs, url, bearer, body) {
161
+ const stop = new AbortController();
162
+ const timer = setTimeout(() => stop.abort(), timeoutMs);
163
+ try {
164
+ return await post(url, bearer, body, stop.signal);
165
+ }
166
+ finally {
167
+ clearTimeout(timer);
168
+ }
169
+ }
170
+ /** The conflict list the job reports, bounded so the result always fits the
171
+ * coordinator's body limit. A path too long to name is counted instead. */
172
+ export function boundConflictFiles(files) {
173
+ const named = files.filter((file) => file.length <= PUBLISH_MERGE_CONFLICT_PATH_MAX).slice(0, PUBLISH_MERGE_CONFLICT_FILES_LIMIT);
174
+ return { files: named, moreFiles: files.length - named.length };
175
+ }
176
+ function toOutcome(result) {
177
+ switch (result.kind) {
178
+ case 'merged':
179
+ return { outcome: 'merged', mergeSha: result.mergeSha };
180
+ case 'already_merged':
181
+ return { outcome: 'already_merged', headSha: result.canonicalSha };
182
+ case 'conflict':
183
+ return { outcome: 'conflict', ...boundConflictFiles(result.files) };
184
+ case 'denied':
185
+ return { outcome: 'denied' };
186
+ case 'race_lost':
187
+ return { outcome: 'race_lost' };
188
+ }
189
+ }
190
+ export async function runPublishMergeJob(options) {
191
+ const { env } = options;
192
+ const startedAt = Date.now();
193
+ const wallEnd = Math.min(startedAt + JOB_WALL_MS, env.wallAt ?? Number.POSITIVE_INFINITY);
194
+ const reserveMs = Math.min(options.timing?.resultReserveMs ?? RESULT_RESERVE_MS, RESULT_RESERVE_MS);
195
+ const lateCallMs = Math.min(options.timing?.lateCallMs ?? LATE_CALL_TIMEOUT_MS, LATE_CALL_TIMEOUT_MS);
196
+ const stop = new AbortController();
197
+ const timer = setTimeout(() => stop.abort(), Math.max(0, Math.min(options.deadlineMs ?? JOB_DEADLINE_MS, wallEnd - reserveMs - startedAt)));
198
+ const deadline = stop.signal;
199
+ const api = (action) => `${env.baseUrl}/api/internal/publish-merge/${env.jobId}/${action}`;
200
+ const issued = [];
201
+ let jobToken = '';
202
+ /** A late call's bound: its own limit, or the time left before the last `keepMs` of the wall. */
203
+ const lateBound = (keepMs) => Math.min(lateCallMs, wallEnd - keepMs - Date.now());
204
+ const revokeCall = async (target, tokenId) => {
205
+ const bound = lateBound(reserveMs);
206
+ if (bound <= 0)
207
+ throw new JobFailure('credentials_pending');
208
+ return postWithin(bound, api('revoke'), jobToken, { target, tokenId });
209
+ };
210
+ let outcome;
211
+ const root = await mkdtemp(join(tmpdir(), 'orizu-publish-merge-'));
212
+ try {
213
+ const askPass = await createEphemeralAskPass(root);
214
+ const claimed = await post(`${env.coordinatorUrl}/publish-merge-jobs/${env.jobId}/claim`, env.bootSecret, {}, deadline);
215
+ if (typeof claimed.jobToken !== 'string' || !claimed.jobToken)
216
+ throw new JobFailure('scope_refused');
217
+ jobToken = claimed.jobToken;
218
+ const spec = await post(api('spec'), jobToken, {}, deadline);
219
+ const sessionRemote = assertRemote(spec.session?.remote, env.expectedGitHost);
220
+ if (spec.jobId !== env.jobId || typeof spec.sessionCommitSha !== 'string' || spec.ref !== 'refs/heads/main' || typeof spec.commitMessage !== 'string') {
221
+ throw new JobFailure('scope_refused');
222
+ }
223
+ const mint = async (target, scope) => {
224
+ const value = await post(api('credential'), jobToken, { target, scope }, deadline);
225
+ if (typeof value.tokenId !== 'string' || typeof value.plaintext !== 'string')
226
+ throw new JobFailure('scope_refused');
227
+ issued.push({ target, tokenId: value.tokenId });
228
+ return { tokenId: value.tokenId, plaintext: value.plaintext, remote: assertRemote(value.remote, env.expectedGitHost) };
229
+ };
230
+ const revoke = async (target, tokenId) => {
231
+ const value = await revokeCall(target, tokenId);
232
+ if (value.revoked !== true)
233
+ throw new JobFailure('credentials_pending');
234
+ issued.splice(issued.findIndex((item) => item.tokenId === tokenId), 1);
235
+ };
236
+ const auth = (credential) => ({ askPassPath: askPass.path, token: credential.plaintext });
237
+ const sessionRead = await mint('session', 'read');
238
+ if (sessionRead.remote !== sessionRemote)
239
+ throw new JobFailure('scope_refused');
240
+ const teamRead = await mint('team', 'read');
241
+ const result = await publishSessionMerge({
242
+ root,
243
+ canonical: { remote: teamRead.remote, auth: auth(teamRead) },
244
+ source: { remote: sessionRemote, auth: auth(sessionRead) },
245
+ canonicalRef: 'refs/heads/main',
246
+ sourceRef: 'refs/heads/main',
247
+ expectedSourceSha: spec.sessionCommitSha,
248
+ commitMessage: spec.commitMessage,
249
+ commitIdentityEnv: IDENTITY,
250
+ authorize: async (merge) => {
251
+ await assertMergeAdmitted(merge.worktree, deadline, options.admission);
252
+ return gateAllows(await post(api('gate'), jobToken, {}, deadline));
253
+ },
254
+ withCanonicalWrite: async (push) => {
255
+ const write = await mint('team', 'write');
256
+ if (write.remote !== teamRead.remote)
257
+ throw new JobFailure('scope_refused');
258
+ try {
259
+ return await push(auth(write));
260
+ }
261
+ finally {
262
+ await revoke('team', write.tokenId);
263
+ }
264
+ },
265
+ timeoutMs: GIT_TIMEOUT_MS,
266
+ signal: deadline,
267
+ });
268
+ outcome = toOutcome(result);
269
+ }
270
+ catch (error) {
271
+ if (error instanceof JobFailure && error.code === 'denied')
272
+ outcome = { outcome: 'denied' };
273
+ else if (deadline.aborted)
274
+ outcome = { outcome: 'failed', code: 'job_timed_out' };
275
+ else
276
+ outcome = { outcome: 'failed', code: error instanceof JobFailure && error.code !== 'denied' ? error.code : 'publish_failed' };
277
+ }
278
+ finally {
279
+ clearTimeout(timer);
280
+ // Revoke whatever is still live, newest first, even past the deadline; an
281
+ // unrevoked key wins over the merge outcome because its authority is then uncertain.
282
+ for (const { target, tokenId } of [...issued].reverse()) {
283
+ try {
284
+ const value = await revokeCall(target, tokenId);
285
+ if (value.revoked !== true)
286
+ throw new JobFailure('credentials_pending');
287
+ }
288
+ catch {
289
+ outcome = { outcome: 'failed', code: 'credentials_pending' };
290
+ }
291
+ }
292
+ await rm(root, { recursive: true, force: true });
293
+ }
294
+ let reported = false;
295
+ try {
296
+ const bound = lateBound(0);
297
+ if (bound <= 0)
298
+ throw new JobFailure('job_timed_out');
299
+ await postWithin(bound, `${env.coordinatorUrl}/publish-merge-jobs/${env.jobId}/result`, env.bootSecret, outcome);
300
+ reported = true;
301
+ }
302
+ catch {
303
+ reported = false;
304
+ }
305
+ return { reported, outcome };
306
+ }
307
+ export async function publishMergeJobCommand(args, io) {
308
+ if (args.includes('--capability-check')) {
309
+ io.print(PUBLISH_MERGE_JOB_CAPABILITY);
310
+ return 0;
311
+ }
312
+ const env = resolvePublishMergeJobEnv(process.env);
313
+ if (typeof env === 'string') {
314
+ io.printErr?.(`publish-merge-job: ${env}`);
315
+ return 1;
316
+ }
317
+ const result = await runPublishMergeJob({ env });
318
+ io.print(JSON.stringify(result.outcome));
319
+ return result.reported ? 0 : 1;
320
+ }
@@ -0,0 +1,18 @@
1
+ /** ORI-2280: the publish merge job's wall, shared by the coordinator, which
2
+ * stops the sandbox at it, and the CLI job, which must report before it. No
3
+ * Node or Worker imports: both sides compile this file. */
4
+ /** From the coordinator creating the job to it stopping the sandbox. */
5
+ export declare const PUBLISH_MERGE_COORDINATOR_WALL_MS: number;
6
+ /** The coordinator sets this on the sandbox to `createdAt + PUBLISH_MERGE_COORDINATOR_WALL_MS`, in epoch milliseconds. */
7
+ export declare const PUBLISH_MERGE_WALL_AT_ENV = "ORIZU_PUBLISH_MERGE_WALL_AT";
8
+ /** A conflict result names at most this many paths, each at most
9
+ * PUBLISH_MERGE_CONFLICT_PATH_MAX characters, and counts the rest, so the
10
+ * result always fits the coordinator's result body limit. */
11
+ export declare const PUBLISH_MERGE_CONFLICT_FILES_LIMIT = 200;
12
+ export declare const PUBLISH_MERGE_CONFLICT_PATH_MAX = 1024;
13
+ /** The failure codes the sandbox may report. The coordinator's own codes
14
+ * (`timed_out`, `provider_unavailable`, `snapshot_missing_command`, ...) are
15
+ * not among them, so a reported failure always says which side saw it. */
16
+ export declare const PUBLISH_MERGE_JOB_FAILURE_CODES: readonly ["scope_refused", "admission_refused", "credentials_pending", "api_unavailable", "job_timed_out", "publish_failed"];
17
+ export type PublishMergeJobFailureCode = (typeof PUBLISH_MERGE_JOB_FAILURE_CODES)[number];
18
+ //# sourceMappingURL=publish-merge-timing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-merge-timing.d.ts","sourceRoot":"","sources":["../src/publish-merge-timing.ts"],"names":[],"mappings":"AAAA;;2DAE2D;AAE3D,wEAAwE;AACxE,eAAO,MAAM,iCAAiC,QAAgB,CAAA;AAC9D,0HAA0H;AAC1H,eAAO,MAAM,yBAAyB,gCAAgC,CAAA;AAEtE;;6DAE6D;AAC7D,eAAO,MAAM,kCAAkC,MAAM,CAAA;AACrD,eAAO,MAAM,+BAA+B,OAAO,CAAA;AAEnD;;0EAE0E;AAC1E,eAAO,MAAM,+BAA+B,8HAOlC,CAAA;AACV,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,+BAA+B,CAAC,CAAC,MAAM,CAAC,CAAA"}
@@ -0,0 +1,23 @@
1
+ /** ORI-2280: the publish merge job's wall, shared by the coordinator, which
2
+ * stops the sandbox at it, and the CLI job, which must report before it. No
3
+ * Node or Worker imports: both sides compile this file. */
4
+ /** From the coordinator creating the job to it stopping the sandbox. */
5
+ export const PUBLISH_MERGE_COORDINATOR_WALL_MS = 2 * 60 * 1000;
6
+ /** The coordinator sets this on the sandbox to `createdAt + PUBLISH_MERGE_COORDINATOR_WALL_MS`, in epoch milliseconds. */
7
+ export const PUBLISH_MERGE_WALL_AT_ENV = 'ORIZU_PUBLISH_MERGE_WALL_AT';
8
+ /** A conflict result names at most this many paths, each at most
9
+ * PUBLISH_MERGE_CONFLICT_PATH_MAX characters, and counts the rest, so the
10
+ * result always fits the coordinator's result body limit. */
11
+ export const PUBLISH_MERGE_CONFLICT_FILES_LIMIT = 200;
12
+ export const PUBLISH_MERGE_CONFLICT_PATH_MAX = 1024;
13
+ /** The failure codes the sandbox may report. The coordinator's own codes
14
+ * (`timed_out`, `provider_unavailable`, `snapshot_missing_command`, ...) are
15
+ * not among them, so a reported failure always says which side saw it. */
16
+ export const PUBLISH_MERGE_JOB_FAILURE_CODES = [
17
+ 'scope_refused',
18
+ 'admission_refused',
19
+ 'credentials_pending',
20
+ 'api_unavailable',
21
+ 'job_timed_out',
22
+ 'publish_failed',
23
+ ];
@@ -24,6 +24,8 @@ export interface WorkbenchRunCosts {
24
24
  export interface WorkbenchRunSummary extends WorkbenchRunCosts {
25
25
  id: string;
26
26
  status: string;
27
+ /** Why a failed run failed, in plain words, mapped by the server (ORI-2264). */
28
+ failureReason?: string;
27
29
  }
28
30
  export interface WorkbenchSession {
29
31
  id: string;
@@ -53,6 +55,8 @@ export interface WorkbenchRun extends WorkbenchRunCosts {
53
55
  status: string;
54
56
  evidence?: Record<string, unknown>;
55
57
  summary?: Record<string, unknown>;
58
+ /** Why a failed run failed, in plain words, mapped by the server (ORI-2264). */
59
+ failureReason?: string;
56
60
  latestSequence?: number;
57
61
  startedAt?: string | null;
58
62
  finishedAt?: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"workbench-cli.d.ts","sourceRoot":"","sources":["../src/workbench-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workbench-cli.d.ts","sourceRoot":"","sources":["../src/workbench-cli.ts"],"names":[],"mappings":"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"}
@@ -763,6 +763,9 @@ function formatSessionStatus(result) {
763
763
  const cost = finiteOrNull(run.modelCostUsd);
764
764
  const suffix = cost !== null ? ` ${formatUsd(cost)}` : '';
765
765
  lines.push(` run ${run.id} ${run.status}${suffix}`);
766
+ const why = failedRunLine(run);
767
+ if (why)
768
+ lines.push(` ${why}`);
766
769
  }
767
770
  return lines.join('\n');
768
771
  }
@@ -797,10 +800,17 @@ function formatSessionFinishOutcome(result) {
797
800
  const deletions = typeof proposed.deletions === 'number' ? proposed.deletions : 0;
798
801
  return `manifest ${id} ${status} repo_merge (${files} files, +${additions}/-${deletions})`;
799
802
  }
803
+ // The web page's failed line, with the reason the server mapped (ORI-2264).
804
+ function failedRunLine(run) {
805
+ return run.status === 'failed' && typeof run.failureReason === 'string' && run.failureReason
806
+ ? `The agent stopped: ${run.failureReason}.`
807
+ : null;
808
+ }
800
809
  function formatRunStatus(run) {
801
810
  const sequence = typeof run.latestSequence === 'number' ? ` latestSequence=${run.latestSequence}` : '';
802
811
  const costLine = formatCostSummary(run);
803
- return `run ${run.id} ${run.status}${sequence}${costLine ? `\n ${costLine}` : ''}`;
812
+ const why = failedRunLine(run);
813
+ return `run ${run.id} ${run.status}${sequence}${costLine ? `\n ${costLine}` : ''}${why ? `\n ${why}` : ''}`;
804
814
  }
805
815
  // ALI-1045: one compact digest line per event — shared with the attached
806
816
  // `session start --hosted --tail` stream. Full fidelity stays in `--json`.
@@ -25,6 +25,7 @@ export interface WorkspaceBootstrapJobRunResult {
25
25
  state: 'verified' | 'failed';
26
26
  diagnostic: WorkspaceBootstrapFailureCode | null;
27
27
  }
28
+ export declare function isLoopbackOrigin(value: string): boolean;
28
29
  export declare function resolveWorkspaceBootstrapJobEnv(env: Record<string, string | undefined>): {
29
30
  ok: true;
30
31
  value: WorkspaceBootstrapJobEnv;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-bootstrap-job.d.ts","sourceRoot":"","sources":["../src/workspace-bootstrap-job.ts"],"names":[],"mappings":"AAaA,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,4BAA4B,CAAA;AAGnC,eAAO,MAAM,kCAAkC,+BAA+B,CAAA;AAC9E,eAAO,MAAM,6BAA6B,wBAAwB,CAAA;AAQlE,eAAO,MAAM,mCAAmC,SAAU,CAAA;AAC1D,eAAO,MAAM,iDAAiD,SAAU,CAAA;AAExE,eAAO,MAAM,iCAAiC,2IAOpC,CAAA;AAEV,MAAM,MAAM,6BAA6B,GAAG,CAAC,OAAO,iCAAiC,CAAC,CAAC,MAAM,CAAC,CAAA;AAC9F,MAAM,MAAM,0BAA0B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE/F,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAqCD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC5B,UAAU,EAAE,6BAA6B,GAAG,IAAI,CAAA;CACjD;AAyBD,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAErC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAkDtD;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAwB5F;AAqQD,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE,wBAAwB,CAAA;IAC7B,SAAS,CAAC,EAAE,0BAA0B,CAAA;IACtC,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,8BAA8B,CAAC,CA6GzC;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,8BAA8B,GACjC,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
1
+ {"version":3,"file":"workspace-bootstrap-job.d.ts","sourceRoot":"","sources":["../src/workspace-bootstrap-job.ts"],"names":[],"mappings":"AAaA,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,4BAA4B,CAAA;AAGnC,eAAO,MAAM,kCAAkC,+BAA+B,CAAA;AAC9E,eAAO,MAAM,6BAA6B,wBAAwB,CAAA;AAQlE,eAAO,MAAM,mCAAmC,SAAU,CAAA;AAC1D,eAAO,MAAM,iDAAiD,SAAU,CAAA;AAExE,eAAO,MAAM,iCAAiC,2IAOpC,CAAA;AAEV,MAAM,MAAM,6BAA6B,GAAG,CAAC,OAAO,iCAAiC,CAAC,CAAC,MAAM,CAAC,CAAA;AAC9F,MAAM,MAAM,0BAA0B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE/F,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAqCD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC5B,UAAU,EAAE,6BAA6B,GAAG,IAAI,CAAA;CACjD;AAgBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOvD;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAErC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAkDtD;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAwB5F;AAqQD,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE,wBAAwB,CAAA;IAC7B,SAAS,CAAC,EAAE,0BAA0B,CAAA;IACtC,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,8BAA8B,CAAC,CA6GzC;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,8BAA8B,GACjC,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
@@ -37,7 +37,7 @@ class WorkspaceBootstrapFailure extends Error {
37
37
  function isObject(value) {
38
38
  return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
39
39
  }
40
- function isLoopbackOrigin(value) {
40
+ export function isLoopbackOrigin(value) {
41
41
  try {
42
42
  const host = new URL(value).hostname;
43
43
  return host === 'localhost' || host === '127.0.0.1' || host === '::1';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orizu",
3
- "version": "0.5.38",
3
+ "version": "0.5.39",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,6 +18,9 @@
18
18
  "bin": {
19
19
  "orizu": "dist/index.js"
20
20
  },
21
+ "engines": {
22
+ "node": ">=22"
23
+ },
21
24
  "files": [
22
25
  "README.md",
23
26
  "dist",
@@ -35,7 +38,7 @@
35
38
  "dependencies": {
36
39
  "@anthropic-ai/claude-agent-sdk": "0.3.201",
37
40
  "@vercel/sandbox": "1.10.2",
38
- "effect": "3.22.1",
41
+ "effect": "4.0.0",
39
42
  "esbuild": "^0.25.8"
40
43
  },
41
44
  "devDependencies": {