@ashlr/hub 3.7.0 → 3.9.0
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/CHANGELOG.md +257 -0
- package/dist/build-identity.json +2 -2
- package/dist/cli/resource-profile.js +95 -21
- package/dist/cli/resource-profile.js.map +1 -1
- package/dist/core/policy/local-only.d.ts +142 -2
- package/dist/core/policy/local-only.js +204 -15
- package/dist/core/policy/local-only.js.map +1 -1
- package/dist/core/resources/native-profile.d.ts +56 -0
- package/dist/core/resources/native-profile.js +368 -6
- package/dist/core/resources/native-profile.js.map +1 -1
- package/dist/core/run/budget.d.ts +22 -8
- package/dist/core/run/budget.js +80 -12
- package/dist/core/run/budget.js.map +1 -1
- package/dist/core/run/model-catalog.js +8 -1
- package/dist/core/run/model-catalog.js.map +1 -1
- package/dist/core/run/sandboxed-engine.js +3 -3
- package/dist/core/run/sandboxed-engine.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +69 -10
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +68 -9
- package/dist/core/verse/adapters/claude.d.ts +49 -2
- package/dist/core/verse/adapters/claude.js +317 -56
- package/dist/core/verse/adapters/claude.js.map +1 -1
- package/dist/core/verse/adapters/codex.d.ts +81 -5
- package/dist/core/verse/adapters/codex.js +409 -47
- package/dist/core/verse/adapters/codex.js.map +1 -1
- package/dist/core/verse/adapters/grok.d.ts +13 -1
- package/dist/core/verse/adapters/grok.js +28 -2
- package/dist/core/verse/adapters/grok.js.map +1 -1
- package/dist/core/verse/adapters/index.d.ts +32 -0
- package/dist/core/verse/adapters/index.js +2 -0
- package/dist/core/verse/adapters/index.js.map +1 -1
- package/dist/core/verse/codex-rollout.d.ts +284 -0
- package/dist/core/verse/codex-rollout.js +786 -0
- package/dist/core/verse/codex-rollout.js.map +1 -0
- package/dist/core/verse/context-fit.d.ts +63 -0
- package/dist/core/verse/context-fit.js +355 -0
- package/dist/core/verse/context-fit.js.map +1 -0
- package/dist/core/verse/context-math.d.ts +215 -0
- package/dist/core/verse/context-math.js +365 -0
- package/dist/core/verse/context-math.js.map +1 -0
- package/dist/core/verse/local-models.d.ts +137 -1
- package/dist/core/verse/local-models.js +209 -5
- package/dist/core/verse/local-models.js.map +1 -1
- package/dist/core/verse/model-windows.d.ts +217 -0
- package/dist/core/verse/model-windows.js +616 -0
- package/dist/core/verse/model-windows.js.map +1 -0
- package/dist/core/verse/preferences.d.ts +123 -0
- package/dist/core/verse/preferences.js +403 -0
- package/dist/core/verse/preferences.js.map +1 -0
- package/dist/core/verse/project-memory.d.ts +112 -0
- package/dist/core/verse/project-memory.js +295 -0
- package/dist/core/verse/project-memory.js.map +1 -0
- package/dist/core/verse/seats.d.ts +106 -4
- package/dist/core/verse/seats.js +291 -89
- package/dist/core/verse/seats.js.map +1 -1
- package/dist/core/verse/session-engine.d.ts +117 -2
- package/dist/core/verse/session-engine.js +763 -65
- package/dist/core/verse/session-engine.js.map +1 -1
- package/dist/core/verse/session-handoff.d.ts +94 -0
- package/dist/core/verse/session-handoff.js +551 -0
- package/dist/core/verse/session-handoff.js.map +1 -0
- package/dist/core/verse/session-search.d.ts +63 -0
- package/dist/core/verse/session-search.js +213 -0
- package/dist/core/verse/session-search.js.map +1 -0
- package/dist/core/verse/session-store.d.ts +16 -2
- package/dist/core/verse/session-store.js +80 -6
- package/dist/core/verse/session-store.js.map +1 -1
- package/dist/core/verse/types.d.ts +333 -1
- package/dist/core/verse/types.js +54 -2
- package/dist/core/verse/types.js.map +1 -1
- package/dist/core/verse/verse-api.d.ts +40 -5
- package/dist/core/verse/verse-api.js +724 -25
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/web/api.d.ts +14 -4
- package/dist/core/web/api.js +26 -11
- package/dist/core/web/api.js.map +1 -1
- package/dist/core/web/public/next/assets/{App-vtaHB9mp.js → App-XURmiAAp.js} +5 -5
- package/dist/core/web/public/next/assets/{App-vtaHB9mp.js.map → App-XURmiAAp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ApprovalsSection-B-bFJ0I9.js → ApprovalsSection-BriUzoZc.js} +2 -2
- package/dist/core/web/public/next/assets/{ApprovalsSection-B-bFJ0I9.js.map → ApprovalsSection-BriUzoZc.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-C4GBsQVc.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-DoqmsCjw.js.map → AutonomySection-C4GBsQVc.js.map} +1 -1
- package/dist/core/web/public/next/assets/ChatSection-BpOBOUvg.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-hlgPBRco.js +84 -0
- package/dist/core/web/public/next/assets/ChatSection-hlgPBRco.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-BdQYI-Ng.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-BdQYI-Ng.js.map +1 -0
- package/dist/core/web/public/next/assets/{Dialog-CPM9JxBc.js → Dialog-BxdIfmFH.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-CPM9JxBc.js.map → Dialog-BxdIfmFH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-B84qVef9.js → DiffViewer-DmeRWuc4.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-B84qVef9.js.map → DiffViewer-DmeRWuc4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{McpSection-CEUpV_5X.js → McpSection-q34T7Tho.js} +2 -2
- package/dist/core/web/public/next/assets/{McpSection-CEUpV_5X.js.map → McpSection-q34T7Tho.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MutationTokenDialog-DA8t97XT.js → MutationTokenDialog-CFAkwOEt.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-DA8t97XT.js.map → MutationTokenDialog-CFAkwOEt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-Bq7Vyud0.js → ResourcePoolConsoleApp-DHc8GFOY.js} +4 -4
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-Bq7Vyud0.js.map → ResourcePoolConsoleApp-DHc8GFOY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-Badio_uO.js → RouteErrorBoundary-ZL9F4qUn.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-Badio_uO.js.map → RouteErrorBoundary-ZL9F4qUn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-CLcr-4wS.css → Segmented-8cf0Fypn.css} +1 -1
- package/dist/core/web/public/next/assets/{Meter--h3MmZS-.js → Segmented-DbRjVye3.js} +2 -2
- package/dist/core/web/public/next/assets/Segmented-DbRjVye3.js.map +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-nJGGGYqv.js +2 -0
- package/dist/core/web/public/next/assets/{SettingsSection-BwrpQlpP.js.map → SettingsSection-nJGGGYqv.js.map} +1 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-6GJydgo4.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-_FSohAdN.js.map → UniverseConsoleApp-6GJydgo4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-DqcXbed4.js → UniverseView-DLDtNYL8.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseView-DqcXbed4.js.map → UniverseView-DLDtNYL8.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-Cf9d9iFH.js +2 -0
- package/dist/core/web/public/next/assets/UsageSection-Cf9d9iFH.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DsdKQoTH.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-y0uOHixd.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-y0uOHixd.js.map +1 -0
- package/dist/core/web/public/next/assets/{charts-CTZJ-JrH.js → charts-CVooqJWN.js} +2 -2
- package/dist/core/web/public/next/assets/{charts-CTZJ-JrH.js.map → charts-CVooqJWN.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-model-Bqv8DVuH.js +2 -0
- package/dist/core/web/public/next/assets/context-model-Bqv8DVuH.js.map +1 -0
- package/dist/core/web/public/next/assets/global-eaY9GyX3.js +2 -0
- package/dist/core/web/public/next/assets/global-eaY9GyX3.js.map +1 -0
- package/dist/core/web/public/next/assets/{icons-D9vlf85u.js → icons-vex8rclC.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-D9vlf85u.js.map → icons-vex8rclC.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-CZamKRUg.js → index-D2Eik-zt.js} +3 -3
- package/dist/core/web/public/next/assets/{index-CZamKRUg.js.map → index-D2Eik-zt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{queries-B8eBnFox.js → queries-bAYU0VNy.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-B8eBnFox.js.map → queries-bAYU0VNy.js.map} +1 -1
- package/dist/core/web/public/next/assets/use-guarded-action-C7QrP7Yp.js +2 -0
- package/dist/core/web/public/next/assets/{use-guarded-action-bzrVVAYq.js.map → use-guarded-action-C7QrP7Yp.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-model-TfDk9cky.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-TfDk9cky.js.map +1 -0
- package/dist/core/web/public/next/assets/{workspace-model-v0a1gl-C.js → workspace-model-CHol5RVp.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-v0a1gl-C.js.map → workspace-model-CHol5RVp.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/README.md +1 -0
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-DoqmsCjw.js +0 -2
- package/dist/core/web/public/next/assets/ChatSection-BfnLe5dT.css +0 -1
- package/dist/core/web/public/next/assets/ChatSection-vNPIJffd.js +0 -80
- package/dist/core/web/public/next/assets/ChatSection-vNPIJffd.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-Dd2APQhB.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-Dd2APQhB.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter--h3MmZS-.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-BwrpQlpP.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-_FSohAdN.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-Bq6Daaby.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-Bq6Daaby.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-CMkCizvL.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-CsIQv9id.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-CsIQv9id.js.map +0 -1
- package/dist/core/web/public/next/assets/global-D6bTxIRn.js +0 -2
- package/dist/core/web/public/next/assets/global-D6bTxIRn.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-bzrVVAYq.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js.map +0 -1
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Prepare fresh owner-scoped native state without reading credentials or starting a native process,
|
|
3
|
+
* and re-pin an existing prepared profile to a different native executable.
|
|
4
|
+
*/
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
6
|
+
import { accessSync, closeSync, constants, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readSync, realpathSync, renameSync, unlinkSync, writeSync, } from 'node:fs';
|
|
7
|
+
import { basename, dirname, isAbsolute, join, parse, resolve } from 'node:path';
|
|
4
8
|
import { inspectPrivateDirectory } from '../universe/artifacts.js';
|
|
5
9
|
import { fsyncDirectory } from '../util/durability.js';
|
|
6
10
|
function path(value) {
|
|
@@ -14,13 +18,28 @@ function executable(path) {
|
|
|
14
18
|
accessSync(path, constants.X_OK);
|
|
15
19
|
}
|
|
16
20
|
function same(left, right) { return left.dev === right.dev && left.ino === right.ino; }
|
|
21
|
+
// The generated launcher's fixed landmarks. `repinResourceNativeProfile` edits
|
|
22
|
+
// exactly the one `const profile=` line and refuses a launcher that does not
|
|
23
|
+
// carry these byte-for-byte, so prepare and repin share one definition.
|
|
24
|
+
const LAUNCHER_HEADER = '// Generated private native profile. Owner-editable configuration, not an authentication attestation.';
|
|
25
|
+
const LAUNCHER_PROFILE_PREFIX = 'const profile=';
|
|
26
|
+
const LAUNCHER_DIRECTORIES_PREFIX = 'const directories=';
|
|
27
|
+
/** Key order of the embedded launcher profile, exactly as `launcherSource` serializes it. */
|
|
28
|
+
const LAUNCHER_PROFILE_KEYS = ['provider', 'executable', 'nativeStatePath', 'anthropicStatePath', 'launcherPath'];
|
|
29
|
+
/**
|
|
30
|
+
* Key order of profile.json, exactly as `prepareResourceNativeProfile` builds it.
|
|
31
|
+
* Exported so a test can pin prepare's output to it: repin refuses any other
|
|
32
|
+
* shape, so the two must never drift apart silently.
|
|
33
|
+
*/
|
|
34
|
+
export const RESOURCE_NATIVE_PROFILE_MANIFEST_KEYS = ['schemaVersion', 'scope', 'status', 'authentication', 'provider', 'directory', 'executable',
|
|
35
|
+
'nodeExecutable', 'commandPath', 'launcherPath', 'nativeStatePath', 'anthropicStatePath', 'manifestPath', 'command', 'loginCommand'];
|
|
17
36
|
/** Standalone source deliberately has no dependency on an installed Hub path. */
|
|
18
37
|
function launcherSource(profile, directories) {
|
|
19
|
-
return
|
|
38
|
+
return `${LAUNCHER_HEADER}
|
|
20
39
|
import {accessSync,constants,lstatSync,realpathSync} from 'node:fs';
|
|
21
|
-
|
|
40
|
+
${LAUNCHER_PROFILE_PREFIX}${JSON.stringify({ provider: profile.provider, executable: profile.executable, nativeStatePath: profile.nativeStatePath,
|
|
22
41
|
anthropicStatePath: profile.anthropicStatePath, launcherPath: profile.launcherPath })};
|
|
23
|
-
|
|
42
|
+
${LAUNCHER_DIRECTORIES_PREFIX}${JSON.stringify(directories)};
|
|
24
43
|
const fail=()=>{process.stderr.write('Native profile launcher unavailable or conflicting authentication override\\n');process.exit(126);};
|
|
25
44
|
try {
|
|
26
45
|
if(typeof process.execve!=='function')fail();
|
|
@@ -173,4 +192,347 @@ export function prepareResourceNativeProfile(options) {
|
|
|
173
192
|
throw new Error('Native profile preparation failed; the partial directory remains for inspection');
|
|
174
193
|
}
|
|
175
194
|
}
|
|
195
|
+
// Fixed text: a failure message must never carry a private path or an OS error string.
|
|
196
|
+
const REPIN_FAILURE_MESSAGES = {
|
|
197
|
+
invalid: 'Invalid native profile repin: options, executable, runtime, private directories or file modes failed validation; nothing was written',
|
|
198
|
+
inconsistent: 'Native profile files are not an unmodified prepared profile or disagree with each other; nothing was written',
|
|
199
|
+
'failed-unchanged': 'Native profile repin failed before the launcher changed; the profile still runs its previous executable',
|
|
200
|
+
'failed-partial': 'Native profile repin was interrupted after the launcher changed; rerun the same repin to finish it, or restore the .prev files',
|
|
201
|
+
};
|
|
202
|
+
export class ResourceNativeProfileRepinError extends Error {
|
|
203
|
+
failure;
|
|
204
|
+
constructor(failure) {
|
|
205
|
+
super(REPIN_FAILURE_MESSAGES[failure]);
|
|
206
|
+
this.name = 'ResourceNativeProfileRepinError';
|
|
207
|
+
this.failure = failure;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** Generated files are a few KB; anything larger is not a file prepare wrote. */
|
|
211
|
+
const PROFILE_FILE_MAX_BYTES = 64 * 1024;
|
|
212
|
+
const REPIN_BACKUP_SUFFIX = '.prev';
|
|
213
|
+
function isRecord(value) {
|
|
214
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
215
|
+
}
|
|
216
|
+
function hasExactKeys(value, keys) {
|
|
217
|
+
const own = Object.keys(value);
|
|
218
|
+
return own.length === keys.length && own.every((key, index) => key === keys[index]);
|
|
219
|
+
}
|
|
220
|
+
function isStringArray(value) { return Array.isArray(value) && value.every((item) => typeof item === 'string'); }
|
|
221
|
+
/**
|
|
222
|
+
* Parse JSON that must re-serialize to exactly the same text. prepare writes
|
|
223
|
+
* every file with JSON.stringify, so a byte-exact round trip proves the text is
|
|
224
|
+
* still prepare's output; anything else (hand-reformatted, commented, extra
|
|
225
|
+
* whitespace) is refused rather than rewritten into a different shape.
|
|
226
|
+
*/
|
|
227
|
+
function exactJson(text, indent) {
|
|
228
|
+
const value = JSON.parse(text);
|
|
229
|
+
if ((indent === 2 ? `${JSON.stringify(value, null, 2)}\n` : JSON.stringify(value)) !== text)
|
|
230
|
+
throw new Error();
|
|
231
|
+
return value;
|
|
232
|
+
}
|
|
233
|
+
/** One bounded read of an owner-private 0600 single-link regular file; links, growth mid-read and non-UTF-8 are refused. */
|
|
234
|
+
function readOwnedFile(file) {
|
|
235
|
+
let fd;
|
|
236
|
+
try {
|
|
237
|
+
fd = openSync(file, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
238
|
+
const opened = fstatSync(fd, { bigint: true });
|
|
239
|
+
const named = lstatSync(file, { bigint: true });
|
|
240
|
+
if (!opened.isFile() || named.isSymbolicLink() || !same(opened, named) || opened.nlink !== 1n || (opened.mode & 511n) !== 384n ||
|
|
241
|
+
typeof process.getuid === 'function' && opened.uid !== BigInt(process.getuid()) || opened.size > BigInt(PROFILE_FILE_MAX_BYTES))
|
|
242
|
+
throw new Error();
|
|
243
|
+
// One spare byte so a file that grew after fstat is detected, not truncated.
|
|
244
|
+
const bytes = Buffer.alloc(Number(opened.size) + 1);
|
|
245
|
+
let length = 0;
|
|
246
|
+
while (length < bytes.length) {
|
|
247
|
+
const read = readSync(fd, bytes, length, bytes.length - length, null);
|
|
248
|
+
if (read === 0)
|
|
249
|
+
break;
|
|
250
|
+
length += read;
|
|
251
|
+
}
|
|
252
|
+
if (length !== Number(opened.size))
|
|
253
|
+
throw new Error();
|
|
254
|
+
const content = bytes.subarray(0, length);
|
|
255
|
+
const text = content.toString('utf8');
|
|
256
|
+
if (!Buffer.from(text, 'utf8').equals(content))
|
|
257
|
+
throw new Error();
|
|
258
|
+
return { text, stat: opened };
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
if (fd !== undefined)
|
|
262
|
+
closeSync(fd);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/** Absent, or an owned single-link regular file that a rename may replace. Anything else is refused. */
|
|
266
|
+
function assertReplaceable(file) {
|
|
267
|
+
let stat;
|
|
268
|
+
try {
|
|
269
|
+
stat = lstatSync(file, { bigint: true });
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
if (error.code === 'ENOENT')
|
|
273
|
+
return;
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1n || typeof process.getuid === 'function' && stat.uid !== BigInt(process.getuid())) {
|
|
277
|
+
throw new Error();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/** The launcher text with only its `const profile=` line re-rendered for `executable`. */
|
|
281
|
+
function launcherWithExecutable(state, executable) {
|
|
282
|
+
const lines = [...state.launcherLines];
|
|
283
|
+
lines[state.profileLineIndex] = `${LAUNCHER_PROFILE_PREFIX}${JSON.stringify({ ...state.launcherProfile, executable })};`;
|
|
284
|
+
return lines.join('\n');
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Read and cross-check the three generated files of one prepared profile.
|
|
288
|
+
* Read-only. Throws `invalid` for directory/file-mode problems and
|
|
289
|
+
* `inconsistent` for content that is not prepare's own output.
|
|
290
|
+
*/
|
|
291
|
+
function inspectRepinTarget(directory) {
|
|
292
|
+
let parent;
|
|
293
|
+
let parentStat;
|
|
294
|
+
let directoryStat;
|
|
295
|
+
let paths;
|
|
296
|
+
let files;
|
|
297
|
+
try {
|
|
298
|
+
parent = dirname(directory);
|
|
299
|
+
inspectPrivateDirectory(parent);
|
|
300
|
+
parentStat = lstatSync(parent, { bigint: true });
|
|
301
|
+
inspectPrivateDirectory(directory);
|
|
302
|
+
directoryStat = lstatSync(directory, { bigint: true });
|
|
303
|
+
paths = { launcher: join(directory, 'launcher.mjs'), manifest: join(directory, 'profile.json'), command: join(directory, 'command.json') };
|
|
304
|
+
files = { launcher: readOwnedFile(paths.launcher), manifest: readOwnedFile(paths.manifest), command: readOwnedFile(paths.command) };
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
throw new ResourceNativeProfileRepinError('invalid');
|
|
308
|
+
}
|
|
309
|
+
try {
|
|
310
|
+
const manifest = exactJson(files.manifest.text, 2);
|
|
311
|
+
if (!isRecord(manifest) || !hasExactKeys(manifest, RESOURCE_NATIVE_PROFILE_MANIFEST_KEYS))
|
|
312
|
+
throw new Error();
|
|
313
|
+
const provider = manifest['provider'];
|
|
314
|
+
if (provider !== 'codex' && provider !== 'claude' && provider !== 'grok')
|
|
315
|
+
throw new Error();
|
|
316
|
+
// Every locator is derived from the directory, exactly as prepare derives it:
|
|
317
|
+
// a profile.json copied or moved from elsewhere names another tree and is refused.
|
|
318
|
+
const expected = {
|
|
319
|
+
directory, commandPath: paths.command, launcherPath: paths.launcher, nativeStatePath: join(directory, 'native-state'),
|
|
320
|
+
anthropicStatePath: provider === 'claude' ? join(directory, 'anthropic-state') : null, manifestPath: paths.manifest,
|
|
321
|
+
};
|
|
322
|
+
const command = manifest['command'];
|
|
323
|
+
const loginCommand = manifest['loginCommand'];
|
|
324
|
+
if (manifest['schemaVersion'] !== 1 || manifest['scope'] !== 'native-profile-preparation' || manifest['status'] !== 'prepared' ||
|
|
325
|
+
manifest['authentication'] !== 'not-checked' || Object.entries(expected).some(([key, value]) => manifest[key] !== value) ||
|
|
326
|
+
!path(manifest['executable']) || !path(manifest['nodeExecutable']) || !isStringArray(command) || command.length !== 2 ||
|
|
327
|
+
command[0] !== manifest['nodeExecutable'] || command[1] !== paths.launcher || !isStringArray(loginCommand) ||
|
|
328
|
+
loginCommand[0] !== command[0] || loginCommand[1] !== command[1])
|
|
329
|
+
throw new Error();
|
|
330
|
+
if (JSON.stringify(exactJson(files.command.text, 2)) !== JSON.stringify(command))
|
|
331
|
+
throw new Error();
|
|
332
|
+
const launcherLines = files.launcher.text.split('\n');
|
|
333
|
+
const indexesOf = (prefix) => launcherLines.flatMap((line, index) => line.startsWith(prefix) ? [index] : []);
|
|
334
|
+
const profileIndexes = indexesOf(LAUNCHER_PROFILE_PREFIX);
|
|
335
|
+
const directoryIndexes = indexesOf(LAUNCHER_DIRECTORIES_PREFIX);
|
|
336
|
+
if (launcherLines[0] !== LAUNCHER_HEADER || profileIndexes.length !== 1 || directoryIndexes.length !== 1)
|
|
337
|
+
throw new Error();
|
|
338
|
+
const embedded = (index, prefix) => {
|
|
339
|
+
const line = launcherLines[index];
|
|
340
|
+
if (!line.endsWith(';'))
|
|
341
|
+
throw new Error();
|
|
342
|
+
return exactJson(line.slice(prefix.length, -1), 0);
|
|
343
|
+
};
|
|
344
|
+
const launcherProfile = embedded(profileIndexes[0], LAUNCHER_PROFILE_PREFIX);
|
|
345
|
+
if (!isRecord(launcherProfile) || !hasExactKeys(launcherProfile, LAUNCHER_PROFILE_KEYS) || launcherProfile['provider'] !== provider ||
|
|
346
|
+
launcherProfile['nativeStatePath'] !== expected['nativeStatePath'] || launcherProfile['anthropicStatePath'] !== expected['anthropicStatePath'] ||
|
|
347
|
+
launcherProfile['launcherPath'] !== paths.launcher || !path(launcherProfile['executable']))
|
|
348
|
+
throw new Error();
|
|
349
|
+
// The launcher refuses to run unless these directories still have the
|
|
350
|
+
// identities recorded at preparation. Check the same thing here: a repin
|
|
351
|
+
// must never produce a launcher that is already dead on arrival.
|
|
352
|
+
const directories = embedded(directoryIndexes[0], LAUNCHER_DIRECTORIES_PREFIX);
|
|
353
|
+
const expectedDirectories = [directory, join(directory, 'native-state'), ...(provider === 'claude' ? [join(directory, 'anthropic-state')] : [])];
|
|
354
|
+
if (!Array.isArray(directories) || directories.length !== expectedDirectories.length)
|
|
355
|
+
throw new Error();
|
|
356
|
+
directories.forEach((row, index) => {
|
|
357
|
+
if (!isRecord(row) || !hasExactKeys(row, ['path', 'dev', 'ino']) || row['path'] !== expectedDirectories[index])
|
|
358
|
+
throw new Error();
|
|
359
|
+
inspectPrivateDirectory(expectedDirectories[index]);
|
|
360
|
+
const live = lstatSync(expectedDirectories[index], { bigint: true });
|
|
361
|
+
if (live.dev.toString() !== row['dev'] || live.ino.toString() !== row['ino'])
|
|
362
|
+
throw new Error();
|
|
363
|
+
});
|
|
364
|
+
return { provider, parent, parentStat, directoryStat, paths, files, manifest, launcherLines, profileLineIndex: profileIndexes[0],
|
|
365
|
+
launcherProfile, launcherExecutable: launcherProfile['executable'], manifestExecutable: manifest['executable'] };
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
throw new ResourceNativeProfileRepinError('inconsistent');
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Re-pin one existing prepared profile to a different native executable.
|
|
373
|
+
* Rewrites only the executable locator (see the section comment above);
|
|
374
|
+
* idempotent when already pinned; resumes its own interrupted run; never
|
|
375
|
+
* executes anything and never reads native state or credentials.
|
|
376
|
+
*/
|
|
377
|
+
export function repinResourceNativeProfile(options) {
|
|
378
|
+
let directory;
|
|
379
|
+
let target;
|
|
380
|
+
let dryRun;
|
|
381
|
+
try {
|
|
382
|
+
if (options === null || typeof options !== 'object' || Array.isArray(options) ||
|
|
383
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(options)))
|
|
384
|
+
throw new Error();
|
|
385
|
+
const keys = Reflect.ownKeys(options);
|
|
386
|
+
if (!keys.every((key) => (key === 'directory' || key === 'executable' || key === 'dryRun') &&
|
|
387
|
+
'value' in Object.getOwnPropertyDescriptor(options, key)) || !Object.hasOwn(options, 'directory') || !Object.hasOwn(options, 'executable')) {
|
|
388
|
+
throw new Error();
|
|
389
|
+
}
|
|
390
|
+
directory = options.directory;
|
|
391
|
+
target = options.executable;
|
|
392
|
+
dryRun = options.dryRun ?? false;
|
|
393
|
+
if (!path(directory) || !path(target) || typeof dryRun !== 'boolean' || typeof process.execve !== 'function' ||
|
|
394
|
+
process.platform === 'win32' || process.platform === 'aix')
|
|
395
|
+
throw new Error();
|
|
396
|
+
executable(target);
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
throw new ResourceNativeProfileRepinError('invalid');
|
|
400
|
+
}
|
|
401
|
+
const state = inspectRepinTarget(directory);
|
|
402
|
+
const previous = state.manifestExecutable;
|
|
403
|
+
const mode = state.launcherExecutable === previous ? (previous === target ? 'unchanged' : 'repin')
|
|
404
|
+
: state.launcherExecutable === target ? 'resume' : (() => { throw new ResourceNativeProfileRepinError('inconsistent'); })();
|
|
405
|
+
const backups = { launcherPath: `${state.paths.launcher}${REPIN_BACKUP_SUFFIX}`, manifestPath: `${state.paths.manifest}${REPIN_BACKUP_SUFFIX}`,
|
|
406
|
+
commandPath: `${state.paths.command}${REPIN_BACKUP_SUFFIX}` };
|
|
407
|
+
// The launcher as it stood pinned to `previous` (identical to what was read in
|
|
408
|
+
// `repin` mode; reconstructed in `resume` mode to check the backup against).
|
|
409
|
+
const previousLauncher = launcherWithExecutable(state, previous);
|
|
410
|
+
const nextLauncher = launcherWithExecutable(state, target);
|
|
411
|
+
const nextManifest = `${JSON.stringify({ ...state.manifest, executable: target }, null, 2)}\n`;
|
|
412
|
+
if (mode === 'resume') {
|
|
413
|
+
// Only finish a torn run whose backups prove it: they must hold exactly the
|
|
414
|
+
// pre-repin triple, and profile.json must still be that pre-repin text.
|
|
415
|
+
try {
|
|
416
|
+
if (readOwnedFile(backups.launcherPath).text !== previousLauncher || readOwnedFile(backups.manifestPath).text !== state.files.manifest.text ||
|
|
417
|
+
readOwnedFile(backups.commandPath).text !== state.files.command.text)
|
|
418
|
+
throw new Error();
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
throw new ResourceNativeProfileRepinError('inconsistent');
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
else if (mode === 'repin') {
|
|
425
|
+
try {
|
|
426
|
+
for (const file of Object.values(backups))
|
|
427
|
+
assertReplaceable(file);
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
throw new ResourceNativeProfileRepinError('invalid');
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
const report = (status, written) => ({
|
|
434
|
+
schemaVersion: 1, scope: 'native-profile-repin', status, authentication: 'not-checked', provider: state.provider, directory,
|
|
435
|
+
previousExecutable: previous, executable: target, launcherPath: state.paths.launcher, manifestPath: state.paths.manifest,
|
|
436
|
+
commandPath: state.paths.command, backups: written, resumed: mode === 'resume',
|
|
437
|
+
});
|
|
438
|
+
if (mode === 'unchanged')
|
|
439
|
+
return report('unchanged', null);
|
|
440
|
+
if (dryRun)
|
|
441
|
+
return report('would-repin', null);
|
|
442
|
+
const assertOwned = () => {
|
|
443
|
+
inspectPrivateDirectory(state.parent);
|
|
444
|
+
if (!same(state.parentStat, lstatSync(state.parent, { bigint: true })))
|
|
445
|
+
throw new Error();
|
|
446
|
+
inspectPrivateDirectory(directory);
|
|
447
|
+
if (!same(state.directoryStat, lstatSync(directory, { bigint: true })))
|
|
448
|
+
throw new Error();
|
|
449
|
+
};
|
|
450
|
+
/** The target is still exactly the inode and bytes that inspection validated. */
|
|
451
|
+
const unchangedSinceInspection = (file, read) => {
|
|
452
|
+
const now = readOwnedFile(file);
|
|
453
|
+
if (!same(now.stat, read.stat) || now.text !== read.text)
|
|
454
|
+
throw new Error();
|
|
455
|
+
};
|
|
456
|
+
// Write a fresh exclusive temp file beside `file`, then rename it into place.
|
|
457
|
+
// The precondition runs immediately before the rename; the remaining window
|
|
458
|
+
// is a same-owner race inside a directory only this uid can write.
|
|
459
|
+
const publish = (file, text, precondition, onInstalled) => {
|
|
460
|
+
assertOwned();
|
|
461
|
+
const temp = join(directory, `.${basename(file)}.${randomBytes(8).toString('hex')}.repin-tmp`);
|
|
462
|
+
let fd;
|
|
463
|
+
let created = false;
|
|
464
|
+
let installed = false;
|
|
465
|
+
try {
|
|
466
|
+
fd = openSync(temp, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
|
|
467
|
+
created = true;
|
|
468
|
+
const before = fstatSync(fd, { bigint: true });
|
|
469
|
+
const named = lstatSync(temp, { bigint: true });
|
|
470
|
+
if (!before.isFile() || before.nlink !== 1n || before.size !== 0n || !same(before, named) || named.isSymbolicLink() ||
|
|
471
|
+
(before.mode & 511n) !== 384n || typeof process.getuid === 'function' && before.uid !== BigInt(process.getuid()))
|
|
472
|
+
throw new Error();
|
|
473
|
+
const bytes = Buffer.from(text);
|
|
474
|
+
let offset = 0;
|
|
475
|
+
while (offset < bytes.length) {
|
|
476
|
+
const written = writeSync(fd, bytes, offset, bytes.length - offset);
|
|
477
|
+
if (written < 1)
|
|
478
|
+
throw new Error();
|
|
479
|
+
offset += written;
|
|
480
|
+
}
|
|
481
|
+
fsyncSync(fd);
|
|
482
|
+
const after = fstatSync(fd, { bigint: true });
|
|
483
|
+
if (!same(before, after) || after.nlink !== 1n || after.size !== BigInt(bytes.length) || (after.mode & 511n) !== 384n)
|
|
484
|
+
throw new Error();
|
|
485
|
+
closeSync(fd);
|
|
486
|
+
fd = undefined;
|
|
487
|
+
assertOwned();
|
|
488
|
+
precondition();
|
|
489
|
+
renameSync(temp, file);
|
|
490
|
+
installed = true;
|
|
491
|
+
onInstalled?.();
|
|
492
|
+
const placed = lstatSync(file, { bigint: true });
|
|
493
|
+
if (!same(before, placed) || !placed.isFile() || placed.isSymbolicLink() || placed.nlink !== 1n || (placed.mode & 511n) !== 384n)
|
|
494
|
+
throw new Error();
|
|
495
|
+
}
|
|
496
|
+
finally {
|
|
497
|
+
if (fd !== undefined)
|
|
498
|
+
closeSync(fd);
|
|
499
|
+
// Our own O_EXCL temp file only; best effort, and it never names a live file.
|
|
500
|
+
if (created && !installed) {
|
|
501
|
+
try {
|
|
502
|
+
unlinkSync(temp);
|
|
503
|
+
}
|
|
504
|
+
catch { /* left beside the profile for inspection */ }
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
const syncDirectory = () => fsyncDirectory(directory, { expectedIdentity: state.directoryStat });
|
|
509
|
+
let launcherChanged = mode === 'resume';
|
|
510
|
+
try {
|
|
511
|
+
if (mode === 'repin') {
|
|
512
|
+
// Copies, never hard links: the launcher refuses to run when its own
|
|
513
|
+
// file has more than one link, so a linked backup would disable the profile.
|
|
514
|
+
publish(backups.commandPath, state.files.command.text, () => assertReplaceable(backups.commandPath));
|
|
515
|
+
publish(backups.manifestPath, state.files.manifest.text, () => assertReplaceable(backups.manifestPath));
|
|
516
|
+
publish(backups.launcherPath, state.files.launcher.text, () => assertReplaceable(backups.launcherPath));
|
|
517
|
+
syncDirectory();
|
|
518
|
+
publish(state.paths.launcher, nextLauncher, () => unchangedSinceInspection(state.paths.launcher, state.files.launcher), () => { launcherChanged = true; });
|
|
519
|
+
syncDirectory();
|
|
520
|
+
}
|
|
521
|
+
publish(state.paths.manifest, nextManifest, () => unchangedSinceInspection(state.paths.manifest, state.files.manifest));
|
|
522
|
+
syncDirectory();
|
|
523
|
+
// Postcondition from disk, not from memory: the profile re-validates as a
|
|
524
|
+
// prepared profile pinned to the target, and the backups hold the prior triple.
|
|
525
|
+
const settled = inspectRepinTarget(directory);
|
|
526
|
+
if (settled.launcherExecutable !== target || settled.manifestExecutable !== target || settled.files.launcher.text !== nextLauncher ||
|
|
527
|
+
settled.files.manifest.text !== nextManifest || settled.files.command.text !== state.files.command.text ||
|
|
528
|
+
readOwnedFile(backups.launcherPath).text !== previousLauncher || readOwnedFile(backups.manifestPath).text !== state.files.manifest.text ||
|
|
529
|
+
readOwnedFile(backups.commandPath).text !== state.files.command.text)
|
|
530
|
+
throw new Error();
|
|
531
|
+
assertOwned();
|
|
532
|
+
}
|
|
533
|
+
catch {
|
|
534
|
+
throw new ResourceNativeProfileRepinError(launcherChanged ? 'failed-partial' : 'failed-unchanged');
|
|
535
|
+
}
|
|
536
|
+
return report('repinned', backups);
|
|
537
|
+
}
|
|
176
538
|
//# sourceMappingURL=native-profile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-profile.js","sourceRoot":"","sources":["../../../src/core/resources/native-profile.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAoB,MAAM,SAAS,CAAC;AAC5J,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAsBvD,SAAS,IAAI,CAAC,KAAc;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK;QACnH,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/J,CAAC;AACD,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK;QAAE,MAAM,IAAI,KAAK,EAAE,CAAC;IACnH,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AACD,SAAS,IAAI,CAAC,IAAiB,EAAE,KAAkB,IAAa,OAAO,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1H,iFAAiF;AACjF,SAAS,cAAc,CAAC,OAA8B,EAAE,WAA8D;IACpH,OAAO;;gBAEO,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe;QACjI,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;oBACrE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyC9C,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAqC;IAChF,IAAI,MAAc,CAAC;IAAC,IAAI,UAAuB,CAAC;IAAC,IAAI,cAAsB,CAAC;IAC5E,IAAI,CAAC;QACH,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAC3E,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;YAC3G,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;gBACjF,OAAO,IAAI,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;YACvH,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU;YAC7F,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QAChF,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAAC,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACvH,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAAC,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC9G,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IAAC,CAAC;IAC3G,MAAM,OAAO,GAA0B,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa;QAC/I,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,cAAc;QACxG,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC;QAC3G,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI;QAC/J,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IACzF,OAAO,CAAC,OAAO,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACzD,OAAO,CAAC,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACtF,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/G,IAAI,CAAC;QACH,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QAC9E,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAAC,CAAC;IACrG,MAAM,KAAK,GAA+C,EAAE,CAAC;IAC7D,IAAI,CAAC;QACH,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1I,MAAM,WAAW,GAAG,GAAS,EAAE;YAC7B,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;YAC/G,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;YAAC,CAAC;QAChJ,CAAC,CAAC;QACF,KAAK,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACvH,WAAW,EAAE,CAAC;YAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;YACzF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,IAAY,EAAQ,EAAE;YACjD,WAAW,EAAE,CAAC;YAAC,IAAI,EAAsB,CAAC;YAC1C,IAAI,CAAC;gBACH,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC7G,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,EAAE;oBACjH,CAAC,MAAM,CAAC,IAAI,GAAG,IAAM,CAAC,KAAK,IAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC1I,WAAW,EAAE,CAAC;gBAAC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,MAAM,GAAG,CAAC,CAAC;gBAC/D,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;oBAAC,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;oBAAC,IAAI,OAAO,GAAG,CAAC;wBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;oBAAC,MAAM,IAAI,OAAO,CAAC;gBAAC,CAAC;gBAC7J,SAAS,CAAC,EAAE,CAAC,CAAC;gBAAC,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClH,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC,cAAc,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,EAAE;oBACtG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAM,CAAC,KAAK,IAAM;oBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC7F,WAAW,EAAE,CAAC;YAChB,CAAC;oBAAS,CAAC;gBAAC,IAAI,EAAE,KAAK,SAAS;oBAAE,SAAS,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;QACpD,CAAC,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3J,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5E,kFAAkF;QAClF,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrE,KAAK,MAAM,GAAG,IAAI,KAAK;YAAE,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,cAAc,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAC;QAAC,WAAW,EAAE,CAAC;QACxE,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IAAC,CAAC;AACjH,CAAC"}
|
|
1
|
+
{"version":3,"file":"native-profile.js","sourceRoot":"","sources":["../../../src/core/resources/native-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,12 @@
|
|
|
4
4
|
* Pure, deterministic functions — no I/O, no side effects. All functions
|
|
5
5
|
* return new objects; RunUsage is never mutated in place.
|
|
6
6
|
*/
|
|
7
|
-
import type { RunUsage, RunBudget } from '../types.js';
|
|
7
|
+
import type { AshlrConfig, RunUsage, RunBudget } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Test-only: drop memoised answers so suites that vary env or registry entries
|
|
10
|
+
* stay independent of each other's ordering.
|
|
11
|
+
*/
|
|
12
|
+
export declare function __resetBudgetMeterednessCacheForTests(): void;
|
|
8
13
|
/**
|
|
9
14
|
* Return a fresh, zeroed RunUsage.
|
|
10
15
|
*/
|
|
@@ -48,19 +53,28 @@ export declare const CACHE_READ_MULT = 0.1;
|
|
|
48
53
|
/**
|
|
49
54
|
* Estimated USD cost for a single model call.
|
|
50
55
|
*
|
|
51
|
-
* -
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
56
|
+
* - PROVABLY FREE subjects → 0. That is `subjectMeteredness(...) === 'free'`:
|
|
57
|
+
* loopback endpoints and the local serving runtimes, whatever they are called
|
|
58
|
+
* in either id space.
|
|
59
|
+
* - Everything else → looked up from the static price table by matching the id
|
|
60
|
+
* (case-insensitive prefix match against known keys). Falls back to a
|
|
61
|
+
* conservative $3/$15 per-M-token estimate when nothing matches — which is
|
|
62
|
+
* where `'ashlrcode'` lands, ON PURPOSE. A metered subject must never report
|
|
63
|
+
* $0; a wrong number invites scrutiny, a zero ends it.
|
|
55
64
|
* - M246: optional cache token params (default 0) add tiered cache pricing
|
|
56
65
|
* on top of the base cost. Existing callers with no cache args are unaffected.
|
|
57
66
|
*
|
|
58
|
-
* @param
|
|
67
|
+
* @param subject Provider id OR engine id — e.g. 'ollama', 'anthropic',
|
|
68
|
+
* 'local-coder', 'ashlrcode'. Both id spaces resolve; see
|
|
69
|
+
* `meterednessOf` for why this parameter used to lie.
|
|
59
70
|
* @param tokensIn Number of prompt/input tokens (non-cached).
|
|
60
71
|
* @param tokensOut Number of completion/output tokens.
|
|
61
72
|
* @param cacheRead M246: Cache-read tokens (0 by default).
|
|
62
73
|
* @param cacheWrite5m M246: 5-min TTL cache-write tokens (0 by default).
|
|
63
74
|
* @param cacheWrite1h M246: 1-hour TTL cache-write tokens (0 by default).
|
|
64
|
-
* @
|
|
75
|
+
* @param cfg Optional config, so engines registered through
|
|
76
|
+
* `cfg.foundry.engines` classify correctly. Omitting it
|
|
77
|
+
* can only make a subject LESS provably free, never more.
|
|
78
|
+
* @returns Estimated USD cost as a number (0 only when provably free).
|
|
65
79
|
*/
|
|
66
|
-
export declare function estCostUsd(
|
|
80
|
+
export declare function estCostUsd(subject: string, tokensIn: number, tokensOut: number, cacheRead?: number, cacheWrite5m?: number, cacheWrite1h?: number, cfg?: AshlrConfig): number;
|
package/dist/core/run/budget.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Pure, deterministic functions — no I/O, no side effects. All functions
|
|
5
5
|
* return new objects; RunUsage is never mutated in place.
|
|
6
6
|
*/
|
|
7
|
+
import { subjectMeteredness } from '../policy/local-only.js';
|
|
7
8
|
// ---------------------------------------------------------------------------
|
|
8
9
|
// Static price table (rough $/M-token estimates for cloud providers).
|
|
9
10
|
// Local providers always return 0. Cloud prices are ESTIMATES only — used
|
|
@@ -36,8 +37,66 @@ const PRICE_OUT = {
|
|
|
36
37
|
mistral: 6.0,
|
|
37
38
|
cohere: 3.0,
|
|
38
39
|
};
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// What costs nothing — asked, never restated
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/**
|
|
44
|
+
* WHAT MAKES A CALL FREE IS METEREDNESS, NEVER LOCALITY.
|
|
45
|
+
*
|
|
46
|
+
* This file used to carry its own two-entry set (`ollama`, `lmstudio`). That was
|
|
47
|
+
* wrong in one direction — `local-coder` and `llama-server` serve the same
|
|
48
|
+
* weights off the same loopback port and were priced as cloud — and the obvious
|
|
49
|
+
* repair was worse in the other: routing the question through
|
|
50
|
+
* `engineLocality` would have called `ashlrcode` local and billed every
|
|
51
|
+
* ashlrcode run at $0.
|
|
52
|
+
*
|
|
53
|
+
* ZERO IS WORSE THAN WRONG. Before this change `'ashlrcode'` matched no price
|
|
54
|
+
* key and fell to the conservative $3/$15 estimate: a wrong number, but a
|
|
55
|
+
* VISIBLE one, and a wrong number invites scrutiny where a zero ends it. So the
|
|
56
|
+
* question asked here is the spend question, and `ashlrcode` stays priced.
|
|
57
|
+
*
|
|
58
|
+
* `subjectMeteredness` also settles the id-space confusion this function was
|
|
59
|
+
* living with: the doc comment below said "provider id" while
|
|
60
|
+
* `run/sandboxed-engine.ts` passed an ENGINE id at `:1825`, `:2161` and
|
|
61
|
+
* `:3061`. Both id spaces now resolve, and the parameter is named for it.
|
|
62
|
+
*/
|
|
63
|
+
function meterednessOf(subject, cfg) {
|
|
64
|
+
const key = subject.trim().toLowerCase();
|
|
65
|
+
if (key.length === 0)
|
|
66
|
+
return 'unknown';
|
|
67
|
+
const bucket = cacheBucket(cfg);
|
|
68
|
+
const hit = bucket.get(key);
|
|
69
|
+
if (hit !== undefined)
|
|
70
|
+
return hit;
|
|
71
|
+
const answer = subjectMeteredness(subject, cfg);
|
|
72
|
+
bucket.set(key, answer);
|
|
73
|
+
return answer;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Memoised because `estCostUsd` runs once per model step and per usage event in
|
|
77
|
+
* the rollup, while `subjectMeteredness` resolves the whole engine registry.
|
|
78
|
+
* Keyed by cfg identity so a caller that passes a different config is not served
|
|
79
|
+
* another config's answer; the no-cfg bucket is separate for the same reason.
|
|
80
|
+
*/
|
|
81
|
+
const meterednessByCfg = new WeakMap();
|
|
82
|
+
const meterednessNoCfg = new Map();
|
|
83
|
+
function cacheBucket(cfg) {
|
|
84
|
+
if (!cfg)
|
|
85
|
+
return meterednessNoCfg;
|
|
86
|
+
const existing = meterednessByCfg.get(cfg);
|
|
87
|
+
if (existing)
|
|
88
|
+
return existing;
|
|
89
|
+
const fresh = new Map();
|
|
90
|
+
meterednessByCfg.set(cfg, fresh);
|
|
91
|
+
return fresh;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Test-only: drop memoised answers so suites that vary env or registry entries
|
|
95
|
+
* stay independent of each other's ordering.
|
|
96
|
+
*/
|
|
97
|
+
export function __resetBudgetMeterednessCacheForTests() {
|
|
98
|
+
meterednessNoCfg.clear();
|
|
99
|
+
}
|
|
41
100
|
// ---------------------------------------------------------------------------
|
|
42
101
|
// Public API
|
|
43
102
|
// ---------------------------------------------------------------------------
|
|
@@ -95,25 +154,34 @@ export const CACHE_READ_MULT = 0.1; // cache read (served from cache)
|
|
|
95
154
|
/**
|
|
96
155
|
* Estimated USD cost for a single model call.
|
|
97
156
|
*
|
|
98
|
-
* -
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
157
|
+
* - PROVABLY FREE subjects → 0. That is `subjectMeteredness(...) === 'free'`:
|
|
158
|
+
* loopback endpoints and the local serving runtimes, whatever they are called
|
|
159
|
+
* in either id space.
|
|
160
|
+
* - Everything else → looked up from the static price table by matching the id
|
|
161
|
+
* (case-insensitive prefix match against known keys). Falls back to a
|
|
162
|
+
* conservative $3/$15 per-M-token estimate when nothing matches — which is
|
|
163
|
+
* where `'ashlrcode'` lands, ON PURPOSE. A metered subject must never report
|
|
164
|
+
* $0; a wrong number invites scrutiny, a zero ends it.
|
|
102
165
|
* - M246: optional cache token params (default 0) add tiered cache pricing
|
|
103
166
|
* on top of the base cost. Existing callers with no cache args are unaffected.
|
|
104
167
|
*
|
|
105
|
-
* @param
|
|
168
|
+
* @param subject Provider id OR engine id — e.g. 'ollama', 'anthropic',
|
|
169
|
+
* 'local-coder', 'ashlrcode'. Both id spaces resolve; see
|
|
170
|
+
* `meterednessOf` for why this parameter used to lie.
|
|
106
171
|
* @param tokensIn Number of prompt/input tokens (non-cached).
|
|
107
172
|
* @param tokensOut Number of completion/output tokens.
|
|
108
173
|
* @param cacheRead M246: Cache-read tokens (0 by default).
|
|
109
174
|
* @param cacheWrite5m M246: 5-min TTL cache-write tokens (0 by default).
|
|
110
175
|
* @param cacheWrite1h M246: 1-hour TTL cache-write tokens (0 by default).
|
|
111
|
-
* @
|
|
176
|
+
* @param cfg Optional config, so engines registered through
|
|
177
|
+
* `cfg.foundry.engines` classify correctly. Omitting it
|
|
178
|
+
* can only make a subject LESS provably free, never more.
|
|
179
|
+
* @returns Estimated USD cost as a number (0 only when provably free).
|
|
112
180
|
*/
|
|
113
|
-
export function estCostUsd(
|
|
114
|
-
const key =
|
|
115
|
-
// Fast path:
|
|
116
|
-
if (
|
|
181
|
+
export function estCostUsd(subject, tokensIn, tokensOut, cacheRead = 0, cacheWrite5m = 0, cacheWrite1h = 0, cfg) {
|
|
182
|
+
const key = subject.toLowerCase();
|
|
183
|
+
// Fast path: nothing that is PROVABLY free can bill anyone.
|
|
184
|
+
if (meterednessOf(subject, cfg) === 'free')
|
|
117
185
|
return 0;
|
|
118
186
|
// Prefix match against the price table keys
|
|
119
187
|
let priceIn = 3.0; // conservative fallback
|