@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.
Files changed (155) hide show
  1. package/CHANGELOG.md +257 -0
  2. package/dist/build-identity.json +2 -2
  3. package/dist/cli/resource-profile.js +95 -21
  4. package/dist/cli/resource-profile.js.map +1 -1
  5. package/dist/core/policy/local-only.d.ts +142 -2
  6. package/dist/core/policy/local-only.js +204 -15
  7. package/dist/core/policy/local-only.js.map +1 -1
  8. package/dist/core/resources/native-profile.d.ts +56 -0
  9. package/dist/core/resources/native-profile.js +368 -6
  10. package/dist/core/resources/native-profile.js.map +1 -1
  11. package/dist/core/run/budget.d.ts +22 -8
  12. package/dist/core/run/budget.js +80 -12
  13. package/dist/core/run/budget.js.map +1 -1
  14. package/dist/core/run/model-catalog.js +8 -1
  15. package/dist/core/run/model-catalog.js.map +1 -1
  16. package/dist/core/run/sandboxed-engine.js +3 -3
  17. package/dist/core/run/sandboxed-engine.js.map +1 -1
  18. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  19. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +69 -10
  20. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +68 -9
  21. package/dist/core/verse/adapters/claude.d.ts +49 -2
  22. package/dist/core/verse/adapters/claude.js +317 -56
  23. package/dist/core/verse/adapters/claude.js.map +1 -1
  24. package/dist/core/verse/adapters/codex.d.ts +81 -5
  25. package/dist/core/verse/adapters/codex.js +409 -47
  26. package/dist/core/verse/adapters/codex.js.map +1 -1
  27. package/dist/core/verse/adapters/grok.d.ts +13 -1
  28. package/dist/core/verse/adapters/grok.js +28 -2
  29. package/dist/core/verse/adapters/grok.js.map +1 -1
  30. package/dist/core/verse/adapters/index.d.ts +32 -0
  31. package/dist/core/verse/adapters/index.js +2 -0
  32. package/dist/core/verse/adapters/index.js.map +1 -1
  33. package/dist/core/verse/codex-rollout.d.ts +284 -0
  34. package/dist/core/verse/codex-rollout.js +786 -0
  35. package/dist/core/verse/codex-rollout.js.map +1 -0
  36. package/dist/core/verse/context-fit.d.ts +63 -0
  37. package/dist/core/verse/context-fit.js +355 -0
  38. package/dist/core/verse/context-fit.js.map +1 -0
  39. package/dist/core/verse/context-math.d.ts +215 -0
  40. package/dist/core/verse/context-math.js +365 -0
  41. package/dist/core/verse/context-math.js.map +1 -0
  42. package/dist/core/verse/local-models.d.ts +137 -1
  43. package/dist/core/verse/local-models.js +209 -5
  44. package/dist/core/verse/local-models.js.map +1 -1
  45. package/dist/core/verse/model-windows.d.ts +217 -0
  46. package/dist/core/verse/model-windows.js +616 -0
  47. package/dist/core/verse/model-windows.js.map +1 -0
  48. package/dist/core/verse/preferences.d.ts +123 -0
  49. package/dist/core/verse/preferences.js +403 -0
  50. package/dist/core/verse/preferences.js.map +1 -0
  51. package/dist/core/verse/project-memory.d.ts +112 -0
  52. package/dist/core/verse/project-memory.js +295 -0
  53. package/dist/core/verse/project-memory.js.map +1 -0
  54. package/dist/core/verse/seats.d.ts +106 -4
  55. package/dist/core/verse/seats.js +291 -89
  56. package/dist/core/verse/seats.js.map +1 -1
  57. package/dist/core/verse/session-engine.d.ts +117 -2
  58. package/dist/core/verse/session-engine.js +763 -65
  59. package/dist/core/verse/session-engine.js.map +1 -1
  60. package/dist/core/verse/session-handoff.d.ts +94 -0
  61. package/dist/core/verse/session-handoff.js +551 -0
  62. package/dist/core/verse/session-handoff.js.map +1 -0
  63. package/dist/core/verse/session-search.d.ts +63 -0
  64. package/dist/core/verse/session-search.js +213 -0
  65. package/dist/core/verse/session-search.js.map +1 -0
  66. package/dist/core/verse/session-store.d.ts +16 -2
  67. package/dist/core/verse/session-store.js +80 -6
  68. package/dist/core/verse/session-store.js.map +1 -1
  69. package/dist/core/verse/types.d.ts +333 -1
  70. package/dist/core/verse/types.js +54 -2
  71. package/dist/core/verse/types.js.map +1 -1
  72. package/dist/core/verse/verse-api.d.ts +40 -5
  73. package/dist/core/verse/verse-api.js +724 -25
  74. package/dist/core/verse/verse-api.js.map +1 -1
  75. package/dist/core/web/api.d.ts +14 -4
  76. package/dist/core/web/api.js +26 -11
  77. package/dist/core/web/api.js.map +1 -1
  78. package/dist/core/web/public/next/assets/{App-vtaHB9mp.js → App-XURmiAAp.js} +5 -5
  79. package/dist/core/web/public/next/assets/{App-vtaHB9mp.js.map → App-XURmiAAp.js.map} +1 -1
  80. package/dist/core/web/public/next/assets/{ApprovalsSection-B-bFJ0I9.js → ApprovalsSection-BriUzoZc.js} +2 -2
  81. package/dist/core/web/public/next/assets/{ApprovalsSection-B-bFJ0I9.js.map → ApprovalsSection-BriUzoZc.js.map} +1 -1
  82. package/dist/core/web/public/next/assets/AutonomySection-C4GBsQVc.js +2 -0
  83. package/dist/core/web/public/next/assets/{AutonomySection-DoqmsCjw.js.map → AutonomySection-C4GBsQVc.js.map} +1 -1
  84. package/dist/core/web/public/next/assets/ChatSection-BpOBOUvg.css +1 -0
  85. package/dist/core/web/public/next/assets/ChatSection-hlgPBRco.js +84 -0
  86. package/dist/core/web/public/next/assets/ChatSection-hlgPBRco.js.map +1 -0
  87. package/dist/core/web/public/next/assets/ConfirmDialog-BdQYI-Ng.js +2 -0
  88. package/dist/core/web/public/next/assets/ConfirmDialog-BdQYI-Ng.js.map +1 -0
  89. package/dist/core/web/public/next/assets/{Dialog-CPM9JxBc.js → Dialog-BxdIfmFH.js} +2 -2
  90. package/dist/core/web/public/next/assets/{Dialog-CPM9JxBc.js.map → Dialog-BxdIfmFH.js.map} +1 -1
  91. package/dist/core/web/public/next/assets/{DiffViewer-B84qVef9.js → DiffViewer-DmeRWuc4.js} +2 -2
  92. package/dist/core/web/public/next/assets/{DiffViewer-B84qVef9.js.map → DiffViewer-DmeRWuc4.js.map} +1 -1
  93. package/dist/core/web/public/next/assets/{McpSection-CEUpV_5X.js → McpSection-q34T7Tho.js} +2 -2
  94. package/dist/core/web/public/next/assets/{McpSection-CEUpV_5X.js.map → McpSection-q34T7Tho.js.map} +1 -1
  95. package/dist/core/web/public/next/assets/{MutationTokenDialog-DA8t97XT.js → MutationTokenDialog-CFAkwOEt.js} +2 -2
  96. package/dist/core/web/public/next/assets/{MutationTokenDialog-DA8t97XT.js.map → MutationTokenDialog-CFAkwOEt.js.map} +1 -1
  97. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-Bq7Vyud0.js → ResourcePoolConsoleApp-DHc8GFOY.js} +4 -4
  98. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-Bq7Vyud0.js.map → ResourcePoolConsoleApp-DHc8GFOY.js.map} +1 -1
  99. package/dist/core/web/public/next/assets/{RouteErrorBoundary-Badio_uO.js → RouteErrorBoundary-ZL9F4qUn.js} +2 -2
  100. package/dist/core/web/public/next/assets/{RouteErrorBoundary-Badio_uO.js.map → RouteErrorBoundary-ZL9F4qUn.js.map} +1 -1
  101. package/dist/core/web/public/next/assets/{Meter-CLcr-4wS.css → Segmented-8cf0Fypn.css} +1 -1
  102. package/dist/core/web/public/next/assets/{Meter--h3MmZS-.js → Segmented-DbRjVye3.js} +2 -2
  103. package/dist/core/web/public/next/assets/Segmented-DbRjVye3.js.map +1 -0
  104. package/dist/core/web/public/next/assets/SettingsSection-nJGGGYqv.js +2 -0
  105. package/dist/core/web/public/next/assets/{SettingsSection-BwrpQlpP.js.map → SettingsSection-nJGGGYqv.js.map} +1 -1
  106. package/dist/core/web/public/next/assets/UniverseConsoleApp-6GJydgo4.js +2 -0
  107. package/dist/core/web/public/next/assets/{UniverseConsoleApp-_FSohAdN.js.map → UniverseConsoleApp-6GJydgo4.js.map} +1 -1
  108. package/dist/core/web/public/next/assets/{UniverseView-DqcXbed4.js → UniverseView-DLDtNYL8.js} +2 -2
  109. package/dist/core/web/public/next/assets/{UniverseView-DqcXbed4.js.map → UniverseView-DLDtNYL8.js.map} +1 -1
  110. package/dist/core/web/public/next/assets/UsageSection-Cf9d9iFH.js +2 -0
  111. package/dist/core/web/public/next/assets/UsageSection-Cf9d9iFH.js.map +1 -0
  112. package/dist/core/web/public/next/assets/VerseConsoleApp-DsdKQoTH.css +1 -0
  113. package/dist/core/web/public/next/assets/VerseConsoleApp-y0uOHixd.js +3 -0
  114. package/dist/core/web/public/next/assets/VerseConsoleApp-y0uOHixd.js.map +1 -0
  115. package/dist/core/web/public/next/assets/{charts-CTZJ-JrH.js → charts-CVooqJWN.js} +2 -2
  116. package/dist/core/web/public/next/assets/{charts-CTZJ-JrH.js.map → charts-CVooqJWN.js.map} +1 -1
  117. package/dist/core/web/public/next/assets/context-model-Bqv8DVuH.js +2 -0
  118. package/dist/core/web/public/next/assets/context-model-Bqv8DVuH.js.map +1 -0
  119. package/dist/core/web/public/next/assets/global-eaY9GyX3.js +2 -0
  120. package/dist/core/web/public/next/assets/global-eaY9GyX3.js.map +1 -0
  121. package/dist/core/web/public/next/assets/{icons-D9vlf85u.js → icons-vex8rclC.js} +2 -2
  122. package/dist/core/web/public/next/assets/{icons-D9vlf85u.js.map → icons-vex8rclC.js.map} +1 -1
  123. package/dist/core/web/public/next/assets/{index-CZamKRUg.js → index-D2Eik-zt.js} +3 -3
  124. package/dist/core/web/public/next/assets/{index-CZamKRUg.js.map → index-D2Eik-zt.js.map} +1 -1
  125. package/dist/core/web/public/next/assets/{queries-B8eBnFox.js → queries-bAYU0VNy.js} +2 -2
  126. package/dist/core/web/public/next/assets/{queries-B8eBnFox.js.map → queries-bAYU0VNy.js.map} +1 -1
  127. package/dist/core/web/public/next/assets/use-guarded-action-C7QrP7Yp.js +2 -0
  128. package/dist/core/web/public/next/assets/{use-guarded-action-bzrVVAYq.js.map → use-guarded-action-C7QrP7Yp.js.map} +1 -1
  129. package/dist/core/web/public/next/assets/verse-model-TfDk9cky.js +2 -0
  130. package/dist/core/web/public/next/assets/verse-model-TfDk9cky.js.map +1 -0
  131. package/dist/core/web/public/next/assets/{workspace-model-v0a1gl-C.js → workspace-model-CHol5RVp.js} +2 -2
  132. package/dist/core/web/public/next/assets/{workspace-model-v0a1gl-C.js.map → workspace-model-CHol5RVp.js.map} +1 -1
  133. package/dist/core/web/public/next/index.html +1 -1
  134. package/dist/release-dependency-inventory.json +1 -1
  135. package/docs/README.md +1 -0
  136. package/package.json +1 -1
  137. package/dist/core/web/public/next/assets/AutonomySection-DoqmsCjw.js +0 -2
  138. package/dist/core/web/public/next/assets/ChatSection-BfnLe5dT.css +0 -1
  139. package/dist/core/web/public/next/assets/ChatSection-vNPIJffd.js +0 -80
  140. package/dist/core/web/public/next/assets/ChatSection-vNPIJffd.js.map +0 -1
  141. package/dist/core/web/public/next/assets/ConfirmDialog-Dd2APQhB.js +0 -2
  142. package/dist/core/web/public/next/assets/ConfirmDialog-Dd2APQhB.js.map +0 -1
  143. package/dist/core/web/public/next/assets/Meter--h3MmZS-.js.map +0 -1
  144. package/dist/core/web/public/next/assets/SettingsSection-BwrpQlpP.js +0 -2
  145. package/dist/core/web/public/next/assets/UniverseConsoleApp-_FSohAdN.js +0 -2
  146. package/dist/core/web/public/next/assets/UsageSection-Bq6Daaby.js +0 -2
  147. package/dist/core/web/public/next/assets/UsageSection-Bq6Daaby.js.map +0 -1
  148. package/dist/core/web/public/next/assets/VerseConsoleApp-CMkCizvL.css +0 -1
  149. package/dist/core/web/public/next/assets/VerseConsoleApp-CsIQv9id.js +0 -3
  150. package/dist/core/web/public/next/assets/VerseConsoleApp-CsIQv9id.js.map +0 -1
  151. package/dist/core/web/public/next/assets/global-D6bTxIRn.js +0 -2
  152. package/dist/core/web/public/next/assets/global-D6bTxIRn.js.map +0 -1
  153. package/dist/core/web/public/next/assets/use-guarded-action-bzrVVAYq.js +0 -2
  154. package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js +0 -2
  155. package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js.map +0 -1
@@ -1,6 +1,10 @@
1
- /** Prepare fresh owner-scoped native state without reading credentials or starting a native process. */
2
- import { accessSync, closeSync, constants, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, realpathSync, writeSync } from 'node:fs';
3
- import { dirname, isAbsolute, join, parse, resolve } from 'node:path';
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 `// Generated private native profile. Owner-editable configuration, not an authentication attestation.
38
+ return `${LAUNCHER_HEADER}
20
39
  import {accessSync,constants,lstatSync,realpathSync} from 'node:fs';
21
- const profile=${JSON.stringify({ provider: profile.provider, executable: profile.executable, nativeStatePath: profile.nativeStatePath,
40
+ ${LAUNCHER_PROFILE_PREFIX}${JSON.stringify({ provider: profile.provider, executable: profile.executable, nativeStatePath: profile.nativeStatePath,
22
41
  anthropicStatePath: profile.anthropicStatePath, launcherPath: profile.launcherPath })};
23
- const directories=${JSON.stringify(directories)};
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":"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"}
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
- * - Local providers (ollama, lmstudio) → always 0.
52
- * - Cloud providers → looked up from the static price table by matching
53
- * the provider id (case-insensitive prefix match against known keys).
54
- * Falls back to a conservative $3/$15 per-M-token estimate when unknown.
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 provider Provider id string (e.g. 'ollama', 'anthropic', 'openai').
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
- * @returns Estimated USD cost as a number (0 for local).
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(provider: string, tokensIn: number, tokensOut: number, cacheRead?: number, cacheWrite5m?: number, cacheWrite1h?: number): number;
80
+ export declare function estCostUsd(subject: string, tokensIn: number, tokensOut: number, cacheRead?: number, cacheWrite5m?: number, cacheWrite1h?: number, cfg?: AshlrConfig): number;
@@ -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
- /** Providers that are always local (zero cost). */
40
- const LOCAL_PROVIDERS = new Set(['ollama', 'lmstudio']);
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
- * - Local providers (ollama, lmstudio) → always 0.
99
- * - Cloud providers → looked up from the static price table by matching
100
- * the provider id (case-insensitive prefix match against known keys).
101
- * Falls back to a conservative $3/$15 per-M-token estimate when unknown.
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 provider Provider id string (e.g. 'ollama', 'anthropic', 'openai').
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
- * @returns Estimated USD cost as a number (0 for local).
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(provider, tokensIn, tokensOut, cacheRead = 0, cacheWrite5m = 0, cacheWrite1h = 0) {
114
- const key = provider.toLowerCase();
115
- // Fast path: known local providers
116
- if (LOCAL_PROVIDERS.has(key))
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