@dsh-plugin/dsh-loader 1.0.0 → 1.1.0-dev.32278873528

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 (73) hide show
  1. package/README.md +251 -226
  2. package/{README.zh-CN.md → README.zh_CN.md} +227 -202
  3. package/bin/dshloader.mjs +42 -42
  4. package/cordis.patch.yml +8 -8
  5. package/dist/adapters/dsh-1-x.d.ts +23 -0
  6. package/dist/adapters/dsh-1-x.js +223 -0
  7. package/dist/adapters/dsh-1-x.js.map +1 -0
  8. package/dist/adapters/index.d.ts +22 -0
  9. package/dist/adapters/index.js +57 -0
  10. package/dist/adapters/index.js.map +1 -0
  11. package/dist/api.d.ts +13 -0
  12. package/dist/api.js +46 -0
  13. package/dist/api.js.map +1 -0
  14. package/dist/client.d.ts +157 -0
  15. package/dist/client.js +295 -0
  16. package/dist/client.js.map +1 -0
  17. package/dist/index.d.ts +52 -0
  18. package/dist/index.js +89 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/registry.d.ts +35 -0
  21. package/dist/registry.js +229 -0
  22. package/dist/registry.js.map +1 -0
  23. package/dist/services/services.d.ts +4 -0
  24. package/dist/services/services.js +28 -0
  25. package/dist/services/services.js.map +1 -0
  26. package/dist/services/settings.d.ts +41 -0
  27. package/dist/services/settings.js +161 -0
  28. package/dist/services/settings.js.map +1 -0
  29. package/dist/services/web.d.ts +10 -0
  30. package/dist/services/web.js +63 -0
  31. package/dist/services/web.js.map +1 -0
  32. package/dist/setup.d.ts +32 -0
  33. package/dist/setup.js +119 -0
  34. package/dist/setup.js.map +1 -0
  35. package/dist/types.d.ts +111 -0
  36. package/dist/types.js +12 -0
  37. package/dist/types.js.map +1 -0
  38. package/dist/version.d.ts +2 -0
  39. package/{src → dist}/version.js +5 -5
  40. package/dist/version.js.map +1 -0
  41. package/lib/client.js +283 -0
  42. package/lib/client.js.map +1 -0
  43. package/package.json +74 -59
  44. package/src/stable/agent.d.ts +1 -1
  45. package/src/stable/agent.js +2 -2
  46. package/src/stable/llm.d.ts +1 -1
  47. package/src/stable/llm.js +2 -2
  48. package/src/stable/runtime.d.ts +1 -1
  49. package/src/stable/runtime.js +5 -5
  50. package/src/stable/schema-form.d.ts +1 -1
  51. package/src/stable/schema-form.js +2 -2
  52. package/src/stable/settings.d.ts +1 -1
  53. package/src/stable/settings.js +2 -2
  54. package/src/stable/tools.d.ts +1 -1
  55. package/src/stable/tools.js +5 -5
  56. package/src/stable/ui-primitives.d.ts +4 -4
  57. package/src/stable/ui-primitives.js +6 -6
  58. package/src/stable/ui-settings.d.ts +6 -6
  59. package/src/stable/ui-settings.js +4 -4
  60. package/src/stable/ui-slots.d.ts +1 -1
  61. package/src/stable/ui-slots.js +2 -2
  62. package/src/stable/web-react.d.ts +1 -1
  63. package/src/stable/web-react.js +2 -2
  64. package/src/adapters/dsh-1-x.js +0 -236
  65. package/src/adapters/index.js +0 -59
  66. package/src/api.js +0 -56
  67. package/src/client.js +0 -330
  68. package/src/index.js +0 -105
  69. package/src/registry.js +0 -242
  70. package/src/services/services.js +0 -28
  71. package/src/services/settings.js +0 -174
  72. package/src/services/web.js +0 -71
  73. package/src/setup.mjs +0 -125
package/dist/client.js ADDED
@@ -0,0 +1,295 @@
1
+ // dshloader client bundle entry (design.md §3.5 / §4.3 / §7.3).
2
+ //
3
+ // Loaded in the `immediately` prefetch tier (package.json `dsh.client`).
4
+ // Responsibilities:
5
+ // 1. Mount `window.__dshLoader__` with `require` / `registerModuleAlias` /
6
+ // `rpc.settings.*`.
7
+ // 2. Register module-alias factories via `window.__ModuleLoader__.load` so
8
+ // deep source imports (fix 1) and stable module names resolve to the
9
+ // public runtime client entry.
10
+ // 3. When `exposeAllNamespaces` is on, install a fetch interceptor that
11
+ // merges non-whitelisted namespaces into `/api/settings.describe` and
12
+ // routes non-whitelisted writes through the host bridge, echoing the
13
+ // request `rpcId` in the `{ type: 'server-response', rpcId, result }`
14
+ // envelope (fix 5, path 2 — mirrors dsh-upstream-fixes/lib/client.js).
15
+ //
16
+ // The module exports an `installClient` function for testability and runs an
17
+ // IIFE at the bottom for the real browser bundle.
18
+ import { LOADER_VERSION, LOG_PREFIX } from './version.js';
19
+ import { clientAdapters } from './adapters/index.js';
20
+ import { BRIDGE_PREFIX } from './adapters/dsh-1-x.js';
21
+ export class ModuleNotFoundError extends Error {
22
+ specifier;
23
+ constructor(specifier) {
24
+ super(`${LOG_PREFIX} module not found: ${specifier}`);
25
+ this.name = 'ModuleNotFoundError';
26
+ this.specifier = specifier;
27
+ }
28
+ }
29
+ /**
30
+ * Pick the client adapter for the given dsh version. v1 ships a single
31
+ * client adapter (dsh 1.x); when more are added, swap this for a semver-based
32
+ * selection mirroring the host AdapterRegistry.
33
+ */
34
+ function pickClientAdapter(dshVersion) {
35
+ return clientAdapters[0];
36
+ }
37
+ /**
38
+ * Build the `window.__dshLoader__` API object.
39
+ */
40
+ export function createClientAPI(opts = {}) {
41
+ const aliases = new Map(Object.entries(opts.moduleAliases ?? {}));
42
+ const requireImpl = opts.requireImpl ?? ((spec) => {
43
+ throw new ModuleNotFoundError(spec);
44
+ });
45
+ const clientCtx = opts.clientCtx;
46
+ // Reuse the Map from installClient when provided so registerPackageAlias
47
+ // mutations are visible to the __ModuleLoader__ wrapper. Otherwise create
48
+ // a fresh Map from a plain object.
49
+ const packageAliases = opts.packageAliases instanceof Map
50
+ ? opts.packageAliases
51
+ : new Map(Object.entries(opts.packageAliases ?? {}));
52
+ const api = {
53
+ version: LOADER_VERSION,
54
+ dshVersion: opts.dshVersion,
55
+ adapterVersion: opts.adapterVersion,
56
+ require(specifier) {
57
+ if (typeof specifier !== 'string')
58
+ throw new ModuleNotFoundError(String(specifier));
59
+ const target = aliases.get(specifier);
60
+ if (target === undefined) {
61
+ throw new ModuleNotFoundError(specifier);
62
+ }
63
+ return requireImpl(target);
64
+ },
65
+ registerModuleAlias(alias, target) {
66
+ aliases.set(alias, target);
67
+ },
68
+ /**
69
+ * Register a package-name alias for the client module loader's
70
+ * require(). When a plugin's bundle calls require('@old/pkg-name'),
71
+ * the loader's wrapped require remaps it to '@new/pkg-name' before
72
+ * hitting the module table. This lets dsh rename client packages
73
+ * across versions without forcing plugin bundles to rebuild.
74
+ */
75
+ registerPackageAlias(oldName, newName) {
76
+ packageAliases.set(oldName, newName);
77
+ },
78
+ /**
79
+ * Read a client-side cordis service by name.
80
+ * Proxies to `clientCtx.get(name)` — the same ctx.get plugins use
81
+ * inside their client `apply(ctx)`, but exposed through the stable
82
+ * dshloader surface so plugins don't depend on the cordis context
83
+ * shape directly.
84
+ *
85
+ * Only available when dshloader's client apply() received a ctx
86
+ * (cordis client boot). Returns undefined when ctx is not wired.
87
+ */
88
+ services: {
89
+ get(name) {
90
+ if (clientCtx === undefined || typeof clientCtx.get !== 'function')
91
+ return undefined;
92
+ return clientCtx.get(name);
93
+ },
94
+ },
95
+ rpc: opts.fetchBridge
96
+ ? {
97
+ settings: {
98
+ describe: () => opts.fetchBridge.describe(),
99
+ update: (ns, section) => opts.fetchBridge.write('update', { ns, section }),
100
+ replace: (ns, section) => opts.fetchBridge.write('replace', { ns, section }),
101
+ mutate: (ns, ops) => opts.fetchBridge.write('mutate', { ns, ops }),
102
+ },
103
+ }
104
+ : undefined,
105
+ };
106
+ return api;
107
+ }
108
+ /**
109
+ * Install dshloader into a browser-like environment.
110
+ */
111
+ export function installClient(opts = {}) {
112
+ const win = opts.window ?? (typeof window !== 'undefined' ? window : undefined);
113
+ if (win === undefined)
114
+ return undefined;
115
+ const dshVersion = opts.dshVersion ?? win.__DSHLOADER_VERSION__;
116
+ const adapter = pickClientAdapter(dshVersion);
117
+ const moduleAliases = { ...(adapter.moduleAliases ?? {}) };
118
+ // Merge adapter-declared package aliases with any passed via opts (opts
119
+ // win on conflict, so tests / runtime can override adapter defaults).
120
+ const packageAliases = new Map(Object.entries(adapter.packageAliases ?? {}));
121
+ if (opts.packageAliases) {
122
+ for (const [k, v] of Object.entries(opts.packageAliases))
123
+ packageAliases.set(k, v);
124
+ }
125
+ // fetch bridge (only meaningful when exposeAllNamespaces is on).
126
+ const exposeAllNamespaces = Boolean(opts.exposeAllNamespaces ?? win.__DSHLOADER_CONFIG__?.exposeAllNamespaces);
127
+ const bridgePrefix = opts.hostBridgePrefix ?? BRIDGE_PREFIX;
128
+ const fetchBridge = exposeAllNamespaces
129
+ ? {
130
+ describe: () => win.fetch(`${bridgePrefix}/settings/describe`, { headers: { accept: 'application/json' } }).then((r) => r.json()),
131
+ write: (mode, payload) => win.fetch(`${bridgePrefix}/settings/${mode}`, {
132
+ method: 'POST',
133
+ headers: { 'content-type': 'application/json' },
134
+ body: JSON.stringify(payload),
135
+ }).then((r) => r.json()),
136
+ }
137
+ : undefined;
138
+ const api = createClientAPI({
139
+ dshVersion,
140
+ adapterVersion: adapter.supports,
141
+ moduleAliases,
142
+ packageAliases,
143
+ requireImpl: opts.requireImpl ?? ((spec) => win.__dshNativeRequire__?.(spec)),
144
+ fetchBridge,
145
+ clientCtx: opts.clientCtx,
146
+ });
147
+ win.__dshLoader__ = api;
148
+ // Wrap __ModuleLoader__.load so every factory's require() function
149
+ // applies package-name aliases before hitting the module table. This
150
+ // must happen BEFORE registering module-alias factories below, because
151
+ // those factories also receive the wrapped require.
152
+ const loader = win.__ModuleLoader__;
153
+ if (loader && typeof loader.load === 'function') {
154
+ const originalLoad = loader.load.bind(loader);
155
+ loader.load = function dshloaderLoad(handoff) {
156
+ const wrappedFactory = (require) => {
157
+ const aliasedRequire = (spec) => {
158
+ const mapped = packageAliases.get(spec);
159
+ return require(mapped ?? spec);
160
+ };
161
+ return handoff.factory(aliasedRequire);
162
+ };
163
+ return originalLoad({ id: handoff.id, factory: wrappedFactory });
164
+ };
165
+ }
166
+ // Register module-alias factories with the client module loader (fix 1).
167
+ if (loader && typeof loader.load === 'function') {
168
+ for (const [aliasId, target] of Object.entries(moduleAliases)) {
169
+ loader.load({
170
+ id: aliasId,
171
+ factory: (require) => {
172
+ const mod = require(target);
173
+ // Preserve the deep import's expected named export shape.
174
+ if (aliasId.endsWith('context-provenance.ts') || aliasId.endsWith('context-provenance')) {
175
+ return { contextProvenance: mod.contextProvenance };
176
+ }
177
+ return mod;
178
+ },
179
+ });
180
+ }
181
+ }
182
+ if (exposeAllNamespaces) {
183
+ installSettingsFetchInterceptor(win, bridgePrefix);
184
+ console.warn(`${LOG_PREFIX} exposeAllNamespaces enabled: bypassing official settings whitelist`);
185
+ }
186
+ return api;
187
+ }
188
+ /**
189
+ * Fetch interceptor for settings namespace whitelist bypass (fix 5, path 2).
190
+ * Mirrors dsh-upstream-fixes/lib/client.js (127-223).
191
+ *
192
+ * - /api/settings.describe: merge non-whitelisted namespaces from the host
193
+ * bridge into the official response (rpcId/official fields preserved).
194
+ * - /api/settings.{update,mutate,replace}: route writes for namespaces the
195
+ * official proxy does NOT expose through the host bridge, and rebuild the
196
+ * response envelope as `{ type: 'server-response', rpcId, result }` so the
197
+ * official client can correlate the response with the request.
198
+ */
199
+ export function installSettingsFetchInterceptor(win, bridgePrefix = BRIDGE_PREFIX) {
200
+ if (typeof win.fetch !== 'function')
201
+ return () => { };
202
+ const originalFetch = win.fetch;
203
+ /** Namespaces the official proxy itself exposed (learned from describe). */
204
+ const officialExposed = new Set();
205
+ win.fetch = async function dshloaderFetch(input, init) {
206
+ let pathname = '';
207
+ try {
208
+ const urlLike = typeof input === 'string' ? input : input.url;
209
+ pathname = new URL(urlLike, win.location?.origin ?? 'http://localhost').pathname;
210
+ }
211
+ catch {
212
+ pathname = String(input).split('?')[0];
213
+ }
214
+ const method = (init?.method ?? 'GET').toUpperCase();
215
+ // describe: merge bridge namespaces into the official response.
216
+ if (pathname === '/api/settings.describe') {
217
+ const response = await originalFetch.call(this, input, init);
218
+ try {
219
+ const body = await response.clone().json();
220
+ const namespaces = body?.result?.value?.namespaces;
221
+ if (!Array.isArray(namespaces))
222
+ return response;
223
+ for (const row of namespaces) {
224
+ if (typeof row?.ns === 'string')
225
+ officialExposed.add(row.ns);
226
+ }
227
+ const extra = await originalFetch.call(this, `${bridgePrefix}/settings/describe`, {
228
+ headers: { accept: 'application/json' },
229
+ });
230
+ const extraBody = await extra.json();
231
+ if (extraBody?.ok !== true || !Array.isArray(extraBody.namespaces))
232
+ return response;
233
+ const seen = new Set(namespaces.map((row) => row.ns));
234
+ const merged = [...namespaces, ...extraBody.namespaces.filter((row) => !seen.has(row.ns))];
235
+ const ResponseCtor = win.Response;
236
+ return new ResponseCtor(JSON.stringify({ ...body, result: { ...body.result, value: { ...body.result.value, namespaces: merged } } }), { status: 200, headers: { 'content-type': 'application/json' } });
237
+ }
238
+ catch {
239
+ return response;
240
+ }
241
+ }
242
+ // writes: route non-whitelisted namespaces through the bridge, echo rpcId.
243
+ if ((pathname === '/api/settings.update' || pathname === '/api/settings.mutate' || pathname === '/api/settings.replace') &&
244
+ method === 'POST') {
245
+ let rpcId = null;
246
+ let payload = null;
247
+ try {
248
+ const parsed = JSON.parse(String(init?.body ?? '{}'));
249
+ rpcId = parsed.rpcId;
250
+ payload = parsed.payload;
251
+ }
252
+ catch {
253
+ /* fall through to the original endpoint */
254
+ }
255
+ const ns = typeof payload?.ns === 'string' ? payload.ns : '';
256
+ if (rpcId !== null && ns !== '' && officialExposed.size > 0 && !officialExposed.has(ns)) {
257
+ try {
258
+ const mode = pathname.slice('/api/settings.'.length);
259
+ const res = await originalFetch.call(this, `${bridgePrefix}/settings/${mode}`, {
260
+ method: 'POST',
261
+ headers: { 'content-type': 'application/json' },
262
+ body: JSON.stringify(payload),
263
+ });
264
+ const body = await res.json();
265
+ if (body?.result) {
266
+ const ResponseCtor = win.Response;
267
+ return new ResponseCtor(JSON.stringify({ type: 'server-response', rpcId, result: body.result }), { status: 200, headers: { 'content-type': 'application/json' } });
268
+ }
269
+ }
270
+ catch {
271
+ /* fall back to the original endpoint */
272
+ }
273
+ }
274
+ }
275
+ return originalFetch.call(this, input, init);
276
+ };
277
+ return () => {
278
+ win.fetch = originalFetch;
279
+ };
280
+ }
281
+ // ── cordis client-plugin entry ─────────────────────────────────────────
282
+ // dsh's client boot applies every registered bundle as a cordis plugin:
283
+ // the module must expose `apply` (third-party plugins / dsh-client-runtime
284
+ // all do `exports.apply = apply`). Without it the client boot fails with
285
+ // "invalid plugin, expect function or object with an \"apply\" method".
286
+ // `installClient` mounts window.__dshLoader__, registers module aliases,
287
+ // wires the client cordis ctx for `services.get`, and (when opted in)
288
+ // installs the settings fetch interceptor.
289
+ export const name = '@dsh-plugin/dsh-loader';
290
+ export const inject = [];
291
+ export function apply(ctx) {
292
+ if (typeof window !== 'undefined')
293
+ installClient({ window: window, clientCtx: ctx });
294
+ }
295
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,yEAAyE;AACzE,oBAAoB;AACpB,6EAA6E;AAC7E,yBAAyB;AACzB,6EAA6E;AAC7E,0EAA0E;AAC1E,oCAAoC;AACpC,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,2EAA2E;AAC3E,4EAA4E;AAC5E,EAAE;AACF,6EAA6E;AAC7E,kDAAkD;AAClD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAwBtD,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,SAAS,CAAS;IAElB,YAAY,SAAiB;QAC3B,KAAK,CAAC,GAAG,UAAU,sBAAsB,SAAS,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AASD;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,UAAmB;IAC5C,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAeD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAI,GAAwB,EAAE;IAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE;QACxD,MAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACjC,yEAAyE;IACzE,0EAA0E;IAC1E,mCAAmC;IACnC,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,YAAY,GAAG;QACvD,CAAC,CAAC,IAAI,CAAC,cAAc;QACrB,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC;IAEvD,MAAM,GAAG,GAAG;QACV,OAAO,EAAE,cAAc;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;QAEnC,OAAO,CAAC,SAAiB;YACvB,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACpF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QAED,mBAAmB,CAAC,KAAa,EAAE,MAAc;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;QAED;;;;;;WAMG;QACH,oBAAoB,CAAC,OAAe,EAAE,OAAe;YACnD,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAED;;;;;;;;;WASG;QACH,QAAQ,EAAE;YACR,GAAG,CAAC,IAAY;gBACd,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,UAAU;oBAAE,OAAO,SAAS,CAAC;gBACrF,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;SACF;QAED,GAAG,EAAE,IAAI,CAAC,WAAW;YACnB,CAAC,CAAC;gBACE,QAAQ,EAAE;oBACR,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAY,CAAC,QAAQ,EAAE;oBAC5C,MAAM,EAAE,CAAC,EAAU,EAAE,OAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,WAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;oBAC5F,OAAO,EAAE,CAAC,EAAU,EAAE,OAAgB,EAAE,EAAE,CAAC,IAAI,CAAC,WAAY,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;oBAC9F,MAAM,EAAE,CAAC,EAAU,EAAE,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;iBACrF;aACF;YACH,CAAC,CAAC,SAAS;KACd,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAYD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAI,GAAsB,EAAE;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAE,MAA8B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzG,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAExC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,qBAAqB,CAAC;IAChE,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3D,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,iEAAiE;IACjE,MAAM,mBAAmB,GAAG,OAAO,CACjC,IAAI,CAAC,mBAAmB,IAAI,GAAG,CAAC,oBAAoB,EAAE,mBAAmB,CAC1E,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,IAAI,aAAa,CAAC;IAE5D,MAAM,WAAW,GAAG,mBAAmB;QACrC,CAAC,CAAC;YACE,QAAQ,EAAE,GAAG,EAAE,CACb,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,oBAAoB,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnH,KAAK,EAAE,CAAC,IAAY,EAAE,OAAe,EAAE,EAAE,CACvC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,aAAa,IAAI,EAAE,EAAE;gBAC5C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAC3B;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,GAAG,GAAG,eAAe,CAAC;QAC1B,UAAU;QACV,cAAc,EAAE,OAAO,CAAC,QAAQ;QAChC,aAAa;QACb,cAAc;QACd,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7E,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC;IACH,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC;IAExB,mEAAmE;IACnE,qEAAqE;IACrE,uEAAuE;IACvE,oDAAoD;IACpD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC;IACpC,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,GAAG,SAAS,aAAa,CAAC,OAAyE;YAC5G,MAAM,cAAc,GAAG,CAAC,OAA8B,EAAE,EAAE;gBACxD,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE;oBACtC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACxC,OAAO,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;gBACjC,CAAC,CAAC;gBACF,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACzC,CAAC,CAAC;YACF,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAChD,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,OAAO;gBACX,OAAO,EAAE,CAAC,OAA8B,EAAE,EAAE;oBAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC5B,0DAA0D;oBAC1D,IAAI,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;wBACxF,OAAO,EAAE,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC;oBACtD,CAAC;oBACD,OAAO,GAAG,CAAC;gBACb,CAAC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,+BAA+B,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,qEAAqE,CAAC,CAAC;IACnG,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,+BAA+B,CAC7C,GAAwB,EACxB,YAAY,GAAG,aAAa;IAE5B,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC;IAChC,4EAA4E;IAC5E,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,GAAG,CAAC,KAAK,GAAG,KAAK,UAAU,cAAc,CAAgB,KAAU,EAAE,IAAU;QAC7E,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,KAA0B,CAAC,GAAG,CAAC;YACpF,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAiB,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,kBAAkB,CAAC,CAAC,QAAQ,CAAC;QAC7F,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAErD,gEAAgE;QAChE,IAAI,QAAQ,KAAK,wBAAwB,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC3C,MAAM,UAAU,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC;gBACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;oBAAE,OAAO,QAAQ,CAAC;gBAChD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC7B,IAAI,OAAO,GAAG,EAAE,EAAE,KAAK,QAAQ;wBAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/D,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,oBAAoB,EAAE;oBAChF,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;iBACxC,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,SAAS,EAAE,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC;oBAAE,OAAO,QAAQ,CAAC;gBACpF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAmB,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtE,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAmB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3G,MAAM,YAAY,GAAG,GAAG,CAAC,QAAS,CAAC;gBACnC,OAAO,IAAI,YAAY,CACrB,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAC5G,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,IACE,CAAC,QAAQ,KAAK,sBAAsB,IAAI,QAAQ,KAAK,sBAAsB,IAAI,QAAQ,KAAK,uBAAuB,CAAC;YACpH,MAAM,KAAK,MAAM,EACjB,CAAC;YACD,IAAI,KAAK,GAAY,IAAI,CAAC;YAC1B,IAAI,OAAO,GAAiD,IAAI,CAAC;YACjE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC;gBACtD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBACrB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;YAC7C,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,OAAO,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,IAAI,KAAK,KAAK,IAAI,IAAI,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACxF,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;oBACrD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,aAAa,IAAI,EAAE,EAAE;wBAC7E,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;wBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;qBAC9B,CAAC,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;wBACjB,MAAM,YAAY,GAAG,GAAG,CAAC,QAAS,CAAC;wBACnC,OAAO,IAAI,YAAY,CACrB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EACvE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,wCAAwC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,OAAO,GAAG,EAAE;QACV,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,wEAAwE;AACxE,2EAA2E;AAC3E,yEAAyE;AACzE,wEAAwE;AACxE,yEAAyE;AACzE,sEAAsE;AACtE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,IAAI,GAAG,wBAAwB,CAAA;AAC5C,MAAM,CAAC,MAAM,MAAM,GAAa,EAAE,CAAA;AAClC,MAAM,UAAU,KAAK,CAAC,GAAoC;IACxD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,aAAa,CAAC,EAAE,MAAM,EAAE,MAA6B,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;AAC9G,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { LOADER_VERSION } from './version.js';
2
+ import { AdapterRegistry } from './registry.js';
3
+ import { createHostAPI } from './api.js';
4
+ import type { CordisContext, AdapterFactory } from './types.js';
5
+ export declare const name = "@dsh-plugin/dsh-loader";
6
+ export declare const inject: string[];
7
+ interface LoaderConfig {
8
+ exposeAllNamespaces: boolean;
9
+ hostPackageAliases?: Record<string, string>;
10
+ }
11
+ /**
12
+ * Read the profile-level dshloader config (exposeAllNamespaces etc.).
13
+ * Sources, in priority order:
14
+ * 1. process.env.DSHLOADER_EXPOSE_ALL_SETTINGS=1
15
+ * 2. profile package.json `dsh.dshloader.exposeAllNamespaces`
16
+ * 3. profile package.json `dshLoader.settings.exposeAllNamespaces`
17
+ */
18
+ export declare function readLoaderConfig(opts?: {
19
+ profileDir?: string;
20
+ }): LoaderConfig;
21
+ interface AdapterSelectionResult {
22
+ registry: AdapterRegistry;
23
+ factory: AdapterFactory;
24
+ mode: 'exact' | 'range' | 'fallback';
25
+ dshVersion: string;
26
+ }
27
+ /**
28
+ * Build the registry + select an adapter for the current dsh version, without
29
+ * touching the cordis context. Exported for tests and the `info` CLI command.
30
+ */
31
+ export declare function selectAdapter(opts?: {
32
+ dshVersion?: string;
33
+ registry?: AdapterRegistry;
34
+ }): AdapterSelectionResult;
35
+ /**
36
+ * Apply the selected adapter onto a cordis context and expose the stable API.
37
+ * @param ctx cordis context
38
+ * @returns
39
+ */
40
+ export declare function applyAdapter(ctx: CordisContext, opts?: {
41
+ dshVersion?: string;
42
+ config?: LoaderConfig;
43
+ registry?: AdapterRegistry;
44
+ }): Promise<{
45
+ api: ReturnType<typeof createHostAPI>;
46
+ factory: AdapterFactory;
47
+ mode: string;
48
+ dshVersion: string;
49
+ }>;
50
+ /** cordis function-plugin entry point. */
51
+ export declare function apply(ctx: CordisContext): Promise<void>;
52
+ export { LOADER_VERSION };
package/dist/index.js ADDED
@@ -0,0 +1,89 @@
1
+ // dshloader host bundle entry (design.md §7.3 / §4.4).
2
+ //
3
+ // Exports the cordis function-plugin shape (`name`, `inject`, `apply`) and
4
+ // wires the adapter registry → version detection → stable API onto
5
+ // `ctx.dshLoader`. Service aliases / bridge routes register through
6
+ // ctx.reflect.provide / ctx.effect so cordis auto-recycles them on fiber
7
+ // unload — no manual dispose is required for v1's covered capabilities.
8
+ import { LOADER_VERSION, LOG_PREFIX } from './version.js';
9
+ import { readFileSync } from 'node:fs';
10
+ import { join, resolve } from 'node:path';
11
+ import { AdapterRegistry, detectDshVersion, UnsupportedDshVersionError } from './registry.js';
12
+ import { registerHostAdapters } from './adapters/index.js';
13
+ import { createHostAPI } from './api.js';
14
+ export const name = '@dsh-plugin/dsh-loader';
15
+ // dshloader itself depends on `webServer` so its fiber only activates once
16
+ // the real web server is provided — the alias then points `httpServer` at it.
17
+ export const inject = ['webServer'];
18
+ /**
19
+ * Read the profile-level dshloader config (exposeAllNamespaces etc.).
20
+ * Sources, in priority order:
21
+ * 1. process.env.DSHLOADER_EXPOSE_ALL_SETTINGS=1
22
+ * 2. profile package.json `dsh.dshloader.exposeAllNamespaces`
23
+ * 3. profile package.json `dshLoader.settings.exposeAllNamespaces`
24
+ */
25
+ export function readLoaderConfig(opts = {}) {
26
+ const envOn = process.env.DSHLOADER_EXPOSE_ALL_SETTINGS === '1' || process.env.DSHLOADER_EXPOSE_ALL_SETTINGS === 'true';
27
+ let pkgOn = false;
28
+ try {
29
+ // Best-effort: read the profile manifest if reachable via cwd.
30
+ const dir = opts.profileDir ?? join(process.env.DSH_HOME ?? '', 'profiles', 'web');
31
+ const manifest = JSON.parse(readFileSync(join(resolve(dir), 'package.json'), 'utf8'));
32
+ pkgOn = Boolean(manifest.dsh?.dshloader?.exposeAllNamespaces ??
33
+ manifest.dshLoader?.settings?.exposeAllNamespaces);
34
+ }
35
+ catch {
36
+ /* ignore */
37
+ }
38
+ return { exposeAllNamespaces: envOn || pkgOn };
39
+ }
40
+ /**
41
+ * Build the registry + select an adapter for the current dsh version, without
42
+ * touching the cordis context. Exported for tests and the `info` CLI command.
43
+ */
44
+ export function selectAdapter(opts = {}) {
45
+ const reg = opts.registry ?? registerHostAdapters(new AdapterRegistry());
46
+ const version = opts.dshVersion ?? detectDshVersion();
47
+ if (version === undefined) {
48
+ throw new UnsupportedDshVersionError(`${LOG_PREFIX} could not detect dsh version; set DSHLOADER_DSH_VERSION or install @deepseek-ai/dsh`, { kind: 'too-new' });
49
+ }
50
+ const { factory, mode } = reg.select(version);
51
+ return { registry: reg, factory, mode, dshVersion: version };
52
+ }
53
+ /**
54
+ * Apply the selected adapter onto a cordis context and expose the stable API.
55
+ * @param ctx cordis context
56
+ * @returns
57
+ */
58
+ export async function applyAdapter(ctx, opts = {}) {
59
+ const config = opts.config ?? readLoaderConfig();
60
+ const selection = selectAdapter({ dshVersion: opts.dshVersion, registry: opts.registry });
61
+ const { factory, mode, dshVersion } = selection;
62
+ const adapter = factory.create(ctx, config);
63
+ await adapter.apply?.();
64
+ const api = createHostAPI({
65
+ ctx,
66
+ dshVersion,
67
+ factory,
68
+ adapter,
69
+ exposeAllNamespaces: config.exposeAllNamespaces,
70
+ hostPackageAliases: config.hostPackageAliases,
71
+ });
72
+ ctx.reflect.provide('dshLoader', api);
73
+ console.log(`${LOG_PREFIX} loaded adapter ${factory.name} for dsh ${dshVersion} (mode: ${mode})`);
74
+ console.log(`${LOG_PREFIX} registered stable API: settings, web, services`);
75
+ if (config.exposeAllNamespaces) {
76
+ console.warn(`${LOG_PREFIX} exposeAllNamespaces enabled: bypassing official settings whitelist`);
77
+ }
78
+ return { api, factory, mode, dshVersion };
79
+ }
80
+ /** cordis function-plugin entry point. */
81
+ export async function apply(ctx) {
82
+ if (process.env.DSHLOADER_DISABLE === '1' || process.env.DSHLOADER_DISABLE === 'true') {
83
+ console.log(`${LOG_PREFIX} disabled by env, skipping`);
84
+ return;
85
+ }
86
+ await applyAdapter(ctx);
87
+ }
88
+ export { LOADER_VERSION };
89
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { AdapterFactory, AdapterSelection } from './types.js';
2
+ interface DshVersionOptions {
3
+ profileDir?: string;
4
+ dshPkgPath?: string;
5
+ env?: typeof process.env;
6
+ }
7
+ export declare class UnsupportedDshVersionError extends Error {
8
+ kind?: string;
9
+ version?: string;
10
+ minSupported?: string | null;
11
+ constructor(message: string, opts?: {
12
+ kind?: string;
13
+ version?: string;
14
+ minSupported?: string | null;
15
+ });
16
+ }
17
+ export declare class InvalidVersionError extends Error {
18
+ version?: string;
19
+ constructor(message: string, opts?: {
20
+ version?: string;
21
+ });
22
+ }
23
+ /**
24
+ * Resolve the installed dsh version.
25
+ *
26
+ * @returns semver version string, or undefined when unreachable
27
+ */
28
+ export declare function detectDshVersion(opts?: DshVersionOptions): string | undefined;
29
+ export declare class AdapterRegistry {
30
+ adapters: AdapterFactory[];
31
+ constructor();
32
+ register(factory: AdapterFactory): this;
33
+ select(version: string): AdapterSelection;
34
+ }
35
+ export {};