@skrr-ai/cli 0.1.33 → 0.1.35
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/base-command.js +5 -0
- package/dist/commands/learning/delete.js +2 -1
- package/dist/commands/learning/export.d.ts +4 -0
- package/dist/commands/learning/export.js +36 -2
- package/dist/commands/learning/reset.js +4 -2
- package/dist/commands/machines/hosted/resume.js +1 -0
- package/dist/lib/auth-core-init.d.ts +23 -0
- package/dist/lib/auth-core-init.js +61 -0
- package/dist/lib/dedicated-machines.js +5 -1
- package/dist/lib/hosted-machines.d.ts +1 -0
- package/dist/lib/hosted-machines.js +17 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarness.d.ts +7 -5
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarness.js +7 -5
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarness.d.ts +7 -5
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarness.js +7 -5
- package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
- package/dist/node_modules/@skrr-ai/data-provider/index.js +1 -1
- package/oclif.manifest.json +31726 -31713
- package/package.json +2 -2
package/dist/base-command.js
CHANGED
|
@@ -203,6 +203,11 @@ class BaseCommand extends core_1.Command {
|
|
|
203
203
|
(0, data_provider_1.setHttpAdapter)((0, node_adapter_1.createNodeAdapter)());
|
|
204
204
|
return;
|
|
205
205
|
}
|
|
206
|
+
// A replacement guest keeps its workspace but receives a fresh Linux
|
|
207
|
+
// machine-id. Retire the prior instance's machine-bound CLI envelopes
|
|
208
|
+
// before migration/prefetch reads them; the current daemon handoff below
|
|
209
|
+
// supplies fresh authority without a user login.
|
|
210
|
+
await (0, auth_core_init_1.prepareDedicatedRuntimeAuthGeneration)();
|
|
206
211
|
// One-shot migration: legacy token/refreshToken in cli-config.json
|
|
207
212
|
// → keychain (macOS) or cli-auth.json (elsewhere). Idempotent.
|
|
208
213
|
try {
|
|
@@ -14,7 +14,8 @@ class LearningDelete extends base_command_1.BaseCommand {
|
|
|
14
14
|
const { flags } = await this.parse(LearningDelete);
|
|
15
15
|
if (!flags.yes &&
|
|
16
16
|
!(await this.confirm('Delete all adaptive-learning state, episodes, and outcomes? [y/N] '))) {
|
|
17
|
-
|
|
17
|
+
this.log('Cancelled.');
|
|
18
|
+
this.exit(1);
|
|
18
19
|
}
|
|
19
20
|
let result;
|
|
20
21
|
try {
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { BaseCommand } from '../../base-command';
|
|
2
2
|
export default class LearningExport extends BaseCommand {
|
|
3
3
|
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
7
|
+
};
|
|
4
8
|
run(): Promise<void>;
|
|
5
9
|
}
|
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const promises_1 = require("node:fs/promises");
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
3
5
|
const base_command_1 = require("../../base-command");
|
|
4
6
|
const api_fetch_1 = require("../../lib/api-fetch");
|
|
5
7
|
class LearningExport extends base_command_1.BaseCommand {
|
|
6
8
|
static description = 'Export your adaptive-learning consent, state, episodes, and outcomes as JSON';
|
|
9
|
+
static examples = [
|
|
10
|
+
'<%= config.bin %> learning export --output learning-data.json',
|
|
11
|
+
'<%= config.bin %> learning export --output - | jq .consent',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
output: core_1.Flags.string({
|
|
15
|
+
char: 'o',
|
|
16
|
+
description: 'Required destination path; use "-" only for deliberate stdout output',
|
|
17
|
+
required: true,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
7
20
|
async run() {
|
|
8
21
|
this.requireAuth();
|
|
9
|
-
await this.parse(LearningExport);
|
|
22
|
+
const { flags } = await this.parse(LearningExport);
|
|
10
23
|
let result;
|
|
11
24
|
try {
|
|
12
25
|
result = await (0, api_fetch_1.apiFetch)('/api/user/adaptive-learning/export', {
|
|
@@ -16,7 +29,28 @@ class LearningExport extends base_command_1.BaseCommand {
|
|
|
16
29
|
catch (err) {
|
|
17
30
|
this.handleApiError(err);
|
|
18
31
|
}
|
|
19
|
-
|
|
32
|
+
const serialized = `${JSON.stringify(result, null, 2)}\n`;
|
|
33
|
+
if (flags.output === '-') {
|
|
34
|
+
this.log(serialized.trimEnd());
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
await (0, promises_1.writeFile)(flags.output, serialized, {
|
|
39
|
+
encoding: 'utf8',
|
|
40
|
+
flag: 'wx',
|
|
41
|
+
mode: 0o600,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
this.failWithCliError({
|
|
46
|
+
message: `Could not write ${flags.output}: ${err.message}`,
|
|
47
|
+
code: 'ADAPTIVE_LEARNING_EXPORT_WRITE_FAILED',
|
|
48
|
+
exit: 1,
|
|
49
|
+
retryable: false,
|
|
50
|
+
details: { path: flags.output },
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
this.log(`Wrote adaptive-learning export to ${flags.output}.`);
|
|
20
54
|
}
|
|
21
55
|
}
|
|
22
56
|
exports.default = LearningExport;
|
|
@@ -12,8 +12,10 @@ class LearningReset extends base_command_1.BaseCommand {
|
|
|
12
12
|
async run() {
|
|
13
13
|
this.requireAuth();
|
|
14
14
|
const { flags } = await this.parse(LearningReset);
|
|
15
|
-
if (!flags.yes && !(await this.confirm('Reset all learned serving state? [y/N] ')))
|
|
16
|
-
|
|
15
|
+
if (!flags.yes && !(await this.confirm('Reset all learned serving state? [y/N] '))) {
|
|
16
|
+
this.log('Cancelled.');
|
|
17
|
+
this.exit(1);
|
|
18
|
+
}
|
|
17
19
|
let result;
|
|
18
20
|
try {
|
|
19
21
|
result = await (0, api_fetch_1.apiFetch)('/api/user/adaptive-learning/reset', {
|
|
@@ -1,4 +1,26 @@
|
|
|
1
1
|
import { type AuthBundle } from './auth-storage';
|
|
2
|
+
type DedicatedGenerationPreparationOptions = {
|
|
3
|
+
machineUuid?: string;
|
|
4
|
+
configDir?: string;
|
|
5
|
+
clearStoredAuth?: () => void;
|
|
6
|
+
clearCredentialEnvelope?: () => Promise<void>;
|
|
7
|
+
clearDeviceIdentity?: () => Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* A Dedicated Runtime's workspace survives replacement but `/etc/machine-id`
|
|
11
|
+
* intentionally does not. Linux's fallback KEK is derived from that id, so a
|
|
12
|
+
* CLI credential persisted by the prior instance is unreadable on the next
|
|
13
|
+
* one. The guest never needs that stale authority: its root-owned loopback
|
|
14
|
+
* handoff descriptor mints a fresh CLI credential from the current daemon.
|
|
15
|
+
*
|
|
16
|
+
* Clear only the workload CLI's machine-bound auth artifacts once per runtime
|
|
17
|
+
* generation, before auth-core tries to decrypt them. A cross-process lock is
|
|
18
|
+
* required because terminals and agent tools can launch several `skrr`
|
|
19
|
+
* processes as soon as the guest becomes ready; without it they can clear a
|
|
20
|
+
* sibling's just-enrolled credential. The marker contains identity, not a
|
|
21
|
+
* secret, and stays in the persistent workspace beside the auth files.
|
|
22
|
+
*/
|
|
23
|
+
export declare function prepareDedicatedRuntimeAuthGeneration(options?: DedicatedGenerationPreparationOptions): Promise<boolean>;
|
|
2
24
|
export declare function ensureAuthCoreConfigured(): void;
|
|
3
25
|
export declare class CliCredentialInitializationError extends Error {
|
|
4
26
|
readonly code = "CREDENTIAL_INITIALIZATION_UNAVAILABLE";
|
|
@@ -42,3 +64,4 @@ export declare function waitForCliCredentialEnvelope(): Promise<void>;
|
|
|
42
64
|
/** @internal Test seam — reset the module-level one-shot initialization. */
|
|
43
65
|
export declare function __resetPrefetchCliAuthForTest(): void;
|
|
44
66
|
export declare function shouldUseAccessTokenForEnrollment(bundle: Pick<AuthBundle, 'token' | 'expiresAt'> | null | undefined, nowMs?: number, minTtlMs?: number): boolean;
|
|
67
|
+
export {};
|
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.CliCredentialInitializationError = void 0;
|
|
7
|
+
exports.prepareDedicatedRuntimeAuthGeneration = prepareDedicatedRuntimeAuthGeneration;
|
|
7
8
|
exports.ensureAuthCoreConfigured = ensureAuthCoreConfigured;
|
|
8
9
|
exports.prefetchCliAuth = prefetchCliAuth;
|
|
9
10
|
exports.waitForCliCredentialEnvelope = waitForCliCredentialEnvelope;
|
|
@@ -33,8 +34,10 @@ exports.shouldUseAccessTokenForEnrollment = shouldUseAccessTokenForEnrollment;
|
|
|
33
34
|
* - Fire-and-forget enrollment when an access token is already
|
|
34
35
|
* present — short-circuits silently on a fresh install before login.
|
|
35
36
|
*/
|
|
37
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
36
38
|
const node_os_1 = __importDefault(require("node:os"));
|
|
37
39
|
const node_path_1 = __importDefault(require("node:path"));
|
|
40
|
+
const proper_lockfile_1 = __importDefault(require("proper-lockfile"));
|
|
38
41
|
const auth_core_1 = require("@skrr-ai/auth-core");
|
|
39
42
|
const cred_envelope_1 = require("./cred-envelope");
|
|
40
43
|
const device_identity_1 = require("./device-identity");
|
|
@@ -64,6 +67,64 @@ const cliLogger = {
|
|
|
64
67
|
* so cross-binary file paths align byte-for-byte.
|
|
65
68
|
*/
|
|
66
69
|
const DEFAULT_PROFILE = 'default';
|
|
70
|
+
const DEDICATED_AUTH_GENERATION_MARKER = 'dedicated-runtime-auth-generation';
|
|
71
|
+
/**
|
|
72
|
+
* A Dedicated Runtime's workspace survives replacement but `/etc/machine-id`
|
|
73
|
+
* intentionally does not. Linux's fallback KEK is derived from that id, so a
|
|
74
|
+
* CLI credential persisted by the prior instance is unreadable on the next
|
|
75
|
+
* one. The guest never needs that stale authority: its root-owned loopback
|
|
76
|
+
* handoff descriptor mints a fresh CLI credential from the current daemon.
|
|
77
|
+
*
|
|
78
|
+
* Clear only the workload CLI's machine-bound auth artifacts once per runtime
|
|
79
|
+
* generation, before auth-core tries to decrypt them. A cross-process lock is
|
|
80
|
+
* required because terminals and agent tools can launch several `skrr`
|
|
81
|
+
* processes as soon as the guest becomes ready; without it they can clear a
|
|
82
|
+
* sibling's just-enrolled credential. The marker contains identity, not a
|
|
83
|
+
* secret, and stays in the persistent workspace beside the auth files.
|
|
84
|
+
*/
|
|
85
|
+
async function prepareDedicatedRuntimeAuthGeneration(options = {}) {
|
|
86
|
+
const machineUuid = String(options.machineUuid ?? process.env.SKRR_MACHINE_UUID ?? '').trim();
|
|
87
|
+
if (!machineUuid.startsWith('dedicated-runtime:'))
|
|
88
|
+
return false;
|
|
89
|
+
const configDir = options.configDir ?? node_path_1.default.join(node_os_1.default.homedir(), '.skrr');
|
|
90
|
+
node_fs_1.default.mkdirSync(configDir, { recursive: true, mode: 0o700 });
|
|
91
|
+
const markerPath = node_path_1.default.join(configDir, DEDICATED_AUTH_GENERATION_MARKER);
|
|
92
|
+
const release = await proper_lockfile_1.default.lock(configDir, {
|
|
93
|
+
lockfilePath: `${markerPath}.lock`,
|
|
94
|
+
realpath: false,
|
|
95
|
+
retries: { retries: 20, minTimeout: 25, maxTimeout: 250 },
|
|
96
|
+
});
|
|
97
|
+
try {
|
|
98
|
+
let recorded = '';
|
|
99
|
+
try {
|
|
100
|
+
recorded = node_fs_1.default.readFileSync(markerPath, 'utf8').trim();
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (error.code !== 'ENOENT')
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
if (recorded === machineUuid)
|
|
107
|
+
return false;
|
|
108
|
+
(options.clearStoredAuth ?? auth_storage_1.clearAllBackends)();
|
|
109
|
+
await (options.clearDeviceIdentity ??
|
|
110
|
+
(() => (0, device_identity_1.resetDeviceIdentity)({
|
|
111
|
+
profile: DEFAULT_PROFILE,
|
|
112
|
+
clearOnDisk: true,
|
|
113
|
+
})))();
|
|
114
|
+
await (options.clearCredentialEnvelope ??
|
|
115
|
+
(() => (0, cred_envelope_1.resetCredEnvelope)({
|
|
116
|
+
profile: DEFAULT_PROFILE,
|
|
117
|
+
clearOnDisk: true,
|
|
118
|
+
})))();
|
|
119
|
+
const temporary = `${markerPath}.tmp.${process.pid}.${Date.now()}`;
|
|
120
|
+
node_fs_1.default.writeFileSync(temporary, `${machineUuid}\n`, { mode: 0o600 });
|
|
121
|
+
node_fs_1.default.renameSync(temporary, markerPath);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
await release();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
67
128
|
/**
|
|
68
129
|
* Soft cap so a stuck KEK probe (corrupt keychain, hung native binding)
|
|
69
130
|
* does not wedge commands on a fresh/plaintext install. Persisted encrypted
|
|
@@ -893,7 +893,11 @@ function formatDedicatedRuntimeApiError(err) {
|
|
|
893
893
|
}
|
|
894
894
|
try {
|
|
895
895
|
const parsed = JSON.parse(err.body);
|
|
896
|
-
|
|
896
|
+
// This formatter is reached only by `machines dedicated *`. Older API
|
|
897
|
+
// replicas and product-neutral action errors may still carry the Hosted
|
|
898
|
+
// Machine noun even though the caller named a Dedicated Runtime. Do not
|
|
899
|
+
// repeat that contradictory product name while a mixed deployment rolls.
|
|
900
|
+
const sentence = (parsed.message || parsed.error || parsed.code)?.replace(/(?:skrr )?Hosted Machine/g, 'Dedicated Runtime');
|
|
897
901
|
return sentence ? `${sentence}${describeRefusalReasons(err)}` : null;
|
|
898
902
|
}
|
|
899
903
|
catch {
|
|
@@ -162,6 +162,7 @@ export declare function waitForHostedMachineReady(id: string, options: HostedMac
|
|
|
162
162
|
intervalMs: number;
|
|
163
163
|
timeoutMs?: number;
|
|
164
164
|
onSnapshot?: (session: HostedMachineSession) => void;
|
|
165
|
+
ignoreInitialPaused?: boolean;
|
|
165
166
|
}): Promise<HostedMachineSession>;
|
|
166
167
|
/**
|
|
167
168
|
* Human-readable age of an engine's last heartbeat, e.g. `9d`, `4h`, `12m`.
|
|
@@ -230,6 +230,7 @@ class HostedMachineReadyTimeoutError extends Error {
|
|
|
230
230
|
exports.HostedMachineReadyTimeoutError = HostedMachineReadyTimeoutError;
|
|
231
231
|
async function waitForHostedMachineReady(id, options) {
|
|
232
232
|
const startedAt = Date.now();
|
|
233
|
+
let observedResumeProgress = false;
|
|
233
234
|
while (true) {
|
|
234
235
|
const response = await getHostedMachine(id, options);
|
|
235
236
|
const session = response.session;
|
|
@@ -244,6 +245,9 @@ async function waitForHostedMachineReady(id, options) {
|
|
|
244
245
|
const detail = hostedMachineErrorSummary(session);
|
|
245
246
|
throw new Error(`Hosted Machine ${id} reached ${status}${detail ? `: ${detail}` : ''}`);
|
|
246
247
|
}
|
|
248
|
+
if (status !== 'paused') {
|
|
249
|
+
observedResumeProgress = true;
|
|
250
|
+
}
|
|
247
251
|
// Async resume deliberately rolls a recoverable failure back to `paused`
|
|
248
252
|
// so the retained workspace remains resumable. That is terminal for THIS
|
|
249
253
|
// wait operation even though it is not terminal for the machine. The
|
|
@@ -251,6 +255,19 @@ async function waitForHostedMachineReady(id, options) {
|
|
|
251
255
|
// row here belongs to the attempt we just started.
|
|
252
256
|
if (status === 'paused') {
|
|
253
257
|
const detail = hostedMachineErrorSummary(session);
|
|
258
|
+
// The resume endpoint enqueues asynchronously. Its first read can still
|
|
259
|
+
// return the old, clean `paused` row before the worker persists
|
|
260
|
+
// `resuming`; treating that snapshot as the attempt's terminal state
|
|
261
|
+
// makes `resume --wait` fail while the machine is actually starting.
|
|
262
|
+
// Once progress has been observed — or the paused row carries an error —
|
|
263
|
+
// it is a real rollback and remains terminal for this wait.
|
|
264
|
+
if (options.ignoreInitialPaused && !observedResumeProgress && !detail) {
|
|
265
|
+
if (options.timeoutMs && Date.now() - startedAt >= options.timeoutMs) {
|
|
266
|
+
throw new HostedMachineReadyTimeoutError(id, hostedMachineProgressSummary(session));
|
|
267
|
+
}
|
|
268
|
+
await sleep(options.intervalMs);
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
254
271
|
throw new Error(`Hosted Machine ${id} returned to paused before it became ready${detail ? `: ${detail}` : ''}`);
|
|
255
272
|
}
|
|
256
273
|
if (options.timeoutMs && Date.now() - startedAt >= options.timeoutMs) {
|
|
@@ -63,15 +63,17 @@ export interface FirstPartyHarnessIdentity {
|
|
|
63
63
|
/**
|
|
64
64
|
* THE identity — the only literal product name in the codebase.
|
|
65
65
|
*
|
|
66
|
-
* Phase:
|
|
67
|
-
* `
|
|
68
|
-
*
|
|
66
|
+
* Phase: FLIPPED. `skrr-code` is canonical — stored, returned and rendered.
|
|
67
|
+
* `sky-code` is still accepted on every ingress, and it is still the WIRE
|
|
68
|
+
* spelling: daemons on users' machines may predate the rename, so the server
|
|
69
|
+
* and a daemon keep exchanging `sky-code` until contract (OSK-8663) empties
|
|
70
|
+
* `aliases` and moves `wireProvider`.
|
|
69
71
|
*/
|
|
70
72
|
declare const IDENTITY: {
|
|
71
73
|
readonly displayName: "skrr Code";
|
|
72
74
|
readonly command: "skrr code";
|
|
73
|
-
readonly provider: "
|
|
74
|
-
readonly aliases: readonly ["
|
|
75
|
+
readonly provider: "skrr-code";
|
|
76
|
+
readonly aliases: readonly ["sky-code"];
|
|
75
77
|
readonly wireProvider: "sky-code";
|
|
76
78
|
};
|
|
77
79
|
/** The canonical slug, as a literal type. */
|
|
@@ -99,15 +99,17 @@ function defineIdentity(identity) {
|
|
|
99
99
|
/**
|
|
100
100
|
* THE identity — the only literal product name in the codebase.
|
|
101
101
|
*
|
|
102
|
-
* Phase:
|
|
103
|
-
* `
|
|
104
|
-
*
|
|
102
|
+
* Phase: FLIPPED. `skrr-code` is canonical — stored, returned and rendered.
|
|
103
|
+
* `sky-code` is still accepted on every ingress, and it is still the WIRE
|
|
104
|
+
* spelling: daemons on users' machines may predate the rename, so the server
|
|
105
|
+
* and a daemon keep exchanging `sky-code` until contract (OSK-8663) empties
|
|
106
|
+
* `aliases` and moves `wireProvider`.
|
|
105
107
|
*/
|
|
106
108
|
const IDENTITY = {
|
|
107
109
|
displayName: 'skrr Code',
|
|
108
110
|
command: 'skrr code',
|
|
109
|
-
provider: '
|
|
110
|
-
aliases: ['
|
|
111
|
+
provider: 'skrr-code',
|
|
112
|
+
aliases: ['sky-code'],
|
|
111
113
|
wireProvider: 'sky-code',
|
|
112
114
|
};
|
|
113
115
|
exports.FIRST_PARTY_HARNESS = defineIdentity(IDENTITY);
|
|
@@ -63,15 +63,17 @@ export interface FirstPartyHarnessIdentity {
|
|
|
63
63
|
/**
|
|
64
64
|
* THE identity — the only literal product name in the codebase.
|
|
65
65
|
*
|
|
66
|
-
* Phase:
|
|
67
|
-
* `
|
|
68
|
-
*
|
|
66
|
+
* Phase: FLIPPED. `skrr-code` is canonical — stored, returned and rendered.
|
|
67
|
+
* `sky-code` is still accepted on every ingress, and it is still the WIRE
|
|
68
|
+
* spelling: daemons on users' machines may predate the rename, so the server
|
|
69
|
+
* and a daemon keep exchanging `sky-code` until contract (OSK-8663) empties
|
|
70
|
+
* `aliases` and moves `wireProvider`.
|
|
69
71
|
*/
|
|
70
72
|
declare const IDENTITY: {
|
|
71
73
|
readonly displayName: "skrr Code";
|
|
72
74
|
readonly command: "skrr code";
|
|
73
|
-
readonly provider: "
|
|
74
|
-
readonly aliases: readonly ["
|
|
75
|
+
readonly provider: "skrr-code";
|
|
76
|
+
readonly aliases: readonly ["sky-code"];
|
|
75
77
|
readonly wireProvider: "sky-code";
|
|
76
78
|
};
|
|
77
79
|
/** The canonical slug, as a literal type. */
|
|
@@ -70,15 +70,17 @@ function defineIdentity(identity) {
|
|
|
70
70
|
/**
|
|
71
71
|
* THE identity — the only literal product name in the codebase.
|
|
72
72
|
*
|
|
73
|
-
* Phase:
|
|
74
|
-
* `
|
|
75
|
-
*
|
|
73
|
+
* Phase: FLIPPED. `skrr-code` is canonical — stored, returned and rendered.
|
|
74
|
+
* `sky-code` is still accepted on every ingress, and it is still the WIRE
|
|
75
|
+
* spelling: daemons on users' machines may predate the rename, so the server
|
|
76
|
+
* and a daemon keep exchanging `sky-code` until contract (OSK-8663) empties
|
|
77
|
+
* `aliases` and moves `wireProvider`.
|
|
76
78
|
*/
|
|
77
79
|
const IDENTITY = {
|
|
78
80
|
displayName: 'skrr Code',
|
|
79
81
|
command: 'skrr code',
|
|
80
|
-
provider: '
|
|
81
|
-
aliases: ['
|
|
82
|
+
provider: 'skrr-code',
|
|
83
|
+
aliases: ['sky-code'],
|
|
82
84
|
wireProvider: 'sky-code',
|
|
83
85
|
};
|
|
84
86
|
export const FIRST_PARTY_HARNESS = defineIdentity(IDENTITY);
|
|
@@ -38796,7 +38796,7 @@ function Xu(t2, n2) {
|
|
|
38796
38796
|
var i2 = qu[t2];
|
|
38797
38797
|
return i2 ? b([], i2, true) : [];
|
|
38798
38798
|
}
|
|
38799
|
-
var Qu = Object.freeze(((Gu = { claude: Object.freeze([{ value: "sonnet", label: "Sonnet", description: "Balanced \u2014 the default for most work" }, { value: "opus", label: "Opus", description: "Most capable, highest cost" }, { value: "haiku", label: "Haiku", description: "Fastest and cheapest" }, { value: "opusplan", label: "Opus plan", description: "Opus while planning, Sonnet while executing" }]), codex: Object.freeze([{ value: "gpt-5.6-sol", label: "GPT-5.6 Sol", description: "Frontier agentic coding \u2014 the Codex default", efforts: Object.freeze(["low", "medium", "high", "xhigh", "max", "ultra"]), defaultEffort: "low" }, { value: "gpt-5.6-terra", label: "GPT-5.6 Terra", description: "Balanced capability and cost", efforts: Object.freeze(["low", "medium", "high", "xhigh", "max", "ultra"]), defaultEffort: "medium" }, { value: "gpt-5.6-luna", label: "GPT-5.6 Luna", description: "Fast, high-volume work", efforts: Object.freeze(["low", "medium", "high", "xhigh", "max"]), defaultEffort: "medium" }, { value: "gpt-5.5", label: "GPT-5.5", description: "Previous generation", efforts: Object.freeze(["low", "medium", "high", "xhigh"]), defaultEffort: "medium" }, { value: "gpt-5.4", label: "GPT-5.4", description: "Previous generation", efforts: Object.freeze(["low", "medium", "high", "xhigh"]), defaultEffort: "medium" }, { value: "gpt-5.4-mini", label: "GPT-5.4 Mini", description: "Smallest and cheapest", efforts: Object.freeze(["low", "medium", "high", "xhigh"]), defaultEffort: "medium" }, { value: "gpt-5.3-codex-spark", label: "GPT-5.3 Codex Spark", description: "Low-latency coding", efforts: Object.freeze(["low", "medium", "high", "xhigh"]), defaultEffort: "high" }]), gemini: Object.freeze([{ value: "gemini-2.5-pro", label: "Gemini 2.5 Pro" }, { value: "gemini-2.5-flash", label: "Gemini 2.5 Flash", description: "Faster and cheaper" }]), "gemini-acp": Object.freeze([{ value: "gemini-2.5-pro", label: "Gemini 2.5 Pro" }, { value: "gemini-2.5-flash", label: "Gemini 2.5 Flash", description: "Faster and cheaper" }]) })[e.FIRST_PARTY_HARNESS_PROVIDER] = Object.freeze([{ value: "anthropic/claude-opus-5", label: "Claude Opus 5", description: "Most capable \u2014 the
|
|
38799
|
+
var Qu = Object.freeze(((Gu = { claude: Object.freeze([{ value: "sonnet", label: "Sonnet", description: "Balanced \u2014 the default for most work" }, { value: "opus", label: "Opus", description: "Most capable, highest cost" }, { value: "haiku", label: "Haiku", description: "Fastest and cheapest" }, { value: "opusplan", label: "Opus plan", description: "Opus while planning, Sonnet while executing" }]), codex: Object.freeze([{ value: "gpt-5.6-sol", label: "GPT-5.6 Sol", description: "Frontier agentic coding \u2014 the Codex default", efforts: Object.freeze(["low", "medium", "high", "xhigh", "max", "ultra"]), defaultEffort: "low" }, { value: "gpt-5.6-terra", label: "GPT-5.6 Terra", description: "Balanced capability and cost", efforts: Object.freeze(["low", "medium", "high", "xhigh", "max", "ultra"]), defaultEffort: "medium" }, { value: "gpt-5.6-luna", label: "GPT-5.6 Luna", description: "Fast, high-volume work", efforts: Object.freeze(["low", "medium", "high", "xhigh", "max"]), defaultEffort: "medium" }, { value: "gpt-5.5", label: "GPT-5.5", description: "Previous generation", efforts: Object.freeze(["low", "medium", "high", "xhigh"]), defaultEffort: "medium" }, { value: "gpt-5.4", label: "GPT-5.4", description: "Previous generation", efforts: Object.freeze(["low", "medium", "high", "xhigh"]), defaultEffort: "medium" }, { value: "gpt-5.4-mini", label: "GPT-5.4 Mini", description: "Smallest and cheapest", efforts: Object.freeze(["low", "medium", "high", "xhigh"]), defaultEffort: "medium" }, { value: "gpt-5.3-codex-spark", label: "GPT-5.3 Codex Spark", description: "Low-latency coding", efforts: Object.freeze(["low", "medium", "high", "xhigh"]), defaultEffort: "high" }]), gemini: Object.freeze([{ value: "gemini-2.5-pro", label: "Gemini 2.5 Pro" }, { value: "gemini-2.5-flash", label: "Gemini 2.5 Flash", description: "Faster and cheaper" }]), "gemini-acp": Object.freeze([{ value: "gemini-2.5-pro", label: "Gemini 2.5 Pro" }, { value: "gemini-2.5-flash", label: "Gemini 2.5 Flash", description: "Faster and cheaper" }]) })[e.FIRST_PARTY_HARNESS_PROVIDER] = Object.freeze([{ value: "anthropic/claude-opus-5", label: "Claude Opus 5", description: "Most capable \u2014 the ".concat(e.FIRST_PARTY_HARNESS.displayName, " default") }, { value: "openai/gpt-5.6", label: "GPT-5.6", description: "OpenAI alias for current Sol" }, { value: "anthropic/claude-fable-5", label: "Claude Fable 5", description: "Premium long-horizon work" }, { value: "anthropic/claude-sonnet-5", label: "Claude Sonnet 5", description: "Balanced capability and cost" }, { value: "openai/gpt-5.6-sol", label: "GPT-5.6 Sol", description: "OpenAI frontier" }, { value: "openai/gpt-5.6-terra", label: "GPT-5.6 Terra", description: "OpenAI balanced tier" }, { value: "openai/gpt-5.6-luna", label: "GPT-5.6 Luna", description: "OpenAI fast tier" }, { value: "google/gemini-3-pro", label: "Gemini 3 Pro", description: "Google direct; requires an enabled provider policy" }]), Gu));
|
|
38800
38800
|
var Zu = Object.freeze(/* @__PURE__ */ new Set(["hermes", "kimi", "gemini-acp", "opencode-acp"]));
|
|
38801
38801
|
var Ju = 128;
|
|
38802
38802
|
var $u = Object.freeze(/* @__PURE__ */ new Set(["default", "auto", "inherit", "none"]));
|