@specverse/engines 6.33.0 → 6.34.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 (57) hide show
  1. package/dist/libs/instance-factories/communication/rabbitmq-events.yaml +11 -0
  2. package/dist/libs/instance-factories/controllers/fastify.yaml +11 -0
  3. package/dist/libs/instance-factories/managed/stripe-rest-sdk.yaml +78 -0
  4. package/dist/libs/instance-factories/managed/templates/stripe/stripe-client-generator.js +8 -0
  5. package/dist/libs/instance-factories/orms/prisma.yaml +11 -0
  6. package/dist/realize/index.d.ts.map +1 -1
  7. package/dist/realize/index.js +261 -4
  8. package/dist/realize/index.js.map +1 -1
  9. package/dist/realize/library/loader.d.ts.map +1 -1
  10. package/dist/realize/library/loader.js +81 -1
  11. package/dist/realize/library/loader.js.map +1 -1
  12. package/dist/realize/per-action-emitter.d.ts +9 -0
  13. package/dist/realize/per-action-emitter.d.ts.map +1 -1
  14. package/dist/realize/per-action-emitter.js.map +1 -1
  15. package/dist/realize/per-action-llm-emit.d.ts.map +1 -1
  16. package/dist/realize/per-action-llm-emit.js +5 -1
  17. package/dist/realize/per-action-llm-emit.js.map +1 -1
  18. package/dist/realize/per-action-runner.d.ts +45 -0
  19. package/dist/realize/per-action-runner.d.ts.map +1 -1
  20. package/dist/realize/per-action-runner.js +132 -0
  21. package/dist/realize/per-action-runner.js.map +1 -1
  22. package/dist/realize/resolver/index.d.ts +157 -0
  23. package/dist/realize/resolver/index.d.ts.map +1 -0
  24. package/dist/realize/resolver/index.js +307 -0
  25. package/dist/realize/resolver/index.js.map +1 -0
  26. package/dist/realize/runtime-emitters/dispatcher.d.ts +176 -0
  27. package/dist/realize/runtime-emitters/dispatcher.d.ts.map +1 -0
  28. package/dist/realize/runtime-emitters/dispatcher.js +76 -0
  29. package/dist/realize/runtime-emitters/dispatcher.js.map +1 -0
  30. package/dist/realize/runtime-emitters/executable.d.ts +57 -0
  31. package/dist/realize/runtime-emitters/executable.d.ts.map +1 -0
  32. package/dist/realize/runtime-emitters/executable.js +316 -0
  33. package/dist/realize/runtime-emitters/executable.js.map +1 -0
  34. package/dist/realize/runtime-emitters/library.d.ts +52 -0
  35. package/dist/realize/runtime-emitters/library.d.ts.map +1 -0
  36. package/dist/realize/runtime-emitters/library.js +349 -0
  37. package/dist/realize/runtime-emitters/library.js.map +1 -0
  38. package/dist/realize/runtime-emitters/managed.d.ts +44 -0
  39. package/dist/realize/runtime-emitters/managed.d.ts.map +1 -0
  40. package/dist/realize/runtime-emitters/managed.js +283 -0
  41. package/dist/realize/runtime-emitters/managed.js.map +1 -0
  42. package/dist/realize/runtime-emitters/messaging.d.ts +77 -0
  43. package/dist/realize/runtime-emitters/messaging.d.ts.map +1 -0
  44. package/dist/realize/runtime-emitters/messaging.js +423 -0
  45. package/dist/realize/runtime-emitters/messaging.js.map +1 -0
  46. package/dist/realize/runtime-emitters/service.d.ts +42 -0
  47. package/dist/realize/runtime-emitters/service.d.ts.map +1 -0
  48. package/dist/realize/runtime-emitters/service.js +355 -0
  49. package/dist/realize/runtime-emitters/service.js.map +1 -0
  50. package/dist/realize/types/instance-factory.d.ts +1 -1
  51. package/dist/realize/types/instance-factory.d.ts.map +1 -1
  52. package/libs/instance-factories/communication/rabbitmq-events.yaml +11 -0
  53. package/libs/instance-factories/controllers/fastify.yaml +11 -0
  54. package/libs/instance-factories/managed/stripe-rest-sdk.yaml +78 -0
  55. package/libs/instance-factories/managed/templates/stripe/stripe-client-generator.ts +26 -0
  56. package/libs/instance-factories/orms/prisma.yaml +11 -0
  57. package/package.json +1 -1
@@ -66,6 +66,7 @@ export async function runPerActionEmission(opts) {
66
66
  for (const [ownerName, actions] of ownerGroups) {
67
67
  const bodies = new Map();
68
68
  const specs = new Map();
69
+ const availableClients = opts.availableClientsByOwner?.get(ownerName);
69
70
  for (const collectedAction of actions) {
70
71
  const realizeCtx = {
71
72
  componentName: ownerName,
@@ -75,6 +76,7 @@ export async function runPerActionEmission(opts) {
75
76
  aiArgsExpr: opts.aiArgsExpr,
76
77
  llmEmit: opts.llmEmit,
77
78
  canCallLLM: opts.canCallLLM,
79
+ availableClients,
78
80
  };
79
81
  const body = await emitActionBody(collectedAction.spec, realizeCtx);
80
82
  bodies.set(collectedAction.actionName, body);
@@ -266,4 +268,134 @@ ${body}
266
268
  }
267
269
  `;
268
270
  }
271
+ // ─── V2 imports → availableClients string (Round 3 follow-up) ────────
272
+ /**
273
+ * Convert a V2 `import: from:` provider name to the client identifier
274
+ * the runtime aggregator (`clients/index.ts`) exposes via `v2Clients`.
275
+ *
276
+ * Mirrors the `toClientName` logic in
277
+ * `engines/src/realize/runtime-emitters/library.ts` so the prompt's
278
+ * advertised name matches the actual client constant the consumer
279
+ * spreads into `deps`. Kept local (rather than imported) because the
280
+ * library emitter's helper is private and the conversion is a tiny
281
+ * pure function — duplication is cheaper than a public re-export.
282
+ */
283
+ function toClientName(fromName) {
284
+ // Mirrors the library emitter's toWords: scope-strip, slash → dash,
285
+ // split on camelCase boundary AND non-alphanumeric runs, lowercase.
286
+ const normalised = fromName.replace(/^@/, '').replace(/\//g, '-');
287
+ const words = normalised
288
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
289
+ .replace(/[^a-zA-Z0-9]+/g, ' ')
290
+ .trim()
291
+ .split(' ')
292
+ .filter(Boolean)
293
+ .map((w) => w.toLowerCase());
294
+ if (words.length === 0)
295
+ return 'unknownClient';
296
+ return (words[0] +
297
+ words
298
+ .slice(1)
299
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
300
+ .join(''));
301
+ }
302
+ /**
303
+ * Build a single component's `availableClients` prompt string from its
304
+ * V2 `import:` block.
305
+ *
306
+ * Output shape (one line per importable operation):
307
+ * - deps.<clientName>.<operation>(input) // from <fromName> (<topology>)
308
+ * - deps.<clientName> // bare entity export from <fromName> (<topology>)
309
+ *
310
+ * Topology is included when known (caller can pass a resolver-result
311
+ * lookup); when unknown, we omit the parenthetical. The Round-3 wire-up
312
+ * in `realize/index.ts` runs BEFORE the V2 imports loop has resolved
313
+ * factories, so most calls today omit topology — fine. The slot is
314
+ * forward-compatible: a future revision can pass topology by name and
315
+ * we'll surface it.
316
+ *
317
+ * Returns `null` when the component has no imports (caller should not
318
+ * set `availableClients` at all in that case so the LLM hook falls
319
+ * back to its "(none)" default).
320
+ */
321
+ export function buildAvailableClientsForComponent(component, topologyByFrom) {
322
+ const imports = Array.isArray(component?.import) ? component.import : [];
323
+ if (imports.length === 0)
324
+ return null;
325
+ const lines = [];
326
+ for (const entry of imports) {
327
+ const fromName = entry?.from ?? entry?.package ?? entry?.file ?? '';
328
+ if (!fromName)
329
+ continue;
330
+ const select = Array.isArray(entry?.select) ? entry.select : [];
331
+ if (select.length === 0)
332
+ continue;
333
+ const clientName = toClientName(fromName);
334
+ const topology = topologyByFrom?.get(fromName);
335
+ const topoSuffix = topology ? ` (${topology})` : '';
336
+ for (const sel of select) {
337
+ const dotIndex = sel.indexOf('.');
338
+ if (dotIndex === -1) {
339
+ // Bare entity export: full interface, LLM picks the operation.
340
+ lines.push(` - deps.${clientName} // bare entity export ${sel} from ${fromName}${topoSuffix}`);
341
+ }
342
+ else {
343
+ // Dotted: <Entity>.<operation> — surface the operation directly.
344
+ const operation = sel.slice(dotIndex + 1);
345
+ lines.push(` - deps.${clientName}.${operation}(input) // from ${fromName}${topoSuffix}`);
346
+ }
347
+ }
348
+ }
349
+ if (lines.length === 0)
350
+ return null;
351
+ return ['Available imported clients (V2 imports):', ...lines].join('\n');
352
+ }
353
+ /**
354
+ * Walk a parsed spec and build the per-owner `availableClients` map the
355
+ * per-action runner threads into `RealizeContext.availableClients`.
356
+ *
357
+ * Resolution: each `spec.components[i]` carries an `import:` block AND
358
+ * a set of contained controllers + services. Every controller / service
359
+ * inside the component sees the same `availableClients` string (V2
360
+ * imports are component-scoped; per-action filtering via `Action.uses`
361
+ * is a future refinement).
362
+ *
363
+ * Components-without-imports do not contribute entries — owners in
364
+ * those components won't have `availableClients` set, and the LLM hook
365
+ * falls back to its "(none)" default. This keeps the prompt clean for
366
+ * specs that don't use V2 imports at all.
367
+ */
368
+ export function buildAvailableClientsByOwner(spec, topologyByFrom) {
369
+ const out = new Map();
370
+ const components = Array.isArray(spec?.components)
371
+ ? spec.components
372
+ : Object.values(spec?.components ?? {});
373
+ for (const component of components) {
374
+ const clientsString = buildAvailableClientsForComponent(component, topologyByFrom);
375
+ if (!clientsString)
376
+ continue;
377
+ // Each contained controller and service shares this component's
378
+ // imports. Controllers are shaped `{ Name: { ... } }` or
379
+ // `[{ name, ... }]`; same for services.
380
+ const controllerEntries = Array.isArray(component?.controllers)
381
+ ? component.controllers.map((c) => [c?.name ?? '', c])
382
+ : Object.entries(component?.controllers ?? {});
383
+ for (const [keyName, c] of controllerEntries) {
384
+ const ownerName = c?.name || keyName;
385
+ if (!ownerName)
386
+ continue;
387
+ out.set(ownerName, clientsString);
388
+ }
389
+ const serviceEntries = Array.isArray(component?.services)
390
+ ? component.services.map((s) => [s?.name ?? '', s])
391
+ : Object.entries(component?.services ?? {});
392
+ for (const [keyName, s] of serviceEntries) {
393
+ const ownerName = s?.name || keyName;
394
+ if (!ownerName)
395
+ continue;
396
+ out.set(ownerName, clientsString);
397
+ }
398
+ }
399
+ return out;
400
+ }
269
401
  //# sourceMappingURL=per-action-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"per-action-runner.js","sourceRoot":"","sources":["../../src/realize/per-action-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"per-action-runner.js","sourceRoot":"","sources":["../../src/realize/per-action-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * V2 Dependency Resolver — Phase 3 (Round 1)
3
+ *
4
+ * 4-step lookup chain for `import[].from` references:
5
+ * 1. Local component in same spec
6
+ * 2. Local npm package (node_modules/<name>/package.json)
7
+ * 3. Registry library (Library.type: component) — HTTP stubbed for Round 1
8
+ * 4. Registry factory (Library.type: factory) — HTTP stubbed for Round 1
9
+ *
10
+ * Decision points applied:
11
+ * D1: version defaults to ^latest (per-realize-run cache)
12
+ * Offline mode: skips steps 3 + 4, fails loudly if unresolvable
13
+ * Cache: <cacheDir>/registry-cache/ (default .specverse/registry-cache/)
14
+ * Fail-loud: throws DependencyResolutionError when nothing resolves
15
+ *
16
+ * @see docs/proposals/2026-05-08-COMPONENT-DEPENDENCIES-V2.md — "Realize bridge — Resolver"
17
+ */
18
+ import type { SpecVerseAST, ComponentSpec } from '@specverse/types';
19
+ /**
20
+ * A spec that has been resolved from a `from:` reference.
21
+ * For Round 1 registry paths, `spec` is a minimal stub generated from
22
+ * the registry Library record.
23
+ */
24
+ export interface ResolvedComponent {
25
+ /** The original `from:` value from the import entry that produced this. */
26
+ fromName: string;
27
+ /** Which step of the 4-step chain produced this result. */
28
+ source: 'local' | 'npm' | 'registry-component' | 'registry-factory';
29
+ /**
30
+ * The resolved SpecVerse spec. For local + npm sources this is the full
31
+ * parsed spec. For registry sources (stubs in Round 1) this is a minimal
32
+ * object bearing at least the component's `name` and `version`.
33
+ */
34
+ spec: PartialSpec;
35
+ /**
36
+ * The resolved provider name (component name for local, npm package name
37
+ * for npm, registry library/factory name for registry-*).
38
+ */
39
+ resolvedName: string;
40
+ /**
41
+ * Pinned version after ^latest expansion (or the version from the local
42
+ * spec / npm package.json). Optional because some local components may
43
+ * not declare a version field.
44
+ */
45
+ resolvedVersion?: string;
46
+ /**
47
+ * For source = 'npm' or 'registry-*': the package specifier to use in
48
+ * generated `import` statements (e.g. '@stripe/stripe-js' or 'profit-calc').
49
+ * For source = 'local': not populated; callers compute relative paths
50
+ * from outputDir + resolvedName.
51
+ */
52
+ packageSpecifier?: string;
53
+ /**
54
+ * For source = 'local': relative path from the consumer's outputDir to
55
+ * the provider's emitted module. Optional — when absent, callers fall
56
+ * back to `../{resolvedName}` or similar convention.
57
+ */
58
+ localRelativePath?: string;
59
+ /**
60
+ * Registry coordinates when source is 'registry-component' or 'registry-factory'.
61
+ */
62
+ registryRef?: {
63
+ name: string;
64
+ version: string;
65
+ };
66
+ }
67
+ /**
68
+ * A factory reference returned when the registry resolves a capability match
69
+ * (step 4).
70
+ */
71
+ export interface FactoryReference {
72
+ name: string;
73
+ version: string;
74
+ /** Factory metadata from registry — partial in Round 1 (HTTP is stubbed). */
75
+ metadata?: Record<string, unknown>;
76
+ }
77
+ /**
78
+ * Options passed to each `resolve()` call. The full spec + workspace context
79
+ * allow the local-component and npm-package steps to work without extra
80
+ * configuration.
81
+ */
82
+ export interface ResolveOptions {
83
+ /** The spec being realized — used for local-component lookup (step 1). */
84
+ spec: SpecVerseAST;
85
+ /**
86
+ * Absolute path to the workspace root. Used to locate node_modules for
87
+ * step 2. Defaults to `process.cwd()`.
88
+ */
89
+ workspaceRoot?: string;
90
+ /**
91
+ * When true, steps 3 and 4 (registry) are skipped. If a `from:` reference
92
+ * cannot be resolved via steps 1–2, throws `DependencyResolutionError`.
93
+ */
94
+ offline?: boolean;
95
+ /**
96
+ * Directory where registry responses are cached.
97
+ * Defaults to `.specverse/registry-cache/` inside `workspaceRoot`.
98
+ */
99
+ cacheDir?: string;
100
+ /**
101
+ * When true, treats the registry cache as stale and re-fetches even if a
102
+ * cached entry exists. Equivalent to the `--refresh-registry` flag.
103
+ * Can also be set via the `SPECVERSE_REFRESH_REGISTRY=1` environment variable.
104
+ */
105
+ refreshRegistry?: boolean;
106
+ }
107
+ export interface DependencyResolver {
108
+ /**
109
+ * Resolve a `from:` reference to a component spec.
110
+ *
111
+ * Steps (in order):
112
+ * 1. Local component in spec.components
113
+ * 2. node_modules/<from>/package.json
114
+ * 3. GET /api/libraries/<from> (Registry, Library.type: component) — STUBBED
115
+ * 4. GET /api/libraries?type=factory&capability=<from> — STUBBED
116
+ *
117
+ * @param from The `from:` value from the import entry.
118
+ * @param version Semver range or pin. Defaults to `^latest` (D1).
119
+ * @param options Resolve-time context.
120
+ * @returns ResolvedComponent or null when offline + not locally found.
121
+ * @throws DependencyResolutionError when nothing resolves (not offline) or
122
+ * when offline and no local resolution is possible.
123
+ */
124
+ resolve(from: string, version?: string, options?: ResolveOptions): Promise<ResolvedComponent | null>;
125
+ /**
126
+ * Resolve a capability tag to a factory reference.
127
+ * Used by realize emitters that need to find which factory covers a given
128
+ * capability string.
129
+ *
130
+ * Delegates to step 4 of the chain.
131
+ *
132
+ * @throws DependencyResolutionError when no factory matches and not offline.
133
+ */
134
+ resolveCapability(capability: string, options?: ResolveOptions): Promise<FactoryReference | null>;
135
+ }
136
+ export declare class DependencyResolutionError extends Error {
137
+ readonly from: string;
138
+ readonly triedSteps: string[];
139
+ constructor(message: string, from: string, triedSteps: string[]);
140
+ }
141
+ /** Minimal spec shape accepted from all resolution sources. */
142
+ export interface PartialSpec {
143
+ name?: string;
144
+ version?: string;
145
+ components?: ComponentSpec[];
146
+ [key: string]: unknown;
147
+ }
148
+ /**
149
+ * Create a `DependencyResolver` instance.
150
+ *
151
+ * The resolver is stateless between realize runs. A new instance should be
152
+ * created per-run (or per test) to avoid cross-run cache pollution in memory.
153
+ * On-disk cache in `<cacheDir>/registry-cache/` persists across runs and is
154
+ * shared across instances that use the same directory.
155
+ */
156
+ export declare function createDependencyResolver(): DependencyResolver;
157
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/realize/resolver/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMpE;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;IACpE;;;;OAIG;IACH,IAAI,EAAE,WAAW,CAAC;IAClB;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,IAAI,EAAE,YAAY,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAErG;;;;;;;;OAQG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;CACnG;AAMD,qBAAa,yBAA0B,SAAQ,KAAK;aAGhC,IAAI,EAAE,MAAM;aACZ,UAAU,EAAE,MAAM,EAAE;gBAFpC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAAE;CAKvC;AAMD,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA4TD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * V2 Dependency Resolver — Phase 3 (Round 1)
3
+ *
4
+ * 4-step lookup chain for `import[].from` references:
5
+ * 1. Local component in same spec
6
+ * 2. Local npm package (node_modules/<name>/package.json)
7
+ * 3. Registry library (Library.type: component) — HTTP stubbed for Round 1
8
+ * 4. Registry factory (Library.type: factory) — HTTP stubbed for Round 1
9
+ *
10
+ * Decision points applied:
11
+ * D1: version defaults to ^latest (per-realize-run cache)
12
+ * Offline mode: skips steps 3 + 4, fails loudly if unresolvable
13
+ * Cache: <cacheDir>/registry-cache/ (default .specverse/registry-cache/)
14
+ * Fail-loud: throws DependencyResolutionError when nothing resolves
15
+ *
16
+ * @see docs/proposals/2026-05-08-COMPONENT-DEPENDENCIES-V2.md — "Realize bridge — Resolver"
17
+ */
18
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
19
+ import { join, resolve } from 'path';
20
+ // ============================================================================
21
+ // Error
22
+ // ============================================================================
23
+ export class DependencyResolutionError extends Error {
24
+ from;
25
+ triedSteps;
26
+ constructor(message, from, triedSteps) {
27
+ super(message);
28
+ this.from = from;
29
+ this.triedSteps = triedSteps;
30
+ this.name = 'DependencyResolutionError';
31
+ }
32
+ }
33
+ // ============================================================================
34
+ // Registry HTTP stub
35
+ // ============================================================================
36
+ /**
37
+ * Round-1 stub for registry component lookup.
38
+ *
39
+ * TODO: Replace with real HTTP fetch:
40
+ * GET <registryBase>/api/libraries/<name>
41
+ * Expected response shape (Library.type: component):
42
+ * { name, version, type: 'component', specContent: '<yaml>' }
43
+ *
44
+ * @returns null — no registry data in Round 1 (real HTTP not yet wired).
45
+ */
46
+ async function fetchRegistryComponent(name, _version) {
47
+ // TODO(v2-p3-round2): implement real HTTP fetch to specverse registry.
48
+ // Endpoint: GET /api/libraries/<name>
49
+ // Auth: anonymous reads; OAuth for publish
50
+ // Filtering: check Library.type === 'component'
51
+ void name;
52
+ return null;
53
+ }
54
+ /**
55
+ * Round-1 stub for registry factory lookup by capability.
56
+ *
57
+ * TODO: Replace with real HTTP fetch:
58
+ * GET <registryBase>/api/libraries?type=factory&capability=<capability>
59
+ * Expected response shape (array of Library.type: factory records):
60
+ * [{ name, version, type: 'factory', metadata: { topology, protocol, ... } }]
61
+ *
62
+ * @returns null — no registry data in Round 1.
63
+ */
64
+ async function fetchRegistryFactory(_capability) {
65
+ // TODO(v2-p3-round2): implement real HTTP fetch to specverse registry.
66
+ // Endpoint: GET /api/libraries?type=factory&capability=<capability>
67
+ // Auth: anonymous reads
68
+ // Selection: pick highest semver-matching version
69
+ void _capability;
70
+ return null;
71
+ }
72
+ // ============================================================================
73
+ // Resolver implementation
74
+ // ============================================================================
75
+ /**
76
+ * Default semver range when the spec author omits `version:` (D1).
77
+ */
78
+ const DEFAULT_VERSION = '^latest';
79
+ /**
80
+ * Resolve an effective cache directory from options + environment.
81
+ */
82
+ function resolveCacheDir(options) {
83
+ if (options.cacheDir)
84
+ return options.cacheDir;
85
+ const root = options.workspaceRoot ?? process.cwd();
86
+ return join(root, '.specverse', 'registry-cache');
87
+ }
88
+ /**
89
+ * Determine whether the registry cache should be refreshed.
90
+ * Checks:
91
+ * 1. `options.refreshRegistry` flag
92
+ * 2. `SPECVERSE_REFRESH_REGISTRY` environment variable
93
+ */
94
+ function shouldRefreshRegistry(options) {
95
+ if (options.refreshRegistry)
96
+ return true;
97
+ return process.env['SPECVERSE_REFRESH_REGISTRY'] === '1';
98
+ }
99
+ /**
100
+ * Read a cache entry if it exists (and we are not refreshing).
101
+ */
102
+ function readCache(cacheDir, key, refresh) {
103
+ if (refresh)
104
+ return null;
105
+ const filePath = join(cacheDir, `${key}.json`);
106
+ if (!existsSync(filePath))
107
+ return null;
108
+ try {
109
+ const raw = readFileSync(filePath, 'utf-8');
110
+ return JSON.parse(raw);
111
+ }
112
+ catch {
113
+ return null;
114
+ }
115
+ }
116
+ /**
117
+ * Write a cache entry. Creates the cache directory if it doesn't exist.
118
+ */
119
+ function writeCache(cacheDir, key, entry) {
120
+ try {
121
+ if (!existsSync(cacheDir)) {
122
+ mkdirSync(cacheDir, { recursive: true });
123
+ }
124
+ const filePath = join(cacheDir, `${key}.json`);
125
+ writeFileSync(filePath, JSON.stringify(entry, null, 2), 'utf-8');
126
+ }
127
+ catch {
128
+ // Cache write failure is non-fatal — resolution can continue without it.
129
+ }
130
+ }
131
+ /**
132
+ * Sanitise a `from:` value so it's safe as a filesystem key.
133
+ * Converts `@scope/pkg` → `scope__pkg`, slashes → `__`.
134
+ */
135
+ function cacheKey(from) {
136
+ return from.replace(/^@/, '').replace(/\//g, '__');
137
+ }
138
+ class DependencyResolverImpl {
139
+ async resolve(from, version, options = { spec: { components: [], deployments: [], manifests: [] } }) {
140
+ const effectiveVersion = version ?? DEFAULT_VERSION;
141
+ const triedSteps = [];
142
+ // ── Step 1: Local component in same spec ────────────────────────────────
143
+ triedSteps.push('local-component');
144
+ const localMatch = (options.spec?.components ?? []).find((c) => c.name === from);
145
+ if (localMatch) {
146
+ return {
147
+ fromName: from,
148
+ source: 'local',
149
+ spec: { name: localMatch.name, version: localMatch.version, components: [localMatch] },
150
+ resolvedName: localMatch.name,
151
+ resolvedVersion: localMatch.version,
152
+ };
153
+ }
154
+ // ── Step 2: Local npm package ────────────────────────────────────────────
155
+ triedSteps.push('npm-package');
156
+ const workspaceRoot = resolve(options.workspaceRoot ?? process.cwd());
157
+ const pkgJsonPath = join(workspaceRoot, 'node_modules', from, 'package.json');
158
+ if (existsSync(pkgJsonPath)) {
159
+ try {
160
+ const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
161
+ const pkgName = pkgJson['name'] ?? from;
162
+ const pkgVersion = pkgJson['version'] ?? effectiveVersion;
163
+ return {
164
+ fromName: from,
165
+ source: 'npm',
166
+ spec: { name: pkgName, version: pkgVersion },
167
+ resolvedName: pkgName,
168
+ resolvedVersion: pkgVersion,
169
+ packageSpecifier: pkgName,
170
+ };
171
+ }
172
+ catch {
173
+ // Malformed package.json — fall through to registry steps.
174
+ }
175
+ }
176
+ // ── Offline fence ────────────────────────────────────────────────────────
177
+ if (options.offline) {
178
+ throw new DependencyResolutionError(`Cannot resolve "${from}": not found as a local component or npm package, ` +
179
+ `and offline mode prevents registry lookup.\n` +
180
+ ` Tried: ${triedSteps.join(', ')}`, from, triedSteps);
181
+ }
182
+ const cacheDir = resolveCacheDir(options);
183
+ const refresh = shouldRefreshRegistry(options);
184
+ const key = cacheKey(from);
185
+ // ── Step 3: Registry library (Library.type: component) ───────────────────
186
+ triedSteps.push('registry-component');
187
+ const cachedComponent = readCache(cacheDir, key, refresh);
188
+ if (cachedComponent && cachedComponent.source === 'registry-component') {
189
+ return {
190
+ fromName: from,
191
+ source: 'registry-component',
192
+ spec: { name: cachedComponent.name, version: cachedComponent.version },
193
+ resolvedName: cachedComponent.name,
194
+ resolvedVersion: cachedComponent.version,
195
+ packageSpecifier: cachedComponent.name,
196
+ registryRef: { name: cachedComponent.name, version: cachedComponent.version },
197
+ };
198
+ }
199
+ const registryComponentResult = await fetchRegistryComponent(from, effectiveVersion);
200
+ if (registryComponentResult) {
201
+ const entry = {
202
+ cachedAt: new Date().toISOString(),
203
+ source: 'registry-component',
204
+ name: registryComponentResult.name,
205
+ version: registryComponentResult.version,
206
+ data: registryComponentResult,
207
+ };
208
+ writeCache(cacheDir, key, entry);
209
+ return {
210
+ fromName: from,
211
+ source: 'registry-component',
212
+ spec: { name: registryComponentResult.name, version: registryComponentResult.version },
213
+ resolvedName: registryComponentResult.name,
214
+ resolvedVersion: registryComponentResult.version,
215
+ packageSpecifier: registryComponentResult.name,
216
+ registryRef: { name: registryComponentResult.name, version: registryComponentResult.version },
217
+ };
218
+ }
219
+ // ── Step 4: Registry factory (Library.type: factory) ─────────────────────
220
+ triedSteps.push('registry-factory');
221
+ const factoryKey = `factory__${key}`;
222
+ const cachedFactory = readCache(cacheDir, factoryKey, refresh);
223
+ if (cachedFactory && cachedFactory.source === 'registry-factory') {
224
+ return {
225
+ fromName: from,
226
+ source: 'registry-factory',
227
+ spec: { name: cachedFactory.name, version: cachedFactory.version },
228
+ resolvedName: cachedFactory.name,
229
+ resolvedVersion: cachedFactory.version,
230
+ packageSpecifier: cachedFactory.name,
231
+ registryRef: { name: cachedFactory.name, version: cachedFactory.version },
232
+ };
233
+ }
234
+ const registryFactoryResult = await fetchRegistryFactory(from);
235
+ if (registryFactoryResult) {
236
+ const entry = {
237
+ cachedAt: new Date().toISOString(),
238
+ source: 'registry-factory',
239
+ name: registryFactoryResult.name,
240
+ version: registryFactoryResult.version,
241
+ data: registryFactoryResult,
242
+ };
243
+ writeCache(cacheDir, factoryKey, entry);
244
+ return {
245
+ fromName: from,
246
+ source: 'registry-factory',
247
+ spec: { name: registryFactoryResult.name, version: registryFactoryResult.version },
248
+ resolvedName: registryFactoryResult.name,
249
+ resolvedVersion: registryFactoryResult.version,
250
+ packageSpecifier: registryFactoryResult.name,
251
+ registryRef: { name: registryFactoryResult.name, version: registryFactoryResult.version },
252
+ };
253
+ }
254
+ // ── Nothing resolved ─────────────────────────────────────────────────────
255
+ throw new DependencyResolutionError(`Cannot resolve "${from}" (version: "${effectiveVersion}"): ` +
256
+ `exhausted all 4 lookup steps with no match.\n` +
257
+ ` Tried: ${triedSteps.join(' → ')}\n` +
258
+ ` Hint: check the component name, npm package name, or registry entry for "${from}".`, from, triedSteps);
259
+ }
260
+ async resolveCapability(capability, options = { spec: { components: [], deployments: [], manifests: [] } }) {
261
+ if (options.offline) {
262
+ // In offline mode we cannot query the registry for capability matches.
263
+ return null;
264
+ }
265
+ const cacheDir = resolveCacheDir(options);
266
+ const refresh = shouldRefreshRegistry(options);
267
+ const key = `capability__${cacheKey(capability)}`;
268
+ // Check cache first.
269
+ const cached = readCache(cacheDir, key, refresh);
270
+ if (cached && cached.source === 'registry-factory') {
271
+ return {
272
+ name: cached.name,
273
+ version: cached.version,
274
+ metadata: cached.data,
275
+ };
276
+ }
277
+ // TODO(v2-p3-round2): real HTTP call stubbed below.
278
+ const result = await fetchRegistryFactory(capability);
279
+ if (result) {
280
+ const entry = {
281
+ cachedAt: new Date().toISOString(),
282
+ source: 'registry-factory',
283
+ name: result.name,
284
+ version: result.version,
285
+ data: result,
286
+ };
287
+ writeCache(cacheDir, key, entry);
288
+ return { name: result.name, version: result.version, metadata: result.metadata };
289
+ }
290
+ return null;
291
+ }
292
+ }
293
+ // ============================================================================
294
+ // Factory function (public API)
295
+ // ============================================================================
296
+ /**
297
+ * Create a `DependencyResolver` instance.
298
+ *
299
+ * The resolver is stateless between realize runs. A new instance should be
300
+ * created per-run (or per test) to avoid cross-run cache pollution in memory.
301
+ * On-disk cache in `<cacheDir>/registry-cache/` persists across runs and is
302
+ * shared across instances that use the same directory.
303
+ */
304
+ export function createDependencyResolver() {
305
+ return new DependencyResolverImpl();
306
+ }
307
+ //# sourceMappingURL=index.js.map