orizu 0.5.22 → 0.5.23
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/README.md +42 -14
- package/dist/cleanup.d.ts +6 -0
- package/dist/cleanup.d.ts.map +1 -0
- package/dist/cleanup.js +27 -0
- package/dist/help.js +3 -3
- package/dist/hosted-commands.d.ts +13 -0
- package/dist/hosted-commands.d.ts.map +1 -0
- package/dist/hosted-commands.js +10 -0
- package/dist/hosted-gepa-cli.d.ts +11 -0
- package/dist/hosted-gepa-cli.d.ts.map +1 -0
- package/dist/hosted-gepa-cli.js +110 -0
- package/dist/hosted-gepa-numeric-values.d.ts +3 -0
- package/dist/hosted-gepa-numeric-values.d.ts.map +1 -0
- package/dist/hosted-gepa-numeric-values.js +49 -0
- package/dist/hosted-provider-settings.d.ts +3 -0
- package/dist/hosted-provider-settings.d.ts.map +1 -0
- package/dist/hosted-provider-settings.js +69 -0
- package/dist/hosted-session-cli.d.ts.map +1 -1
- package/dist/hosted-session-cli.js +6 -1
- package/dist/http.d.ts +1 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -36
- package/dist/optimizations-promote-cli.d.ts +3 -0
- package/dist/optimizations-promote-cli.d.ts.map +1 -1
- package/dist/optimizations-promote-cli.js +75 -7
- package/dist/runner-dir-verify.d.ts.map +1 -1
- package/dist/runner-dir-verify.js +4 -7
- package/dist/skilled-proposer-bake-report.d.ts +2 -0
- package/dist/skilled-proposer-bake-report.d.ts.map +1 -0
- package/dist/skilled-proposer-bake-report.js +1 -0
- package/dist/skilled-proposer-launch.d.ts +22 -0
- package/dist/skilled-proposer-launch.d.ts.map +1 -1
- package/dist/skilled-proposer-launch.js +39 -6
- package/package.json +1 -1
- package/scripts/vendor-gepa-python.mjs +81 -12
- package/src/cleanup.ts +37 -0
- package/src/help.ts +3 -3
- package/src/hosted-commands.ts +4 -0
- package/src/hosted-gepa-cli.ts +107 -0
- package/src/hosted-gepa-numeric-values.ts +60 -0
- package/src/hosted-provider-settings.ts +69 -0
- package/src/hosted-session-cli.ts +4 -1
- package/src/http.ts +8 -0
- package/src/index.ts +107 -37
- package/src/optimizations-promote-cli.ts +85 -7
- package/src/runner-dir-verify.ts +11 -6
- package/src/skilled-proposer-bake-report.ts +1 -0
- package/src/skilled-proposer-launch.ts +38 -7
- package/src/skilled-proposer-venv-manager.mjs +44 -27
- package/vendor/orizu-gepa/src/orizu_gepa_connector/runtime.py +7 -2
- package/vendor/orizu-gepa-python/src/orizu_gepa/cli.py +1 -0
- package/vendor/orizu-gepa-python/src/orizu_gepa/client.py +15 -0
- package/vendor/skills/orizu-cli/SKILL.md +94 -202
- package/vendor/skills/orizu-cli/references/assess-and-plan.md +107 -0
- package/vendor/skills/orizu-cli/references/building-judges.md +442 -180
- package/vendor/skills/orizu-cli/references/cli-reference.md +20 -19
- package/vendor/skills/orizu-cli/references/dataset-design.md +100 -0
- package/vendor/skills/orizu-cli/references/eval-strategy.md +64 -0
- package/vendor/skills/orizu-cli/references/instructions-after-prompts.md +12 -17
- package/vendor/skills/orizu-cli/references/migrate-existing-gepa-setup.md +78 -70
- package/vendor/skills/orizu-cli/references/optimization-reports.md +195 -108
- package/vendor/skills/orizu-cli/references/optimization-with-gepa.md +42 -23
- package/vendor/skills/orizu-cli/references/primer.md +25 -16
- package/vendor/skills/orizu-cli/references/prompt-control-plane.md +94 -73
package/README.md
CHANGED
|
@@ -28,24 +28,52 @@ By default, the CLI talks to `https://orizu.ai`.
|
|
|
28
28
|
## Updating bundled GEPA
|
|
29
29
|
|
|
30
30
|
The CLI ships a verified, source-only copy of official GEPA so optimization
|
|
31
|
-
users never need `pip` or a network connection.
|
|
32
|
-
|
|
33
|
-
`scripts/vendor-gepa-python.mjs`, then re-runs the refresh command with the
|
|
34
|
-
matching downloaded wheel:
|
|
31
|
+
users never need `pip` or a network connection. From the repository root,
|
|
32
|
+
derive both mandatory pins independently from the downloaded wheel:
|
|
35
33
|
|
|
36
34
|
```bash
|
|
37
|
-
|
|
35
|
+
python3 - /path/to/gepa-<version>-py3-none-any.whl <version> <<'PY'
|
|
36
|
+
import hashlib, json, sys, zipfile
|
|
37
|
+
from pathlib import Path
|
|
38
|
+
|
|
39
|
+
wheel, version = Path(sys.argv[1]), sys.argv[2]
|
|
40
|
+
license_member = f'gepa-{version}.dist-info/licenses/LICENSE'
|
|
41
|
+
files = {}
|
|
42
|
+
with zipfile.ZipFile(wheel) as archive:
|
|
43
|
+
for member in archive.infolist():
|
|
44
|
+
if member.is_dir():
|
|
45
|
+
continue
|
|
46
|
+
if member.filename.startswith('gepa/'):
|
|
47
|
+
path = f'src/{member.filename}'
|
|
48
|
+
elif member.filename == license_member:
|
|
49
|
+
path = 'LICENSE'
|
|
50
|
+
else:
|
|
51
|
+
continue
|
|
52
|
+
files[path] = hashlib.sha256(archive.read(member)).hexdigest()
|
|
53
|
+
entries = sorted(files.items())
|
|
54
|
+
print('GEPA_WHEEL_SHA256=' + hashlib.sha256(wheel.read_bytes()).hexdigest())
|
|
55
|
+
print('GEPA_TREE_SHA256=' + hashlib.sha256(json.dumps(entries, separators=(',', ':')).encode()).hexdigest())
|
|
56
|
+
PY
|
|
38
57
|
```
|
|
39
58
|
|
|
40
|
-
|
|
41
|
-
`
|
|
42
|
-
|
|
59
|
+
Update `GEPA_VERSION`, `GEPA_RELEASE_COMMIT`, `GEPA_WHEEL_FILENAME`,
|
|
60
|
+
`GEPA_WHEEL_SHA256`, `GEPA_TREE_SHA256`, and the extractor's license member in
|
|
61
|
+
`packages/cli/scripts/vendor-gepa-python.mjs`. Both SHA-256 constants must
|
|
62
|
+
change together before running the matching refresh command:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
node packages/cli/scripts/vendor-gepa-python.mjs --refresh --archive /path/to/gepa-<version>-py3-none-any.whl
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Commit the refreshed `packages/cli/gepa-python-source.zip`, then run
|
|
69
|
+
`bun test test/cli-gepa-packaging.test.ts test/cli/provision-snapshot.test.ts`.
|
|
70
|
+
These gates cover both pins. `npm pack` never downloads GEPA.
|
|
43
71
|
|
|
44
72
|
For a development checkout, materialize that same verified source before local
|
|
45
73
|
work that imports GEPA:
|
|
46
74
|
|
|
47
75
|
```bash
|
|
48
|
-
node scripts/vendor-gepa-python.mjs
|
|
76
|
+
node packages/cli/scripts/vendor-gepa-python.mjs
|
|
49
77
|
```
|
|
50
78
|
|
|
51
79
|
## Install
|
|
@@ -109,9 +137,9 @@ Agents are first-class users of this CLI: **every command supports `--json`**
|
|
|
109
137
|
(as a prefix, `orizu --json teams list`, or a trailing flag) and emits a single
|
|
110
138
|
machine-readable JSON document instead of formatted text. Discover the full
|
|
111
139
|
command surface, including global options, with `orizu capabilities --json`.
|
|
112
|
-
Hosted agents may read and sync instruction sets and prepare complete manifests,
|
|
113
|
-
|
|
114
|
-
|
|
140
|
+
Hosted agents may read and sync instruction sets and prepare complete manifests. A local coding agent using the user's token runs instruction create, push, shape,
|
|
141
|
+
archive, and restore itself after plan ratification. It gathers only read-only pointer-resolution and binding evidence; a human curator executes every production/default pointer command on every surface.
|
|
142
|
+
In a hosted session, a human curator using the local CLI must run both categories.
|
|
115
143
|
|
|
116
144
|
## Authentication
|
|
117
145
|
|
|
@@ -196,11 +224,11 @@ orizu logout
|
|
|
196
224
|
<td><code>orizu prompts list --project ops-eval/support-qa [--status active|archived|all]</code></td>
|
|
197
225
|
</tr>
|
|
198
226
|
<tr>
|
|
199
|
-
<td>Archive or restore an instruction set (
|
|
227
|
+
<td>Archive or restore an instruction set (local agent or human; hosted human only)</td>
|
|
200
228
|
<td><code>orizu instructions archive <slug-or-exact-name> --project ops-eval/support-qa</code><br><code>orizu instructions restore <slug-or-exact-name> --project ops-eval/support-qa</code></td>
|
|
201
229
|
</tr>
|
|
202
230
|
<tr>
|
|
203
|
-
<td>Push an instruction-set manifest (
|
|
231
|
+
<td>Push an instruction-set manifest (local agent or human; hosted human only)</td>
|
|
204
232
|
<td><code>orizu instructions push ./orizu.instruction-set.json --project ops-eval/support-qa --set <slug-or-exact-name></code></td>
|
|
205
233
|
</tr>
|
|
206
234
|
<tr>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type Cleanup = () => void;
|
|
2
|
+
/** Attempt every disposer even when an earlier cleanup fails. */
|
|
3
|
+
export declare function cleanupAll(cleanups: readonly Cleanup[], message: string): void;
|
|
4
|
+
/** Preserve the operation failure together with every cleanup failure. */
|
|
5
|
+
export declare function throwWithCleanup(operationError: unknown, cleanups: readonly Cleanup[], message: string): never;
|
|
6
|
+
//# sourceMappingURL=cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../src/cleanup.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,IAAI,CAAA;AAchC,iEAAiE;AACjE,wBAAgB,UAAU,CACxB,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,OAAO,EAAE,MAAM,GACd,IAAI,CAKN;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,OAAO,EACvB,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,OAAO,EAAE,MAAM,GACd,KAAK,CAMP"}
|
package/dist/cleanup.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function collectCleanupFailures(cleanups) {
|
|
2
|
+
const failures = [];
|
|
3
|
+
for (const cleanup of cleanups) {
|
|
4
|
+
try {
|
|
5
|
+
cleanup();
|
|
6
|
+
}
|
|
7
|
+
catch (error) {
|
|
8
|
+
failures.push(error);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return failures;
|
|
12
|
+
}
|
|
13
|
+
/** Attempt every disposer even when an earlier cleanup fails. */
|
|
14
|
+
export function cleanupAll(cleanups, message) {
|
|
15
|
+
const failures = collectCleanupFailures(cleanups);
|
|
16
|
+
if (failures.length > 0) {
|
|
17
|
+
throw new AggregateError(failures, message);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Preserve the operation failure together with every cleanup failure. */
|
|
21
|
+
export function throwWithCleanup(operationError, cleanups, message) {
|
|
22
|
+
const cleanupFailures = collectCleanupFailures(cleanups);
|
|
23
|
+
if (cleanupFailures.length > 0) {
|
|
24
|
+
throw new AggregateError([operationError, ...cleanupFailures], message);
|
|
25
|
+
}
|
|
26
|
+
throw operationError;
|
|
27
|
+
}
|
package/dist/help.js
CHANGED
|
@@ -128,7 +128,7 @@ export const COMMAND_DOCS = [
|
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
130
|
path: ['log'],
|
|
131
|
-
usage: 'orizu log <event_type> --run-id <id> --sequence <n> --payload @event.json',
|
|
131
|
+
usage: 'orizu log <event_type> --run-id <id> --sequence <n> --payload @event.json [--event-id <id>] [--event-layer <layer>] [--optimizer-family <family>] [--iteration <n>] [--candidate-id <id>] [--parent-candidate-id <id>] [--child-candidate-id <id>]',
|
|
132
132
|
summary: 'Submit an optimization event payload.',
|
|
133
133
|
group: 'Optimizations',
|
|
134
134
|
},
|
|
@@ -575,8 +575,8 @@ export const COMMAND_DOCS = [
|
|
|
575
575
|
},
|
|
576
576
|
{
|
|
577
577
|
path: ['optimizations', 'run-gepa'],
|
|
578
|
-
usage: 'orizu optimizations run-gepa --project <team/project> --optimizer-version-id <id> (--candidate-version-id <id> | --instruction-set <name> --model-config <identity> [--component-selector round-robin|all]) --runner-version-id <id> --candidate-runner-dir <dir> --scorer-version-id <id> --scorer-runner-version-id <id> --scorer-runner-dir <dir> [--engine official|legacy] [--candidate-proposer skilled-proposer [--candidate-proposer-config <@file|path>] [--proposal-max-calls <n>] [--proposal-max-tokens <n>]] [--scorer-input-contract gepa|flat_row] [--scorer-candidate-field <row-field>] [--allow-degenerate-seed] --dataset-version-id <id> --split-set-id <id> [--train-split train] [--val-split validation] [--budget auto|light|medium|heavy | --max-metric-calls <n> | --max-full-evals <n> | --max-iterations <n> | --max-candidate-proposals <n>] [--num-threads auto|N] [--reflection-max-tokens N] [--reflection-retry-attempts N] [--reflection-http-timeout-seconds N] [--log-dir logs]',
|
|
579
|
-
summary: 'Run official GEPA locally and stream events
|
|
578
|
+
usage: 'orizu optimizations run-gepa [--hosted [--launch-intent-id <uuid>]] --project <team/project> --optimizer-version-id <id> (--candidate-version-id <id> | --instruction-set <name> --model-config <identity> [--component-selector round-robin|all]) --runner-version-id <id> [--candidate-runner-dir <dir>] --scorer-version-id <id> --scorer-runner-version-id <id> [--scorer-runner-dir <dir>] [--engine official|legacy] [--candidate-proposer skilled-proposer [--candidate-proposer-config <@file|path>] [--proposal-max-calls <n>] [--proposal-max-tokens <n>]] [--scorer-input-contract gepa|flat_row] [--scorer-candidate-field <row-field>] [--allow-degenerate-seed] [--seed <n>] --dataset-version-id <id> --split-set-id <id> [--train-split train] [--val-split validation] [--minibatch-size <n>] [--candidate-selection-strategy pareto|current_best|epsilon_greedy] [--epsilon <n>] [--objective <text>] [--budget auto|light|medium|heavy | --max-metric-calls <n> | --max-full-evals <n> | --max-iterations <n> | --max-candidate-proposals <n>] [--num-threads auto|N] [--reflection-model <provider/model>] [--reflection-temperature <n>] [--reflection-prompt-template <text|@file>] [--reflection-max-tokens N] [--reflection-provider-settings <json|@file>] [--reflection-retry-attempts N] [--reflection-http-timeout-seconds N] [--skip-perfect-parent-reflection|--no-skip-perfect-parent-reflection] [--disable-evaluation-cache] [--auto-promote] [--promotion-label <label>] [--log-row-snapshots] [--metadata <json>] [--python <command>] [--log-dir logs] [--no-local-log] [--json]',
|
|
579
|
+
summary: 'Run official GEPA locally and stream events, or use --hosted for a queued Orizu launch. Hosted mode does not require --candidate-runner-dir or --scorer-runner-dir, accepts only a named --budget preset, and supports response-loss recovery with --launch-intent-id. Local runner version ids materialize registered bytes, while optional runner dirs are additionally byte-verified before execution. Pass --engine legacy only for the frozen safety hatch. Skilled-proposer is official-only, its config requires that selection, and the selection cannot be combined with --reflection-prompt-template. --instruction-set requires --model-config and cannot be combined with --candidate-version-id; round-robin updates one component-map entry per round and all updates every component. --max-candidate-proposals is official-engine-only. Validates the scorer contract on the seed before iterating; judge runners built for flat-row score runs need --scorer-input-contract flat_row (ALI-1158).',
|
|
580
580
|
group: 'Optimizations',
|
|
581
581
|
},
|
|
582
582
|
{
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface HostedCommandContext {
|
|
2
|
+
environment: NodeJS.ProcessEnv;
|
|
3
|
+
getArg: (name: string) => string | null;
|
|
4
|
+
json: boolean;
|
|
5
|
+
printJson: (value: Record<string, unknown>) => void;
|
|
6
|
+
printLine: (value?: string) => void;
|
|
7
|
+
printErr: (value: string) => void;
|
|
8
|
+
resolveProjectSlug: (projectArg: string | null) => Promise<string>;
|
|
9
|
+
setExitCode: (code: number) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function dispatchHostedCommands(args: string[], context: HostedCommandContext): Promise<boolean>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=hosted-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-commands.d.ts","sourceRoot":"","sources":["../src/hosted-commands.ts"],"names":[],"mappings":"AAEA,UAAU,oBAAoB;IAAG,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAAC,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE;AAC/V,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAwqB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { runHostedGepaOptimization } from './hosted-gepa-cli.js';
|
|
2
|
+
import { hostedCommand } from './hosted-session-cli.js';
|
|
3
|
+
export async function dispatchHostedCommands(args, context) { const [command, subcommand] = args; if (command === 'optimizations' && subcommand === 'run-gepa' && args.includes('--hosted')) {
|
|
4
|
+
const project = context.getArg('--project') || await context.resolveProjectSlug(null);
|
|
5
|
+
await runHostedGepaOptimization({ args: args.slice(2), project, environment: context.environment, json: context.json, printJson: context.printJson, printLine: context.printLine });
|
|
6
|
+
return true;
|
|
7
|
+
} if (command === 'internal' || (command === 'session' && subcommand === 'start' && args.includes('--hosted'))) {
|
|
8
|
+
context.setExitCode(await hostedCommand(args, { json: context.json, print: context.printLine, printErr: context.printErr }));
|
|
9
|
+
return true;
|
|
10
|
+
} return false; }
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface HostedGepaOptions {
|
|
2
|
+
args: string[];
|
|
3
|
+
project: string;
|
|
4
|
+
environment: NodeJS.ProcessEnv;
|
|
5
|
+
json: boolean;
|
|
6
|
+
printJson: (value: Record<string, unknown>) => void;
|
|
7
|
+
printLine: (value: string) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function runHostedGepaOptimization(options: HostedGepaOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=hosted-gepa-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-gepa-cli.d.ts","sourceRoot":"","sources":["../src/hosted-gepa-cli.ts"],"names":[],"mappings":"AAQA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAC,UAAU,CAAA;IAC9B,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACnD,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAmBD,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEzF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { dispatchGepaEngine } from './gepa-engine-dispatch.js';
|
|
3
|
+
import { parseHostedGepaNumericValue } from './hosted-gepa-numeric-values.js';
|
|
4
|
+
import { authedFetch } from './http.js';
|
|
5
|
+
import { hostedProviderSettingsError } from './hosted-provider-settings.js';
|
|
6
|
+
import { parseJsonResponse } from './json-response.js';
|
|
7
|
+
function argumentValue(args, name) {
|
|
8
|
+
const index = args.indexOf(name);
|
|
9
|
+
if (index >= 0 && index + 1 < args.length)
|
|
10
|
+
return args[index + 1];
|
|
11
|
+
return args.find(argument => argument.startsWith(`${name}=`))?.slice(name.length + 1) ?? null;
|
|
12
|
+
}
|
|
13
|
+
function dispatchArgs(args) {
|
|
14
|
+
const filtered = [];
|
|
15
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
16
|
+
if (args[index] === '--hosted')
|
|
17
|
+
continue;
|
|
18
|
+
if (args[index] === '--launch-intent-id') {
|
|
19
|
+
index += 1;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (args[index].startsWith('--launch-intent-id='))
|
|
23
|
+
continue;
|
|
24
|
+
filtered.push(args[index]);
|
|
25
|
+
}
|
|
26
|
+
return filtered;
|
|
27
|
+
}
|
|
28
|
+
export async function runHostedGepaOptimization(options) {
|
|
29
|
+
const hasLaunchIntent = options.args.some(argument => argument === '--launch-intent-id' || argument.startsWith('--launch-intent-id='));
|
|
30
|
+
const explicitLaunchIntent = argumentValue(options.args, '--launch-intent-id');
|
|
31
|
+
if (hasLaunchIntent && (!explicitLaunchIntent || explicitLaunchIntent.startsWith('-')
|
|
32
|
+
|| !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(explicitLaunchIntent))) {
|
|
33
|
+
throw new Error('--launch-intent-id must be a UUIDv4 value when provided.');
|
|
34
|
+
}
|
|
35
|
+
const args = dispatchArgs(options.args);
|
|
36
|
+
if (['--max-iterations', '--max-full-evals', '--max-metric-calls', '--max-candidate-proposals']
|
|
37
|
+
.some(flag => args.some(argument => argument === flag || argument.startsWith(`${flag}=`)))) {
|
|
38
|
+
throw new Error('Hosted optimization requires a named --budget preset; numeric budget controls are not accepted.');
|
|
39
|
+
}
|
|
40
|
+
const dispatch = dispatchGepaEngine(args, options.project, options.environment);
|
|
41
|
+
if (dispatch.engine !== 'official')
|
|
42
|
+
throw new Error('Hosted optimization requires the official GEPA engine.');
|
|
43
|
+
const env = dispatch.environment;
|
|
44
|
+
const required = [
|
|
45
|
+
['ORIZU_OPTIMIZER_VERSION_ID', '--optimizer-version-id'], ['ORIZU_RUNNER_VERSION_ID', '--runner-version-id'],
|
|
46
|
+
['ORIZU_SCORER_VERSION_ID', '--scorer-version-id'], ['ORIZU_SCORER_RUNNER_VERSION_ID', '--scorer-runner-version-id'],
|
|
47
|
+
['ORIZU_DATASET_VERSION_ID', '--dataset-version-id'], ['ORIZU_SPLIT_SET_ID', '--split-set-id'],
|
|
48
|
+
];
|
|
49
|
+
for (const [name, flag] of required)
|
|
50
|
+
if (!env[name])
|
|
51
|
+
throw new Error(`${flag} is required for hosted optimization.`);
|
|
52
|
+
const providerSettings = JSON.parse(env.ORIZU_REFLECTION_PROVIDER_SETTINGS ?? '{}');
|
|
53
|
+
const providerSettingsError = hostedProviderSettingsError(providerSettings, env.ORIZU_REFLECTION_MODEL ?? 'anthropic/', env.ORIZU_REFLECTION_TEMPERATURE);
|
|
54
|
+
if (providerSettingsError)
|
|
55
|
+
throw new Error(providerSettingsError);
|
|
56
|
+
const optional = {};
|
|
57
|
+
const fields = [
|
|
58
|
+
['candidateProposer', 'ORIZU_CANDIDATE_PROPOSER', 'string'], ['candidateProposerConfig', 'ORIZU_SKILLED_PROPOSER_CONFIG', 'json'],
|
|
59
|
+
['proposalMaxCalls', 'ORIZU_PROPOSAL_MAX_CALLS', 'number'], ['proposalMaxTokens', 'ORIZU_PROPOSAL_MAX_TOKENS', 'number'],
|
|
60
|
+
['minibatchSize', 'ORIZU_MINIBATCH_SIZE', 'number'], ['numThreads', 'ORIZU_NUM_THREADS', 'number'],
|
|
61
|
+
['candidateSelectionStrategy', 'ORIZU_CANDIDATE_SELECTION_STRATEGY', 'string'], ['epsilon', 'ORIZU_EPSILON', 'number'],
|
|
62
|
+
['reflectionModel', 'ORIZU_REFLECTION_MODEL', 'string'], ['reflectionTemperature', 'ORIZU_REFLECTION_TEMPERATURE', 'number'],
|
|
63
|
+
['reflectionMaxTokens', 'ORIZU_REFLECTION_MAX_TOKENS', 'number'], ['reflectionRetryAttempts', 'ORIZU_REFLECTION_RETRY_ATTEMPTS', 'number'],
|
|
64
|
+
['reflectionHttpTimeoutSeconds', 'ORIZU_REFLECTION_HTTP_TIMEOUT_SECONDS', 'number'],
|
|
65
|
+
['reflectionPromptTemplate', 'ORIZU_REFLECTION_PROMPT_TEMPLATE', 'string'],
|
|
66
|
+
['reflectionProviderSettings', 'ORIZU_REFLECTION_PROVIDER_SETTINGS', 'json'], ['objective', 'ORIZU_OBJECTIVE', 'string'],
|
|
67
|
+
['seed', 'ORIZU_SEED', 'number'], ['disableEvaluationCache', 'ORIZU_DISABLE_EVALUATION_CACHE', 'boolean'],
|
|
68
|
+
['allowDegenerateSeed', 'ORIZU_ALLOW_DEGENERATE_SEED', 'boolean'],
|
|
69
|
+
['skipPerfectParentReflection', 'ORIZU_SKIP_PERFECT_PARENT_REFLECTION', 'boolean'],
|
|
70
|
+
];
|
|
71
|
+
for (const [field, name, kind] of fields) {
|
|
72
|
+
if (env[name] === undefined)
|
|
73
|
+
continue;
|
|
74
|
+
optional[field] = kind === 'number' ? parseHostedGepaNumericValue(field, env[name])
|
|
75
|
+
: kind === 'json' ? JSON.parse(env[name]) : kind === 'boolean' ? env[name] === '1' : env[name];
|
|
76
|
+
}
|
|
77
|
+
const launchIntentId = explicitLaunchIntent || randomUUID();
|
|
78
|
+
const body = {
|
|
79
|
+
hosted: true, launchIntentId, optimizerVersionId: env.ORIZU_OPTIMIZER_VERSION_ID,
|
|
80
|
+
promptVersionIds: env.ORIZU_PROMPT_VERSION_ID ? [env.ORIZU_PROMPT_VERSION_ID] : [],
|
|
81
|
+
...(env.ORIZU_INSTRUCTION_SET_NAME ? { instructionSetName: env.ORIZU_INSTRUCTION_SET_NAME,
|
|
82
|
+
modelConfigIdentity: env.ORIZU_MODEL_CONFIG_IDENTITY, componentSelector: env.ORIZU_COMPONENT_SELECTOR } : {}),
|
|
83
|
+
runnerVersionId: env.ORIZU_RUNNER_VERSION_ID,
|
|
84
|
+
scorers: [{ scorerVersionId: env.ORIZU_SCORER_VERSION_ID,
|
|
85
|
+
scorerRunnerVersionId: env.ORIZU_SCORER_RUNNER_VERSION_ID, role: 'selection', scorerConfig: {} }],
|
|
86
|
+
datasetVersionId: env.ORIZU_DATASET_VERSION_ID, splitSetId: env.ORIZU_SPLIT_SET_ID,
|
|
87
|
+
trainSplitName: env.ORIZU_TRAIN_SPLIT ?? 'train', validationSplitName: env.ORIZU_VALIDATION_SPLIT ?? 'validation',
|
|
88
|
+
engine: 'official', scorerInputContract: env.ORIZU_SCORER_INPUT_CONTRACT ?? 'gepa',
|
|
89
|
+
scorerCandidateField: env.ORIZU_SCORER_CANDIDATE_FIELD ?? null, budget: env.ORIZU_BUDGET ?? 'auto', ...optional,
|
|
90
|
+
};
|
|
91
|
+
const response = await authedFetch(`/api/cli/optimization-runs?project=${encodeURIComponent(options.project)}`, {
|
|
92
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body),
|
|
93
|
+
});
|
|
94
|
+
const data = await parseJsonResponse(response, 'Hosted optimization launch');
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
if (options.json) {
|
|
97
|
+
options.printJson(data);
|
|
98
|
+
process.exitCode = 1;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
throw new Error(JSON.stringify(data));
|
|
102
|
+
}
|
|
103
|
+
if (options.json) {
|
|
104
|
+
options.printJson(data);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
options.printLine('Queued hosted optimization.');
|
|
108
|
+
options.printLine(`Launch intent: ${launchIntentId}`);
|
|
109
|
+
options.printLine(String(data.monitorUrl));
|
|
110
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-gepa-numeric-values.d.ts","sourceRoot":"","sources":["../src/hosted-gepa-numeric-values.ts"],"names":[],"mappings":"AAyCA,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAS5F;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAOrF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const isFiniteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
|
|
2
|
+
const isInteger = (value) => isFiniteNumber(value) && Number.isInteger(value);
|
|
3
|
+
const isPositiveInteger = (value) => isInteger(value) && value > 0;
|
|
4
|
+
const rules = [
|
|
5
|
+
...[
|
|
6
|
+
['proposalMaxCalls', '--proposal-max-calls'],
|
|
7
|
+
['proposalMaxTokens', '--proposal-max-tokens'],
|
|
8
|
+
['maxIterations', '--max-iterations'],
|
|
9
|
+
['maxCandidateProposals', '--max-candidate-proposals'],
|
|
10
|
+
['maxFullEvals', '--max-full-evals'],
|
|
11
|
+
['maxMetricCalls', '--max-metric-calls'],
|
|
12
|
+
['minibatchSize', '--minibatch-size'],
|
|
13
|
+
['reflectionMaxTokens', '--reflection-max-tokens'],
|
|
14
|
+
['reflectionRetryAttempts', '--reflection-retry-attempts'],
|
|
15
|
+
['reflectionHttpTimeoutSeconds', '--reflection-http-timeout-seconds'],
|
|
16
|
+
].map(([field, flag]) => ({ field, flag, grammar: 'positive integer', accepts: isPositiveInteger })),
|
|
17
|
+
{
|
|
18
|
+
field: 'numThreads', flag: '--num-threads', grammar: 'auto or positive integer',
|
|
19
|
+
accepts: value => value === 'auto' || isPositiveInteger(value),
|
|
20
|
+
},
|
|
21
|
+
...[
|
|
22
|
+
['epsilon', '--epsilon'],
|
|
23
|
+
['reflectionTemperature', '--reflection-temperature'],
|
|
24
|
+
].map(([field, flag]) => ({ field, flag, grammar: 'finite number', accepts: isFiniteNumber })),
|
|
25
|
+
{ field: 'seed', flag: '--seed', grammar: 'integer', accepts: isInteger },
|
|
26
|
+
];
|
|
27
|
+
const integerPattern = /^[+-]?\d+$/;
|
|
28
|
+
const floatPattern = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
|
|
29
|
+
export function parseHostedGepaNumericValue(field, rawValue) {
|
|
30
|
+
const rule = rules.find(candidate => candidate.field === field);
|
|
31
|
+
if (!rule)
|
|
32
|
+
throw new Error(`Unknown hosted numeric field ${field}`);
|
|
33
|
+
const trimmed = rawValue.trim();
|
|
34
|
+
if (field === 'numThreads' && trimmed.toLowerCase() === 'auto')
|
|
35
|
+
return 'auto';
|
|
36
|
+
const lexicalPattern = rule.grammar === 'finite number' ? floatPattern : integerPattern;
|
|
37
|
+
const parsed = lexicalPattern.test(trimmed) ? Number(trimmed) : Number.NaN;
|
|
38
|
+
if (!rule.accepts(parsed))
|
|
39
|
+
throw new Error(`${rule.flag} must be ${rule.grammar}`);
|
|
40
|
+
return parsed;
|
|
41
|
+
}
|
|
42
|
+
export function hostedGepaNumericError(values) {
|
|
43
|
+
for (const rule of rules) {
|
|
44
|
+
if (values[rule.field] !== undefined && !rule.accepts(values[rule.field])) {
|
|
45
|
+
return `${rule.field} must be ${rule.grammar}`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-provider-settings.d.ts","sourceRoot":"","sources":["../src/hosted-provider-settings.ts"],"names":[],"mappings":"AAqDA,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAqC;AAE9G,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAe,EAAE,WAAW,CAAC,EAAE,OAAO,GAC1D,MAAM,GAAG,IAAI,CAWf"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
function isRecord(value) {
|
|
2
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
function hasOnlyKeys(value, keys) {
|
|
5
|
+
return Object.keys(value).every(key => keys.includes(key));
|
|
6
|
+
}
|
|
7
|
+
function isChoice(value, choices) {
|
|
8
|
+
return typeof value === 'string' && choices.includes(value);
|
|
9
|
+
}
|
|
10
|
+
function isProviderObject(value, keys, choices) {
|
|
11
|
+
return isRecord(value) && hasOnlyKeys(value, keys)
|
|
12
|
+
&& Object.entries(value).every(([key, nested]) => isChoice(nested, choices[key] ?? []));
|
|
13
|
+
}
|
|
14
|
+
function isCredentialKey(key) {
|
|
15
|
+
const tokens = key.replaceAll(/([a-z0-9])([A-Z])/g, '$1 $2').toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);
|
|
16
|
+
return tokens.some(token => ['auth', 'authorization', 'token', 'secret', 'password', 'passwd', 'credential', 'credentials', 'key'].includes(token))
|
|
17
|
+
|| /(?:authorization|authheader|bearer|token|secret|password|passwd|credential|credentials|apikey|accesskey(?:id)?|privatekey|clientkey|secretkey|connection(?:string|url)|dsn)$/.test(tokens.join(''));
|
|
18
|
+
}
|
|
19
|
+
function containsCredential(value, root = true) {
|
|
20
|
+
if (Array.isArray(value))
|
|
21
|
+
return root || value.some(nested => containsCredential(nested, false));
|
|
22
|
+
if (!isRecord(value))
|
|
23
|
+
return root ? value !== undefined
|
|
24
|
+
: typeof value === 'string' && (/(?:authorization|bearer|x-api-key|x-auth-token)\s*[: ]/i.test(value)
|
|
25
|
+
|| /^[a-z]+:\/\/[^/@]*:[^/@]*@/i.test(value));
|
|
26
|
+
return Object.entries(value).some(([key, nested]) => isCredentialKey(key) || containsCredential(nested, false));
|
|
27
|
+
}
|
|
28
|
+
function unsupportedHostedSetting(value, model) {
|
|
29
|
+
if (value === undefined)
|
|
30
|
+
return null;
|
|
31
|
+
if (!isRecord(value))
|
|
32
|
+
return '<root>';
|
|
33
|
+
const providerKeys = model.startsWith('openai/') ? ['reasoning']
|
|
34
|
+
: model.startsWith('anthropic/') ? ['thinking', 'output_config'] : [];
|
|
35
|
+
const unknown = Object.keys(value).find(key => !['top_p', ...providerKeys].includes(key));
|
|
36
|
+
if (unknown)
|
|
37
|
+
return unknown;
|
|
38
|
+
if (value.top_p !== undefined && (typeof value.top_p !== 'number'
|
|
39
|
+
|| !Number.isFinite(value.top_p) || value.top_p < 0 || value.top_p > 1))
|
|
40
|
+
return 'top_p';
|
|
41
|
+
if (value.thinking !== undefined && (!isRecord(value.thinking) || value.thinking.type === undefined))
|
|
42
|
+
return 'thinking.type';
|
|
43
|
+
for (const [key, nested, keys, choices] of [
|
|
44
|
+
['thinking', value.thinking, ['type'], { type: ['adaptive'] }],
|
|
45
|
+
['output_config', value.output_config, ['effort'], { effort: ['low', 'medium', 'high', 'max'] }],
|
|
46
|
+
['reasoning', value.reasoning, ['effort', 'summary'], { effort: ['minimal', 'low', 'medium', 'high', 'xhigh'], summary: ['auto', 'concise', 'detailed'] }],
|
|
47
|
+
])
|
|
48
|
+
if (nested !== undefined && !isProviderObject(nested, keys, choices)) {
|
|
49
|
+
if (!isRecord(nested))
|
|
50
|
+
return key;
|
|
51
|
+
return `${key}.${Object.keys(nested).find(child => !keys.includes(child)
|
|
52
|
+
|| !isChoice(nested[child], choices[child] ?? [])) ?? key}`;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
export function hostedSettingsContainCredentials(value) { return containsCredential(value); }
|
|
57
|
+
export function hostedProviderSettingsError(value, model = 'anthropic/', temperature) {
|
|
58
|
+
if (hostedSettingsContainCredentials(value)) {
|
|
59
|
+
return 'Hosted reflection provider settings must not contain credential-bearing fields.';
|
|
60
|
+
}
|
|
61
|
+
const unsupported = unsupportedHostedSetting(value, model);
|
|
62
|
+
if (unsupported)
|
|
63
|
+
return `Unsupported hosted setting "${unsupported}".`;
|
|
64
|
+
if (model.startsWith('anthropic/') && temperature !== undefined && temperature !== null
|
|
65
|
+
&& isRecord(value) && value.thinking !== undefined) {
|
|
66
|
+
return 'reflection_temperature cannot be combined with Anthropic thinking';
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hosted-session-cli.d.ts","sourceRoot":"","sources":["../src/hosted-session-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAIH,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAA;AAK9B,OAAO,EAAE,oBAAoB,EAAqB,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"hosted-session-cli.d.ts","sourceRoot":"","sources":["../src/hosted-session-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,7 @@ import { buildEgressPolicy, DEFAULT_EGRESS_CANARY_HOST } from './egress-policy.j
|
|
|
44
44
|
import { DEFAULT_HOSTED_MODEL, hostedLoopCommand } from './hosted-loop.js';
|
|
45
45
|
import { hostedBootCommand } from './hosted-boot.js';
|
|
46
46
|
import { mergeJobCommand } from './merge-job.js';
|
|
47
|
+
import { skilledProposerBakeCommand } from './skilled-proposer-launch.js';
|
|
47
48
|
import { authedFetch } from './http.js';
|
|
48
49
|
import { resolveBaseUrl } from './http.js';
|
|
49
50
|
import { findUnknownOption } from './option-validation.js';
|
|
@@ -1185,7 +1186,11 @@ export async function hostedCommand(args, io, deps = {}) {
|
|
|
1185
1186
|
if (positional[1] === 'merge-job') {
|
|
1186
1187
|
return mergeJobCommand(io);
|
|
1187
1188
|
}
|
|
1188
|
-
|
|
1189
|
+
if (positional[1] === 'bake-skilled-proposer-venv')
|
|
1190
|
+
return skilledProposerBakeCommand(io);
|
|
1191
|
+
if (positional[1] === 'verify-skilled-proposer-bake')
|
|
1192
|
+
return skilledProposerBakeCommand(io, true);
|
|
1193
|
+
io.printErr?.('Usage: orizu internal <hosted-loop --context <path> | hosted-boot | merge-job | bake-skilled-proposer-venv | verify-skilled-proposer-bake>');
|
|
1189
1194
|
return 1;
|
|
1190
1195
|
}
|
|
1191
1196
|
const unknownOption = findUnknownOption(args, HOSTED_START_OPTIONS, HOSTED_START_VALUE_OPTIONS);
|
package/dist/http.d.ts
CHANGED
|
@@ -4,5 +4,6 @@ export declare function resolveBaseUrl(flags?: GlobalFlags): string;
|
|
|
4
4
|
export declare function resolveLoginBaseUrl(flags?: GlobalFlags): string;
|
|
5
5
|
export declare function getBaseUrl(): string;
|
|
6
6
|
export declare function assertSecureTokenTransport(baseUrl: string): void;
|
|
7
|
+
export declare function credentialRequestRedirectPolicy(): Pick<RequestInit, 'redirect'>;
|
|
7
8
|
export declare function authedFetch(path: string, init?: RequestInit): Promise<Response>;
|
|
8
9
|
//# sourceMappingURL=http.d.ts.map
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AAKjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,QAEhD;AAED,wBAAgB,cAAc,CAAC,KAAK,GAAE,WAA0B,GAAG,MAAM,CAiBxE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,GAAE,WAA0B,GAAG,MAAM,CAY7E;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAWD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,QAmBzD;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AAKjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,QAEhD;AAED,wBAAgB,cAAc,CAAC,KAAK,GAAE,WAA0B,GAAG,MAAM,CAiBxE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,GAAE,WAA0B,GAAG,MAAM,CAY7E;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAWD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,QAmBzD;AAeD,wBAAgB,+BAA+B,IAAI,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAE/E;AAkCD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,qBAqDrE"}
|
package/dist/http.js
CHANGED
|
@@ -65,6 +65,9 @@ function isExpired(expiresAt) {
|
|
|
65
65
|
const nowUnix = Math.floor(Date.now() / 1000);
|
|
66
66
|
return expiresAt <= nowUnix + 30;
|
|
67
67
|
}
|
|
68
|
+
export function credentialRequestRedirectPolicy() {
|
|
69
|
+
return process.env.ORIZU_CLI_AUTH_REDIRECT === 'error' ? { redirect: 'error' } : {};
|
|
70
|
+
}
|
|
68
71
|
async function refreshCredentials(baseUrl, credentials) {
|
|
69
72
|
if (!isSessionCredentials(credentials)) {
|
|
70
73
|
throw new Error('API key credentials do not refresh. Run `orizu login` again if access fails.');
|
|
@@ -74,6 +77,7 @@ async function refreshCredentials(baseUrl, credentials) {
|
|
|
74
77
|
method: 'POST',
|
|
75
78
|
headers: { 'Content-Type': 'application/json' },
|
|
76
79
|
body: JSON.stringify({ refreshToken: credentials.refreshToken }),
|
|
80
|
+
...credentialRequestRedirectPolicy(),
|
|
77
81
|
});
|
|
78
82
|
if (!response.ok) {
|
|
79
83
|
throw new Error('Session expired. Run `orizu login` again.');
|
|
@@ -107,6 +111,7 @@ export async function authedFetch(path, init = {}) {
|
|
|
107
111
|
...(init.headers || {}),
|
|
108
112
|
Authorization: `Bearer ${envBearer}`,
|
|
109
113
|
},
|
|
114
|
+
...credentialRequestRedirectPolicy(),
|
|
110
115
|
});
|
|
111
116
|
}
|
|
112
117
|
const credentials = getServerCredentials(baseUrl);
|
|
@@ -123,6 +128,7 @@ export async function authedFetch(path, init = {}) {
|
|
|
123
128
|
...(init.headers || {}),
|
|
124
129
|
Authorization: `Bearer ${getAuthorizationToken(activeCredentials)}`,
|
|
125
130
|
},
|
|
131
|
+
...credentialRequestRedirectPolicy(),
|
|
126
132
|
});
|
|
127
133
|
if (response.status === 401 && isSessionCredentials(activeCredentials)) {
|
|
128
134
|
activeCredentials = await refreshCredentials(baseUrl, activeCredentials);
|
|
@@ -132,6 +138,7 @@ export async function authedFetch(path, init = {}) {
|
|
|
132
138
|
...(init.headers || {}),
|
|
133
139
|
Authorization: `Bearer ${getAuthorizationToken(activeCredentials)}`,
|
|
134
140
|
},
|
|
141
|
+
...credentialRequestRedirectPolicy(),
|
|
135
142
|
});
|
|
136
143
|
}
|
|
137
144
|
return response;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAmGgF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAoChJ,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAgU5E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAUD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOnD;AAyBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAcD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,GAAG,CAqB5E;AA6BD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBtD;AAkkKD,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,eAAO,MAAM,oBAAoB,aAgB/B,CAAA;AAEF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAaxH;AAWD,wBAAsB,wBAAwB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAoC3H;AA0LD,wBAAsB,IAAI,CAAC,OAAO,WAAwB,iBAygBzD"}
|