@ontrails/core 1.0.0-beta.12 → 1.0.0-beta.14

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 (139) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +65 -35
  3. package/README.md +21 -20
  4. package/dist/context.d.ts +1 -1
  5. package/dist/context.d.ts.map +1 -1
  6. package/dist/context.js +5 -4
  7. package/dist/context.js.map +1 -1
  8. package/dist/derive.d.ts +14 -3
  9. package/dist/derive.d.ts.map +1 -1
  10. package/dist/derive.js +36 -12
  11. package/dist/derive.js.map +1 -1
  12. package/dist/draft.d.ts +28 -0
  13. package/dist/draft.d.ts.map +1 -0
  14. package/dist/draft.js +156 -0
  15. package/dist/draft.js.map +1 -0
  16. package/dist/event.d.ts +4 -41
  17. package/dist/event.d.ts.map +1 -1
  18. package/dist/event.js +4 -14
  19. package/dist/event.js.map +1 -1
  20. package/dist/execute.d.ts +10 -10
  21. package/dist/execute.d.ts.map +1 -1
  22. package/dist/execute.js +35 -28
  23. package/dist/execute.js.map +1 -1
  24. package/dist/gate.d.ts +17 -0
  25. package/dist/gate.d.ts.map +1 -0
  26. package/dist/gate.js +21 -0
  27. package/dist/gate.js.map +1 -0
  28. package/dist/index.d.ts +16 -9
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +14 -9
  31. package/dist/index.js.map +1 -1
  32. package/dist/internal/topo-saves.d.ts +47 -0
  33. package/dist/internal/topo-saves.d.ts.map +1 -0
  34. package/dist/internal/topo-saves.js +310 -0
  35. package/dist/internal/topo-saves.js.map +1 -0
  36. package/dist/internal/topo-store-read.d.ts +67 -0
  37. package/dist/internal/topo-store-read.d.ts.map +1 -0
  38. package/dist/internal/topo-store-read.js +222 -0
  39. package/dist/internal/topo-store-read.js.map +1 -0
  40. package/dist/internal/topo-store.d.ts +12 -0
  41. package/dist/internal/topo-store.d.ts.map +1 -0
  42. package/dist/internal/topo-store.js +571 -0
  43. package/dist/internal/topo-store.js.map +1 -0
  44. package/dist/internal/trails-db.d.ts +16 -0
  45. package/dist/internal/trails-db.d.ts.map +1 -0
  46. package/dist/internal/trails-db.js +118 -0
  47. package/dist/internal/trails-db.js.map +1 -0
  48. package/dist/layer.d.ts +5 -16
  49. package/dist/layer.d.ts.map +1 -1
  50. package/dist/layer.js +3 -20
  51. package/dist/layer.js.map +1 -1
  52. package/dist/provision-config.d.ts +22 -0
  53. package/dist/provision-config.d.ts.map +1 -0
  54. package/dist/provision-config.js +210 -0
  55. package/dist/provision-config.js.map +1 -0
  56. package/dist/provision.d.ts +71 -0
  57. package/dist/provision.d.ts.map +1 -0
  58. package/dist/provision.js +56 -0
  59. package/dist/provision.js.map +1 -0
  60. package/dist/run.d.ts +27 -0
  61. package/dist/run.d.ts.map +1 -0
  62. package/dist/run.js +34 -0
  63. package/dist/run.js.map +1 -0
  64. package/dist/service-config.d.ts +7 -7
  65. package/dist/service-config.d.ts.map +1 -1
  66. package/dist/service-config.js +75 -73
  67. package/dist/service-config.js.map +1 -1
  68. package/dist/service.d.ts +32 -36
  69. package/dist/service.d.ts.map +1 -1
  70. package/dist/service.js +21 -21
  71. package/dist/service.js.map +1 -1
  72. package/dist/signal.d.ts +33 -0
  73. package/dist/signal.d.ts.map +1 -0
  74. package/dist/signal.js +17 -0
  75. package/dist/signal.js.map +1 -0
  76. package/dist/topo-store.d.ts +48 -0
  77. package/dist/topo-store.d.ts.map +1 -0
  78. package/dist/topo-store.js +175 -0
  79. package/dist/topo-store.js.map +1 -0
  80. package/dist/topo.d.ts +10 -10
  81. package/dist/topo.d.ts.map +1 -1
  82. package/dist/topo.js +48 -35
  83. package/dist/topo.js.map +1 -1
  84. package/dist/trail.d.ts +16 -16
  85. package/dist/trail.d.ts.map +1 -1
  86. package/dist/trail.js +5 -4
  87. package/dist/trail.js.map +1 -1
  88. package/dist/types.d.ts +10 -10
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/types.js +2 -2
  91. package/dist/types.js.map +1 -1
  92. package/dist/validate-established-topo.d.ts +76 -0
  93. package/dist/validate-established-topo.d.ts.map +1 -0
  94. package/dist/validate-established-topo.js +43 -0
  95. package/dist/validate-established-topo.js.map +1 -0
  96. package/dist/validate-topo.d.ts +2 -2
  97. package/dist/validate-topo.d.ts.map +1 -1
  98. package/dist/validate-topo.js +34 -32
  99. package/dist/validate-topo.js.map +1 -1
  100. package/package.json +4 -1
  101. package/src/__tests__/context.test.ts +8 -8
  102. package/src/__tests__/derive.test.ts +58 -1
  103. package/src/__tests__/execute.test.ts +124 -122
  104. package/src/__tests__/{layer.test.ts → gate.test.ts} +26 -26
  105. package/src/__tests__/{dispatch.test.ts → run.test.ts} +39 -39
  106. package/src/__tests__/service-config.test.ts +41 -37
  107. package/src/__tests__/service.test.ts +71 -71
  108. package/src/__tests__/{event.test.ts → signal.test.ts} +15 -15
  109. package/src/__tests__/topo-store-read.test.ts +251 -0
  110. package/src/__tests__/topo-store.test.ts +469 -0
  111. package/src/__tests__/topo.test.ts +54 -54
  112. package/src/__tests__/trail-permit.test.ts +4 -4
  113. package/src/__tests__/trail.test.ts +58 -58
  114. package/src/__tests__/trails-db.test.ts +191 -0
  115. package/src/__tests__/type-utils.test.ts +3 -3
  116. package/src/__tests__/validate-topo.test.ts +205 -38
  117. package/src/context.ts +5 -4
  118. package/src/derive.ts +47 -16
  119. package/src/draft.ts +334 -0
  120. package/src/event.ts +11 -73
  121. package/src/execute.ts +56 -40
  122. package/src/{layer.ts → gate.ts} +13 -13
  123. package/src/index.ts +54 -23
  124. package/src/internal/topo-saves.ts +429 -0
  125. package/src/internal/topo-store-read.ts +473 -0
  126. package/src/internal/topo-store.ts +1087 -0
  127. package/src/internal/trails-db.ts +189 -0
  128. package/src/{service-config.ts → provision-config.ts} +124 -105
  129. package/src/provision.ts +148 -0
  130. package/src/{dispatch.ts → run.ts} +8 -8
  131. package/src/signal.ts +65 -0
  132. package/src/topo-store.ts +301 -0
  133. package/src/topo.ts +74 -52
  134. package/src/trail.ts +23 -22
  135. package/src/types.ts +11 -11
  136. package/src/validate-established-topo.ts +63 -0
  137. package/src/validate-topo.ts +38 -34
  138. package/tsconfig.tsbuildinfo +1 -1
  139. package/src/service.ts +0 -145
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AASrC,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,IAAU,EACV,EAAU,EACV,KAAc,EACd,OAAoB,EACa,EAAE;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,OAAO,CACpB,MAAM,CAAC,GAAG,CACR,IAAI,aAAa,CAAC,UAAU,EAAE,wBAAwB,IAAI,CAAC,IAAI,GAAG,CAAC,CACpE,CACF,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC"}
@@ -1,22 +1,22 @@
1
1
  /**
2
- * Service resolution pipeline.
2
+ * Provision resolution pipeline.
3
3
  *
4
4
  * Extracted from execute.ts to keep both modules under the 400 LOC ceiling.
5
5
  * Handles config validation, singleton caching, concurrent-creation dedup,
6
- * and the full resolve-or-create flow for declared services.
6
+ * and the full resolve-or-create flow for declared provisions.
7
7
  */
8
- import type { ServiceOverrideMap } from './service.js';
8
+ import type { ProvisionOverrideMap } from './service.js';
9
9
  import type { AnyTrail } from './trail.js';
10
10
  import type { TrailContext } from './types.js';
11
11
  import { Result } from './result.js';
12
12
  type ConfigValues = Readonly<Record<string, Record<string, unknown>>>;
13
13
  /**
14
- * Resolve all declared services for a trail.
14
+ * Resolve all declared provisions for a trail.
15
15
  *
16
- * Validates per-service config, checks overrides and caches, and creates
17
- * new instances as needed. Returns an enriched context with all service
16
+ * Validates per-provision config, checks overrides and caches, and creates
17
+ * new instances as needed. Returns an enriched context with all provision
18
18
  * instances injected into extensions.
19
19
  */
20
- export declare const resolveServices: (trail: AnyTrail, ctx: TrailContext, overrides?: ServiceOverrideMap, configValues?: ConfigValues) => Promise<Result<TrailContext, Error>>;
20
+ export declare const resolveProvisions: (trail: AnyTrail, ctx: TrailContext, overrides?: ProvisionOverrideMap, configValues?: ConfigValues) => Promise<Result<TrailContext, Error>>;
21
21
  export {};
22
22
  //# sourceMappingURL=service-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-config.d.ts","sourceRoot":"","sources":["../src/service-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,KAAK,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAwStE;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,QAAQ,EACf,KAAK,YAAY,EACjB,YAAY,kBAAkB,EAC9B,eAAe,YAAY,KAC1B,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAqBrC,CAAC"}
1
+ {"version":3,"file":"service-config.d.ts","sourceRoot":"","sources":["../src/service-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAGV,oBAAoB,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,KAAK,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AA0TtE;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,QAAQ,EACf,KAAK,YAAY,EACjB,YAAY,oBAAoB,EAChC,eAAe,YAAY,KAC1B,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAsBrC,CAAC"}
@@ -1,29 +1,29 @@
1
1
  /**
2
- * Service resolution pipeline.
2
+ * Provision resolution pipeline.
3
3
  *
4
4
  * Extracted from execute.ts to keep both modules under the 400 LOC ceiling.
5
5
  * Handles config validation, singleton caching, concurrent-creation dedup,
6
- * and the full resolve-or-create flow for declared services.
6
+ * and the full resolve-or-create flow for declared provisions.
7
7
  */
8
8
  import { InternalError, ValidationError } from './errors.js';
9
9
  import { Result } from './result.js';
10
- import { createServiceLookup } from './service.js';
10
+ import { createProvisionLookup } from './service.js';
11
11
  // ---------------------------------------------------------------------------
12
12
  // Singleton caches
13
13
  // ---------------------------------------------------------------------------
14
- const singletonServices = new WeakMap();
15
- /** In-flight service creation promises, keyed by service x context. */
14
+ const singletonProvisions = new WeakMap();
15
+ /** In-flight provision creation promises, keyed by provision x context. */
16
16
  const pendingCreations = new WeakMap();
17
17
  // ---------------------------------------------------------------------------
18
18
  // Context helpers
19
19
  // ---------------------------------------------------------------------------
20
- const toServiceContext = (ctx, config) => ({
20
+ const toProvisionContext = (ctx, config) => ({
21
21
  config,
22
22
  cwd: ctx.cwd,
23
23
  env: ctx.env,
24
24
  workspaceRoot: ctx.workspaceRoot,
25
25
  });
26
- const toServiceContextKey = (ctx) => JSON.stringify({
26
+ const toProvisionContextKey = (ctx) => JSON.stringify({
27
27
  config: ctx.config,
28
28
  cwd: ctx.cwd,
29
29
  env: Object.entries(ctx.env ?? {}).toSorted(([left], [right]) => left.localeCompare(right)),
@@ -32,31 +32,31 @@ const toServiceContextKey = (ctx) => JSON.stringify({
32
32
  // ---------------------------------------------------------------------------
33
33
  // Config validation
34
34
  // ---------------------------------------------------------------------------
35
- /** Validate and resolve a service's config from the provided configValues map. */
36
- const resolveServiceConfig = (declaredService, configValues) => {
37
- if (declaredService.config === undefined) {
35
+ /** Validate and resolve a provision's config from the provided configValues map. */
36
+ const resolveProvisionConfig = (declaredProvision, configValues) => {
37
+ if (declaredProvision.config === undefined) {
38
38
  return Result.ok();
39
39
  }
40
- const raw = configValues?.[declaredService.id];
40
+ const raw = configValues?.[declaredProvision.id];
41
41
  if (raw === undefined) {
42
- return Result.err(new ValidationError(`Service "${declaredService.id}" declares a config schema but no config was provided`));
42
+ return Result.err(new ValidationError(`Provision "${declaredProvision.id}" declares a config schema but no config was provided`));
43
43
  }
44
- const parsed = declaredService.config.safeParse(raw);
44
+ const parsed = declaredProvision.config.safeParse(raw);
45
45
  if (!parsed.success) {
46
- return Result.err(new ValidationError(`Service "${declaredService.id}" config validation failed: ${parsed.error.message}`));
46
+ return Result.err(new ValidationError(`Provision "${declaredProvision.id}" config validation failed: ${parsed.error.message}`));
47
47
  }
48
48
  return Result.ok(parsed.data);
49
49
  };
50
50
  // ---------------------------------------------------------------------------
51
51
  // Override / cache lookups
52
52
  // ---------------------------------------------------------------------------
53
- const hasOwnServiceOverride = (overrides, id) => overrides !== undefined && Object.hasOwn(overrides, id);
54
- const getCachedSingletonService = (declaredService, serviceContext) => {
55
- const scopedCache = singletonServices.get(declaredService);
53
+ const hasOwnProvisionOverride = (overrides, id) => overrides !== undefined && Object.hasOwn(overrides, id);
54
+ const getCachedSingletonProvision = (declaredProvision, provisionContext) => {
55
+ const scopedCache = singletonProvisions.get(declaredProvision);
56
56
  if (scopedCache === undefined) {
57
57
  return { found: false, value: undefined };
58
58
  }
59
- const key = toServiceContextKey(serviceContext);
59
+ const key = toProvisionContextKey(provisionContext);
60
60
  if (!scopedCache.has(key)) {
61
61
  return { found: false, value: undefined };
62
62
  }
@@ -65,144 +65,146 @@ const getCachedSingletonService = (declaredService, serviceContext) => {
65
65
  value: scopedCache.get(key),
66
66
  };
67
67
  };
68
- const getProvidedService = (ctx, overrides, declaredService, serviceContext) => {
69
- const { id } = declaredService;
70
- if (hasOwnServiceOverride(overrides, id)) {
68
+ const getProvidedProvision = (ctx, overrides, declaredProvision, provisionContext) => {
69
+ const { id } = declaredProvision;
70
+ if (hasOwnProvisionOverride(overrides, id)) {
71
71
  return Result.ok(overrides[id]);
72
72
  }
73
73
  if (Object.hasOwn(ctx.extensions ?? {}, id)) {
74
74
  return Result.ok(ctx.extensions?.[id]);
75
75
  }
76
- const cached = getCachedSingletonService(declaredService, serviceContext);
76
+ const cached = getCachedSingletonProvision(declaredProvision, provisionContext);
77
77
  if (cached.found) {
78
78
  return Result.ok(cached.value);
79
79
  }
80
80
  return undefined;
81
81
  };
82
- const getOverrideOrExtension = (ctx, overrides, declaredService) => getProvidedService(ctx, overrides, declaredService, toServiceContext(ctx));
83
- const resolveConfigAwareProvidedService = (ctx, declaredService, configValues) => {
84
- const configResult = resolveServiceConfig(declaredService, configValues);
82
+ const getOverrideOrExtension = (ctx, overrides, declaredProvision) => getProvidedProvision(ctx, overrides, declaredProvision, toProvisionContext(ctx));
83
+ const resolveConfigAwareProvidedProvision = (ctx, declaredProvision, configValues) => {
84
+ const configResult = resolveProvisionConfig(declaredProvision, configValues);
85
85
  if (configResult.isErr()) {
86
86
  return configResult;
87
87
  }
88
- const serviceContext = toServiceContext(ctx, configResult.value);
89
- const provided = getProvidedService(ctx, undefined, declaredService, serviceContext);
88
+ const provisionContext = toProvisionContext(ctx, configResult.value);
89
+ const provided = getProvidedProvision(ctx, undefined, declaredProvision, provisionContext);
90
90
  return provided
91
91
  ? Result.ok({ kind: 'provided', value: provided.unwrap() })
92
- : Result.ok({ kind: 'context', serviceContext });
92
+ : Result.ok({ kind: 'context', provisionContext });
93
93
  };
94
94
  // ---------------------------------------------------------------------------
95
95
  // Instance creation
96
96
  // ---------------------------------------------------------------------------
97
- const toInternalServiceError = (id, error) => {
97
+ const toInternalProvisionError = (id, error) => {
98
98
  const cause = error instanceof Error ? error : undefined;
99
99
  const message = cause?.message ?? String(error);
100
- return new InternalError(`Service "${id}" failed to resolve: ${message}`, {
100
+ return new InternalError(`Provision "${id}" failed to resolve: ${message}`, {
101
101
  ...(cause ? { cause } : {}),
102
- context: { serviceId: id },
102
+ context: { provisionId: id },
103
103
  });
104
104
  };
105
- const getSingletonServiceCache = (declaredService) => {
106
- const existing = singletonServices.get(declaredService);
105
+ const getSingletonProvisionCache = (declaredProvision) => {
106
+ const existing = singletonProvisions.get(declaredProvision);
107
107
  if (existing !== undefined) {
108
108
  return existing;
109
109
  }
110
110
  const created = new Map();
111
- singletonServices.set(declaredService, created);
111
+ singletonProvisions.set(declaredProvision, created);
112
112
  return created;
113
113
  };
114
- const doCreateServiceInstance = async (declaredService, serviceContext) => {
114
+ const doCreateProvisionInstance = async (declaredProvision, provisionContext) => {
115
115
  try {
116
- const created = await declaredService.create(serviceContext);
116
+ const created = await declaredProvision.create(provisionContext);
117
117
  if (created.isErr()) {
118
118
  return Result.err(created.error);
119
119
  }
120
120
  const instance = created.unwrap();
121
- getSingletonServiceCache(declaredService).set(toServiceContextKey(serviceContext), instance);
121
+ getSingletonProvisionCache(declaredProvision).set(toProvisionContextKey(provisionContext), instance);
122
122
  return Result.ok(instance);
123
123
  }
124
124
  catch (error) {
125
- return Result.err(toInternalServiceError(declaredService.id, error));
125
+ return Result.err(toInternalProvisionError(declaredProvision.id, error));
126
126
  }
127
127
  };
128
- const trackPendingCreation = (declaredService, key, promise) => {
129
- const pending = pendingCreations.get(declaredService);
128
+ const trackPendingCreation = (declaredProvision, key, promise) => {
129
+ const pending = pendingCreations.get(declaredProvision);
130
130
  if (pending) {
131
131
  pending.set(key, promise);
132
132
  }
133
133
  else {
134
- pendingCreations.set(declaredService, new Map([[key, promise]]));
134
+ pendingCreations.set(declaredProvision, new Map([[key, promise]]));
135
135
  }
136
136
  };
137
137
  /**
138
- * Deduplicates concurrent creation of the same service singleton.
139
- * If a creation is already in flight for this service x context key,
138
+ * Deduplicates concurrent creation of the same provision singleton.
139
+ * If a creation is already in flight for this provision x context key,
140
140
  * returns the existing promise instead of spawning a second factory call.
141
141
  */
142
- const createServiceInstance = async (declaredService, serviceContext) => {
143
- const key = toServiceContextKey(serviceContext);
144
- const inflight = pendingCreations.get(declaredService)?.get(key);
142
+ const createProvisionInstance = async (declaredProvision, provisionContext) => {
143
+ const key = toProvisionContextKey(provisionContext);
144
+ const inflight = pendingCreations.get(declaredProvision)?.get(key);
145
145
  if (inflight) {
146
146
  return inflight;
147
147
  }
148
- const promise = doCreateServiceInstance(declaredService, serviceContext);
149
- trackPendingCreation(declaredService, key, promise);
148
+ const promise = doCreateProvisionInstance(declaredProvision, provisionContext);
149
+ trackPendingCreation(declaredProvision, key, promise);
150
150
  try {
151
151
  return await promise;
152
152
  }
153
153
  finally {
154
- pendingCreations.get(declaredService)?.delete(key);
154
+ pendingCreations.get(declaredProvision)?.delete(key);
155
155
  }
156
156
  };
157
- /** Validate config and resolve a single declared service. */
158
- const resolveDeclaredService = async (declaredService, ctx, overrides, configValues) => {
157
+ /** Validate config and resolve a single declared provision. */
158
+ const resolveDeclaredProvision = async (declaredProvision, ctx, overrides, configValues) => {
159
159
  // Check overrides/extensions first — skip config validation entirely when
160
- // a service instance is already provided.
161
- const overrideOrExtension = getOverrideOrExtension(ctx, overrides, declaredService);
160
+ // a provision instance is already provided.
161
+ const overrideOrExtension = getOverrideOrExtension(ctx, overrides, declaredProvision);
162
162
  if (overrideOrExtension !== undefined) {
163
163
  return overrideOrExtension;
164
164
  }
165
165
  // Resolve config before consulting the singleton cache so config-aware
166
- // services use the same canonical context for cache reads and writes.
167
- const configAwareService = resolveConfigAwareProvidedService(ctx, declaredService, configValues);
168
- if (configAwareService.isErr()) {
169
- return configAwareService;
166
+ // provisions use the same canonical context for cache reads and writes.
167
+ const configAwareProvision = resolveConfigAwareProvidedProvision(ctx, declaredProvision, configValues);
168
+ if (configAwareProvision.isErr()) {
169
+ return configAwareProvision;
170
170
  }
171
171
  // No provided instance — create via factory.
172
- const resolved = configAwareService.unwrap();
172
+ const resolved = configAwareProvision.unwrap();
173
173
  if (resolved.kind === 'provided') {
174
174
  return Result.ok(resolved.value);
175
175
  }
176
- return await createServiceInstance(declaredService, resolved.serviceContext);
176
+ return await createProvisionInstance(declaredProvision, resolved.provisionContext);
177
177
  };
178
178
  // ---------------------------------------------------------------------------
179
- // Full trail service resolution
179
+ // Full trail provision resolution
180
180
  // ---------------------------------------------------------------------------
181
- const withResolvedServices = (ctx, resolvedServices) => {
182
- const extensions = { ...ctx.extensions, ...resolvedServices };
181
+ const withResolvedProvisions = (ctx, resolvedProvisions) => {
182
+ const extensions = { ...ctx.extensions, ...resolvedProvisions };
183
183
  const resolvedCtx = { ...ctx, extensions };
184
- resolvedCtx.service = createServiceLookup(() => resolvedCtx);
184
+ const lookup = createProvisionLookup(() => resolvedCtx);
185
+ resolvedCtx.provision = lookup;
185
186
  return resolvedCtx;
186
187
  };
187
188
  /**
188
- * Resolve all declared services for a trail.
189
+ * Resolve all declared provisions for a trail.
189
190
  *
190
- * Validates per-service config, checks overrides and caches, and creates
191
- * new instances as needed. Returns an enriched context with all service
191
+ * Validates per-provision config, checks overrides and caches, and creates
192
+ * new instances as needed. Returns an enriched context with all provision
192
193
  * instances injected into extensions.
193
194
  */
194
- export const resolveServices = async (trail, ctx, overrides, configValues) => {
195
- if (trail.services.length === 0) {
195
+ export const resolveProvisions = async (trail, ctx, overrides, configValues) => {
196
+ const provisions = trail.provisions;
197
+ if (provisions.length === 0) {
196
198
  return Result.ok(ctx);
197
199
  }
198
- const resolvedServices = {};
199
- for (const declaredService of trail.services) {
200
- const resolved = await resolveDeclaredService(declaredService, ctx, overrides, configValues);
200
+ const resolvedProvisions = {};
201
+ for (const declaredProvision of provisions) {
202
+ const resolved = await resolveDeclaredProvision(declaredProvision, ctx, overrides, configValues);
201
203
  if (resolved.isErr()) {
202
204
  return resolved;
203
205
  }
204
- resolvedServices[declaredService.id] = resolved.unwrap();
206
+ resolvedProvisions[declaredProvision.id] = resolved.unwrap();
205
207
  }
206
- return Result.ok(withResolvedServices(ctx, resolvedServices));
208
+ return Result.ok(withResolvedProvisions(ctx, resolvedProvisions));
207
209
  };
208
210
  //# sourceMappingURL=service-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-config.js","sourceRoot":"","sources":["../src/service-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-config.js","sourceRoot":"","sources":["../src/service-config.ts"],"names":[],"mappings":"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"}
package/dist/service.d.ts CHANGED
@@ -1,31 +1,31 @@
1
1
  import type { Result } from './result.js';
2
- import type { ServiceLookup, TrailContext } from './types.js';
2
+ import type { ProvisionLookup, TrailContext } from './types.js';
3
3
  import type { z } from 'zod';
4
4
  /**
5
- * Stable process-scoped fields available when constructing a service.
5
+ * Stable process-scoped fields available when constructing a provision.
6
6
  *
7
- * Services are app-level singletons, so they intentionally do not receive the
8
- * full per-request TrailContext. When a service declares a `config` schema,
7
+ * Provisions are app-level singletons, so they intentionally do not receive
8
+ * the full per-request TrailContext. When a provision declares a `config` schema,
9
9
  * the validated config is passed as `svc.config`.
10
10
  */
11
- export type ServiceContext<C = unknown> = Pick<TrailContext, 'cwd' | 'env' | 'workspaceRoot'> & {
11
+ export type ProvisionContext<C = unknown> = Pick<TrailContext, 'cwd' | 'env' | 'workspaceRoot'> & {
12
12
  readonly config: C;
13
13
  };
14
14
  /**
15
- * Everything needed to describe a service before a factory is introduced.
15
+ * Everything needed to describe a provision before a factory is introduced.
16
16
  *
17
17
  * When `config` is a Zod schema, the `create` callback receives
18
- * `ServiceContext<C>` with the validated config value.
18
+ * `ProvisionContext<C>` with the validated config value.
19
19
  */
20
- export interface ServiceSpec<T, C = unknown> {
21
- /** Create the service instance from stable process-scoped context. */
22
- readonly create: (svc: ServiceContext<C>) => Result<T, Error> | Promise<Result<T, Error>>;
20
+ export interface ProvisionSpec<T, C = unknown> {
21
+ /** Create the provision instance from stable process-scoped context. */
22
+ readonly create: (svc: ProvisionContext<C>) => Result<T, Error> | Promise<Result<T, Error>>;
23
23
  /** Config schema — when present, config is validated and passed to `create`. */
24
24
  readonly config?: z.ZodType<C> | undefined;
25
25
  /** Optional cleanup performed when the hosting surface shuts down. */
26
- readonly dispose?: ((service: T) => void | Promise<void>) | undefined;
26
+ readonly dispose?: ((provision: T) => void | Promise<void>) | undefined;
27
27
  /** Optional operational readiness probe for introspection tooling. */
28
- readonly health?: ((service: T) => Result<unknown, Error> | Promise<Result<unknown, Error>>) | undefined;
28
+ readonly health?: ((provision: T) => Result<unknown, Error> | Promise<Result<unknown, Error>>) | undefined;
29
29
  /** Optional test factory used by higher-level helpers. */
30
30
  readonly mock?: (() => T | Promise<T>) | undefined;
31
31
  /** Human-readable description. */
@@ -33,43 +33,39 @@ export interface ServiceSpec<T, C = unknown> {
33
33
  /** Arbitrary metadata for tooling and filtering. */
34
34
  readonly metadata?: Readonly<Record<string, unknown>> | undefined;
35
35
  }
36
- /**
37
- * A typed service definition.
38
- *
39
- * TRL-73 introduces the structural contract only. The `service()` factory and
40
- * runtime helpers land in follow-up branches.
41
- */
42
- export interface Service<T> extends ServiceSpec<T> {
43
- readonly kind: 'service';
36
+ /** A typed provision definition. */
37
+ export interface Provision<T> extends ProvisionSpec<T> {
38
+ readonly kind: 'provision';
44
39
  readonly id: string;
45
- /** Read the resolved service instance from a trail context. */
40
+ /** Read the resolved provision instance from a trail context. */
46
41
  from(ctx: TrailContext): T;
47
42
  }
48
43
  /**
49
- * Existential type for heterogeneous service collections.
44
+ * Existential type for heterogeneous provision collections.
50
45
  *
51
- * `Service<T>` includes function parameters in `dispose`/`health`, so `unknown`
52
- * is too narrow for mixed service arrays. `any` is the correct existential here.
46
+ * `Provision<T>` includes function parameters in `dispose`/`health`, so
47
+ * `unknown` is too narrow for mixed provision arrays. `any` is the correct
48
+ * existential here.
53
49
  */
54
- export type AnyService = Service<any>;
55
- /** Explicit runtime overrides keyed by service ID. */
56
- export type ServiceOverrideMap = Readonly<Record<string, unknown>>;
57
- /** Create a `ctx.service(...)` accessor bound to a concrete context snapshot. */
58
- export declare const createServiceLookup: (getContext: () => Pick<TrailContext, "extensions">) => ServiceLookup;
50
+ export type AnyProvision = Provision<any>;
51
+ /** Explicit runtime overrides keyed by provision ID. */
52
+ export type ProvisionOverrideMap = Readonly<Record<string, unknown>>;
53
+ /** Create a `ctx.provision(...)` accessor bound to a concrete context snapshot. */
54
+ export declare const createProvisionLookup: (getContext: () => Pick<TrailContext, "extensions">) => ProvisionLookup;
59
55
  /**
60
- * Create a typed service definition.
56
+ * Create a typed provision definition.
61
57
  *
62
- * The service object is inert until a later execution branch resolves concrete
58
+ * The provision object is inert until a later execution branch resolves concrete
63
59
  * instances into TrailContext extensions.
64
60
  */
65
- export declare const service: <T>(id: string, spec: ServiceSpec<T>) => Service<T>;
66
- /** Narrow unknown values to service definitions during topo discovery. */
67
- export declare const isService: (value: unknown) => value is AnyService;
61
+ export declare const provision: <T>(id: string, spec: ProvisionSpec<T>) => Provision<T>;
62
+ /** Narrow unknown values to provision definitions during topo discovery. */
63
+ export declare const isProvision: (value: unknown) => value is AnyProvision;
68
64
  /**
69
- * Return the first duplicate service ID in a collection, if any.
65
+ * Return the first duplicate provision ID in a collection, if any.
70
66
  *
71
67
  * This supports later topo registration without each caller duplicating the
72
68
  * same scan logic.
73
69
  */
74
- export declare const findDuplicateServiceId: (services: readonly Pick<AnyService, "id">[]) => string | undefined;
70
+ export declare const findDuplicateProvisionId: (provisions: readonly Pick<AnyProvision, "id">[]) => string | undefined;
75
71
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CAC5C,YAAY,EACZ,KAAK,GAAG,KAAK,GAAG,eAAe,CAChC,GAAG;IACF,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO;IACzC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,CACf,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,KACnB,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3C,sEAAsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACtE,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EACZ,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAC1E,SAAS,CAAC;IACd,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACnD,kCAAkC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CACnE;AAED;;;;;GAKG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,IAAI,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,CAAC;CAC5B;AAED;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAEtC,sDAAsD;AACtD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAmBnE,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,GAC9B,YAAY,MAAM,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,KACjD,aAQkB,CAAC;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,IAAI,MAAM,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CASnE,CAAC;AAEL,0EAA0E;AAC1E,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,UAMnD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,UAAU,SAAS,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,KAC1C,MAAM,GAAG,SASX,CAAC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CAC9C,YAAY,EACZ,KAAK,GAAG,KAAK,GAAG,eAAe,CAChC,GAAG;IACF,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO;IAC3C,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,CACf,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,KACrB,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3C,sEAAsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACxE,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EACZ,CAAC,CACC,SAAS,EAAE,CAAC,KACT,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAC9D,SAAS,CAAC;IACd,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACnD,kCAAkC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CACnE;AAED,oCAAoC;AACpC,MAAM,WAAW,SAAS,CAAC,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,CAAC;CAC5B;AAED;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;AAE1C,wDAAwD;AACxD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAqBrE,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,GAChC,YAAY,MAAM,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,KACjD,eAQoB,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EACzB,IAAI,MAAM,EACV,MAAM,aAAa,CAAC,CAAC,CAAC,KACrB,SAAS,CAAC,CAAC,CASV,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,YAMrD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,YAAY,SAAS,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,KAC9C,MAAM,GAAG,SASX,CAAC"}
package/dist/service.js CHANGED
@@ -1,51 +1,51 @@
1
1
  import { NotFoundError } from './errors.js';
2
- const getServiceId = (serviceOrId) => (typeof serviceOrId === 'string' ? serviceOrId : serviceOrId.id);
3
- const getServiceInstance = (ctx, serviceOrId) => {
4
- const id = getServiceId(serviceOrId);
2
+ const getProvisionId = (provisionOrId) => typeof provisionOrId === 'string' ? provisionOrId : provisionOrId.id;
3
+ const getProvisionInstance = (ctx, provisionOrId) => {
4
+ const id = getProvisionId(provisionOrId);
5
5
  return ctx.extensions?.[id];
6
6
  };
7
- const hasServiceInstance = (ctx, serviceOrId) => Object.hasOwn(ctx.extensions ?? {}, getServiceId(serviceOrId));
8
- /** Create a `ctx.service(...)` accessor bound to a concrete context snapshot. */
9
- export const createServiceLookup = (getContext) => ((serviceOrId) => {
10
- const id = getServiceId(serviceOrId);
7
+ const hasProvisionInstance = (ctx, provisionOrId) => Object.hasOwn(ctx.extensions ?? {}, getProvisionId(provisionOrId));
8
+ /** Create a `ctx.provision(...)` accessor bound to a concrete context snapshot. */
9
+ export const createProvisionLookup = (getContext) => ((provisionOrId) => {
10
+ const id = getProvisionId(provisionOrId);
11
11
  const ctx = getContext();
12
- if (!hasServiceInstance(ctx, id)) {
13
- throw new NotFoundError(`Service "${id}" not found in trail context`);
12
+ if (!hasProvisionInstance(ctx, id)) {
13
+ throw new NotFoundError(`Provision "${id}" not found in trail context`);
14
14
  }
15
- return getServiceInstance(ctx, id);
15
+ return getProvisionInstance(ctx, id);
16
16
  });
17
17
  /**
18
- * Create a typed service definition.
18
+ * Create a typed provision definition.
19
19
  *
20
- * The service object is inert until a later execution branch resolves concrete
20
+ * The provision object is inert until a later execution branch resolves concrete
21
21
  * instances into TrailContext extensions.
22
22
  */
23
- export const service = (id, spec) => Object.freeze({
23
+ export const provision = (id, spec) => Object.freeze({
24
24
  ...spec,
25
25
  from(ctx) {
26
- const lookup = ctx.service ?? createServiceLookup(() => ctx);
26
+ const lookup = ctx.provision ?? createProvisionLookup(() => ctx);
27
27
  return lookup(this);
28
28
  },
29
29
  id,
30
- kind: 'service',
30
+ kind: 'provision',
31
31
  });
32
- /** Narrow unknown values to service definitions during topo discovery. */
33
- export const isService = (value) => {
32
+ /** Narrow unknown values to provision definitions during topo discovery. */
33
+ export const isProvision = (value) => {
34
34
  if (typeof value !== 'object' || value === null) {
35
35
  return false;
36
36
  }
37
37
  const v = value;
38
- return v.kind === 'service' && typeof v.id === 'string';
38
+ return v.kind === 'provision' && typeof v.id === 'string';
39
39
  };
40
40
  /**
41
- * Return the first duplicate service ID in a collection, if any.
41
+ * Return the first duplicate provision ID in a collection, if any.
42
42
  *
43
43
  * This supports later topo registration without each caller duplicating the
44
44
  * same scan logic.
45
45
  */
46
- export const findDuplicateServiceId = (services) => {
46
+ export const findDuplicateProvisionId = (provisions) => {
47
47
  const seen = new Set();
48
- for (const candidate of services) {
48
+ for (const candidate of provisions) {
49
49
  if (seen.has(candidate.id)) {
50
50
  return candidate.id;
51
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuE5C,MAAM,YAAY,GAAG,CACnB,WAA4C,EACpC,EAAE,CAAC,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAE9E,MAAM,kBAAkB,GAAG,CACzB,GAAqC,EACrC,WAA4C,EACzC,EAAE;IACL,MAAM,EAAE,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACrC,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,CAAM,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CACzB,GAAqC,EACrC,WAA4C,EACnC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;AAE7E,iFAAiF;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,UAAkD,EACnC,EAAE,CACjB,CAAC,CAAC,WAA4C,EAAE,EAAE;IAChD,MAAM,EAAE,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,aAAa,CAAC,YAAY,EAAE,8BAA8B,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,kBAAkB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC,CAAkB,CAAC;AAEtB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAI,EAAU,EAAE,IAAoB,EAAc,EAAE,CACzE,MAAM,CAAC,MAAM,CAAC;IACZ,GAAG,IAAI;IACP,IAAI,CAAC,GAAiB;QACpB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,mBAAmB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,EAAE;IACF,IAAI,EAAE,SAAkB;CACzB,CAAC,CAAC;AAEL,0EAA0E;AAC1E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAuB,EAAE;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,CAAC,GAAG,KAAyC,CAAC;IACpD,OAAO,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;AAC1D,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,QAA2C,EACvB,EAAE;IACtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAqE5C,MAAM,cAAc,GAAG,CACrB,aAAgD,EACxC,EAAE,CACV,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;AAEvE,MAAM,oBAAoB,GAAG,CAC3B,GAAqC,EACrC,aAAgD,EAC7C,EAAE;IACL,MAAM,EAAE,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IACzC,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,CAAM,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,GAAqC,EACrC,aAAgD,EACvC,EAAE,CACX,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;AAErE,mFAAmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,UAAkD,EACjC,EAAE,CACnB,CAAC,CAAC,aAAgD,EAAE,EAAE;IACpD,MAAM,EAAE,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,8BAA8B,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,oBAAoB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC,CAAoB,CAAC;AAExB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,EAAU,EACV,IAAsB,EACR,EAAE,CAChB,MAAM,CAAC,MAAM,CAAC;IACZ,GAAG,IAAI;IACP,IAAI,CAAC,GAAiB;QACpB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,IAAI,qBAAqB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,EAAE;IACF,IAAI,EAAE,WAAoB;CAC3B,CAAC,CAAC;AAEL,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAyB,EAAE;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,CAAC,GAAG,KAAyC,CAAC;IACpD,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;AAC5D,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,UAA+C,EAC3B,EAAE;IACtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Signal — a named payload schema with optional provenance meta.
3
+ */
4
+ import type { z } from 'zod';
5
+ export interface SignalSpec<T> {
6
+ readonly payload: z.ZodType<T>;
7
+ readonly description?: string | undefined;
8
+ readonly meta?: Readonly<Record<string, unknown>> | undefined;
9
+ /** Trail IDs that produce this signal (e.g. the trails it originates from). */
10
+ readonly from?: readonly string[] | undefined;
11
+ }
12
+ export interface Signal<T> {
13
+ readonly id: string;
14
+ readonly kind: 'signal';
15
+ readonly payload: z.ZodType<T>;
16
+ readonly description?: string | undefined;
17
+ readonly meta?: Readonly<Record<string, unknown>> | undefined;
18
+ /** Trail IDs that produce this signal (e.g. the trails it originates from). */
19
+ readonly from?: readonly string[] | undefined;
20
+ }
21
+ /**
22
+ * Create a signal definition.
23
+ *
24
+ * A signal is a named payload schema describing something that happened.
25
+ * Returns a frozen object with `kind: "signal"` and all spec fields.
26
+ */
27
+ export declare function signal<T>(id: string, spec: SignalSpec<T>): Signal<T>;
28
+ export declare function signal<T>(spec: SignalSpec<T> & {
29
+ readonly id: string;
30
+ }): Signal<T>;
31
+ /** Existential type for heterogeneous signal collections */
32
+ export type AnySignal = Signal<unknown>;
33
+ //# sourceMappingURL=signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../src/signal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAM7B,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9D,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC/C;AAMD,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9D,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC/C;AAMD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,wBAAgB,MAAM,CAAC,CAAC,EACtB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5C,MAAM,CAAC,CAAC,CAAC,CAAC;AAkBb,4DAA4D;AAC5D,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC"}