orizu 0.5.42 → 0.5.44
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/account-directory.d.ts.map +1 -1
- package/dist/account-directory.js +4 -22
- package/dist/artifact-archive.d.ts.map +1 -1
- package/dist/artifact-archive.js +2 -0
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +2 -0
- package/dist/hosted-agent-prompt.d.ts +6 -0
- package/dist/hosted-agent-prompt.d.ts.map +1 -1
- package/dist/hosted-agent-prompt.js +11 -0
- package/dist/hosted-boot.d.ts.map +1 -1
- package/dist/hosted-boot.js +44 -7
- package/dist/hosted-bootstrap-rehearsal.d.ts +2 -0
- package/dist/hosted-bootstrap-rehearsal.d.ts.map +1 -1
- package/dist/hosted-bootstrap-rehearsal.js +5 -0
- package/dist/hosted-broker-server.d.ts +2 -0
- package/dist/hosted-broker-server.d.ts.map +1 -1
- package/dist/hosted-broker-server.js +4 -1
- package/dist/hosted-harness-opencode.d.ts +2 -0
- package/dist/hosted-harness-opencode.d.ts.map +1 -1
- package/dist/hosted-harness-opencode.js +2 -2
- package/dist/hosted-live-channel.d.ts +6 -0
- package/dist/hosted-live-channel.d.ts.map +1 -1
- package/dist/hosted-live-channel.js +27 -10
- package/dist/hosted-loop-lifecycle.d.ts +2 -0
- package/dist/hosted-loop-lifecycle.d.ts.map +1 -1
- package/dist/hosted-loop.d.ts +8 -1
- package/dist/hosted-loop.d.ts.map +1 -1
- package/dist/hosted-loop.js +30 -0
- package/dist/hosted-run-event-sink.d.ts +16 -0
- package/dist/hosted-run-event-sink.d.ts.map +1 -1
- package/dist/hosted-run-event-sink.js +102 -3
- package/dist/hosted-session-cli.d.ts.map +1 -1
- package/dist/hosted-session-cli.js +2 -0
- package/dist/hosted-session-seed.d.ts +38 -0
- package/dist/hosted-session-seed.d.ts.map +1 -1
- package/dist/hosted-session-seed.js +69 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -24
- package/dist/repository-backup-core.d.ts.map +1 -1
- package/dist/repository-backup-core.js +2 -0
- package/dist/request-outcome.d.ts +5 -0
- package/dist/request-outcome.d.ts.map +1 -0
- package/dist/request-outcome.js +27 -0
- package/dist/score-save-workflow.d.ts +22 -0
- package/dist/score-save-workflow.d.ts.map +1 -0
- package/dist/score-save-workflow.js +123 -0
- package/dist/skill-installer.d.ts.map +1 -1
- package/dist/skill-installer.js +2 -0
- package/dist/team-create-workflow.d.ts.map +1 -1
- package/dist/team-create-workflow.js +2 -25
- package/dist/team-member-change-workflow.d.ts +25 -0
- package/dist/team-member-change-workflow.d.ts.map +1 -0
- package/dist/team-member-change-workflow.js +132 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +2 -0
- package/package.json +1 -1
- package/src/account-directory.ts +4 -31
- package/src/artifact-archive.ts +2 -0
- package/src/credentials.ts +2 -0
- package/src/hosted-agent-prompt.ts +11 -0
- package/src/hosted-boot.ts +45 -7
- package/src/hosted-bootstrap-rehearsal.ts +6 -0
- package/src/hosted-broker-server.ts +5 -1
- package/src/hosted-harness-opencode.ts +4 -2
- package/src/hosted-live-channel.ts +31 -0
- package/src/hosted-loop-lifecycle.ts +2 -0
- package/src/hosted-loop.ts +36 -0
- package/src/hosted-run-event-sink.ts +111 -3
- package/src/hosted-session-cli.ts +3 -1
- package/src/hosted-session-seed.ts +83 -0
- package/src/index.ts +26 -32
- package/src/repository-backup-core.ts +2 -0
- package/src/request-outcome.ts +28 -0
- package/src/score-save-workflow.ts +137 -0
- package/src/skill-installer.ts +2 -0
- package/src/team-create-workflow.ts +2 -25
- package/src/team-member-change-workflow.ts +146 -0
- package/src/workspace.ts +2 -0
package/dist/hosted-loop.js
CHANGED
|
@@ -201,6 +201,25 @@ function nodeChildSpawner(cmd, opts) {
|
|
|
201
201
|
}
|
|
202
202
|
return { kill: () => child.kill() };
|
|
203
203
|
}
|
|
204
|
+
/** ORI-2512: the longest the end-of-turn save waits for the boot's
|
|
205
|
+
* background fill of the session copy before saving anyway. */
|
|
206
|
+
const BEFORE_SAVE_WAIT_MS = 60_000;
|
|
207
|
+
// Bounded: a stalled background push must never hold the turn's work.
|
|
208
|
+
async function waitForSessionCopyFill(fill, diagnose) {
|
|
209
|
+
let timer;
|
|
210
|
+
try {
|
|
211
|
+
await Promise.race([
|
|
212
|
+
fill(),
|
|
213
|
+
new Promise(resolve => { timer = setTimeout(resolve, BEFORE_SAVE_WAIT_MS); }),
|
|
214
|
+
]);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
diagnose('hosted pre-save wait failed');
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
clearTimeout(timer);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
204
223
|
export async function runHostedLoop(opts) {
|
|
205
224
|
const { context, taskPrompt } = opts;
|
|
206
225
|
const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
@@ -231,6 +250,7 @@ export async function runHostedLoop(opts) {
|
|
|
231
250
|
now: opts.now,
|
|
232
251
|
redactSecretsList: [...(opts.redactSecretsList ?? []), ...redactionListFromEnv()],
|
|
233
252
|
onDiagnostic: diagnose,
|
|
253
|
+
onLiveText: opts.onLiveText,
|
|
234
254
|
});
|
|
235
255
|
// G5 startup canary (fail-closed, POSITIVE CONTROL): when the host applied an
|
|
236
256
|
// enforced egress policy it sets `egressCanaryHost`; probe BOTH the denied host
|
|
@@ -296,6 +316,11 @@ export async function runHostedLoop(opts) {
|
|
|
296
316
|
if (context.runSetupHook && !opts.sharedRuntime?.startupComplete) {
|
|
297
317
|
try {
|
|
298
318
|
const runHook = opts.runSetupHook ?? defaultRunSetupHook;
|
|
319
|
+
// A customer hook may pull from origin, which is the session copy and
|
|
320
|
+
// stays empty until the boot's background fill lands.
|
|
321
|
+
if (opts.beforeSave && existsSync(join(context.workspaceDir, SETUP_HOOK_RELATIVE_PATH))) {
|
|
322
|
+
await waitForSessionCopyFill(opts.beforeSave, diagnose);
|
|
323
|
+
}
|
|
299
324
|
const outcome = await runHook({ workspaceDir: context.workspaceDir });
|
|
300
325
|
await sink.append({
|
|
301
326
|
kind: 'artifact',
|
|
@@ -356,6 +381,8 @@ export async function runHostedLoop(opts) {
|
|
|
356
381
|
diagnose('hosted saving event delivery failed');
|
|
357
382
|
}
|
|
358
383
|
}
|
|
384
|
+
if (opts.beforeSave)
|
|
385
|
+
await waitForSessionCopyFill(opts.beforeSave, diagnose);
|
|
359
386
|
let outcome;
|
|
360
387
|
try {
|
|
361
388
|
const markerValid = hasValidPrebakedMarker(prebakedMarkerPath);
|
|
@@ -471,6 +498,7 @@ export async function runHostedLoop(opts) {
|
|
|
471
498
|
spawned = await spawnImpl({
|
|
472
499
|
model: context.model,
|
|
473
500
|
permission: permissionForOrigin(context.sessionOrigin),
|
|
501
|
+
projectId: context.projectId,
|
|
474
502
|
cwd: context.workspaceDir,
|
|
475
503
|
port: context.opencodePort,
|
|
476
504
|
env: buildOpenCodeSpawnEnv(context),
|
|
@@ -855,6 +883,8 @@ function validateHostedLoopContext(value) {
|
|
|
855
883
|
for (const name of OPTIONAL_CONTEXT_STRINGS)
|
|
856
884
|
if (record[name] !== undefined && typeof record[name] !== 'string')
|
|
857
885
|
fields.push(name);
|
|
886
|
+
if (record.projectId !== undefined && record.projectId !== null && !isNonemptyString(record.projectId))
|
|
887
|
+
fields.push('projectId');
|
|
858
888
|
for (const name of ['prebaked', 'runSetupHook'])
|
|
859
889
|
if (record[name] !== undefined && typeof record[name] !== 'boolean')
|
|
860
890
|
fields.push(name);
|
|
@@ -172,10 +172,26 @@ export interface CreateRunEventSinkOptions {
|
|
|
172
172
|
/** How often buffered token snapshots are flushed while a reply is being
|
|
173
173
|
* written (ORI-2340). Default TOKEN_FLUSH_MS. */
|
|
174
174
|
tokenFlushMs?: number;
|
|
175
|
+
/** ORI-2594: given each reply snapshot, scrubbed like the saved copy, at most
|
|
176
|
+
* once per `liveTextMs`, for the sandbox's coordinator socket. Never awaited
|
|
177
|
+
* and never retried: the next snapshot carries the whole reply. Returns false
|
|
178
|
+
* when the socket declined it, so an unchanged snapshot is offered again. */
|
|
179
|
+
onLiveText?: (snapshot: LiveTextSnapshot) => boolean | void;
|
|
180
|
+
/** Spacing of `onLiveText` calls. Default LIVE_TEXT_MS. */
|
|
181
|
+
liveTextMs?: number;
|
|
182
|
+
}
|
|
183
|
+
/** One reply snapshot for the coordinator socket. `sequence` is the next one
|
|
184
|
+
* the sink will save, so the chat places it where the saved copy will land. */
|
|
185
|
+
export interface LiveTextSnapshot {
|
|
186
|
+
runId: string;
|
|
187
|
+
messageId: string;
|
|
188
|
+
sequence: number;
|
|
189
|
+
text: string;
|
|
175
190
|
}
|
|
176
191
|
/** A text-only reply reaches the browser as growing snapshots at this cadence
|
|
177
192
|
* instead of whole at the end of the turn (ORI-2340). */
|
|
178
193
|
export declare const TOKEN_FLUSH_MS = 250;
|
|
194
|
+
export declare const LIVE_TEXT_MAX_CHARS = 16384;
|
|
179
195
|
export declare function createRunEventSink(options: CreateRunEventSinkOptions): RunEventSink;
|
|
180
196
|
export interface ResumeRunEventSinkOptions extends Omit<CreateRunEventSinkOptions, 'startSequence'> {
|
|
181
197
|
/** Page size for the cursor tail while discovering the latest sequence. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-run-event-sink.d.ts","sourceRoot":"","sources":["../src/hosted-run-event-sink.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hosted-run-event-sink.d.ts","sourceRoot":"","sources":["../src/hosted-run-event-sink.ts"],"names":[],"mappings":"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"}
|
|
@@ -160,6 +160,13 @@ function isTerminalStatus(status) {
|
|
|
160
160
|
/** A text-only reply reaches the browser as growing snapshots at this cadence
|
|
161
161
|
* instead of whole at the end of the turn (ORI-2340). */
|
|
162
162
|
export const TOKEN_FLUSH_MS = 250; // held equal to SESSION_TIMERS.agentTokenFlushMs by test
|
|
163
|
+
/** ORI-2594: the chat follows the model about this closely over the socket,
|
|
164
|
+
* while saves keep their own TOKEN_FLUSH_MS pace. */
|
|
165
|
+
const LIVE_TEXT_MS = 75;
|
|
166
|
+
// The session read shows at most this much of a reply (activity-projection.ts),
|
|
167
|
+
// and the coordinator cuts live text the same way; cutting here keeps every
|
|
168
|
+
// socket message well under the coordinator's size limit.
|
|
169
|
+
export const LIVE_TEXT_MAX_CHARS = 16_384;
|
|
163
170
|
const DEFAULT_MAX_CRITICAL_ATTEMPTS = 4;
|
|
164
171
|
// Non-critical appends get a SMALL bounded retry so a single transient blip
|
|
165
172
|
// (network reset / 5xx) does not drop the event — but on exhaustion they are
|
|
@@ -260,6 +267,50 @@ export function createRunEventSink(options) {
|
|
|
260
267
|
diag(`timer token flush failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
261
268
|
});
|
|
262
269
|
}
|
|
270
|
+
// ORI-2594: live text for the coordinator socket. The first snapshot goes at
|
|
271
|
+
// once, later ones at most once per liveTextMs, and the latest always goes.
|
|
272
|
+
const liveTextMs = options.liveTextMs ?? LIVE_TEXT_MS;
|
|
273
|
+
const livePending = new Map();
|
|
274
|
+
// The last text sent per reply: past the cut, or on a repeated update, the
|
|
275
|
+
// snapshot does not change and is not sent again.
|
|
276
|
+
const liveSent = new Map();
|
|
277
|
+
let liveTimer = null;
|
|
278
|
+
let lastLiveAt = Number.NEGATIVE_INFINITY;
|
|
279
|
+
function sendLiveText() {
|
|
280
|
+
liveTimer = null;
|
|
281
|
+
const pending = [...livePending];
|
|
282
|
+
livePending.clear();
|
|
283
|
+
if (sealed || !options.onLiveText)
|
|
284
|
+
return;
|
|
285
|
+
lastLiveAt = Date.now();
|
|
286
|
+
for (const [messageId, raw] of pending) {
|
|
287
|
+
// Guarded whole: a late send can find the bearer file already gone.
|
|
288
|
+
try {
|
|
289
|
+
const scrubbed = redactSecrets({ text: raw }, { secrets: currentSecrets() }).text;
|
|
290
|
+
const text = scrubbed.length > LIVE_TEXT_MAX_CHARS ? `${scrubbed.slice(0, LIVE_TEXT_MAX_CHARS)}…` : scrubbed;
|
|
291
|
+
if (liveSent.get(messageId) === text)
|
|
292
|
+
continue;
|
|
293
|
+
if (options.onLiveText({ runId: options.runId, messageId, sequence: nextSequence, text }) !== false)
|
|
294
|
+
liveSent.set(messageId, text);
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
diag(`live text not sent: ${error instanceof Error ? error.message : String(error)}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function queueLiveText(messageId, text) {
|
|
302
|
+
// A reply with no id or no text yet has nothing the chat could place.
|
|
303
|
+
if (!options.onLiveText || !messageId || !text)
|
|
304
|
+
return;
|
|
305
|
+
livePending.set(messageId, text);
|
|
306
|
+
if (liveTimer)
|
|
307
|
+
return;
|
|
308
|
+
const waitMs = lastLiveAt + liveTextMs - Date.now();
|
|
309
|
+
if (waitMs <= 0)
|
|
310
|
+
return sendLiveText();
|
|
311
|
+
liveTimer = setTimeout(sendLiveText, waitMs);
|
|
312
|
+
liveTimer.unref?.();
|
|
313
|
+
}
|
|
263
314
|
function assertWritable() {
|
|
264
315
|
if (sealed) {
|
|
265
316
|
throw new RunTerminalError('run is terminal server-side — refusing to append (Orizu records win)');
|
|
@@ -526,10 +577,58 @@ export function createRunEventSink(options) {
|
|
|
526
577
|
throw error;
|
|
527
578
|
}
|
|
528
579
|
}
|
|
580
|
+
// Tokens waiting behind a save, latest per reply. One batch per stretch of
|
|
581
|
+
// tokens joins the queue; any other event closes the batch, so a token
|
|
582
|
+
// written after it lands after it. Bounded however long a save stalls.
|
|
583
|
+
let tokenBatch = null;
|
|
584
|
+
function queueToken(event) {
|
|
585
|
+
if (!tokenBatch) {
|
|
586
|
+
const batch = new Map();
|
|
587
|
+
tokenBatch = batch;
|
|
588
|
+
serialize(async () => {
|
|
589
|
+
if (tokenBatch === batch)
|
|
590
|
+
tokenBatch = null;
|
|
591
|
+
for (const queued of batch.values())
|
|
592
|
+
await append(queued);
|
|
593
|
+
}).catch(error => {
|
|
594
|
+
diag(`token not buffered: ${error instanceof Error ? error.message : String(error)}`);
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
tokenBatch.set(event.messageId ?? '_', event);
|
|
598
|
+
}
|
|
529
599
|
return {
|
|
530
|
-
append: event =>
|
|
531
|
-
|
|
532
|
-
|
|
600
|
+
append: event => {
|
|
601
|
+
if (event.kind !== 'token') {
|
|
602
|
+
tokenBatch = null;
|
|
603
|
+
return serialize(() => append(event));
|
|
604
|
+
}
|
|
605
|
+
// ORI-2594: a token is only buffered, so the harness reader does not wait
|
|
606
|
+
// behind a save in flight (measured: each word waited for the previous
|
|
607
|
+
// save). It still joins the queue in order, and its text goes to the
|
|
608
|
+
// coordinator socket now. A sealed sink still refuses it at once.
|
|
609
|
+
try {
|
|
610
|
+
assertWritable();
|
|
611
|
+
}
|
|
612
|
+
catch (error) {
|
|
613
|
+
return Promise.reject(error);
|
|
614
|
+
}
|
|
615
|
+
queueLiveText(event.messageId ?? '', typeof event.payload.text === 'string' ? event.payload.text : '');
|
|
616
|
+
queueToken(event);
|
|
617
|
+
return Promise.resolve();
|
|
618
|
+
},
|
|
619
|
+
flushTokens: () => {
|
|
620
|
+
tokenBatch = null;
|
|
621
|
+
return serialize(flushTokens);
|
|
622
|
+
},
|
|
623
|
+
finish: (status, opts) => {
|
|
624
|
+
tokenBatch = null;
|
|
625
|
+
// The last snapshot still waiting for its interval goes now, before the run is sealed.
|
|
626
|
+
if (liveTimer) {
|
|
627
|
+
clearTimeout(liveTimer);
|
|
628
|
+
sendLiveText();
|
|
629
|
+
}
|
|
630
|
+
return serialize(() => finish(status, opts));
|
|
631
|
+
},
|
|
533
632
|
get sealed() {
|
|
534
633
|
return sealed;
|
|
535
634
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-session-cli.d.ts","sourceRoot":"","sources":["../src/hosted-session-cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hosted-session-cli.d.ts","sourceRoot":"","sources":["../src/hosted-session-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -428,6 +428,7 @@ export async function startHostedSession(opts) {
|
|
|
428
428
|
});
|
|
429
429
|
const session = sessionResp.session;
|
|
430
430
|
const sessionId = requireString(session?.id, 'session id');
|
|
431
|
+
const sessionProjectId = typeof session?.projectId === 'string' && session.projectId ? session.projectId : undefined;
|
|
431
432
|
const sessionBranch = requireString(session?.repoBranch, 'session repoBranch');
|
|
432
433
|
log(`session ${sessionId} on ${sessionBranch}`);
|
|
433
434
|
// (b) mint the session-scoped agent token (the sandbox's Orizu bearer).
|
|
@@ -558,6 +559,7 @@ export async function startHostedSession(opts) {
|
|
|
558
559
|
taskFile: `${paths.runDirAbs}/task.txt`,
|
|
559
560
|
workspaceDir: paths.repoDirRel,
|
|
560
561
|
sessionBranch,
|
|
562
|
+
projectId: sessionProjectId,
|
|
561
563
|
repositoryRemote: repo.cloneUrl,
|
|
562
564
|
repositoryCredentialHelper: bootstrap.credentialHelper,
|
|
563
565
|
model,
|
|
@@ -43,5 +43,43 @@ export interface SeedSessionCopyInput {
|
|
|
43
43
|
export declare function seedSessionCopy(input: SeedSessionCopyInput): Promise<{
|
|
44
44
|
seeded: boolean;
|
|
45
45
|
}>;
|
|
46
|
+
type SeedExecAsync = (cmd: string, args: string[], opts?: {
|
|
47
|
+
cwd?: string;
|
|
48
|
+
}) => Promise<SeedExecResult>;
|
|
49
|
+
export interface CloneTeamIntoWorkTreeInput {
|
|
50
|
+
exec: SeedExec;
|
|
51
|
+
/** Runs a command without blocking, so the check, the clone and the push
|
|
52
|
+
* can overlap with each other and with the rest of the boot. */
|
|
53
|
+
execAsync: SeedExecAsync;
|
|
54
|
+
sessionRemote: string;
|
|
55
|
+
sessionGitConfig: string[];
|
|
56
|
+
resolveTeam: () => Promise<{
|
|
57
|
+
remote: string;
|
|
58
|
+
gitConfig: string[];
|
|
59
|
+
}>;
|
|
60
|
+
/** A path owned only by this clone; cleared before and after use. */
|
|
61
|
+
scratchDir: string;
|
|
62
|
+
/** The boot's working folder: absent or empty. */
|
|
63
|
+
workTree: string;
|
|
64
|
+
}
|
|
65
|
+
export type CloneTeamIntoWorkTreeResult = {
|
|
66
|
+
cloned: false;
|
|
67
|
+
}
|
|
68
|
+
/** `filled` settles once the background push into the session copy ends:
|
|
69
|
+
* true when the copy now has main. It never rejects. */
|
|
70
|
+
| {
|
|
71
|
+
cloned: true;
|
|
72
|
+
filled: Promise<boolean>;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* ORI-2512: a team boot of an empty session copy makes its working folder
|
|
76
|
+
* from ONE clone of the team copy, with the session copy as its push remote,
|
|
77
|
+
* and fills the session copy by pushing in the background. The session copy
|
|
78
|
+
* is checked at the same time as the clone; a copy that already has branches
|
|
79
|
+
* belongs to an earlier boot of this session, so the clone is dropped and the
|
|
80
|
+
* caller clones the session copy as usual. The clone keeps the whole history:
|
|
81
|
+
* an empty copy refuses a push from a shallow clone.
|
|
82
|
+
*/
|
|
83
|
+
export declare function cloneTeamIntoWorkTree(input: CloneTeamIntoWorkTreeInput): Promise<CloneTeamIntoWorkTreeResult>;
|
|
46
84
|
export {};
|
|
47
85
|
//# sourceMappingURL=hosted-session-seed.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-session-seed.d.ts","sourceRoot":"","sources":["../src/hosted-session-seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,yBAAyB,wDAAwD,CAAA;AAE9F,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AACD,KAAK,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,cAAc,CAAA;AAExF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,aAAa,EAAE,MAAM,CAAA;IACrB,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B;mFAC+E;IAC/E,WAAW,EAAE,MAAM,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACnE,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAA;CACnB;AA2BD,wBAAsB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CA6B/F"}
|
|
1
|
+
{"version":3,"file":"hosted-session-seed.d.ts","sourceRoot":"","sources":["../src/hosted-session-seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,yBAAyB,wDAAwD,CAAA;AAE9F,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AACD,KAAK,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,cAAc,CAAA;AAExF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,aAAa,EAAE,MAAM,CAAA;IACrB,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B;mFAC+E;IAC/E,WAAW,EAAE,MAAM,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACnE,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAA;CACnB;AA2BD,wBAAsB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CA6B/F;AAED,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;AAEtG,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,QAAQ,CAAA;IACd;qEACiE;IACjE,SAAS,EAAE,aAAa,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,WAAW,EAAE,MAAM,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IACnE,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAA;IAClB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,2BAA2B,GACnC;IAAE,MAAM,EAAE,KAAK,CAAA;CAAE;AACnB;yDACyD;GACvD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAA;AAE9C;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAkDnH"}
|
|
@@ -76,3 +76,72 @@ export async function seedSessionCopy(input) {
|
|
|
76
76
|
input.exec('rm', ['-rf', '--', input.scratchDir]);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* ORI-2512: a team boot of an empty session copy makes its working folder
|
|
81
|
+
* from ONE clone of the team copy, with the session copy as its push remote,
|
|
82
|
+
* and fills the session copy by pushing in the background. The session copy
|
|
83
|
+
* is checked at the same time as the clone; a copy that already has branches
|
|
84
|
+
* belongs to an earlier boot of this session, so the clone is dropped and the
|
|
85
|
+
* caller clones the session copy as usual. The clone keeps the whole history:
|
|
86
|
+
* an empty copy refuses a push from a shallow clone.
|
|
87
|
+
*/
|
|
88
|
+
export async function cloneTeamIntoWorkTree(input) {
|
|
89
|
+
const clear = () => input.exec('rm', ['-rf', '--', input.scratchDir]);
|
|
90
|
+
const listing = input.execAsync('git', [...withConfig(input.sessionGitConfig), 'ls-remote', '--heads', input.sessionRemote]);
|
|
91
|
+
const cloning = (async () => {
|
|
92
|
+
const origin = await input.resolveTeam();
|
|
93
|
+
const cleared = clear();
|
|
94
|
+
if (cleared.status !== 0)
|
|
95
|
+
throw failure('clearing the seed scratch', cleared);
|
|
96
|
+
return input.execAsync('git', [...withConfig(origin.gitConfig), 'clone', '--quiet', '--single-branch', '--branch', 'main', origin.remote, input.scratchDir]);
|
|
97
|
+
})();
|
|
98
|
+
const settled = cloning.then(() => undefined, () => undefined);
|
|
99
|
+
let listed;
|
|
100
|
+
try {
|
|
101
|
+
listed = await listing;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
await settled;
|
|
105
|
+
clear();
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
// A copy with saved work: answer now. The unneeded clone ends on its own
|
|
109
|
+
// and its scratch is cleared then.
|
|
110
|
+
if (listed.status === 0 && listed.stdout.trim().length > 0) {
|
|
111
|
+
void settled.then(clear);
|
|
112
|
+
return { cloned: false };
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const fetched = await cloning;
|
|
116
|
+
if (listed.status !== 0)
|
|
117
|
+
throw failure('reading the session copy', listed);
|
|
118
|
+
if (fetched.status !== 0)
|
|
119
|
+
throw failure('reading the team copy', fetched);
|
|
120
|
+
const pointed = input.exec('git', ['-C', input.scratchDir, 'remote', 'set-url', 'origin', input.sessionRemote]);
|
|
121
|
+
if (pointed.status !== 0)
|
|
122
|
+
throw failure('pointing the working folder at the session copy', pointed);
|
|
123
|
+
// The runtime image may ship the folder empty; `mv` needs it gone.
|
|
124
|
+
input.exec('rmdir', ['--', input.workTree]);
|
|
125
|
+
// A folder that is still there (not empty, or a mount point) would make
|
|
126
|
+
// `mv` put the clone inside it.
|
|
127
|
+
const remaining = input.exec('test', ['-e', input.workTree]);
|
|
128
|
+
if (remaining.status === 0)
|
|
129
|
+
throw failure('making the working folder', { status: 1, stdout: '', stderr: `${input.workTree} is not empty` });
|
|
130
|
+
const moved = input.exec('mv', ['--', input.scratchDir, input.workTree]);
|
|
131
|
+
if (moved.status !== 0)
|
|
132
|
+
throw failure('making the working folder', moved);
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
clear();
|
|
136
|
+
}
|
|
137
|
+
const filled = input.execAsync('git', ['-C', input.workTree, ...withConfig(input.sessionGitConfig), 'push', '--quiet', 'origin', 'refs/heads/main:refs/heads/main'])
|
|
138
|
+
.then(async (pushed) => {
|
|
139
|
+
if (pushed.status === 0)
|
|
140
|
+
return true;
|
|
141
|
+
// Another boot, or the agent's own first save, may have filled it first.
|
|
142
|
+
const listed = await input.execAsync('git', [...withConfig(input.sessionGitConfig), 'ls-remote', '--heads', input.sessionRemote]);
|
|
143
|
+
return listed.status === 0 && listed.stdout.trim().length > 0;
|
|
144
|
+
})
|
|
145
|
+
.catch(() => false);
|
|
146
|
+
return { cloned: true, filled };
|
|
147
|
+
}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAwLA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAEhE,eAAO,MAAM,wBAAwB,GAAI,iBAAiB,MAAM;;;EACJ,CAAA;AAE5D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAwLA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAEhE,eAAO,MAAM,wBAAwB,GAAI,iBAAiB,MAAM;;;EACJ,CAAA;AAE5D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAstCtD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CA0B1G;AAED,eAAO,MAAM,iBAAiB,SAAU,CAAA;AACxC,eAAO,MAAM,uBAAuB,QAAkB,CAAA;AACtD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAexH;AAmMD,wBAAsB,IAAI,CAAC,OAAO,WAAwB,iBAiiBzD;AA6DD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAEhF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -532,9 +532,13 @@ async function submitRunResults() {
|
|
|
532
532
|
const resultsJsonl = resultsPath.endsWith('.gz')
|
|
533
533
|
? gunzipSync(resultBytes).toString('utf8')
|
|
534
534
|
: resultBytes.toString('utf8');
|
|
535
|
-
const
|
|
536
|
-
|
|
537
|
-
|
|
535
|
+
const { sendScoreSave } = await import('./score-save-workflow.js');
|
|
536
|
+
const data = await sendScoreSave({
|
|
537
|
+
command: 'run',
|
|
538
|
+
path: `/api/cli/runs/submit?project=${encodeURIComponent(project)}`,
|
|
539
|
+
project,
|
|
540
|
+
promptVersionId,
|
|
541
|
+
saves: true,
|
|
538
542
|
body: JSON.stringify({
|
|
539
543
|
promptVersionId,
|
|
540
544
|
runnerVersionId,
|
|
@@ -546,11 +550,7 @@ async function submitRunResults() {
|
|
|
546
550
|
resultsJsonl,
|
|
547
551
|
...instructionSetProvenanceFields(project),
|
|
548
552
|
}),
|
|
549
|
-
});
|
|
550
|
-
if (!response.ok) {
|
|
551
|
-
throw new Error(`Failed to submit run: ${await response.text()}`);
|
|
552
|
-
}
|
|
553
|
-
const data = await parseJsonResponse(response, 'Run submit');
|
|
553
|
+
}, authedFetch);
|
|
554
554
|
if (hasJsonFlag()) {
|
|
555
555
|
printJson({ run: data.run });
|
|
556
556
|
return;
|
|
@@ -578,9 +578,13 @@ async function submitScoreResults() {
|
|
|
578
578
|
console.warn(scoreInput.aggregateWarning);
|
|
579
579
|
}
|
|
580
580
|
const aggregatePayload = scoreInput.aggregate || {};
|
|
581
|
-
const
|
|
582
|
-
|
|
583
|
-
|
|
581
|
+
const { sendScoreSave } = await import('./score-save-workflow.js');
|
|
582
|
+
const data = await sendScoreSave({
|
|
583
|
+
command: 'submit',
|
|
584
|
+
path: `/api/cli/scores/submit?project=${encodeURIComponent(project)}`,
|
|
585
|
+
project,
|
|
586
|
+
scorerVersionId,
|
|
587
|
+
saves: true,
|
|
584
588
|
body: JSON.stringify({
|
|
585
589
|
...aggregatePayload,
|
|
586
590
|
...instructionSetProvenanceFields(project),
|
|
@@ -593,11 +597,7 @@ async function submitScoreResults() {
|
|
|
593
597
|
candidateId: candidateId || undefined,
|
|
594
598
|
resultsJsonl: scoreInput.resultsJsonl,
|
|
595
599
|
}),
|
|
596
|
-
});
|
|
597
|
-
if (!response.ok) {
|
|
598
|
-
throw new Error(`Failed to submit score: ${await response.text()}`);
|
|
599
|
-
}
|
|
600
|
-
const data = await parseJsonResponse(response, 'Score submit');
|
|
600
|
+
}, authedFetch);
|
|
601
601
|
if (hasJsonFlag()) {
|
|
602
602
|
printJson(data);
|
|
603
603
|
return;
|
|
@@ -706,9 +706,13 @@ async function execScorer() {
|
|
|
706
706
|
}
|
|
707
707
|
const instructionSetProvenance = instructionSetProvenanceFields(project);
|
|
708
708
|
const isNoSubmit = hasArg('--no-submit');
|
|
709
|
-
const
|
|
710
|
-
|
|
711
|
-
|
|
709
|
+
const { sendScoreSave } = await import('./score-save-workflow.js');
|
|
710
|
+
const data = await sendScoreSave({
|
|
711
|
+
command: 'exec',
|
|
712
|
+
path: `/api/cli/scorers/exec?project=${encodeURIComponent(project)}`,
|
|
713
|
+
project,
|
|
714
|
+
scorerVersionId,
|
|
715
|
+
saves: !isNoSubmit,
|
|
712
716
|
body: JSON.stringify({
|
|
713
717
|
scorerVersionId,
|
|
714
718
|
subjectPromptVersionId: subjectPromptVersionId || undefined,
|
|
@@ -724,11 +728,7 @@ async function execScorer() {
|
|
|
724
728
|
dependencyResultsJsonl: readDependencyResultAssignments(getArg('--dependency-results')),
|
|
725
729
|
...instructionSetProvenance,
|
|
726
730
|
}),
|
|
727
|
-
});
|
|
728
|
-
if (!response.ok) {
|
|
729
|
-
throw new Error(`Failed to execute scorer: ${await response.text()}`);
|
|
730
|
-
}
|
|
731
|
-
const data = await parseJsonResponse(response, 'Scorer exec');
|
|
731
|
+
}, authedFetch);
|
|
732
732
|
const noSubmitOutput = isNoSubmit
|
|
733
733
|
? noSubmitScorerOutput(data, instructionSetProvenance)
|
|
734
734
|
: null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-backup-core.d.ts","sourceRoot":"","sources":["../src/repository-backup-core.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repository-backup-core.d.ts","sourceRoot":"","sources":["../src/repository-backup-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The app's own `{ error }` message, or null when the reply isn't the app's JSON. */
|
|
2
|
+
export declare function appErrorOf(response: Response): Promise<string | null>;
|
|
3
|
+
/** The code when the request never reached a server, otherwise null. */
|
|
4
|
+
export declare function unreachedCode(error: unknown): string | null;
|
|
5
|
+
//# sourceMappingURL=request-outcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-outcome.d.ts","sourceRoot":"","sources":["../src/request-outcome.ts"],"names":[],"mappings":"AAKA,sFAAsF;AACtF,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO3E;AAKD,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ3D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { isJsonErrorResponsePayload } from './error-response.js';
|
|
2
|
+
// The request never reached a server, so nothing can have been written.
|
|
3
|
+
const UNREACHED_CODES = new Set(['ECONNREFUSED', 'ENOTFOUND', 'EAI_AGAIN']);
|
|
4
|
+
/** The app's own `{ error }` message, or null when the reply isn't the app's JSON. */
|
|
5
|
+
export async function appErrorOf(response) {
|
|
6
|
+
try {
|
|
7
|
+
const payload = await response.json();
|
|
8
|
+
return isJsonErrorResponsePayload(response, payload) ? payload.error : null;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
// fetch reports a refused connection as `fetch failed` with the reason in
|
|
15
|
+
// `cause`. For a name with several addresses (localhost) the cause is an
|
|
16
|
+
// AggregateError that carries the same code itself.
|
|
17
|
+
/** The code when the request never reached a server, otherwise null. */
|
|
18
|
+
export function unreachedCode(error) {
|
|
19
|
+
let current = error;
|
|
20
|
+
for (let depth = 0; depth < 4 && current !== null && typeof current === 'object'; depth += 1) {
|
|
21
|
+
const { code, cause } = current;
|
|
22
|
+
if (typeof code === 'string' && UNREACHED_CODES.has(code))
|
|
23
|
+
return code;
|
|
24
|
+
current = cause;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface SaveRequest {
|
|
2
|
+
/** The route path with its query, as sent. */
|
|
3
|
+
path: string;
|
|
4
|
+
body: string;
|
|
5
|
+
project: string;
|
|
6
|
+
/** False for `scorers exec --no-submit`, which saves nothing. */
|
|
7
|
+
saves: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** `scores submit` and `scorers exec`, or `runs submit` (ORI-1097 S3b). */
|
|
10
|
+
export type ScoreSave = SaveRequest & {
|
|
11
|
+
command: 'submit' | 'exec';
|
|
12
|
+
scorerVersionId: string;
|
|
13
|
+
} | SaveRequest & {
|
|
14
|
+
command: 'run';
|
|
15
|
+
promptVersionId: string;
|
|
16
|
+
};
|
|
17
|
+
/** Sends one request; calls `onRequestStart` just before anything goes out. */
|
|
18
|
+
export type ScoreSaveRequest = (path: string, init: RequestInit, onRequestStart?: () => void) => Promise<Response>;
|
|
19
|
+
/** `orizu scores submit`, `orizu scorers exec` and `orizu runs submit`: the reply, or an error saying whether the save may have happened. */
|
|
20
|
+
export declare function sendScoreSave(save: ScoreSave, request: ScoreSaveRequest): Promise<Record<string, unknown>>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=score-save-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-save-workflow.d.ts","sourceRoot":"","sources":["../src/score-save-workflow.ts"],"names":[],"mappings":"AAuBA,UAAU,WAAW;IACnB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,iEAAiE;IACjE,KAAK,EAAE,OAAO,CAAA;CACf;AAED,2EAA2E;AAC3E,MAAM,MAAM,SAAS,GACjB,WAAW,GAAG;IAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACrE,WAAW,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7D,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,IAAI,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AA2FlH,6IAA6I;AAC7I,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMhH"}
|