@superbee/core 0.2.0-pre.19 → 0.2.0-pre.20

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 (47) hide show
  1. package/README.md +40 -18
  2. package/dist/connectors.d.ts +7 -0
  3. package/dist/connectors.d.ts.map +1 -1
  4. package/dist/connectors.js +17 -10
  5. package/dist/connectors.js.map +1 -1
  6. package/dist/recipe-lifecycle/errors.d.ts +17 -0
  7. package/dist/recipe-lifecycle/errors.d.ts.map +1 -1
  8. package/dist/recipe-lifecycle/errors.js +26 -0
  9. package/dist/recipe-lifecycle/errors.js.map +1 -1
  10. package/dist/recipe-lifecycle/evolution.d.ts +6 -2
  11. package/dist/recipe-lifecycle/evolution.d.ts.map +1 -1
  12. package/dist/recipe-lifecycle/evolution.js +132 -2
  13. package/dist/recipe-lifecycle/evolution.js.map +1 -1
  14. package/dist/recipe-lifecycle/index.d.ts +10 -9
  15. package/dist/recipe-lifecycle/index.d.ts.map +1 -1
  16. package/dist/recipe-lifecycle/index.js +9 -8
  17. package/dist/recipe-lifecycle/index.js.map +1 -1
  18. package/dist/recipe-lifecycle/install.d.ts +22 -7
  19. package/dist/recipe-lifecycle/install.d.ts.map +1 -1
  20. package/dist/recipe-lifecycle/install.js +102 -3
  21. package/dist/recipe-lifecycle/install.js.map +1 -1
  22. package/dist/recipe-lifecycle/stamp.d.ts +46 -19
  23. package/dist/recipe-lifecycle/stamp.d.ts.map +1 -1
  24. package/dist/recipe-lifecycle/stamp.js +97 -37
  25. package/dist/recipe-lifecycle/stamp.js.map +1 -1
  26. package/dist/recipes.d.ts +24 -1
  27. package/dist/recipes.d.ts.map +1 -1
  28. package/dist/recipes.js +132 -1
  29. package/dist/recipes.js.map +1 -1
  30. package/dist/search/backend-source.d.ts +6 -0
  31. package/dist/search/backend-source.d.ts.map +1 -0
  32. package/dist/search/backend-source.js +33 -0
  33. package/dist/search/backend-source.js.map +1 -0
  34. package/dist/search/index.d.ts +1 -0
  35. package/dist/search/index.d.ts.map +1 -1
  36. package/dist/search/index.js +1 -0
  37. package/dist/search/index.js.map +1 -1
  38. package/dist/search/memory-source.d.ts +11 -0
  39. package/dist/search/memory-source.d.ts.map +1 -1
  40. package/dist/search/memory-source.js +7 -2
  41. package/dist/search/memory-source.js.map +1 -1
  42. package/dist/search/search.d.ts.map +1 -1
  43. package/dist/search/search.js +25 -8
  44. package/dist/search/search.js.map +1 -1
  45. package/dist/source-harness/conformance.js +1 -1
  46. package/dist/source-harness/conformance.js.map +1 -1
  47. package/package.json +1 -1
@@ -1,8 +1,9 @@
1
- // Recipe install stamps. Every convention a recipe installs or evolves carries one `x_recipe`
2
- // record, written in the same compare-and-swap write as the convention, so the stamp exists
3
- // exactly when the convention does. A stamp holds only deterministic facts: two clones that apply
1
+ // Recipe install stamps. Every convention and Connector a recipe installs or evolves carries one
2
+ // `x_recipe` record, written in the same compare-and-swap write as the document, so the stamp
3
+ // exists exactly when the document does. A stamp holds only deterministic facts: two clones that apply
4
4
  // the same evolve write identical stamps. The read side derives each recipe's state from the
5
5
  // stamps alone, without the recipe source. Storage-neutral: no Node globals or builtins.
6
+ import { CONNECTOR_TYPE, CONNECTORS_PREFIX } from "../connectors.js";
6
7
  import { normalizeDocumentBodyForStorage } from "../frontmatter.js";
7
8
  import { CONVENTION_TYPE } from "../kinds.js";
8
9
  import { sha256Hex } from "../versioning.js";
@@ -61,8 +62,10 @@ function digest(value) {
61
62
  }
62
63
  /**
63
64
  * Digest of a recipe's parsed content, taken before edition materialization: its id, version,
64
- * conventions, View pairs and References, each sorted by id, bodies with CRLF read as LF. Equal
65
- * across editions, independent of how the recipe was acquired, and blind to README files.
65
+ * conventions, View pairs, References and (only when it carries any) Connectors, each sorted by id,
66
+ * bodies with CRLF read as LF. Equal across editions, independent of how the recipe was acquired,
67
+ * and blind to README files. A recipe without connectors digests exactly as it did before
68
+ * connectors existed, so every stamp written earlier stays current.
66
69
  */
67
70
  export function recipeSourceDigest(recipe) {
68
71
  const docs = [...recipe.docs]
@@ -74,7 +77,17 @@ export function recipeSourceDigest(recipe) {
74
77
  const references = [...recipe.references]
75
78
  .sort((a, b) => byCodeUnit(a.doc.id, b.doc.id))
76
79
  .map((reference) => [reference.doc.id, reference.doc.frontmatter, lf(reference.doc.body)]);
77
- return digest({ id: recipe.id, version: recipe.version, docs, pages, references });
80
+ const connectors = [...(recipe.connectors ?? [])]
81
+ .sort((a, b) => byCodeUnit(a.doc.id, b.doc.id))
82
+ .map((connector) => [connector.doc.id, connector.doc.frontmatter, lf(connector.doc.body)]);
83
+ return digest({
84
+ id: recipe.id,
85
+ version: recipe.version,
86
+ docs,
87
+ pages,
88
+ references,
89
+ ...(connectors.length > 0 ? { connectors } : {}),
90
+ });
78
91
  }
79
92
  /**
80
93
  * Digest of a convention as written, rules version 1: its frontmatter without the stripped keys
@@ -90,7 +103,11 @@ export function definitionDigest(doc) {
90
103
  function nonNegativeInteger(value) {
91
104
  return typeof value === "number" && Number.isInteger(value) && value >= 0;
92
105
  }
93
- /** The convention's stamp, or null unless it is a mapping whose every field has its type. */
106
+ /**
107
+ * The document's stamp, or null unless it is a mapping whose every required field has its type.
108
+ * The optional `connectors` count is kept when it is a non-negative integer and otherwise read as
109
+ * absent.
110
+ */
94
111
  export function readRecipeStamp(doc) {
95
112
  const value = doc.frontmatter[RECIPE_STAMP_KEY];
96
113
  if (value === null || typeof value !== "object" || Array.isArray(value))
@@ -107,6 +124,7 @@ export function readRecipeStamp(doc) {
107
124
  id: stamp.id,
108
125
  version: stamp.version,
109
126
  of: stamp.of,
127
+ ...(nonNegativeInteger(stamp.connectors) ? { connectors: stamp.connectors } : {}),
110
128
  source_digest: stamp.source_digest,
111
129
  definition: stamp.definition,
112
130
  digest_rules: stamp.digest_rules,
@@ -114,10 +132,12 @@ export function readRecipeStamp(doc) {
114
132
  }
115
133
  /** The recipe-level stamp facts for `recipe`; `materialized` supplies the declared count. */
116
134
  export function recipeStampIdentity(recipe, materialized) {
135
+ const connectors = (recipe.connectors ?? []).length;
117
136
  return {
118
137
  id: recipe.id,
119
138
  version: recipe.version,
120
139
  of: materialized.docs.length,
140
+ ...(connectors > 0 ? { connectors } : {}),
121
141
  source_digest: recipeSourceDigest(recipe),
122
142
  };
123
143
  }
@@ -128,20 +148,29 @@ export function withRecipeStamp(doc, identity) {
128
148
  id: identity.id,
129
149
  version: identity.version,
130
150
  of: identity.of,
151
+ ...(identity.connectors !== undefined ? { connectors: identity.connectors } : {}),
131
152
  source_digest: identity.source_digest,
132
153
  definition: definitionDigest({ frontmatter: frontmatter, body: doc.body }),
133
154
  digest_rules: DEFINITION_DIGEST_RULES,
134
155
  };
135
156
  return { ...doc, frontmatter: { ...frontmatter, [RECIPE_STAMP_KEY]: stamp } };
136
157
  }
137
- /** How the stamp on `doc` (null: no convention) relates to the recipe `identity` describes. */
158
+ /**
159
+ * How the stamp on `doc` (null: no document) relates to the recipe `identity` describes. The
160
+ * Connector count must match too: for a recipe that carries connectors a stamp without it is
161
+ * `stale`, and since no release writes the key for a recipe without connectors, every stamp such a
162
+ * recipe wrote reads as it did before the key existed.
163
+ */
138
164
  export function recipeStampState(doc, identity) {
139
165
  const stamp = doc === null ? null : readRecipeStamp(doc);
140
166
  if (stamp === null)
141
167
  return "missing";
142
168
  if (stamp.id !== identity.id)
143
169
  return "foreign";
144
- return stamp.version === identity.version && stamp.of === identity.of && stamp.source_digest === identity.source_digest
170
+ return stamp.version === identity.version
171
+ && stamp.of === identity.of
172
+ && stamp.source_digest === identity.source_digest
173
+ && stamp.connectors === identity.connectors
145
174
  ? "current"
146
175
  : "stale";
147
176
  }
@@ -152,7 +181,7 @@ export function worstRecipeStampState(states) {
152
181
  worst = Math.max(worst, STAMP_STATE_SEVERITY.indexOf(state));
153
182
  return STAMP_STATE_SEVERITY[worst];
154
183
  }
155
- /** One stamped convention's state: rules this release reads, and whether its digest still matches. */
184
+ /** One stamped document's state: rules this release reads, and whether its digest still matches. */
156
185
  export function conventionStampState(doc) {
157
186
  const stamp = readRecipeStamp(doc);
158
187
  if (stamp === null || stamp.digest_rules !== DEFINITION_DIGEST_RULES)
@@ -163,71 +192,94 @@ export function conventionStampState(doc) {
163
192
  function declarationFree(doc) {
164
193
  return !["fields", "sections", "links", "expects_inbound"].some((key) => Object.hasOwn(doc.frontmatter, key));
165
194
  }
195
+ /** A Connector declaration: the type core's connector parser owns, at the one place it reads it. */
196
+ function isConnectorDoc(doc) {
197
+ return doc.frontmatter.type === CONNECTOR_TYPE && doc.id.startsWith(CONNECTORS_PREFIX);
198
+ }
166
199
  /**
167
- * Each recipe's install state, derived from the stamps on `conventions` (documents of any other
168
- * type are ignored), and the conventions no recipe stamped. `known` recipes (their declared ids
169
- * are visible to the caller) also report a declared id that does not carry their stamp, and get
170
- * a row when an unstamped convention that declares something sits at one of their ids: a bundle
171
- * written before stamps. A declined Kind (a declaration-free record) or another recipe's stamp
172
- * at their ids alone is no evidence they were installed.
200
+ * Each recipe's install state, derived from the stamps on `docs` (conventions, and Connector
201
+ * documents under `connectors/`; documents of any other type are ignored), and the documents no
202
+ * recipe stamped. `known` recipes (their declared ids are visible to the caller) also report a
203
+ * declared id that does not carry their stamp, and get a row when an unstamped convention that
204
+ * declares something, or an unstamped Connector, sits at one of their ids: a bundle written before
205
+ * stamps. A declined Kind (a declaration-free record) or another recipe's stamp at their ids alone
206
+ * is no evidence they were installed.
173
207
  *
174
- * States, the first match winning: `unknown` when no convention carries the recipe's stamp;
175
- * `partial` when the stamps record more than one version or source digest, disagree on the
176
- * declared count, fall short of it, or (known recipes) a declared id is present without this
177
- * recipe's stamp; `diverged` when a stamped convention changed since the recipe wrote it;
178
- * `unknown` when a stamp uses digest rules this release does not read; otherwise `installed`.
208
+ * States, the first match winning: `unknown` when no document carries the recipe's stamp;
209
+ * `partial` when the stamps record more than one version or source digest, disagree on a declared
210
+ * count, fall short of the convention or Connector count, or (known recipes) a declared id is
211
+ * present without this recipe's stamp; `diverged` when a stamped document changed since the recipe
212
+ * wrote it; `unknown` when a stamp uses digest rules this release does not read; otherwise
213
+ * `installed`. A row carries the Connector keys only for a recipe whose stamps record connectors,
214
+ * so every other row reads as it did before connectors existed.
179
215
  */
180
- export function installedRecipes(conventions, known = []) {
216
+ export function installedRecipes(docs, known = []) {
181
217
  const present = new Map();
182
218
  const stampedByRecipe = new Map();
183
219
  const unstamped = [];
184
- for (const doc of conventions) {
185
- if (doc.frontmatter.type !== CONVENTION_TYPE)
220
+ for (const doc of docs) {
221
+ const connector = isConnectorDoc(doc);
222
+ if (doc.frontmatter.type !== CONVENTION_TYPE && !connector)
186
223
  continue;
187
224
  present.set(doc.id, doc);
188
225
  const stamp = readRecipeStamp(doc);
189
226
  if (stamp === null) {
190
- if (!declarationFree(doc))
227
+ if (connector || !declarationFree(doc))
191
228
  unstamped.push(doc.id);
192
229
  continue;
193
230
  }
194
231
  const group = stampedByRecipe.get(stamp.id) ?? [];
195
- group.push({ doc, stamp });
232
+ group.push({ doc, stamp, connector });
196
233
  stampedByRecipe.set(stamp.id, group);
197
234
  }
198
235
  const knownById = new Map(known.map((recipe) => [recipe.id, recipe]));
236
+ const declaredDocs = (recipe) => [...recipe.docs, ...(recipe.connectors ?? []).map((connector) => connector.doc)];
199
237
  const ids = new Set(stampedByRecipe.keys());
200
238
  const unstampedIds = new Set(unstamped);
201
239
  for (const recipe of known) {
202
- if (recipe.docs.some((declared) => unstampedIds.has(declared.id)))
240
+ if (declaredDocs(recipe).some((declared) => unstampedIds.has(declared.id)))
203
241
  ids.add(recipe.id);
204
242
  }
205
243
  const rows = [...ids].sort(byCodeUnit).map((id) => {
206
- const stamped = (stampedByRecipe.get(id) ?? []).sort((a, b) => byCodeUnit(a.doc.id, b.doc.id));
244
+ const all = (stampedByRecipe.get(id) ?? []).sort((a, b) => byCodeUnit(a.doc.id, b.doc.id));
245
+ const stamped = all.filter((entry) => !entry.connector);
246
+ const stampedConnectors = all.filter((entry) => entry.connector);
207
247
  const recipe = knownById.get(id);
208
248
  const conventionIds = stamped.map(({ doc }) => doc.id);
209
- const stampedIds = new Set(conventionIds);
249
+ const stampedIds = new Set(all.map(({ doc }) => doc.id));
210
250
  const records = new Map();
211
- for (const { stamp } of stamped) {
251
+ for (const { stamp, connector } of all) {
212
252
  const key = `${stamp.version}\u0000${stamp.source_digest}`;
213
253
  const record = records.get(key) ?? { version: stamp.version, source_digest: stamp.source_digest, conventions: 0 };
214
- record.conventions += 1;
254
+ if (connector)
255
+ record.connectors = (record.connectors ?? 0) + 1;
256
+ else
257
+ record.conventions += 1;
215
258
  records.set(key, record);
216
259
  }
217
260
  const recordRows = [...records.values()].sort((a, b) => byCodeUnit(a.version, b.version) || byCodeUnit(a.source_digest, b.source_digest));
218
- const declaredCounts = new Set(stamped.map(({ stamp }) => stamp.of));
261
+ const declaredCounts = new Set(all.map(({ stamp }) => stamp.of));
219
262
  const of = declaredCounts.size === 1 ? [...declaredCounts][0] : recipe ? recipe.docs.length : null;
220
- const diverged = stamped.filter(({ doc }) => conventionStampState(doc) === "diverged").map(({ doc }) => doc.id);
221
- const unknownRules = stamped.filter(({ stamp }) => stamp.digest_rules !== DEFINITION_DIGEST_RULES).map(({ doc }) => doc.id);
222
- const declaredIds = recipe ? recipe.docs.map((doc) => doc.id).sort(byCodeUnit) : [];
263
+ // A stamp without the key records no connectors; a disagreement among stamps is partial.
264
+ const connectorCounts = new Set(all.map(({ stamp }) => stamp.connectors));
265
+ const declaredConnectors = recipe && (recipe.connectors ?? []).length > 0 ? recipe.connectors.length : undefined;
266
+ const connectorsOf = connectorCounts.size === 1
267
+ ? [...connectorCounts][0]
268
+ : connectorCounts.size === 0 ? declaredConnectors : declaredConnectors ?? null;
269
+ const carriesConnectors = stampedConnectors.length > 0 || connectorsOf !== undefined;
270
+ const diverged = all.filter(({ doc }) => conventionStampState(doc) === "diverged").map(({ doc }) => doc.id);
271
+ const unknownRules = all.filter(({ stamp }) => stamp.digest_rules !== DEFINITION_DIGEST_RULES).map(({ doc }) => doc.id);
272
+ const declaredIds = recipe ? declaredDocs(recipe).map((doc) => doc.id).sort(byCodeUnit) : [];
223
273
  const missingIds = declaredIds.filter((declared) => !stampedIds.has(declared));
224
274
  const presentWithoutStamp = missingIds.filter((declared) => present.has(declared));
225
275
  let state;
226
- if (stamped.length === 0)
276
+ if (all.length === 0)
227
277
  state = "unknown";
228
278
  else if (recordRows.length > 1
229
279
  || declaredCounts.size > 1
280
+ || connectorCounts.size > 1
230
281
  || stamped.length !== of
282
+ || stampedConnectors.length !== (connectorsOf ?? 0)
231
283
  || presentWithoutStamp.length > 0
232
284
  || (recipe !== undefined && missingIds.length > 0))
233
285
  state = "partial";
@@ -247,9 +299,17 @@ export function installedRecipes(conventions, known = []) {
247
299
  of,
248
300
  convention_ids: conventionIds,
249
301
  };
302
+ if (carriesConnectors) {
303
+ row.connectors = stampedConnectors.length;
304
+ row.connectors_of = connectorsOf ?? null;
305
+ row.connector_ids = stampedConnectors.map(({ doc }) => doc.id);
306
+ }
250
307
  if (state === "partial") {
251
308
  row.records = recordRows;
252
- const missing = recipe ? missingIds.length : of === null ? 0 : Math.max(0, of - stamped.length);
309
+ const missing = recipe
310
+ ? missingIds.length
311
+ : (of === null ? 0 : Math.max(0, of - stamped.length))
312
+ + (typeof connectorsOf === "number" ? Math.max(0, connectorsOf - stampedConnectors.length) : 0);
253
313
  if (missing > 0)
254
314
  row.missing = missing;
255
315
  if (recipe && missingIds.length > 0)
@@ -1 +1 @@
1
- {"version":3,"file":"stamp.js","sourceRoot":"","sources":["../../src/recipe-lifecycle/stamp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stamp.js","sourceRoot":"","sources":["../../src/recipe-lifecycle/stamp.ts"],"names":[],"mappings":"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"}
package/dist/recipes.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type Connector, type ConnectorErrorCode } from "./connectors.js";
1
2
  import type { OkfDocument } from "./types.js";
2
3
  import type { ValidationWarning } from "./validation.js";
3
4
  /** One recipe file: a path relative to the recipe root (posix), with its UTF-8 text. */
@@ -19,6 +20,13 @@ export interface RecipeReference {
19
20
  /** A `type: Reference` document installed under `references/`. */
20
21
  doc: OkfDocument;
21
22
  }
23
+ /** One Connector declaration carried by a recipe package: a definition, never an instance. */
24
+ export interface RecipeConnector {
25
+ /** The `type: Connector` document installed under `connectors/`. */
26
+ doc: OkfDocument;
27
+ /** The declaration as `parseConnectorDoc` read it. */
28
+ connector: Connector;
29
+ }
22
30
  /** Parsed recipe definitions. Parsing does not install, authorize or execute these assets. */
23
31
  export interface LoadedRecipe {
24
32
  id: string;
@@ -35,6 +43,12 @@ export interface LoadedRecipe {
35
43
  pages: RecipePage[];
36
44
  /** Optional operating references installed with the definitions; never project instances. */
37
45
  references: RecipeReference[];
46
+ /**
47
+ * Connector declarations the manifest's `connectors:` list carries, installed and evolved as
48
+ * definitions. Absent when the manifest declares none, so a recipe without connectors parses to
49
+ * the same value it always did.
50
+ */
51
+ connectors?: RecipeConnector[];
38
52
  /** Present only for packages opting into the strict portable definitions-only contract. */
39
53
  contentPolicy?: "definitions-only";
40
54
  /** The `type` values this recipe's conventions govern (derived at parse, for the receipt). */
@@ -47,11 +61,20 @@ export interface LoadedRecipe {
47
61
  * with the target edition's storage field. Part of the recipe format, so every client reads it here.
48
62
  */
49
63
  export declare const RECIPE_PROGRESS_STATUS_TOKEN = "{{superbee:progress_status}}";
50
- export type RecipeErrorCode = "RECIPE_NOT_FOUND" | "RECIPE_MALFORMED" | "RECIPE_EMPTY" | "RECIPE_UNSAFE_PATH";
64
+ export type RecipeErrorCode = "RECIPE_NOT_FOUND" | "RECIPE_MALFORMED" | "RECIPE_EMPTY" | "RECIPE_UNSAFE_PATH" | "RECIPE_CONNECTOR_INVALID";
51
65
  export interface RecipeError {
52
66
  code: RecipeErrorCode;
53
67
  message: string;
68
+ /** `RECIPE_CONNECTOR_INVALID`: the first refusal of the connector named, and how many it had. */
69
+ connector?: {
70
+ id: string;
71
+ code: ConnectorErrorCode;
72
+ path: string;
73
+ count: number;
74
+ };
54
75
  }
76
+ /** The connectors a recipe carries; empty when its manifest declares none. */
77
+ export declare function recipeConnectors(recipe: Pick<LoadedRecipe, "connectors">): readonly RecipeConnector[];
55
78
  export type LoadResult = {
56
79
  ok: true;
57
80
  recipe: LoadedRecipe;
@@ -1 +1 @@
1
- {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAYzD,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,uHAAuH;IACvH,QAAQ,EAAE,WAAW,CAAC;IACtB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,GAAG,EAAE,WAAW,CAAC;CAClB;AAED,8FAA8F;AAC9F,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,sFAAsF;IACtF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,6FAA6F;IAC7F,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,2FAA2F;IAC3F,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,8FAA8F;IAC9F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+FAA+F;IAC/F,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAE3E,MAAM,MAAM,eAAe,GAAE,kBAAkB,GAAG,kBAAkB,GAAG,cAAc,GAAG,oBAAoB,CAAC;AAE7G,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AA6LhG;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,UAAU,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,UAAU,CAwSZ"}
1
+ {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwD,KAAK,SAAS,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAIhI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAYzD,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,uHAAuH;IACvH,QAAQ,EAAE,WAAW,CAAC;IACtB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,GAAG,EAAE,WAAW,CAAC;CAClB;AAED,8FAA8F;AAC9F,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,GAAG,EAAE,WAAW,CAAC;IACjB,sDAAsD;IACtD,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,8FAA8F;AAC9F,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,sFAAsF;IACtF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,6FAA6F;IAC7F,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,2FAA2F;IAC3F,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,8FAA8F;IAC9F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+FAA+F;IAC/F,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAE3E,MAAM,MAAM,eAAe,GACvB,kBAAkB,GAClB,kBAAkB,GAClB,cAAc,GACd,oBAAoB,GACpB,0BAA0B,CAAC;AAE/B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACnF;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,SAAS,eAAe,EAAE,CAErG;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAgRhG;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,UAAU,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,UAAU,CA2VZ"}
package/dist/recipes.js CHANGED
@@ -1,8 +1,9 @@
1
1
  // The ONE pure recipe parse+validate+materialize pipeline. Sources only acquire RecipeFile[];
2
2
  // everything downstream of that byte boundary is distribution-neutral and branches on content,
3
3
  // never on whether the files came from built-in constants, a folder, or a future source adapter.
4
+ import { CONNECTOR_TYPE, CONNECTORS_PREFIX, parseConnectorDoc } from "./connectors.js";
4
5
  import { parseMarkdown } from "./frontmatter.js";
5
- import { parseConventionDoc, CONVENTIONS_PREFIX, CONVENTION_TYPE } from "./kinds.js";
6
+ import { buildKindRegistry, parseConventionDoc, CONVENTIONS_PREFIX, CONVENTION_TYPE } from "./kinds.js";
6
7
  import { conceptIdFromPath, assertSafeConceptId, isReservedFile } from "./paths.js";
7
8
  import { declaredAccessValue, isAnyEntryKey, isAnyRegistryId, isPageTypeName, PAGE_ENTRY_PREFIX, PAGE_REGISTRY_PREFIX, VIEW_ENTRY_PREFIX, VIEW_REGISTRY_PREFIX, } from "./page.js";
8
9
  /**
@@ -10,6 +11,10 @@ import { declaredAccessValue, isAnyEntryKey, isAnyRegistryId, isPageTypeName, PA
10
11
  * with the target edition's storage field. Part of the recipe format, so every client reads it here.
11
12
  */
12
13
  export const RECIPE_PROGRESS_STATUS_TOKEN = "{{superbee:progress_status}}";
14
+ /** The connectors a recipe carries; empty when its manifest declares none. */
15
+ export function recipeConnectors(recipe) {
16
+ return recipe.connectors ?? [];
17
+ }
13
18
  /** Reserved manifest keys are surfaced as warnings, not applied or silently ignored. */
14
19
  const RESERVED_MANIFEST_KEYS = ["composes", "seeds", "requires"];
15
20
  function nonEmptyString(v) {
@@ -93,6 +98,81 @@ function parseReferenceDeclarations(manifest, recipeId, source) {
93
98
  }
94
99
  return { ok: true, references };
95
100
  }
101
+ function isSafeRecipeConnectorPath(value) {
102
+ if (!value.startsWith(CONNECTORS_PREFIX) || !value.endsWith(".md") || /[\\%?#]/.test(value))
103
+ return false;
104
+ const segments = value.slice(CONNECTORS_PREFIX.length).split("/");
105
+ return segments.every((segment) => !segment.startsWith(".") && REFERENCE_SEGMENT.test(segment));
106
+ }
107
+ /** The manifest's `connectors:` list, under the grammar `references:` uses. */
108
+ function parseConnectorDeclarations(manifest, recipeId, source) {
109
+ if (manifest.connectors === undefined)
110
+ return { ok: true, connectors: [] };
111
+ if (manifest.content_policy !== "definitions-only") {
112
+ return {
113
+ ok: false,
114
+ error: {
115
+ code: "RECIPE_MALFORMED",
116
+ message: `recipe '${recipeId}' at '${source}' declares connectors but does not declare ` +
117
+ "'content_policy: definitions-only', which is required for portable assets",
118
+ },
119
+ };
120
+ }
121
+ if (!Array.isArray(manifest.connectors)) {
122
+ return {
123
+ ok: false,
124
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${recipeId}': 'connectors' must be a list` },
125
+ };
126
+ }
127
+ const connectors = [];
128
+ const targets = new Set();
129
+ for (const [index, value] of manifest.connectors.entries()) {
130
+ if (typeof value !== "string" || value === "") {
131
+ return {
132
+ ok: false,
133
+ error: {
134
+ code: "RECIPE_MALFORMED",
135
+ message: `recipe '${recipeId}': connectors[${index}] must be a non-empty path`,
136
+ },
137
+ };
138
+ }
139
+ if (!isSafeRecipeConnectorPath(value)) {
140
+ return {
141
+ ok: false,
142
+ error: {
143
+ code: "RECIPE_UNSAFE_PATH",
144
+ message: `recipe '${recipeId}': Connector '${value}' must be a .md file under '${CONNECTORS_PREFIX}'`,
145
+ },
146
+ };
147
+ }
148
+ const id = conceptIdFromPath(value);
149
+ try {
150
+ assertSafeConceptId(id);
151
+ }
152
+ catch {
153
+ return {
154
+ ok: false,
155
+ error: { code: "RECIPE_UNSAFE_PATH", message: `recipe '${recipeId}' contains an unsafe Connector path` },
156
+ };
157
+ }
158
+ if (isReservedFile(value)) {
159
+ return {
160
+ ok: false,
161
+ error: { code: "RECIPE_UNSAFE_PATH", message: `recipe '${recipeId}' contains a reserved filename: '${value}'` },
162
+ };
163
+ }
164
+ const target = id.toLowerCase();
165
+ if (targets.has(target)) {
166
+ return {
167
+ ok: false,
168
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${recipeId}' declares duplicate Connector '${value}'` },
169
+ };
170
+ }
171
+ targets.add(target);
172
+ connectors.push({ path: value, id });
173
+ }
174
+ return { ok: true, connectors };
175
+ }
96
176
  function parsePageDeclarations(manifest, recipeId, source) {
97
177
  if (manifest.pages === undefined)
98
178
  return { ok: true, pages: [] };
@@ -233,8 +313,12 @@ export function parseRecipeFiles(files, source, options = {}) {
233
313
  const referenceDeclarations = parseReferenceDeclarations(manifest, id, source);
234
314
  if (!referenceDeclarations.ok)
235
315
  return referenceDeclarations;
316
+ const connectorDeclarations = parseConnectorDeclarations(manifest, id, source);
317
+ if (!connectorDeclarations.ok)
318
+ return connectorDeclarations;
236
319
  const declaredPageFiles = new Set(pageDeclarations.pages.flatMap((page) => [page.registry, page.entry]));
237
320
  const declaredReferenceFiles = new Set(referenceDeclarations.references.map((reference) => reference.path));
321
+ const declaredConnectorFiles = new Set(connectorDeclarations.connectors.map((connector) => connector.path));
238
322
  const warnings = [];
239
323
  for (const key of RESERVED_MANIFEST_KEYS) {
240
324
  if (key in manifest) {
@@ -257,6 +341,8 @@ export function parseRecipeFiles(files, source, options = {}) {
257
341
  continue;
258
342
  if (declaredReferenceFiles.has(file.path))
259
343
  continue;
344
+ if (declaredConnectorFiles.has(file.path))
345
+ continue;
260
346
  if (contentPolicy === "definitions-only") {
261
347
  return {
262
348
  ok: false,
@@ -324,6 +410,16 @@ export function parseRecipeFiles(files, source, options = {}) {
324
410
  });
325
411
  continue;
326
412
  }
413
+ // A Connector is a document type core's connector parser owns, never a recipe-declared Kind.
414
+ if (governs === CONNECTOR_TYPE) {
415
+ return {
416
+ ok: false,
417
+ error: {
418
+ code: "RECIPE_MALFORMED",
419
+ message: `recipe '${id}': '${doc.id}' governs '${CONNECTOR_TYPE}'; declare connectors in the manifest's 'connectors:' list instead`,
420
+ },
421
+ };
422
+ }
327
423
  if (contentPolicy === "definitions-only") {
328
424
  const parsed = parseConventionDoc(doc);
329
425
  if (!parsed.ok || parsed.warnings.length > 0) {
@@ -448,6 +544,39 @@ export function parseRecipeFiles(files, source, options = {}) {
448
544
  }
449
545
  references.push({ doc: { id: declaration.id, frontmatter, body } });
450
546
  }
547
+ const connectors = [];
548
+ // The recipe's own Kinds check the sources that target them now; a source whose Kind another
549
+ // recipe declares is checked against the bundle when the recipe is installed or evolved.
550
+ const ownKinds = connectorDeclarations.connectors.length > 0 ? buildKindRegistry(docs, [], options) : undefined;
551
+ for (const declaration of connectorDeclarations.connectors) {
552
+ const connectorFile = files.find((file) => file.path === declaration.path);
553
+ if (!connectorFile) {
554
+ return {
555
+ ok: false,
556
+ error: {
557
+ code: "RECIPE_MALFORMED",
558
+ message: `recipe '${id}' is missing declared Connector file '${declaration.path}'`,
559
+ },
560
+ };
561
+ }
562
+ const { frontmatter, body } = parseMarkdown(connectorFile.bytes, undefined, options);
563
+ const doc = { id: declaration.id, frontmatter, body };
564
+ const parsed = parseConnectorDoc(doc, { kinds: ownKinds });
565
+ if (!parsed.ok) {
566
+ const first = parsed.errors[0];
567
+ const more = parsed.errors.length - 1;
568
+ return {
569
+ ok: false,
570
+ error: {
571
+ code: "RECIPE_CONNECTOR_INVALID",
572
+ message: `recipe '${id}': invalid Connector '${declaration.path}': ${first.code} at '${first.path || "/"}': ${first.message}` +
573
+ (more > 0 ? ` (and ${more} more)` : ""),
574
+ connector: { id: declaration.id, code: first.code, path: first.path, count: parsed.errors.length },
575
+ },
576
+ };
577
+ }
578
+ connectors.push({ doc, connector: parsed.connector });
579
+ }
451
580
  const recipe = {
452
581
  id,
453
582
  title,
@@ -461,6 +590,8 @@ export function parseRecipeFiles(files, source, options = {}) {
461
590
  governs: governsList,
462
591
  warnings,
463
592
  };
593
+ if (connectorDeclarations.connectors.length > 0)
594
+ recipe.connectors = connectors;
464
595
  if (contentPolicy === "definitions-only")
465
596
  recipe.contentPolicy = contentPolicy;
466
597
  return { ok: true, recipe };