@avantf/dsh-plugin-base 0.5.2 → 0.6.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 (118) hide show
  1. package/README.md +133 -20
  2. package/{dist → lib}/bootstrap.d.ts +1 -1
  3. package/{dist → lib}/bootstrap.d.ts.map +1 -1
  4. package/{dist → lib}/bootstrap.js +45 -8
  5. package/{dist → lib}/compat.d.ts +10 -0
  6. package/{dist → lib}/compat.d.ts.map +1 -1
  7. package/{dist → lib}/compat.js +30 -7
  8. package/{dist → lib}/conformance.d.ts.map +1 -1
  9. package/{dist → lib}/conformance.js +5 -0
  10. package/{dist → lib}/errors.d.ts +3 -1
  11. package/lib/errors.d.ts.map +1 -0
  12. package/{dist → lib}/fs.d.ts.map +1 -1
  13. package/{dist → lib}/fs.js +3 -0
  14. package/{dist → lib}/index.d.ts +10 -4
  15. package/lib/index.d.ts.map +1 -0
  16. package/{dist → lib}/index.js +18 -3
  17. package/{dist → lib}/interface.d.ts +165 -32
  18. package/lib/interface.d.ts.map +1 -0
  19. package/{dist → lib}/interface.js +56 -16
  20. package/{dist → lib}/internal.d.ts +2 -0
  21. package/{dist → lib}/internal.d.ts.map +1 -1
  22. package/{dist → lib}/internal.js +3 -0
  23. package/{dist → lib}/lint.d.ts.map +1 -1
  24. package/{dist → lib}/lint.js +42 -2
  25. package/{dist → lib}/providers/model.d.ts.map +1 -1
  26. package/{dist → lib}/providers/model.js +100 -17
  27. package/{dist → lib}/providers/npm.d.ts +10 -1
  28. package/lib/providers/npm.d.ts.map +1 -0
  29. package/{dist → lib}/providers/npm.js +6 -2
  30. package/lib/providers/runtime_deps.d.ts +184 -0
  31. package/lib/providers/runtime_deps.d.ts.map +1 -0
  32. package/lib/providers/runtime_deps.js +1214 -0
  33. package/{dist → lib}/provisioner.d.ts.map +1 -1
  34. package/{dist → lib}/provisioner.js +55 -33
  35. package/lib/runtime_deps_helper.d.ts +71 -0
  36. package/lib/runtime_deps_helper.d.ts.map +1 -0
  37. package/lib/runtime_deps_helper.js +161 -0
  38. package/lib/session_notices.d.ts +95 -0
  39. package/lib/session_notices.d.ts.map +1 -0
  40. package/lib/session_notices.js +172 -0
  41. package/{dist → lib}/state.d.ts +8 -1
  42. package/{dist → lib}/state.d.ts.map +1 -1
  43. package/{dist → lib}/state.js +20 -4
  44. package/{dist → lib}/types.d.ts +14 -1
  45. package/lib/types.d.ts.map +1 -0
  46. package/package.json +37 -33
  47. package/dist/cli.d.ts +0 -4
  48. package/dist/cli.d.ts.map +0 -1
  49. package/dist/cli.js +0 -37
  50. package/dist/errors.d.ts.map +0 -1
  51. package/dist/index.d.ts.map +0 -1
  52. package/dist/interface.d.ts.map +0 -1
  53. package/dist/providers/npm.d.ts.map +0 -1
  54. package/dist/types.d.ts.map +0 -1
  55. /package/{dist → lib}/artifact.d.ts +0 -0
  56. /package/{dist → lib}/artifact.d.ts.map +0 -0
  57. /package/{dist → lib}/artifact.js +0 -0
  58. /package/{dist → lib}/conformance.d.ts +0 -0
  59. /package/{dist → lib}/errors.js +0 -0
  60. /package/{dist → lib}/fs.d.ts +0 -0
  61. /package/{dist → lib}/integrity.d.ts +0 -0
  62. /package/{dist → lib}/integrity.d.ts.map +0 -0
  63. /package/{dist → lib}/integrity.js +0 -0
  64. /package/{dist → lib}/interface_gate.d.ts +0 -0
  65. /package/{dist → lib}/interface_gate.d.ts.map +0 -0
  66. /package/{dist → lib}/interface_gate.js +0 -0
  67. /package/{dist → lib}/kit/family.d.ts +0 -0
  68. /package/{dist → lib}/kit/family.d.ts.map +0 -0
  69. /package/{dist → lib}/kit/family.js +0 -0
  70. /package/{dist → lib}/kit/index.d.ts +0 -0
  71. /package/{dist → lib}/kit/index.d.ts.map +0 -0
  72. /package/{dist → lib}/kit/index.js +0 -0
  73. /package/{dist → lib}/kit/logger.d.ts +0 -0
  74. /package/{dist → lib}/kit/logger.d.ts.map +0 -0
  75. /package/{dist → lib}/kit/logger.js +0 -0
  76. /package/{dist → lib}/kit/prompt_files.d.ts +0 -0
  77. /package/{dist → lib}/kit/prompt_files.d.ts.map +0 -0
  78. /package/{dist → lib}/kit/prompt_files.js +0 -0
  79. /package/{dist → lib}/kit/typert.d.ts +0 -0
  80. /package/{dist → lib}/kit/typert.d.ts.map +0 -0
  81. /package/{dist → lib}/kit/typert.js +0 -0
  82. /package/{dist → lib}/kit/wellformed.d.ts +0 -0
  83. /package/{dist → lib}/kit/wellformed.d.ts.map +0 -0
  84. /package/{dist → lib}/kit/wellformed.js +0 -0
  85. /package/{dist → lib}/layout.d.ts +0 -0
  86. /package/{dist → lib}/layout.d.ts.map +0 -0
  87. /package/{dist → lib}/layout.js +0 -0
  88. /package/{dist → lib}/lint.d.ts +0 -0
  89. /package/{dist → lib}/lock.d.ts +0 -0
  90. /package/{dist → lib}/lock.d.ts.map +0 -0
  91. /package/{dist → lib}/lock.js +0 -0
  92. /package/{dist → lib}/manifest.d.ts +0 -0
  93. /package/{dist → lib}/manifest.d.ts.map +0 -0
  94. /package/{dist → lib}/manifest.js +0 -0
  95. /package/{dist → lib}/net.d.ts +0 -0
  96. /package/{dist → lib}/net.d.ts.map +0 -0
  97. /package/{dist → lib}/net.js +0 -0
  98. /package/{dist → lib}/package-name.d.ts +0 -0
  99. /package/{dist → lib}/package-name.d.ts.map +0 -0
  100. /package/{dist → lib}/package-name.js +0 -0
  101. /package/{dist → lib}/preset.d.ts +0 -0
  102. /package/{dist → lib}/preset.d.ts.map +0 -0
  103. /package/{dist → lib}/preset.js +0 -0
  104. /package/{dist → lib}/providers/archive.d.ts +0 -0
  105. /package/{dist → lib}/providers/archive.d.ts.map +0 -0
  106. /package/{dist → lib}/providers/archive.js +0 -0
  107. /package/{dist → lib}/providers/model.d.ts +0 -0
  108. /package/{dist → lib}/provisioner.d.ts +0 -0
  109. /package/{dist → lib}/semver.d.ts +0 -0
  110. /package/{dist → lib}/semver.d.ts.map +0 -0
  111. /package/{dist → lib}/semver.js +0 -0
  112. /package/{dist → lib}/tar.d.ts +0 -0
  113. /package/{dist → lib}/tar.d.ts.map +0 -0
  114. /package/{dist → lib}/tar.js +0 -0
  115. /package/{dist → lib}/types.js +0 -0
  116. /package/{dist → lib}/zip.d.ts +0 -0
  117. /package/{dist → lib}/zip.d.ts.map +0 -0
  118. /package/{dist → lib}/zip.js +0 -0
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # @avantf/dsh-plugin-base
2
2
 
3
3
  DSH 插件共用的底座(共享库)。**插件在运行时按 file URL 动态加载它**——不静态 `import`、不打包进插件,
4
- 拿不到就降级挂载——把三件容易各写一遍的事收在一起:**启动期资源预装**、**宿主兼容门禁**、**一组与 DSH
5
- 无关的共享工具**。
4
+ 拿不到就降级挂载——把四件容易各写一遍的事收在一起:**启动期资源预装**、**共享运行期依赖**、
5
+ **宿主兼容门禁**、**一组与 DSH 无关的共享工具**。
6
6
 
7
7
  - **运行期零依赖**:`dependencies` 为空,源码里连 `zod` 都不 import。
8
8
  - 唯一一条 peer 是 `zod`(`>=4.4.3 <5`),由宿主 / 上层提供,好让调用方、本包与宿主解析到**同一份**
@@ -25,11 +25,38 @@ DSH 插件共用的底座(共享库)。**插件在运行时按 file URL 动
25
25
  `warn`(写明 holder 的 pid、已持有时长、本次已等待时长)后继续按预算等待;等不到就报 `lock/timeout`,
26
26
  消息里带 holder 与 mtime 诊断;
27
27
  - 每一项给出 `present / installed / skipped / failed`,失败带稳定 `code`;
28
- - 三种内置资源种类:`npm-package`、`binary-archive`、`model-cache`。新的种类 = 一个新的 provider,
29
- 核心不动;
28
+ - 四种内置资源种类:`npm-package`、`binary-archive`、`model-cache`、`runtime-deps`。新的种类 =
29
+ 一个新的 provider,核心不动;
30
30
  - 策略可配:离线、镜像、每项的并发与超时、启动预算、下载总闸。
31
31
 
32
- ### 2. 宿主兼容门禁
32
+ ### 2. 共享运行期依赖(runtime-deps)
33
+
34
+ 插件需要**自己 install 树里没有**的运行期 npm 包(例如某个带原生模块的推理库),但两个插件不该各装一份、
35
+ 更不该把宿主单例(`zod`、DSH 包)装成两份。base 提供一个**按 spec 寻址(spec-addressed)、装一次就不再
36
+ 改写、全局共享**的依赖根:
37
+
38
+ ```
39
+ 插件声明(packages / sources / attempts / verify / peers)
40
+ → key = sha256(packages + verify + lockfile + platform/arch/Node ABI + manager 版本
41
+ + attempts 的 source/env/scripts + peer 名/区间 + 解析到的宿主副本)
42
+ → 在 <home>/deps/runtime/<key>/ 只装一次(per-key 锁 + staging + 原子 rename)
43
+ → 插件用 createRequire(<根>/package.json) 加载
44
+ ```
45
+
46
+ - key 是**声明**的摘要,不是取回字节的摘要:不给 `lockfile` 时,同一个 key 在不同时间/机器上可以装出不同
47
+ 版本;根保证的是“装一次,之后本地不再改写”。要字节级可复现就把 `lockfile` 传进来;
48
+ - 同 key ⇒ 同一份物理安装,所有插件共用;改了包、verify、lockfile、平台、manager、env,或 peer 的区间/
49
+ 解析到的副本 ⇒ 新 key、新根,**旧根永不被改写**;
50
+ - `sources` + `attempts` 按顺序尝试(registry / cache / 离线 / 脚本策略);每个 attempt 都记录,全部失败报
51
+ `runtime-deps/install-failed`,插件照常挂载(`failed` 只是一条报告);
52
+ - `verify` 的每一项在写 `.ready` 之前用 `createRequire(...).resolve()` 验过;失败换下一个 attempt;
53
+ - `peers` **只链接不安装**:宿主单例写在 `peerDependencies`(optional),装完从插件自己的树链接进来;复用
54
+ 时同时核对**链接目标**与链接到的版本,同版本的另一个目录不算本 key 的根(没有 symlink 时的复制回退是
55
+ 版本级身份,记录在 `.runtime.json` 的 `copiedPeers`);
56
+ - **base 不认识任何包名**:装什么、从哪装、验什么,全部来自插件的 `RuntimeDepsSpec`;
57
+ - GC **显式**(`./internal` 的 `gcRuntimeDeps`),按 `status.json` 里记录的 key 保留,绝不在启动时自动回收。
58
+
59
+ ### 3. 宿主兼容门禁
33
60
 
34
61
  在挂载之前判断"当前宿主能不能跑这段代码",语义是**只有被证实的不兼容才拒绝**:
35
62
 
@@ -39,7 +66,7 @@ DSH 插件共用的底座(共享库)。**插件在运行时按 file URL 动
39
66
  - `registerMegaphone` 在拒绝加载的路径上留一条用户可见的命令(那时它是唯一的信息渠道);
40
67
  - `verifyRegisteredFaces` 在挂载后复查"声明的每个 schema / 工具真的注册上了"(只告警)。
41
68
 
42
- ### 3. 共享工具(kit)
69
+ ### 4. 共享工具(kit)
43
70
 
44
71
  与 DSH 无关的纯逻辑,调用方在运行时复用:
45
72
 
@@ -69,7 +96,7 @@ npm install @avantf/dsh-plugin-base
69
96
 
70
97
  ```ts
71
98
  // ── ① 构建期:把零依赖的 bootstrap 拷进自己的源码树,按相对路径 import ──────────────
72
- // cp node_modules/@avantf/dsh-plugin-base/dist/bootstrap.js src/envinit-bootstrap.js
99
+ // cp node_modules/@avantf/dsh-plugin-base/lib/bootstrap.js src/envinit-bootstrap.js
73
100
  // (有打包步骤时用 ./preset 自动内联,见「运行时装载」。)
74
101
  import { loadFramework } from './envinit-bootstrap.js'
75
102
 
@@ -229,12 +256,6 @@ framework.createProvisioner({
229
256
  })
230
257
  ```
231
258
 
232
- 清单可以不联网检查:
233
-
234
- ```bash
235
- provision lint manifest.json
236
- ```
237
-
238
259
  ### 取用就绪资源
239
260
 
240
261
  ```ts
@@ -265,6 +286,87 @@ if (!verdict.load) {
265
286
  }
266
287
  ```
267
288
 
289
+ ### 取用共享运行期依赖(runtime-deps)
290
+
291
+ ```ts
292
+ // 注册 provider(它和别的 provider 一样进 provisioner)
293
+ provisioner.register(framework.runtimeDepsProvider())
294
+
295
+ provisioner.declare({
296
+ plugin: 'my-plugin',
297
+ items: [{
298
+ id: 'my-plugin:transformers',
299
+ kind: framework.RUNTIME_DEPS_KIND, // 'runtime-deps'
300
+ spec: {
301
+ packages: { '@huggingface/transformers': '^4.2.0' },
302
+ sources: [
303
+ { id: 'npmmirror', registry: 'https://registry.npmmirror.com' },
304
+ { id: 'npmjs', registry: 'https://registry.npmjs.org' },
305
+ ],
306
+ attempts: [
307
+ { source: 'npmmirror' },
308
+ { source: 'npmmirror', env: { ONNXRUNTIME_NODE_INSTALL: 'skip' } },
309
+ { source: 'npmjs', manager: 'npm' },
310
+ ],
311
+ verify: ['@huggingface/transformers'],
312
+ peers: { zod: '>=4.4.3 <5' }, // 宿主单例:只链接,不从 registry 装
313
+ },
314
+ target: { root: 'deps/runtime' }, // 规范位置;换 root 就是另一个共享根
315
+ onMissing: { atStartup: 'degrade', atUse: 'error' },
316
+ schemaVersion: 1,
317
+ }],
318
+ })
319
+
320
+ const report = await provisioner.ensure({ only: ['my-plugin:transformers'], deadlineMs: 120_000 })
321
+ if (!report.ok) logger.warn('运行期依赖未就绪,用内置降级路径继续')
322
+
323
+ const state = provisioner.resolve('my-plugin:transformers')
324
+ if (state.state === 'ready') {
325
+ const dir = state.handle.dir // <home>/deps/runtime/<key>
326
+ const req = createRequire(join(dir, 'package.json'))
327
+ const transformers = await import(req.resolve('@huggingface/transformers'))
328
+ // 完整记录(key / attempts / integrity / installedAt)在 <dir>/.runtime.json
329
+ }
330
+ ```
331
+
332
+ ### 用 helper 声明运行期依赖 + 会话提示(v6)
333
+
334
+ 上面那种接线(注册 provider、拼 item、`ensure`、`createRequire`)可以缩成一次调用。helper 只是糖,底层
335
+ `runtimeDepsProvider()` + `createProvisioner()` 的行为一字未改:
336
+
337
+ ```ts
338
+ import { createRuntimeDeps } from '@avantf/dsh-plugin-base'
339
+
340
+ const runtime = createRuntimeDeps({
341
+ namespace: 'my-plugin', // item id 默认 my-plugin:runtime-deps
342
+ packages: { 'some-runtime-pkg': '^1.2.0' },
343
+ sources: [{ id: 'npmmirror', registry: 'https://registry.npmmirror.com' }],
344
+ attempts: [{ source: 'npmmirror' }],
345
+ verify: ['some-runtime-pkg'],
346
+ // 文案永远是插件的(base 里没有任何包名/命令/句子);when 决定它对应哪种状态
347
+ notices: [{
348
+ id: 'my-plugin:runtime-pkg',
349
+ severity: 'degraded',
350
+ when: 'failed',
351
+ body: '[my-plugin] 可选能力未就绪,已降级为内置路径。',
352
+ }],
353
+ })
354
+
355
+ provisioner.declare({ plugin: 'my-plugin', items: [runtime.item] })
356
+ const entry = await runtime.ensure(provisioner) // 这个 item 的报告条目
357
+ if (entry?.action === 'failed') logger.warn(entry.reason ?? '')
358
+
359
+ // 自己的 pre-step 里(owner 会话):
360
+ const lines = runtime.notices.consume(sessionId, { ownerOnly: true })
361
+ if (lines.length > 0) return [...lines, existingHint].join('\n') // 与已有提示合并成 ONE 条
362
+
363
+ // 就绪后从共享根加载:不复制包、不写 node_modules
364
+ const mod = await runtime.load('some-runtime-pkg')
365
+ ```
366
+
367
+ `notices` 的状态是**每次 consume 重新判断**的(依赖修好了就不再提),一个 id 对每个 session 最多出一次,
368
+ 多条同时成立时按 `degraded` > `warning` > `info` 排序合并;`consume` 永不抛。
369
+
268
370
  ### 取用共享工具
269
371
 
270
372
  ```ts
@@ -339,6 +441,13 @@ assertProviderConformance(report)
339
441
 
340
442
  ## 接口要点
341
443
 
444
+ - **v6(0.7.0)新增**:会话提示 registry `createSessionNotices`(+ `SessionNoticeSpec` /
445
+ `SessionNoticeRegistry`)与 runtime-deps 的薄 helper `createRuntimeDeps`(+ `RuntimeDepsConfig` /
446
+ `RuntimeDepsHandle`);v6 是 v5 的增量世代(`BaseRuntimeV6 extends BaseRuntimeV5`),没有拿走任何旧名字。
447
+ - **v5(0.6.0)新增**:`RUNTIME_DEPS_KIND` / `runtimeDepsProvider` 与 `DependencySource` /
448
+ `InstallAttempt` / `RuntimeDepsSpec`;v5 是 v4 的增量世代(`BaseRuntimeV5 extends BaseRuntimeV4`)。
449
+ `BuiltinKind` 增加 `'runtime-deps'`、`ProvisionCode` 增加 `runtime-deps/install-failed`(都是并集加宽)。
450
+
342
451
  `.` 上的导出(值 + 类型)构成本包的**接口**,由世代号冻结;`./preset` / `./conformance` / `./bootstrap`
343
452
  三个子路径也在承诺内,`./internal` 从不承诺稳定。
344
453
 
@@ -359,8 +468,10 @@ assertProviderConformance(report)
359
468
 
360
469
  ## 边界(不做的事)
361
470
 
362
- - **不做包管理器**:不推导传递依赖、不生成 lockfile、不做版本求解;每个 item 自包含。
363
- - **不接管原生模块**:`binding.gyp` / `*.node` / 依赖 `postinstall` 的包会被识别并拒绝。
471
+ - **不自己当包管理器**:不推导传递依赖、不做版本求解;`runtime-deps` 把安装交给调用方声明的 npm / pnpm,
472
+ 依赖图与 lockfile 由 manager 负责,base 只做 spec 寻址、锁、校验与失败报告。
473
+ - **`npm-package` provider 不接管原生模块**:`binding.gyp` / `*.node` / 依赖 `postinstall` 的包会被识别并
474
+ 拒绝;需要原生模块时走 `runtime-deps`(由 manager 安装)或 `binary-archive`。
364
475
  - **不跳过校验**:npm 包核对 `dist.integrity`,归档核对 `sha256`。
365
476
  - **不做进程内预热**:让文件在盘上是框架的事,读进内存是调用方自己的事。
366
477
 
@@ -368,11 +479,13 @@ assertProviderConformance(report)
368
479
 
369
480
  - 接口面是 `.` 上的导出(值 + 类型)加上 `./preset` / `./conformance` / `./bootstrap` 三个子路径;`./internal`
370
481
  是内部件,从不承诺稳定。
371
- - **当前这一代(v4)沿用 v3 的名字面**:`.` 只列"插件真取用、或插件作者被期望调用"的成员,其余进
372
- `./internal`。这是为了把"内部件的改动"与"接口"解耦,不是"这个集合永远不变":新能力从明确标注为
373
- 不稳定的入口引入,既有成员按弃用周期退出。v4 一个名字都没动 —— 它加宽的是**既有成员接受的入参**:
374
- `verifyRegisteredFaces({ …, scope? })` 多了个可选、不透明的 `scope`,原样透传给 `tools.get(name,
375
- scope)`,好让按作用域注册的工具面能被复查到;不传时行为与 v3 逐字相同。
482
+ - **当前这一代(v6)是 v5 的增量**:`.` 仍然只列"插件真取用、或插件作者被期望调用"的成员,其余进
483
+ `./internal`。v6 新增会话提示 registry 与 runtime-deps helper(2 个值名 + 4 个类型名),没有拿走 v5 的
484
+ 任何名字;`BaseRuntimeV6 extends BaseRuntimeV5`,所以 v1–v5 构建遇到 v6 base 仍判 `ok` + `warning`。
485
+ v5 本身是 v4 的增量(共享运行期依赖 provider:2 个值名 + 3 个类型名,外加 `BuiltinKind` /
486
+ `ProvisionCode` 两个并集加宽);v4 则是一个名字都没动的换代 —— 它加宽的是**既有成员接受的入参**:
487
+ `verifyRegisteredFaces({ …, scope? })` 多了个可选、不透明的 `scope`,原样透传给
488
+ `tools.get(name, scope)`,不传时行为与 v3 逐字相同。
376
489
  - **v3 是第一次破坏性换代**:v2 的成员如果有消费者,v3 一个不少;但 v3 不再对 v2 做结构超集。旧调用方
377
490
  遇到更新的 base 仍判 `ok` + `warning`,遇到更旧的 base 才降级。
378
491
  - **接口与包版本是两条轴**:接口换代只升 `INTERFACE_VERSION` 并新增快照;包版本是普通 semver,只表达
@@ -3,7 +3,7 @@
3
3
  * @module bootstrap
4
4
  */
5
5
  /** The bootstrap version; the resolved framework must satisfy {@link supportedRange}. */
6
- export declare const VERSION = "0.5.2";
6
+ export declare const VERSION = "0.6.0";
7
7
  /**
8
8
  * The framework interval this bootstrap can launch.
9
9
  *
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,yFAAyF;AACzF,eAAO,MAAM,OAAO,UAAU,CAAA;AAC9B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,mBAAmB,CAAA;AAI9C,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;IACjC,iDAAiD;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAC5B;AA8LD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAoC7G;AAED,oFAAoF;AACpF,wBAAsB,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAaxG;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAyCnG"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,yFAAyF;AACzF,eAAO,MAAM,OAAO,UAAU,CAAA;AAC9B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,mBAAmB,CAAA;AAI9C,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;IACjC,iDAAiD;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAC5B;AAqOD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAkC7G;AAED,oFAAoF;AACpF,wBAAsB,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAaxG;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAyCnG"}
@@ -2,12 +2,11 @@
2
2
  * Resolve the framework copy the caller's tree already has.
3
3
  * @module bootstrap
4
4
  */
5
- import { promises as fsp } from 'node:fs';
6
- import { createRequire } from 'node:module';
5
+ import { existsSync, promises as fsp, readFileSync } from 'node:fs';
7
6
  import { dirname, join } from 'node:path';
8
7
  import { fileURLToPath, pathToFileURL } from 'node:url';
9
8
  /** The bootstrap version; the resolved framework must satisfy {@link supportedRange}. */
10
- export const VERSION = '0.5.2';
9
+ export const VERSION = '0.6.0';
11
10
  /**
12
11
  * The framework interval this bootstrap can launch.
13
12
  *
@@ -211,6 +210,47 @@ function entryOf(dir, manifest) {
211
210
  relative = manifest['main'];
212
211
  return join(dir, relative ?? 'index.js');
213
212
  }
213
+ /** The name a `package.json` declares, or `undefined`. */
214
+ function manifestName(manifestPath) {
215
+ try {
216
+ const parsed = JSON.parse(readFileSync(manifestPath, 'utf8'));
217
+ const name = parsed.name;
218
+ return typeof name === 'string' ? name : undefined;
219
+ }
220
+ catch {
221
+ return undefined;
222
+ }
223
+ }
224
+ /**
225
+ * The framework directory, resolved by walking THIS FILE's ancestor chain only.
226
+ *
227
+ * WHY THIS DOES NOT USE `createRequire(...).resolve()`. Node falls back to `Module.globalPaths`
228
+ * when a package is not found under any ancestor's `node_modules`, and `Module.globalPaths` is
229
+ * seeded from `NODE_PATH` AT PROCESS START (pnpm sets it for every `pnpm run` process, so it
230
+ * survives deleting the variable at runtime). With that fallback a caller whose own tree has NO
231
+ * base silently resolved whatever the process environment happened to provide — a copy outside the
232
+ * plugin's tree, exactly the false green this lookup exists to avoid (`compat.ts`'s
233
+ * `resolveRuntimeVersion` and `preset.ts`'s `resolveFrameworkDir` record the same trap and walk
234
+ * the ancestors for the same reason).
235
+ *
236
+ * Two answers are legitimate, in walk order: `<dir>/node_modules/<PACKAGE>` (the package manager's
237
+ * copy) and a `package.json` whose OWN name is the package (self-reference — running from inside
238
+ * the framework's own tree: a dev checkout, this repo's tests).
239
+ */
240
+ function resolveFrameworkDir() {
241
+ let current = dirname(fileURLToPath(import.meta.url));
242
+ for (;;) {
243
+ const installed = join(current, 'node_modules', ...PACKAGE.split('/'));
244
+ if (existsSync(join(installed, 'package.json')))
245
+ return installed;
246
+ if (manifestName(join(current, 'package.json')) === PACKAGE)
247
+ return current;
248
+ const parent = dirname(current);
249
+ if (parent === current)
250
+ return undefined;
251
+ current = parent;
252
+ }
253
+ }
214
254
  /**
215
255
  * Report the framework copy this caller's tree resolves to, or `undefined` with a warning.
216
256
  * Never throws and never installs anything.
@@ -233,11 +273,8 @@ export async function ensureFramework(options) {
233
273
  return undefined;
234
274
  }
235
275
  const supported = options.supportedRange ?? supportedRange;
236
- let dir;
237
- try {
238
- dir = dirname(createRequire(import.meta.url).resolve(`${PACKAGE}/package.json`));
239
- }
240
- catch {
276
+ const dir = resolveFrameworkDir();
277
+ if (dir === undefined) {
241
278
  warn(`${PACKAGE} is not installed for this plugin — install it with the package manager (pnpm install)`);
242
279
  return undefined;
243
280
  }
@@ -202,6 +202,16 @@ export declare function readBuildVersions(buildUrl: string | URL, packages: read
202
202
  * @param name - the peer package.
203
203
  * @param base - module URL to resolve from (defaults to this package).
204
204
  * @returns the version string, or `undefined`.
205
+ *
206
+ * WHY THIS DOES NOT USE `require.resolve`. Node falls back to `Module.globalPaths` when a package is
207
+ * not found under the base's own `node_modules`, and `Module.globalPaths` is seeded from `NODE_PATH`
208
+ * AT PROCESS START (pnpm sets it for every `pnpm run` process, so it survives deleting the variable at
209
+ * runtime). With that fallback, a base with no links of its own silently resolved whatever the
210
+ * WORKSPACE happened to install — but the one question this function answers is "what do THIS caller's
211
+ * links point at". Found by the suite: `compat_probes.spec.ts`'s "answers undefined for one without
212
+ * links" passed under bare `vitest` and failed under `pnpm test`, where the base resolved the
213
+ * workspace's local-build `dsh-tools@0.2.1-rc.2` (measured 2026-10-19). The walk below therefore
214
+ * visits ONLY the base directory's ancestors and never consults the process-wide path list.
205
215
  */
206
216
  export declare function resolveRuntimeVersion(name: string, base?: string | URL): string | undefined;
207
217
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../src/compat.ts"],"names":[],"mappings":"AAuCA;;;GAGG;AACH,eAAO,MAAM,aAAa,YAAY,CAAA;AAEtC,oGAAoG;AACpG,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,6FAA6F;IAC7F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAA;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IAC/D;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IAC/D,iFAAiF;IACjF,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;IACrD,kGAAkG;IAClG,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,oFAAoF;IACpF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED,sCAAsC;AACtC,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,eAAe,GAAG,cAAc,CAAA;AAE3G,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC;AAED,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC;AAED,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAA;IAC1C,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,YAAY,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,WAAW,EAAE,YAAY,GAAG,SAAS,CAAA;IAC9C,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAA;IAC1C,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,qDAAqD;AACrD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,uGAAuG;IACvG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAA;IACrC,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;AAYD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAOrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,GAAG,GAAG,EACzB,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAYpC;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,GAAG,EACtB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,QAAQ,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAM,GAC1D,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAepC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,GAAqB,GAAG,MAAM,GAAG,SAAS,CAU5G;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,eAAe,EAAE,GAAG,YAAY,EAAE,CAsBvG;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAMzD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,qBAAqB,CAAA;AAEnD;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAA;AAE7D;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM,OAAO,CAWrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,GAAG,YAAY,CA4C3G;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,GACvD,YAAY,CAoFd;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,IAAI,GAAE,MAAM,GAAG,GAAqB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAIpC;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,cAAc,CAkBnF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,CA0GjE;AAmBD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,aAAa,CAuBhG;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;CACjD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAUR;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,GAAG,IAAI,CAaP;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,EAAE,CAM/D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAExF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAA;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CA+C1C"}
1
+ {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../src/compat.ts"],"names":[],"mappings":"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"}
@@ -33,8 +33,8 @@
33
33
  *
34
34
  * @module @avantf/dsh-plugin-base
35
35
  */
36
- import { readFileSync } from 'node:fs';
37
- import { createRequire } from 'node:module';
36
+ import { readFileSync, statSync } from 'node:fs';
37
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
38
38
  import { fileURLToPath } from 'node:url';
39
39
  /**
40
40
  * Every line this module logs carries this token, so a support question can be answered
@@ -161,14 +161,37 @@ export function readBuildVersions(buildUrl, packages, fallback = {}) {
161
161
  * @param name - the peer package.
162
162
  * @param base - module URL to resolve from (defaults to this package).
163
163
  * @returns the version string, or `undefined`.
164
+ *
165
+ * WHY THIS DOES NOT USE `require.resolve`. Node falls back to `Module.globalPaths` when a package is
166
+ * not found under the base's own `node_modules`, and `Module.globalPaths` is seeded from `NODE_PATH`
167
+ * AT PROCESS START (pnpm sets it for every `pnpm run` process, so it survives deleting the variable at
168
+ * runtime). With that fallback, a base with no links of its own silently resolved whatever the
169
+ * WORKSPACE happened to install — but the one question this function answers is "what do THIS caller's
170
+ * links point at". Found by the suite: `compat_probes.spec.ts`'s "answers undefined for one without
171
+ * links" passed under bare `vitest` and failed under `pnpm test`, where the base resolved the
172
+ * workspace's local-build `dsh-tools@0.2.1-rc.2` (measured 2026-10-19). The walk below therefore
173
+ * visits ONLY the base directory's ancestors and never consults the process-wide path list.
164
174
  */
165
175
  export function resolveRuntimeVersion(name, base = import.meta.url) {
166
176
  try {
167
- const require = createRequire(base);
168
- // Built at runtime so a bundler cannot constant-fold it and resolve at build time.
169
- const manifest = require.resolve(`${name}/package.json`);
170
- const parsed = JSON.parse(readFileSync(manifest, 'utf8'));
171
- return typeof parsed.version === 'string' && parsed.version !== '' ? parsed.version : undefined;
177
+ const start = typeof base === 'string' && isAbsolute(base)
178
+ ? dirname(base)
179
+ : dirname(fileURLToPath(base));
180
+ for (let dir = resolve(start);; dir = dirname(dir)) {
181
+ const manifest = join(dir, 'node_modules', name, 'package.json');
182
+ try {
183
+ // A directory hit can still be a dangling link; the stat keeps "unknown" honest.
184
+ if (statSync(manifest).isFile()) {
185
+ const parsed = JSON.parse(readFileSync(manifest, 'utf8'));
186
+ return typeof parsed.version === 'string' && parsed.version !== '' ? parsed.version : undefined;
187
+ }
188
+ }
189
+ catch {
190
+ // Not here; keep walking.
191
+ }
192
+ if (dirname(dir) === dir)
193
+ return undefined;
194
+ }
172
195
  }
173
196
  catch {
174
197
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAIV,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EAGf,QAAQ,EAKT,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAC7C;AAED,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,wEAAwE;IACxE,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5C,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,EAAE,WAAW,CAAA;IACzB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;IACjC,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,cAAc,CAAA;CAC9B;AA+JD,2FAA2F;AAC3F,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4mBpG;AAED,2EAA2E;AAC3E,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAMzE"}
1
+ {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAIV,WAAW,EACX,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EAGf,QAAQ,EAKT,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAC7C;AAED,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,wEAAwE;IACxE,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5C,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,EAAE,WAAW,CAAA;IACzB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;IACjC,gFAAgF;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,cAAc,CAAA;CAC9B;AAoKD,2FAA2F;AAC3F,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4mBpG;AAED,2EAA2E;AAC3E,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAMzE"}
@@ -54,11 +54,16 @@ function recordingFs(inner) {
54
54
  const mutations = [];
55
55
  // Recording is on by default.
56
56
  let recording = true;
57
+ // Bound once: `realpath` is optional on the seam, and forwarding it only when the wrapped fs has it
58
+ // keeps the kit honest about the documented path-level fallback (a kit-invented realpath would hide
59
+ // the difference between "resolved" and "spelled"). Read-only, so nothing is recorded.
60
+ const realpath = inner.realpath?.bind(inner);
57
61
  const note = (op, path, to) => {
58
62
  if (recording)
59
63
  mutations.push(to === undefined ? { op, path } : { op, path, to });
60
64
  };
61
65
  const fs = {
66
+ ...(realpath === undefined ? {} : { realpath }),
62
67
  readFile: path => inner.readFile(path),
63
68
  readdir: path => inner.readdir(path),
64
69
  stat: path => inner.stat(path),
@@ -4,7 +4,9 @@
4
4
  */
5
5
  /** Every stable code this framework reports.
6
6
  * @stable */
7
- export type ProvisionCode = 'invalid-option' | 'ignored-field' | 'missing-need' | 'policy/download-disabled' | 'policy/offline' | 'unknown-provider' | 'provider/unavailable' | 'provider/conflict' | 'peer/unsatisfied' | 'npm/no-satisfying-version' | 'npm/no-integrity' | 'npm/integrity-mismatch' | 'npm/lifecycle-script-unsupported' | 'archive/path-traversal' | 'archive/integrity-mismatch'
7
+ export type ProvisionCode = 'invalid-option' | 'ignored-field' | 'missing-need' | 'policy/download-disabled' | 'policy/offline' | 'unknown-provider' | 'provider/unavailable' | 'provider/conflict' | 'peer/unsatisfied' | 'npm/no-satisfying-version' | 'npm/no-integrity' | 'npm/integrity-mismatch' | 'npm/lifecycle-script-unsupported'
8
+ /** Every declared source/attempt of a `runtime-deps` item failed (see `detail` for each attempt). */
9
+ | 'runtime-deps/install-failed' | 'archive/path-traversal' | 'archive/integrity-mismatch'
8
10
  /** This artifact has no pack for the running platform. */
9
11
  | 'archive/no-platform-pack' | 'unsupported-envinit' | 'unsupported-item-schema' | 'layout/too-new' | 'layout/mismatch'
10
12
  /** `.layout.json` exists but could not be read (EACCES / ENOSPC / half-written). It shares the
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;cACc;AACd,MAAM,MAAM,aAAa,GAErB,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,0BAA0B,GAC1B,gBAAgB,GAEhB,kBAAkB,GAClB,sBAAsB,GACtB,mBAAmB,GACnB,kBAAkB,GAElB,2BAA2B,GAC3B,kBAAkB,GAClB,wBAAwB,GACxB,kCAAkC;AAEpC,qGAAqG;GACnG,6BAA6B,GAE7B,wBAAwB,GACxB,4BAA4B;AAC9B,0DAA0D;GACxD,0BAA0B,GAE1B,qBAAqB,GACrB,yBAAyB,GACzB,gBAAgB,GAChB,iBAAiB;AACnB;;sFAEsF;GACpF,mBAAmB,GAEnB,cAAc,GACd,sBAAsB,GACtB,cAAc;AAChB;;;6EAG6E;GAC3E,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GAEf,eAAe,CAAA;AAEnB,iGAAiG;AACjG,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;gBAEvB,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAMlE;AAED,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAQjF"}
@@ -1 +1 @@
1
- {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,2BAA2B;AAC3B,wBAAsB,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5E;AAED,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,aAAa,CAAA;AAE5C,uFAAuF;AACvF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlF;AAwCD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,GACpG,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAU9B;AAED,iCAAiC;AACjC,wBAAgB,SAAS,IAAI,WAAW,CA4DvC"}
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,2BAA2B;AAC3B,wBAAsB,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5E;AAED,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,aAAa,CAAA;AAE5C,uFAAuF;AACvF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlF;AAwCD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,GACpG,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAU9B;AAED,iCAAiC;AACjC,wBAAgB,SAAS,IAAI,WAAW,CA+DvC"}
@@ -147,6 +147,9 @@ export function defaultFs() {
147
147
  async chmod(path, mode) {
148
148
  await fsp.chmod(path, mode);
149
149
  },
150
+ async realpath(path) {
151
+ return fsp.realpath(path);
152
+ },
150
153
  };
151
154
  }
152
155
  //# sourceMappingURL=fs.js.map
@@ -15,9 +15,9 @@
15
15
  * `EXTENSION_POINTS` with a one-line reason. A `.` member that is neither consumed nor registered is a
16
16
  * red gate, not a hidden promise.
17
17
  *
18
- * The same surface is stated as a type + two name lists in `./interface.js`; `api/interface-v4.json`
19
- * is its snapshot, and `test/public-surface.spec.ts` keeps the three in step. Do not add a member
20
- * here without a generation decision.
18
+ * The same surface is stated as a type + two name lists in `./interface.js`; `api/interface-v6.json`
19
+ * (the file whose `N` equals `INTERFACE_VERSION`) is its snapshot, and `test/public-surface.spec.ts`
20
+ * keeps the three in step. Do not add a member here without a generation decision.
21
21
  *
22
22
  * @module index
23
23
  */
@@ -28,6 +28,12 @@ export { binaryArchiveProvider, BINARY_ARCHIVE_KIND } from './providers/archive.
28
28
  export type { ArchivePack, BinaryArchiveSpec } from './providers/archive.js';
29
29
  export { modelCacheProvider, MODEL_CACHE_KIND } from './providers/model.js';
30
30
  export type { ModelCacheLayout, ModelCacheSpec } from './providers/model.js';
31
+ export { runtimeDepsProvider, RUNTIME_DEPS_KIND } from './providers/runtime_deps.js';
32
+ export type { DependencySource, InstallAttempt, RuntimeDepsSpec } from './providers/runtime_deps.js';
33
+ export { createSessionNotices } from './session_notices.js';
34
+ export type { SessionNoticeRegistry, SessionNoticeSpec } from './session_notices.js';
35
+ export { createRuntimeDeps } from './runtime_deps_helper.js';
36
+ export type { RuntimeDepsConfig, RuntimeDepsHandle } from './runtime_deps_helper.js';
31
37
  export { BUILD_VERSIONS_FILE, COMPAT_PREFIX, compatReport, gatherEvidence, provision, readBuildVersions, readDeclaredVersions, readRuntimeVersions, registerMegaphone, schemaNamesFrom, toolProbeDeclaration, verdictOf, verifyRegisteredFaces, } from './compat.js';
32
38
  export type { CompatContext, CompatEvidence, CompatLine, CompatLogger, CompatReportWords, CompatSpec, CompatVerdict, ProbeOutcome, ServiceContract, ServiceProbe, } from './compat.js';
33
39
  export { expandHome, familyHome, familyModelsDir, familyToolsDir, resolveDataHome } from './kit/family.js';
@@ -36,7 +42,7 @@ export { PromptFiles } from './kit/prompt_files.js';
36
42
  export type { LoadedPromptText, PromptFileSpec, PromptFilesIo, PromptFilesLogger, PromptFilesOptions } from './kit/prompt_files.js';
37
43
  export { wellFormedDeep, wellFormedText } from './kit/wellformed.js';
38
44
  export { INTERFACE_VERSION } from './interface.js';
39
- export type { BaseRuntimeV1, BaseRuntimeV2, BaseRuntimeV3, BaseRuntimeV4, BaseTypeSurfaceV1, BaseTypeSurfaceV2, BaseTypeSurfaceV3, BaseTypeSurfaceV4, } from './interface.js';
45
+ export type { BaseRuntimeV1, BaseRuntimeV2, BaseRuntimeV3, BaseRuntimeV4, BaseRuntimeV5, BaseTypeSurfaceV1, BaseTypeSurfaceV2, BaseTypeSurfaceV3, BaseTypeSurfaceV4, BaseTypeSurfaceV5, } from './interface.js';
40
46
  export { checkInterface, readInterfaceRequirement } from './interface_gate.js';
41
47
  export type { InterfaceRequirement, InterfaceVerdict } from './interface_gate.js';
42
48
  export type { AtStartup, AtUse, BuiltinKind, ItemPolicy, Kind, Manifest, MirrorPolicy, OnMissing, ProvisionItem, ResourceHandle, ResourceSource, ResourceState, Startup, EnsureOptions, Plan, PlanAction, PlanEntry, PlanOptions, ProvisionEvent, ProvisionReport, ProvisionReportEntry, ProvisionStatus, ReportAction, Disposable, ProgressEvent, ProvisionFs, ProvisionLock, ProvisionLogger, ProvisionPolicy, Provisioner, ProvisionerExperimental, ProvisionerOptions, PrunePolicy, PruneReport, InstallContext, InstallManifest, Provider, ProviderContext, ProviderPlan, ProbeResult, PublishMeta, Resolved, ResourceIdentity, } from './types.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -15,9 +15,9 @@
15
15
  * `EXTENSION_POINTS` with a one-line reason. A `.` member that is neither consumed nor registered is a
16
16
  * red gate, not a hidden promise.
17
17
  *
18
- * The same surface is stated as a type + two name lists in `./interface.js`; `api/interface-v4.json`
19
- * is its snapshot, and `test/public-surface.spec.ts` keeps the three in step. Do not add a member
20
- * here without a generation decision.
18
+ * The same surface is stated as a type + two name lists in `./interface.js`; `api/interface-v6.json`
19
+ * (the file whose `N` equals `INTERFACE_VERSION`) is its snapshot, and `test/public-surface.spec.ts`
20
+ * keeps the three in step. Do not add a member here without a generation decision.
21
21
  *
22
22
  * @module index
23
23
  */
@@ -25,6 +25,21 @@ export { ITEM_SCHEMA_VERSION, createProvisioner } from './provisioner.js';
25
25
  export { ProvisionError, reasonOf } from './errors.js';
26
26
  export { binaryArchiveProvider, BINARY_ARCHIVE_KIND } from './providers/archive.js';
27
27
  export { modelCacheProvider, MODEL_CACHE_KIND } from './providers/model.js';
28
+ // v5: the shared runtime-dependency provider. It is a provider like the three above, but its store is
29
+ // keyed by the DECLARED spec and shared across plugins instead of living under one plugin's item root.
30
+ // Base names no package: the plugin's `RuntimeDepsSpec` supplies packages, sources, attempts, verify
31
+ // entries and peers.
32
+ export { runtimeDepsProvider, RUNTIME_DEPS_KIND } from './providers/runtime_deps.js';
33
+ // v6: session-scoped NOTICES. A generic, in-memory registry: the caller registers an id, a severity and
34
+ // its own state predicate, and consumes at most one line per (notice id, session id). Base supplies no
35
+ // wording, no session identity and no persistence — the plugin owns the hook, the text and the
36
+ // owner/worker decision, which is what keeps base a library rather than a DSH plugin.
37
+ export { createSessionNotices } from './session_notices.js';
38
+ // v6: the thin helper over the v5 provider — one `runtime-deps` ITEM built from the caller's spec, the
39
+ // notices above bound to that item's real state, `ensure`/`resolve`, and a loader that resolves from the
40
+ // shared root (no copy, no `node_modules` write). The lower-level pair (`runtimeDepsProvider` +
41
+ // `createProvisioner`) stays the stable interface; this is optional sugar over it.
42
+ export { createRuntimeDeps } from './runtime_deps_helper.js';
28
43
  // The compatibility gate (rules / probes / verdict / report / post-registration check). It used to
29
44
  // be the separate `@avantf/dsh-compat` package, provisioned into the framework's managed root; it
30
45
  // lives in THIS package now and its composition-layer members are on `.` — a plugin that loaded the