@skrr-ai/cli 0.1.8 → 0.1.10
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.d.ts +27 -0
- package/dist/base-command.js +83 -11
- package/dist/commands/agent/message/send.js +1 -1
- package/dist/commands/agents/chat.d.ts +1 -1
- package/dist/commands/agents/chat.js +1 -1
- package/dist/commands/browser/install.d.ts +1 -1
- package/dist/commands/browser/install.js +10 -2
- package/dist/commands/browser/mcp-config.js +3 -1
- package/dist/commands/browser/skill/show.js +1 -1
- package/dist/commands/browser/status.js +4 -1
- package/dist/commands/browser/uninstall.d.ts +1 -1
- package/dist/commands/browser/uninstall.js +10 -2
- package/dist/commands/browser.d.ts +1 -1
- package/dist/commands/browser.js +3 -3
- package/dist/commands/code/index.js +6 -3
- package/dist/commands/code/install.d.ts +61 -0
- package/dist/commands/code/install.js +247 -0
- package/dist/commands/code/oversky-agent.d.ts +2 -1
- package/dist/commands/code/oversky-agent.js +12 -8
- package/dist/commands/commands.js +1 -1
- package/dist/commands/context.js +1 -1
- package/dist/commands/create-token.js +1 -1
- package/dist/commands/daemon/byok.d.ts +1 -0
- package/dist/commands/daemon/byok.js +14 -1
- package/dist/commands/daemon/index.js +18 -7
- package/dist/commands/daemon/install.d.ts +1 -0
- package/dist/commands/daemon/install.js +22 -3
- package/dist/commands/daemon/logs.d.ts +1 -0
- package/dist/commands/daemon/logs.js +4 -0
- package/dist/commands/daemon/start.d.ts +1 -0
- package/dist/commands/daemon/start.js +15 -2
- package/dist/commands/daemon/status.d.ts +1 -0
- package/dist/commands/daemon/status.js +14 -1
- package/dist/commands/daemon/stop.d.ts +1 -0
- package/dist/commands/daemon/stop.js +14 -1
- package/dist/commands/daemon/uninstall.d.ts +1 -0
- package/dist/commands/daemon/uninstall.js +15 -2
- package/dist/commands/daemon/usage.d.ts +1 -0
- package/dist/commands/daemon/usage.js +5 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/github/allow-tools.d.ts +1 -0
- package/dist/commands/github/app/install.d.ts +1 -0
- package/dist/commands/github/app/status.d.ts +1 -0
- package/dist/commands/github/connect.d.ts +1 -0
- package/dist/commands/github/connections.d.ts +1 -0
- package/dist/commands/github/disconnect.d.ts +1 -0
- package/dist/commands/github/finalize.d.ts +1 -0
- package/dist/commands/github/reconnect.d.ts +1 -0
- package/dist/commands/github/run.d.ts +1 -0
- package/dist/commands/github/tools.d.ts +1 -0
- package/dist/commands/goals/create.js +2 -2
- package/dist/commands/goals/show.js +5 -0
- package/dist/commands/harnesses/list.js +14 -3
- package/dist/commands/harnesses/show.js +14 -0
- package/dist/commands/instructions/activate.js +1 -1
- package/dist/commands/instructions/archive-version.js +1 -1
- package/dist/commands/instructions/delete.js +1 -1
- package/dist/commands/instructions/diff.js +1 -1
- package/dist/commands/instructions/install.js +7 -1
- package/dist/commands/instructions/restore.js +1 -1
- package/dist/commands/instructions/show.js +17 -1
- package/dist/commands/instructions/update.js +1 -1
- package/dist/commands/integrations/connections/connect.d.ts +1 -0
- package/dist/commands/integrations/connections/disconnect.d.ts +1 -0
- package/dist/commands/integrations/connections/finalize.d.ts +1 -0
- package/dist/commands/integrations/connections/list.d.ts +1 -0
- package/dist/commands/integrations/connections/reconnect.d.ts +1 -0
- package/dist/commands/integrations/execute.d.ts +1 -0
- package/dist/commands/integrations/search.d.ts +1 -0
- package/dist/commands/integrations/toolkits.d.ts +1 -0
- package/dist/commands/integrations/tools/allow.d.ts +1 -0
- package/dist/commands/integrations/tools/list.d.ts +1 -0
- package/dist/commands/list-daemons.d.ts +2 -7
- package/dist/commands/list-daemons.js +13 -13
- package/dist/commands/login.js +78 -33
- package/dist/commands/logout.js +52 -1
- package/dist/commands/machines/hosted/start.js +1 -1
- package/dist/commands/pair.js +2 -2
- package/dist/commands/projects/create.js +6 -1
- package/dist/commands/projects/tasks.js +6 -1
- package/dist/commands/revoke-daemon.js +6 -2
- package/dist/commands/set-capabilities.js +6 -2
- package/dist/commands/skills/install.js +1 -1
- package/dist/commands/skills/library.js +2 -2
- package/dist/commands/spaces/create.js +6 -2
- package/dist/commands/tasks/complete.d.ts +1 -1
- package/dist/commands/tasks/complete.js +21 -8
- package/dist/commands/tasks/create.js +4 -1
- package/dist/commands/tasks/current.js +1 -1
- package/dist/commands/tasks/delete.d.ts +1 -0
- package/dist/commands/tasks/delete.js +9 -0
- package/dist/commands/tasks/export.js +5 -1
- package/dist/commands/tasks/follow-up.js +2 -1
- package/dist/commands/tasks/list.js +5 -1
- package/dist/commands/tasks/pr.js +1 -1
- package/dist/commands/tasks/show.js +10 -1
- package/dist/commands/tasks/triage.js +2 -1
- package/dist/commands/tasks/update.js +4 -1
- package/dist/commands/tasks/upsert.js +4 -1
- package/dist/commands/usage.js +1 -1
- package/dist/commands/whoami.js +4 -1
- package/dist/lib/agentic-stream.js +21 -1
- package/dist/lib/api-fetch.d.ts +1 -1
- package/dist/lib/api-fetch.js +1 -1
- package/dist/lib/auth-core-init.js +23 -3
- package/dist/lib/auth-storage.d.ts +0 -12
- package/dist/lib/auth-storage.js +37 -2
- package/dist/lib/config.d.ts +43 -3
- package/dist/lib/config.js +391 -31
- package/dist/lib/created-line.d.ts +22 -0
- package/dist/lib/created-line.js +25 -0
- package/dist/lib/daemon-binding.d.ts +29 -0
- package/dist/lib/daemon-binding.js +63 -0
- package/dist/lib/daemon-ref.d.ts +31 -0
- package/dist/lib/daemon-ref.js +47 -0
- package/dist/lib/daemonBroker.js +1 -1
- package/dist/lib/delegated-cli.js +3 -3
- package/dist/lib/exec-oversky.d.ts +18 -1
- package/dist/lib/exec-oversky.js +21 -4
- package/dist/lib/html-text.d.ts +15 -0
- package/dist/lib/html-text.js +40 -0
- package/dist/lib/keychain.d.ts +43 -0
- package/dist/lib/keychain.js +145 -4
- package/dist/lib/login.js +3 -3
- package/dist/lib/node-adapter.js +1 -1
- package/dist/lib/oauthLogin.js +17 -6
- package/dist/lib/sky-code-agent.d.ts +1 -1
- package/dist/lib/sky-code-agent.js +8 -8
- package/dist/lib/sky-code-broker.js +18 -2
- package/dist/lib/sky-code-doctor.js +120 -4
- package/dist/lib/sky-code-managed.d.ts +12 -0
- package/dist/lib/sky-code-managed.js +21 -7
- package/dist/lib/sky-code.d.ts +16 -1
- package/dist/lib/sky-code.js +110 -7
- package/dist/lib/task-execution.js +4 -11
- package/dist/lib/tasks.d.ts +1 -0
- package/dist/lib/tasks.js +9 -6
- package/dist/lib/update-check.js +1 -1
- package/dist/lib/usage-discovery.js +1 -1
- package/dist/lib/web-url.js +12 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/credentialResolver.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/credentialResolver.js +2 -2
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +1 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +13 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/kek/linux.js +16 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/legacyStatePreflight.d.ts +0 -9
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/legacyStatePreflight.js +18 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/loginLocalhost.js +3 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.js +3 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/runtime.d.ts +7 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/skyCodeChannels.d.ts +96 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/skyCodeChannels.js +115 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/credentialResolver.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/credentialResolver.js +2 -2
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +1 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +1 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/kek/linux.js +16 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/legacyStatePreflight.d.ts +0 -9
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/legacyStatePreflight.js +18 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/loginLocalhost.js +3 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.js +3 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/runtime.d.ts +7 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/skyCodeChannels.d.ts +96 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/skyCodeChannels.js +107 -0
- package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
- package/dist/node_modules/@skrr-ai/data-provider/index.js +4206 -4191
- package/dist/node_modules/@skrr-ai/inference-broker/dist/cjs/managed-inference-broker.js +2 -2
- package/dist/node_modules/@skrr-ai/inference-broker/dist/esm/managed-inference-broker.js +2 -2
- package/oclif.manifest.json +7969 -1397
- package/package.json +22 -19
|
@@ -239,7 +239,7 @@ async function acquireManagedSession(input = {}, deps = {}) {
|
|
|
239
239
|
if (agent.createdNow) {
|
|
240
240
|
input.log?.(`Created "${agent.name ?? agent.id}" as your default skrr Code agent — ` +
|
|
241
241
|
'this session, and future ones, are attributed to it. ' +
|
|
242
|
-
'Change it with `skrr code
|
|
242
|
+
'Change it with `skrr code skrr-agent --set <id-or-name>`.');
|
|
243
243
|
}
|
|
244
244
|
const minted = await mintSessionToken({ sessionId, processStartId, agentId: agent.id, actorId: newId() }, api, acquisition.signal);
|
|
245
245
|
sessionToken = minted.token;
|
|
@@ -888,11 +888,27 @@ function describe(err) {
|
|
|
888
888
|
*
|
|
889
889
|
* The predicate is `hasProviderCredential`, the same one that decides what the
|
|
890
890
|
* engine actually inherits (`sky-code.ts`), so the sentence and the spawn cannot
|
|
891
|
-
* disagree.
|
|
891
|
+
* disagree. `strippedProviderCredentialNames` covers the third case that
|
|
892
|
+
* predicate cannot see: the machine HAS a provider credential and this run
|
|
893
|
+
* removes it, which reads as absence and is not.
|
|
892
894
|
*/
|
|
893
895
|
function fallbackTail(env) {
|
|
894
896
|
if ((0, sky_code_1.hasProviderCredential)(env))
|
|
895
897
|
return 'Continuing with your own provider credentials.';
|
|
898
|
+
// Absence and removal are different problems, and the old sentence said the
|
|
899
|
+
// first when the second was true: on a machine whose only credential is an AWS
|
|
900
|
+
// profile the engine runs fine on its own and fails through `skrr code`,
|
|
901
|
+
// because `AWS_*` is stripped on the way in. Being told "no provider
|
|
902
|
+
// credential is set here" sends that user to buy a key they do not need.
|
|
903
|
+
const stripped = (0, sky_code_1.strippedProviderCredentialNames)(env);
|
|
904
|
+
if (stripped.length > 0) {
|
|
905
|
+
return (`${stripped.join(', ')} is set here, but this run does not pass it to the engine — ` +
|
|
906
|
+
'it is stripped so a model-driven process opening other people\u2019s repositories cannot ' +
|
|
907
|
+
'reuse a cloud credential. So the engine starts without one and its first request will ' +
|
|
908
|
+
'fail. Export a provider key the engine may inherit (any `*_API_KEY`, e.g. ' +
|
|
909
|
+
'OPENROUTER_API_KEY), resolve the reason above, or run the engine directly if you ' +
|
|
910
|
+
'intend to spend that credential (`skrr code doctor` shows where it is).');
|
|
911
|
+
}
|
|
896
912
|
return ('No provider credential is set here either, so the engine will start without one and ' +
|
|
897
913
|
'its first request will fail — set OPENROUTER_API_KEY, or resolve the reason above ' +
|
|
898
914
|
'(`skrr code doctor`).');
|
|
@@ -32,6 +32,7 @@ exports.formatReport = formatReport;
|
|
|
32
32
|
const node_fs_1 = require("node:fs");
|
|
33
33
|
const node_path_1 = __importDefault(require("node:path"));
|
|
34
34
|
const sky_code_1 = require("./sky-code");
|
|
35
|
+
const auth_core_1 = require("@skrr-ai/auth-core");
|
|
35
36
|
const harness_tiers_1 = require("./harness-tiers");
|
|
36
37
|
const config_1 = require("./config");
|
|
37
38
|
const sky_code_managed_1 = require("./sky-code-managed");
|
|
@@ -39,10 +40,124 @@ const sky_code_managed_1 = require("./sky-code-managed");
|
|
|
39
40
|
function projectStateDir(cwd) {
|
|
40
41
|
return node_path_1.default.join(node_path_1.default.resolve(cwd), '.sky-code');
|
|
41
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Which release channel this machine follows, and where its manifest lives.
|
|
45
|
+
*
|
|
46
|
+
* `notInstalledMessage()` has always ended by promising that this command names
|
|
47
|
+
* "which channel this machine follows and whether that channel has a published
|
|
48
|
+
* release", and nothing here knew what a channel was — the whole vocabulary sat
|
|
49
|
+
* in `daemon/src/sky-code/channels.ts`, whose only importer was the daemon's own
|
|
50
|
+
* installer. So the user with no engine, who is exactly the audience for that
|
|
51
|
+
* sentence, was sent to a command that could not answer (dogfood OSK-274).
|
|
52
|
+
*
|
|
53
|
+
* It reports the channel and the exact URL, and does NOT fetch it. The doctor is
|
|
54
|
+
* documented as safe to run in any context and reads only env, config and one
|
|
55
|
+
* `existsSync`; adding a network call to satisfy a sentence would trade a broken
|
|
56
|
+
* promise for a diagnostic that hangs on a captive portal. Printing the URL puts
|
|
57
|
+
* the answer one copy-paste away and keeps the property — and the promise is
|
|
58
|
+
* reworded to match what is delivered rather than the other way round.
|
|
59
|
+
*
|
|
60
|
+
* `warn` on an unrecognised channel, because `resolveSkyCodeChannel` falls back
|
|
61
|
+
* to the default rather than throwing: a typo must not brick updates, and a
|
|
62
|
+
* silent fallback must not look like agreement.
|
|
63
|
+
*/
|
|
64
|
+
function releaseChannelCheck(env) {
|
|
65
|
+
const { channel, invalid } = (0, auth_core_1.resolveSkyCodeChannel)(env);
|
|
66
|
+
const url = (0, auth_core_1.resolveChannelManifestUrl)({
|
|
67
|
+
base: (0, auth_core_1.skyCodeFeedBase)(env),
|
|
68
|
+
manifestFilename: auth_core_1.SKY_CODE_MANIFEST_FILE,
|
|
69
|
+
channel,
|
|
70
|
+
});
|
|
71
|
+
if (invalid) {
|
|
72
|
+
return {
|
|
73
|
+
name: 'release-channel',
|
|
74
|
+
status: 'warn',
|
|
75
|
+
detail: `${auth_core_1.SKY_CODE_CHANNEL_ENV}='${invalid}' is not a channel; following '${channel}' instead — ${url}`,
|
|
76
|
+
remedy: `Set ${auth_core_1.SKY_CODE_CHANNEL_ENV} to one of internal, canary, beta, stable, or unset it to follow the default.`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
name: 'release-channel',
|
|
81
|
+
status: 'ok',
|
|
82
|
+
detail: `${channel} — ${url}`,
|
|
83
|
+
remedy: `Fetch that URL to see whether the channel has a published release, and which version.`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* What the pre-rename engine directory still holds, for a machine that has moved on.
|
|
88
|
+
*
|
|
89
|
+
* Round 1 gave both readers a fallback to `~/.oversky/sky-code/bin` so nothing
|
|
90
|
+
* BREAKS on a machine that installed before the rename. Nothing was given the job
|
|
91
|
+
* of finishing the move: no installer sweep, and — once the current root wins —
|
|
92
|
+
* no mention anywhere. This machine converged on two engine directories and
|
|
93
|
+
* reported one, the older holding 713 MB across six binaries (dogfood OSK-278).
|
|
94
|
+
*
|
|
95
|
+
* Flat, never recursive, and failures are swallowed: this is a footnote on a
|
|
96
|
+
* diagnostic, and a doctor that throws while counting bytes it was only going to
|
|
97
|
+
* mention has made things worse than the clutter it was reporting.
|
|
98
|
+
*/
|
|
99
|
+
function strandedLegacyEngine(env) {
|
|
100
|
+
const exeName = process.platform === 'win32' ? 'sky-code.exe' : 'sky-code';
|
|
101
|
+
const legacy = (0, sky_code_1.legacyManagedEnginePath)(exeName, env);
|
|
102
|
+
if (!legacy)
|
|
103
|
+
return null;
|
|
104
|
+
const dir = node_path_1.default.dirname(legacy);
|
|
105
|
+
try {
|
|
106
|
+
const entries = (0, node_fs_1.readdirSync)(dir);
|
|
107
|
+
let bytes = 0;
|
|
108
|
+
let files = 0;
|
|
109
|
+
for (const entry of entries) {
|
|
110
|
+
const stats = (0, node_fs_1.statSync)(node_path_1.default.join(dir, entry));
|
|
111
|
+
if (!stats.isFile())
|
|
112
|
+
continue;
|
|
113
|
+
files += 1;
|
|
114
|
+
bytes += stats.size;
|
|
115
|
+
}
|
|
116
|
+
return files > 0 ? { dir, files, bytes } : null;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Bytes as the size a human would say out loud. */
|
|
123
|
+
function humanBytes(bytes) {
|
|
124
|
+
const mb = bytes / 1024 / 1024;
|
|
125
|
+
return mb >= 1024 ? `${(mb / 1024).toFixed(1)} GB` : `${Math.round(mb)} MB`;
|
|
126
|
+
}
|
|
42
127
|
function engineCheck(env) {
|
|
43
128
|
const { path: bin, source } = (0, sky_code_1.resolveEngine)(env);
|
|
129
|
+
if (bin && source === 'legacy-managed') {
|
|
130
|
+
// `ok`, because it runs and this is the resolution the daemon has always
|
|
131
|
+
// made. The remedy is here because the resolution is SURPRISING: the path
|
|
132
|
+
// says `.oversky` on a CLI that says `skrr` everywhere else, and the next
|
|
133
|
+
// daemon-driven install will write to `~/.skrr` and leave two copies of a
|
|
134
|
+
// hundred-megabyte binary on disk with no hint which one is live.
|
|
135
|
+
return {
|
|
136
|
+
name: 'engine',
|
|
137
|
+
status: 'ok',
|
|
138
|
+
detail: `${bin} (resolved via ${source} — the pre-rename location)`,
|
|
139
|
+
remedy: 'It works, and nothing has to change today. Installing the engine again ' +
|
|
140
|
+
`through the daemon writes it to ${(0, sky_code_1.managedEnginePath)('sky-code', env)}; ` +
|
|
141
|
+
'the copy above can be deleted once it does.',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
44
144
|
if (bin) {
|
|
45
|
-
|
|
145
|
+
// The engine resolved from the current root — and the pre-rename directory
|
|
146
|
+
// may still be sitting there. Said here rather than in its own check because
|
|
147
|
+
// it is a footnote on a healthy answer, not a finding of its own.
|
|
148
|
+
const stranded = strandedLegacyEngine(env);
|
|
149
|
+
return {
|
|
150
|
+
name: 'engine',
|
|
151
|
+
status: 'ok',
|
|
152
|
+
detail: `${bin} (resolved via ${source})`,
|
|
153
|
+
...(stranded
|
|
154
|
+
? {
|
|
155
|
+
remedy: `${stranded.dir} still holds ${stranded.files} file(s), ${humanBytes(stranded.bytes)}, ` +
|
|
156
|
+
'from before the config root moved. Nothing reads it now that the engine above ' +
|
|
157
|
+
'resolves, and nothing removes it either — delete it when you want the space back.',
|
|
158
|
+
}
|
|
159
|
+
: {}),
|
|
160
|
+
};
|
|
46
161
|
}
|
|
47
162
|
const override = env[sky_code_1.ENGINE_PATH_ENV];
|
|
48
163
|
if (override && !node_path_1.default.isAbsolute(override)) {
|
|
@@ -461,7 +576,7 @@ function sessionAuthorityCheck(env) {
|
|
|
461
576
|
remedy: 'Intended for local use, and nothing to fix. Worth knowing because it is NOT the same ' +
|
|
462
577
|
'trust plane as a daemon-dispatched run — and neither plane is an OS-level sandbox ' +
|
|
463
578
|
'(no seccomp, container, or namespace). An untrusted autonomous workload needs a hosted ' +
|
|
464
|
-
'or container profile; see
|
|
579
|
+
'or container profile; see sky-code/docs/sky-code/threat-model.md.',
|
|
465
580
|
};
|
|
466
581
|
}
|
|
467
582
|
}
|
|
@@ -473,7 +588,7 @@ function sessionAuthorityCheck(env) {
|
|
|
473
588
|
* a `/api/agents` read, and this module's whole contract is that it answers from
|
|
474
589
|
* env, one config read and one `existsSync` — that is what lets `skrr code doctor`
|
|
475
590
|
* run before the auth plane is configured, and on a machine with no network.
|
|
476
|
-
* `skrr code
|
|
591
|
+
* `skrr code skrr-agent` is the command that resolves for real.
|
|
477
592
|
*
|
|
478
593
|
* Never a `warn`. An unset value is the normal, supported state now that
|
|
479
594
|
* resolution ends in a default agent rather than a refusal; flagging it would
|
|
@@ -507,12 +622,13 @@ function agentAttributionCheck() {
|
|
|
507
622
|
name: 'agent',
|
|
508
623
|
status: 'ok',
|
|
509
624
|
detail: `no ${sky_code_managed_1.AGENT_CONFIG_KEY} set — sessions use your sole owned agent, else your default ${sky_code_managed_1.SKY_CODE_HARNESS} agent`,
|
|
510
|
-
remedy: 'Run `skrr code
|
|
625
|
+
remedy: 'Run `skrr code skrr-agent` to see which, or `skrr code skrr-agent --set <id>` to pin one.',
|
|
511
626
|
};
|
|
512
627
|
}
|
|
513
628
|
function runDoctor(cwd = process.cwd(), env = process.env) {
|
|
514
629
|
const checks = [
|
|
515
630
|
engineCheck(env),
|
|
631
|
+
releaseChannelCheck(env),
|
|
516
632
|
stateDirCheck(cwd, env),
|
|
517
633
|
compatCheck(cwd, env),
|
|
518
634
|
opencodeCheck(cwd),
|
|
@@ -46,7 +46,19 @@ export declare const MANAGED_ENV_FLAG = "OVERSKY_SKY_CODE_MANAGED";
|
|
|
46
46
|
* `skrr code --agent reviewer` is the engine's flag and is pinned as such by
|
|
47
47
|
* `sky-code-passthrough.spec.ts`. A bare `--agent` here would steal it.
|
|
48
48
|
*/
|
|
49
|
+
export declare const SKRR_AGENT_FLAG = "--skrr-agent";
|
|
50
|
+
/**
|
|
51
|
+
* The pre-rename spelling, still accepted.
|
|
52
|
+
*
|
|
53
|
+
* It is in muscle memory and in scripts, and `skrr code` forwards argv verbatim
|
|
54
|
+
* — so a flag this CLI stops recognising is not an error, it is silently handed
|
|
55
|
+
* to the engine, which rejects it with a message about a flag the user did not
|
|
56
|
+
* think they were passing. Accepting both is the only version of this rename
|
|
57
|
+
* that fails safely.
|
|
58
|
+
*/
|
|
49
59
|
export declare const OVERSKY_AGENT_FLAG = "--oversky-agent";
|
|
60
|
+
/** Every spelling the argv scanner honours, primary first. */
|
|
61
|
+
export declare const AGENT_FLAG_SPELLINGS: readonly ["--skrr-agent", "--oversky-agent"];
|
|
50
62
|
/** The config key `skrr code` reads when the flag is absent. */
|
|
51
63
|
export declare const AGENT_CONFIG_KEY = "skyCodeAgentId";
|
|
52
64
|
/**
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
* reason: the user is about to spend their own key and must know it.
|
|
33
33
|
*/
|
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
-
exports.BROKER_SOCKET_ENV = exports.MANAGED_SESSION_ENV = exports.SKY_CODE_HARNESS = exports.AGENT_CONFIG_KEY = exports.OVERSKY_AGENT_FLAG = exports.MANAGED_ENV_FLAG = void 0;
|
|
35
|
+
exports.BROKER_SOCKET_ENV = exports.MANAGED_SESSION_ENV = exports.SKY_CODE_HARNESS = exports.AGENT_CONFIG_KEY = exports.AGENT_FLAG_SPELLINGS = exports.OVERSKY_AGENT_FLAG = exports.SKRR_AGENT_FLAG = exports.MANAGED_ENV_FLAG = void 0;
|
|
36
36
|
exports.resolveTrustPlane = resolveTrustPlane;
|
|
37
37
|
exports.skyCodeServerUrl = skyCodeServerUrl;
|
|
38
38
|
exports.managedSkipReason = managedSkipReason;
|
|
@@ -59,7 +59,19 @@ exports.MANAGED_ENV_FLAG = 'OVERSKY_SKY_CODE_MANAGED';
|
|
|
59
59
|
* `skrr code --agent reviewer` is the engine's flag and is pinned as such by
|
|
60
60
|
* `sky-code-passthrough.spec.ts`. A bare `--agent` here would steal it.
|
|
61
61
|
*/
|
|
62
|
+
exports.SKRR_AGENT_FLAG = '--skrr-agent';
|
|
63
|
+
/**
|
|
64
|
+
* The pre-rename spelling, still accepted.
|
|
65
|
+
*
|
|
66
|
+
* It is in muscle memory and in scripts, and `skrr code` forwards argv verbatim
|
|
67
|
+
* — so a flag this CLI stops recognising is not an error, it is silently handed
|
|
68
|
+
* to the engine, which rejects it with a message about a flag the user did not
|
|
69
|
+
* think they were passing. Accepting both is the only version of this rename
|
|
70
|
+
* that fails safely.
|
|
71
|
+
*/
|
|
62
72
|
exports.OVERSKY_AGENT_FLAG = '--oversky-agent';
|
|
73
|
+
/** Every spelling the argv scanner honours, primary first. */
|
|
74
|
+
exports.AGENT_FLAG_SPELLINGS = [exports.SKRR_AGENT_FLAG, exports.OVERSKY_AGENT_FLAG];
|
|
63
75
|
/** The config key `skrr code` reads when the flag is absent. */
|
|
64
76
|
exports.AGENT_CONFIG_KEY = 'skyCodeAgentId';
|
|
65
77
|
/**
|
|
@@ -238,19 +250,21 @@ function takeOverskyAgentFlag(passthrough) {
|
|
|
238
250
|
let agentRef;
|
|
239
251
|
for (let i = 0; i < passthrough.length; i += 1) {
|
|
240
252
|
const token = passthrough[i];
|
|
241
|
-
if (
|
|
242
|
-
// Last one wins, matching how every argv parser treats a repeated flag
|
|
253
|
+
if (exports.AGENT_FLAG_SPELLINGS.includes(token)) {
|
|
254
|
+
// Last one wins, matching how every argv parser treats a repeated flag —
|
|
255
|
+
// and across spellings too, so `--oversky-agent a --skrr-agent b` is `b`.
|
|
243
256
|
const value = passthrough[i + 1];
|
|
244
|
-
// A trailing
|
|
245
|
-
//
|
|
257
|
+
// A trailing flag with no value must not swallow the next token (there is
|
|
258
|
+
// none) nor leave the flag in the argv.
|
|
246
259
|
if (value !== undefined && !value.startsWith('-')) {
|
|
247
260
|
agentRef = value;
|
|
248
261
|
i += 1;
|
|
249
262
|
}
|
|
250
263
|
continue;
|
|
251
264
|
}
|
|
252
|
-
|
|
253
|
-
|
|
265
|
+
const inline = exports.AGENT_FLAG_SPELLINGS.find((f) => token.startsWith(`${f}=`));
|
|
266
|
+
if (inline) {
|
|
267
|
+
agentRef = token.slice(inline.length + 1);
|
|
254
268
|
continue;
|
|
255
269
|
}
|
|
256
270
|
engineArgv.push(token);
|
package/dist/lib/sky-code.d.ts
CHANGED
|
@@ -31,9 +31,23 @@ export declare function skyCodeInstructionHome(env?: NodeJS.ProcessEnv): string;
|
|
|
31
31
|
* `scripts/sky-code/build.mjs --install` all put the engine.
|
|
32
32
|
*/
|
|
33
33
|
export declare function managedEnginePath(exeName: string, env?: NodeJS.ProcessEnv): string;
|
|
34
|
+
/**
|
|
35
|
+
* The same managed location under the PREVIOUS config root.
|
|
36
|
+
*
|
|
37
|
+
* The root moved `~/.oversky` → `~/.skrr` in the skrr rename, and an engine
|
|
38
|
+
* installed before that is still on disk under the old one. `daemon/src/
|
|
39
|
+
* binary-resolver.ts` was given this fallback and this module was not, so on
|
|
40
|
+
* the same machine the daemon found the engine and `skrr code` reported that no
|
|
41
|
+
* engine was installed — the same product, the same 106 MB binary, two answers.
|
|
42
|
+
*
|
|
43
|
+
* Returns null when an explicit `OVERSKY_CONFIG_DIR` is set, matching the
|
|
44
|
+
* daemon: that override names one root deliberately, and reaching past it to a
|
|
45
|
+
* hard-coded home would defeat the pinning {@link engineHome} relies on.
|
|
46
|
+
*/
|
|
47
|
+
export declare function legacyManagedEnginePath(exeName: string, env?: NodeJS.ProcessEnv): string | null;
|
|
34
48
|
export interface EngineResolution {
|
|
35
49
|
path: string | null;
|
|
36
|
-
source: 'env' | 'path' | 'managed' | 'fallback' | 'unresolved';
|
|
50
|
+
source: 'env' | 'path' | 'managed' | 'legacy-managed' | 'fallback' | 'unresolved';
|
|
37
51
|
}
|
|
38
52
|
/**
|
|
39
53
|
* Resolve the engine binary, reporting WHERE it came from.
|
|
@@ -185,6 +199,7 @@ export interface EngineSpawnOptions {
|
|
|
185
199
|
export declare function inheritedProviderCredentials(env: NodeJS.ProcessEnv): Record<string, string>;
|
|
186
200
|
/** Whether an unmanaged run has anything to authenticate with. */
|
|
187
201
|
export declare function hasProviderCredential(env?: NodeJS.ProcessEnv): boolean;
|
|
202
|
+
export declare function strippedProviderCredentialNames(env?: NodeJS.ProcessEnv): string[];
|
|
188
203
|
/**
|
|
189
204
|
* The environment the engine actually receives.
|
|
190
205
|
*
|
package/dist/lib/sky-code.js
CHANGED
|
@@ -21,11 +21,13 @@ exports.ENGINE_PATH_ENV = void 0;
|
|
|
21
21
|
exports.engineHome = engineHome;
|
|
22
22
|
exports.skyCodeInstructionHome = skyCodeInstructionHome;
|
|
23
23
|
exports.managedEnginePath = managedEnginePath;
|
|
24
|
+
exports.legacyManagedEnginePath = legacyManagedEnginePath;
|
|
24
25
|
exports.resolveEngine = resolveEngine;
|
|
25
26
|
exports.buildEngineArgs = buildEngineArgs;
|
|
26
27
|
exports.notInstalledMessage = notInstalledMessage;
|
|
27
28
|
exports.inheritedProviderCredentials = inheritedProviderCredentials;
|
|
28
29
|
exports.hasProviderCredential = hasProviderCredential;
|
|
30
|
+
exports.strippedProviderCredentialNames = strippedProviderCredentialNames;
|
|
29
31
|
exports.engineSpawnEnv = engineSpawnEnv;
|
|
30
32
|
exports.execEngine = execEngine;
|
|
31
33
|
const node_child_process_1 = require("node:child_process");
|
|
@@ -33,6 +35,7 @@ const node_fs_1 = require("node:fs");
|
|
|
33
35
|
const node_os_1 = require("node:os");
|
|
34
36
|
const node_path_1 = __importDefault(require("node:path"));
|
|
35
37
|
const auth_core_1 = require("@skrr-ai/auth-core");
|
|
38
|
+
const config_1 = require("./config");
|
|
36
39
|
// Deliberately does NOT import the managed marker any more. This module used to
|
|
37
40
|
// read it to decide whether a run was managed; that decision now arrives as a
|
|
38
41
|
// declared `credentialMode`, and re-introducing the import here would be the first
|
|
@@ -49,14 +52,18 @@ exports.ENGINE_PATH_ENV = 'OVERSKY_SKY_CODE_PATH';
|
|
|
49
52
|
* ordering below exists to prevent.
|
|
50
53
|
*/
|
|
51
54
|
function engineHome(env = process.env) {
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
// `configRoot` and not a second reading of the environment: deriving the root
|
|
56
|
+
// twice is what let this function and `getConfigPath()` disagree (OSK-300).
|
|
57
|
+
return node_path_1.default.join((0, config_1.configRoot)(env), 'sky-code');
|
|
54
58
|
}
|
|
55
59
|
/** The user-level instruction root owned by skrr Code. */
|
|
56
60
|
function skyCodeInstructionHome(env = process.env) {
|
|
57
61
|
const configured = env.SKY_CODE_HOME?.trim();
|
|
62
|
+
// Falls through to `engineHome()` rather than re-deriving `~/.skrr` — the two
|
|
63
|
+
// describe the same root, and re-deriving it is what made them disagree under
|
|
64
|
+
// `OVERSKY_CONFIG_DIR` (OSK-300).
|
|
58
65
|
if (!configured)
|
|
59
|
-
return
|
|
66
|
+
return engineHome(env);
|
|
60
67
|
if (configured === '~')
|
|
61
68
|
return (0, node_os_1.homedir)();
|
|
62
69
|
if (configured.startsWith('~/'))
|
|
@@ -70,6 +77,24 @@ function skyCodeInstructionHome(env = process.env) {
|
|
|
70
77
|
function managedEnginePath(exeName, env = process.env) {
|
|
71
78
|
return node_path_1.default.join(engineHome(env), 'bin', exeName);
|
|
72
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* The same managed location under the PREVIOUS config root.
|
|
82
|
+
*
|
|
83
|
+
* The root moved `~/.oversky` → `~/.skrr` in the skrr rename, and an engine
|
|
84
|
+
* installed before that is still on disk under the old one. `daemon/src/
|
|
85
|
+
* binary-resolver.ts` was given this fallback and this module was not, so on
|
|
86
|
+
* the same machine the daemon found the engine and `skrr code` reported that no
|
|
87
|
+
* engine was installed — the same product, the same 106 MB binary, two answers.
|
|
88
|
+
*
|
|
89
|
+
* Returns null when an explicit `OVERSKY_CONFIG_DIR` is set, matching the
|
|
90
|
+
* daemon: that override names one root deliberately, and reaching past it to a
|
|
91
|
+
* hard-coded home would defeat the pinning {@link engineHome} relies on.
|
|
92
|
+
*/
|
|
93
|
+
function legacyManagedEnginePath(exeName, env = process.env) {
|
|
94
|
+
if (env.OVERSKY_CONFIG_DIR?.trim())
|
|
95
|
+
return null;
|
|
96
|
+
return node_path_1.default.join((0, node_os_1.homedir)(), '.oversky', 'sky-code', 'bin', exeName);
|
|
97
|
+
}
|
|
73
98
|
/**
|
|
74
99
|
* Unmanaged well-known locations, checked after PATH.
|
|
75
100
|
*
|
|
@@ -139,6 +164,15 @@ function resolveEngine(env = process.env) {
|
|
|
139
164
|
const managed = managedEnginePath(exeName, env);
|
|
140
165
|
if (isExecutable(managed))
|
|
141
166
|
return { path: managed, source: 'managed' };
|
|
167
|
+
// The pre-rename managed location, SECOND. After the current one, so a fresh
|
|
168
|
+
// install always wins; before PATH, for the same WL-6.2 reason the current one
|
|
169
|
+
// beats PATH — a binary skrr installed outranks whatever happens to sit on the
|
|
170
|
+
// user's PATH, and which config root it was installed under does not change
|
|
171
|
+
// that. Reported as its own `source` so `skrr code doctor` can say where it
|
|
172
|
+
// came from rather than quietly resolving something surprising.
|
|
173
|
+
const legacy = legacyManagedEnginePath(exeName, env);
|
|
174
|
+
if (legacy && isExecutable(legacy))
|
|
175
|
+
return { path: legacy, source: 'legacy-managed' };
|
|
142
176
|
const PATH = env.PATH ?? '';
|
|
143
177
|
const sep = process.platform === 'win32' ? ';' : ':';
|
|
144
178
|
const exeNames = process.platform === 'win32' ? ['sky-code.exe', 'sky-code.cmd'] : ['sky-code'];
|
|
@@ -198,15 +232,17 @@ function notInstalledMessage() {
|
|
|
198
232
|
'The skrr Code engine (`sky-code`) is not installed on this machine.',
|
|
199
233
|
'',
|
|
200
234
|
'Install it through the daemon, which verifies the signed release:',
|
|
201
|
-
' •
|
|
202
|
-
' •
|
|
235
|
+
' • `skrr code install` — from here, no browser needed',
|
|
236
|
+
' • Or in the web app: the runtime menu beside the chat input → skrr Code → Install',
|
|
237
|
+
' • Either way a daemon must be running here: `skrr daemon status`',
|
|
203
238
|
'',
|
|
204
239
|
`Or point the CLI at an existing build: export ${exports.ENGINE_PATH_ENV}=/absolute/path/to/sky-code`,
|
|
205
240
|
' (an unsigned build runs, and since 2026-08-11 at the same trust tier as a',
|
|
206
241
|
' signed one — see `skrr code doctor` under trust-tier)',
|
|
207
242
|
'',
|
|
208
|
-
'Run `skrr code doctor` for a full diagnosis
|
|
209
|
-
'machine follows and
|
|
243
|
+
'Run `skrr code doctor` for a full diagnosis. Its `release-channel` line',
|
|
244
|
+
'names the channel this machine follows and the exact manifest URL to check',
|
|
245
|
+
'for a published release.',
|
|
210
246
|
].join('\n');
|
|
211
247
|
}
|
|
212
248
|
/**
|
|
@@ -220,6 +256,37 @@ function notInstalledMessage() {
|
|
|
220
256
|
*/
|
|
221
257
|
const BYOK_CREDENTIAL_SUFFIXES = ['_API_KEY', '_AUTH_TOKEN'];
|
|
222
258
|
const BYOK_CREDENTIAL_NAMES = new Set(['HUGGINGFACE_HUB_TOKEN']);
|
|
259
|
+
/**
|
|
260
|
+
* `AWS_*` names that are not credentials, and that Bedrock cannot run without.
|
|
261
|
+
*
|
|
262
|
+
* The `AWS_` prefix rule below exists for STS/IAM material — `AWS_ACCESS_KEY_ID`,
|
|
263
|
+
* `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_BEARER_TOKEN_BEDROCK` — and
|
|
264
|
+
* every one of those stays stripped. These three carry no secret: two are a
|
|
265
|
+
* region and one is the NAME of a profile whose credentials live in the AWS
|
|
266
|
+
* shared config, a file the engine can read anyway. Stripping them therefore
|
|
267
|
+
* protected nothing and cost an entire provider.
|
|
268
|
+
*
|
|
269
|
+
* Dogfooded as OSK-262, where `sky-code run "say hi"` answered on a Bedrock
|
|
270
|
+
* model and the identical run through `skrr code` died in the engine's generic
|
|
271
|
+
* error handler — because `AWS_PROFILE` did not survive the sanitizer.
|
|
272
|
+
* `env -u AWS_PROFILE` on the bare engine reproduced the failure exactly.
|
|
273
|
+
*
|
|
274
|
+
* An enumerated carve-out rather than a narrower prefix, so every future
|
|
275
|
+
* addition is a reviewable line that has to argue "this one is not a secret".
|
|
276
|
+
* The failure mode of the alternative is an exemption list that grows until the
|
|
277
|
+
* prefix rule means nothing.
|
|
278
|
+
*
|
|
279
|
+
* BYOK ONLY, and that is why it lives here rather than in `sanitizeSpawnEnv`.
|
|
280
|
+
* {@link engineSpawnEnv} re-admits nothing on a managed run, so a session
|
|
281
|
+
* spending a budgeted relay credential still cannot reach Bedrock directly and
|
|
282
|
+
* bill around its own budget. Putting the exemption in the shared sanitizer
|
|
283
|
+
* would hand it to the daemon's managed ACP path too, and lose that.
|
|
284
|
+
*/
|
|
285
|
+
const BYOK_AWS_NON_SECRETS = new Set([
|
|
286
|
+
'AWS_PROFILE',
|
|
287
|
+
'AWS_REGION',
|
|
288
|
+
'AWS_DEFAULT_REGION',
|
|
289
|
+
]);
|
|
223
290
|
/**
|
|
224
291
|
* …and these are never inherited, whatever they look like.
|
|
225
292
|
*
|
|
@@ -256,6 +323,11 @@ function inheritedProviderCredentials(env) {
|
|
|
256
323
|
continue;
|
|
257
324
|
if (ENGINE_NEVER_INHERITS.has(key))
|
|
258
325
|
continue;
|
|
326
|
+
// Before the prefix rule, which would otherwise take these with the family.
|
|
327
|
+
if (BYOK_AWS_NON_SECRETS.has(key)) {
|
|
328
|
+
out[key] = value;
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
259
331
|
if (ENGINE_NEVER_INHERITS_PREFIXES.some((prefix) => key.startsWith(prefix)))
|
|
260
332
|
continue;
|
|
261
333
|
if (BYOK_CREDENTIAL_NAMES.has(key) || BYOK_CREDENTIAL_SUFFIXES.some((s) => key.endsWith(s))) {
|
|
@@ -268,6 +340,37 @@ function inheritedProviderCredentials(env) {
|
|
|
268
340
|
function hasProviderCredential(env = process.env) {
|
|
269
341
|
return Object.keys(inheritedProviderCredentials(env)).length > 0;
|
|
270
342
|
}
|
|
343
|
+
/**
|
|
344
|
+
* Provider-capable credentials this environment HAS and the engine will not get.
|
|
345
|
+
*
|
|
346
|
+
* `hasProviderCredential` answers "will the engine have a key", which is the
|
|
347
|
+
* right question for what to spawn and the wrong one for what to SAY. On a
|
|
348
|
+
* machine whose only credential is an AWS profile the two answers differ: the
|
|
349
|
+
* engine defaults to a Bedrock model and runs fine when launched directly, and
|
|
350
|
+
* `skrr code` — which strips `AWS_*` — reported "no provider credential is set
|
|
351
|
+
* here", sent the user to buy an OpenRouter key, and then died in the engine's
|
|
352
|
+
* generic error handler. The user had a working credential; this run removed it.
|
|
353
|
+
*
|
|
354
|
+
* "You have none" and "you have one and this run does not pass it on" are
|
|
355
|
+
* different problems with different fixes, so they must not share a sentence.
|
|
356
|
+
*
|
|
357
|
+
* Only the deny-listed names a PROVIDER could actually authenticate with are
|
|
358
|
+
* reported. `GH_TOKEN` and `NPM_TOKEN` are stripped too and are not model
|
|
359
|
+
* credentials, so naming them here would turn a precise sentence into noise.
|
|
360
|
+
*/
|
|
361
|
+
const STRIPPED_PROVIDER_CREDENTIALS = [
|
|
362
|
+
// Bedrock's SECRET material only. `AWS_PROFILE` and the region variables are
|
|
363
|
+
// exempt ({@link BYOK_AWS_NON_SECRETS}) and now reach the engine, so naming
|
|
364
|
+
// them here would make this sentence contradict the spawn — which is the exact
|
|
365
|
+
// defect this reporter was added to end.
|
|
366
|
+
'AWS_ACCESS_KEY_ID',
|
|
367
|
+
'AWS_BEARER_TOKEN_BEDROCK',
|
|
368
|
+
// Anthropic OAuth, deny-listed by name in ENGINE_NEVER_INHERITS.
|
|
369
|
+
'CLAUDE_CODE_OAUTH_TOKEN',
|
|
370
|
+
];
|
|
371
|
+
function strippedProviderCredentialNames(env = process.env) {
|
|
372
|
+
return STRIPPED_PROVIDER_CREDENTIALS.filter((name) => (env[name] ?? '').trim() !== '');
|
|
373
|
+
}
|
|
271
374
|
/**
|
|
272
375
|
* The environment the engine actually receives.
|
|
273
376
|
*
|
|
@@ -27,6 +27,7 @@ exports.sleep = sleep;
|
|
|
27
27
|
exports.compactSnapshotSignature = compactSnapshotSignature;
|
|
28
28
|
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
29
29
|
const tasks_1 = require("./tasks");
|
|
30
|
+
const html_text_1 = require("./html-text");
|
|
30
31
|
/**
|
|
31
32
|
* Statuses at which an execution is OVER — nothing further will move the task
|
|
32
33
|
* without new input.
|
|
@@ -304,17 +305,9 @@ function compactSnapshotSignature(snapshot) {
|
|
|
304
305
|
.sort()
|
|
305
306
|
.join('|');
|
|
306
307
|
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
.replace(/<\/p>/gi, '\n')
|
|
311
|
-
.replace(/<[^>]+>/g, ' ')
|
|
312
|
-
.replace(/ /g, ' ')
|
|
313
|
-
.replace(/'/g, "'")
|
|
314
|
-
.replace(/"/g, '"')
|
|
315
|
-
.replace(/&/g, '&')
|
|
316
|
-
.replace(/[ \t]+/g, ' ');
|
|
317
|
-
}
|
|
308
|
+
// Was a private copy here; it is the same job `tasks show` needs, and two
|
|
309
|
+
// slightly different HTML strippers is how the two surfaces drift.
|
|
310
|
+
const stripHtml = html_text_1.htmlToDisplayText;
|
|
318
311
|
function stringValue(value) {
|
|
319
312
|
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
320
313
|
}
|
package/dist/lib/tasks.d.ts
CHANGED
package/dist/lib/tasks.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TASK_WORK_EVENT_KINDS = void 0;
|
|
3
|
+
exports.TASK_WORK_EVENT_KINDS = exports.TASK_PRIORITIES = void 0;
|
|
4
4
|
exports.releasePinRepairGuard = releasePinRepairGuard;
|
|
5
5
|
exports.taskUpdateMutationGuard = taskUpdateMutationGuard;
|
|
6
6
|
exports.executionIsolationFromWorktreeFlag = executionIsolationFromWorktreeFlag;
|
|
@@ -30,7 +30,7 @@ exports.normalizeBulkUpdateInput = normalizeBulkUpdateInput;
|
|
|
30
30
|
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
31
31
|
const prompt_1 = require("./prompt");
|
|
32
32
|
const projects_1 = require("./projects");
|
|
33
|
-
|
|
33
|
+
exports.TASK_PRIORITIES = ['low', 'medium', 'high', 'critical'];
|
|
34
34
|
const DESCRIPTION_FORMATS = ['html', 'markdown', 'plain'];
|
|
35
35
|
/**
|
|
36
36
|
* The kinds `tasks events append --kind` will accept.
|
|
@@ -201,8 +201,8 @@ function validateTaskCreatePayload(payload) {
|
|
|
201
201
|
errors.push(`descriptionFormat must be one of: ${DESCRIPTION_FORMATS.join(', ')}`);
|
|
202
202
|
}
|
|
203
203
|
if (payload.priority !== undefined &&
|
|
204
|
-
!TASK_PRIORITIES.includes(payload.priority)) {
|
|
205
|
-
errors.push(`priority must be one of: ${TASK_PRIORITIES.join(', ')}`);
|
|
204
|
+
!exports.TASK_PRIORITIES.includes(payload.priority)) {
|
|
205
|
+
errors.push(`priority must be one of: ${exports.TASK_PRIORITIES.join(', ')}`);
|
|
206
206
|
}
|
|
207
207
|
if (payload.externalKey !== undefined && !isBoundedString(payload.externalKey, 1, 300)) {
|
|
208
208
|
errors.push('externalKey must be a non-empty string at most 300 characters');
|
|
@@ -566,9 +566,12 @@ function taskRef(task) {
|
|
|
566
566
|
return '';
|
|
567
567
|
}
|
|
568
568
|
function formatTaskLabel(task) {
|
|
569
|
-
|
|
569
|
+
// Ref first, id as the fallback — matching every other entity's confirmation
|
|
570
|
+
// (see `lib/created-line.ts`). Printing both put a uuid in front of the ref a
|
|
571
|
+
// person would actually type, and the `View it at` line already carries the id.
|
|
570
572
|
const ref = taskRef(task);
|
|
571
|
-
|
|
573
|
+
const label = ref || taskId(task) || '?';
|
|
574
|
+
return `${label} — ${String(task.title ?? '(no title)')}`;
|
|
572
575
|
}
|
|
573
576
|
function hasTaskAssignee(task) {
|
|
574
577
|
return (stringArray(task?.assigneeAgentIds).length > 0 || stringArray(task?.assigneeUserIds).length > 0);
|
package/dist/lib/update-check.js
CHANGED
|
@@ -138,7 +138,7 @@ function buildNudgeLine(currentVersion, latest, npmPackage) {
|
|
|
138
138
|
if (!latest || !isOlderVersion(currentVersion, latest))
|
|
139
139
|
return null;
|
|
140
140
|
const pkg = npmPackage || '@skrr-ai/cli';
|
|
141
|
-
return (`[
|
|
141
|
+
return (`[skrr] Update available: ${currentVersion} → ${latest}. ` +
|
|
142
142
|
`Run \`npm update -g ${pkg}\` (or update the skrr app). ` +
|
|
143
143
|
`Silence with OVERSKY_NO_UPDATE_NUDGE=1.\n`);
|
|
144
144
|
}
|
|
@@ -95,7 +95,7 @@ function buildUsageReference(manifest, domainInput, options = {}) {
|
|
|
95
95
|
}
|
|
96
96
|
function renderUsageOverview(overview) {
|
|
97
97
|
const lines = [
|
|
98
|
-
`
|
|
98
|
+
`skrr command domains (${overview.domains.length}; manifest-derived).`,
|
|
99
99
|
'Read one domain at a time: skrr usage <domain>.',
|
|
100
100
|
...overview.domains.map(({ domain }) => domain),
|
|
101
101
|
];
|
package/dist/lib/web-url.js
CHANGED
|
@@ -40,6 +40,7 @@ exports.withNorthstarUrl = withNorthstarUrl;
|
|
|
40
40
|
exports.withAgentUrl = withAgentUrl;
|
|
41
41
|
exports.withDataUrls = withDataUrls;
|
|
42
42
|
exports.workflowUrlFrom = workflowUrlFrom;
|
|
43
|
+
const publicEndpoints_generated_1 = require("./publicEndpoints.generated");
|
|
43
44
|
/**
|
|
44
45
|
* Site-relative canonical path for an entity, or `null` when the required id is
|
|
45
46
|
* missing. When a task/goal knows its hosting space we emit the canonical
|
|
@@ -141,8 +142,18 @@ function webUrl(baseURL, ref) {
|
|
|
141
142
|
* custom) passes through unchanged — only the known skrr api hosts are mapped.
|
|
142
143
|
*/
|
|
143
144
|
const WEB_ORIGIN_FROM_API = {
|
|
145
|
+
// DERIVED from the one domain contract, not hand-listed. The hand-listed
|
|
146
|
+
// version knew only the pre-rename hosts, so `api.skrr.ai` — the CURRENT prod
|
|
147
|
+
// API origin — mapped to nothing and fell through unchanged, and every link
|
|
148
|
+
// the CLI printed from that baseURL would point at the API host instead of
|
|
149
|
+
// the SPA. Deriving it means the next environment cannot be silently omitted.
|
|
150
|
+
...Object.fromEntries(Object.values(publicEndpoints_generated_1.OVERSKY_ENVIRONMENT_ENDPOINTS).map((e) => [
|
|
151
|
+
e.realtimeUrl.toLowerCase(),
|
|
152
|
+
e.appUrl,
|
|
153
|
+
])),
|
|
154
|
+
// Prod's retained previous origin. `oversky.ai` still resolves and is
|
|
155
|
+
// deliberately kept (LEGACY_PROD_BASE_URL), so its api. host must map too.
|
|
144
156
|
'https://api.oversky.ai': 'https://oversky.ai',
|
|
145
|
-
'https://api.oversky.dev': 'https://oversky.dev',
|
|
146
157
|
};
|
|
147
158
|
function toWebOrigin(baseURL) {
|
|
148
159
|
const trimmed = trimTrailingSlash(baseURL);
|
|
@@ -215,7 +215,7 @@ export declare class AuthHelperUnavailableError extends Error {
|
|
|
215
215
|
/**
|
|
216
216
|
* L6.1 — typed error thrown when the workspace-trust gate blocks a
|
|
217
217
|
* project- or local-scope helper. Surfaces the actionable next step
|
|
218
|
-
* (`
|
|
218
|
+
* (`skrrd trust accept`) to the user; the daemon catches and presents
|
|
219
219
|
* this without falling through to OAuth.
|
|
220
220
|
*/
|
|
221
221
|
export declare class AuthHelperUntrustedError extends Error {
|