@cosmicdrift/kumiko-framework 0.388.0 → 0.389.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 (194) hide show
  1. package/AGENTS.md +3 -0
  2. package/agents/examples/golden-path.md +13 -1
  3. package/agents/examples/lifecycle-hooks.md +55 -2
  4. package/agents/examples/list-table-options.md +466 -0
  5. package/agents/examples/pdf-audit-export.md +4 -2
  6. package/agents/examples/state-machine.md +3 -2
  7. package/agents/examples/tenant-isolation.md +73 -1
  8. package/agents/examples.md +1 -0
  9. package/agents/widgets.md +1 -0
  10. package/dist/api/api-constants.d.ts +1 -0
  11. package/dist/api/api-constants.js +2 -0
  12. package/dist/api/auth-routes-shared.d.ts +2 -0
  13. package/dist/api/auth-routes-shared.js +5 -0
  14. package/dist/api/client-error-route.js +2 -3
  15. package/dist/api/entity-read-access.d.ts +2 -1
  16. package/dist/api/entity-read-access.js +14 -0
  17. package/dist/api/export/export-cells-reference.d.ts +9 -0
  18. package/dist/api/export/export-cells-reference.js +21 -0
  19. package/dist/api/export/export-cells.d.ts +11 -0
  20. package/dist/api/export/export-cells.js +136 -0
  21. package/dist/api/export/export-ciphertext-guard.d.ts +2 -0
  22. package/dist/api/export/export-ciphertext-guard.js +27 -0
  23. package/dist/api/export/export-columns.d.ts +29 -0
  24. package/dist/api/export/export-columns.js +85 -0
  25. package/dist/api/export/export-errors.d.ts +4 -0
  26. package/dist/api/export/export-errors.js +14 -0
  27. package/dist/api/export/export-route.d.ts +4 -0
  28. package/dist/api/export/export-route.js +74 -0
  29. package/dist/api/export/export-rows.d.ts +13 -0
  30. package/dist/api/export/export-rows.js +62 -0
  31. package/dist/api/export/export-screen.d.ts +12 -0
  32. package/dist/api/export/export-screen.js +47 -0
  33. package/dist/api/export/export-xlsx-writer.d.ts +4 -0
  34. package/dist/api/export/export-xlsx-writer.js +21 -0
  35. package/dist/api/extra-route.d.ts +4 -0
  36. package/dist/api/pii-leak-guard.d.ts +3 -0
  37. package/dist/api/pii-leak-guard.js +3 -2
  38. package/dist/api/routes.d.ts +16 -0
  39. package/dist/api/routes.js +2 -2
  40. package/dist/api/server-extra-routes.js +3 -0
  41. package/dist/api/server-routes.d.ts +1 -1
  42. package/dist/api/server-routes.js +8 -2
  43. package/dist/api/server-wiring.js +2 -0
  44. package/dist/api/sse-route.d.ts +2 -1
  45. package/dist/api/sse-route.js +11 -1
  46. package/dist/config/index.d.ts +3 -1
  47. package/dist/crypto/pg-kms-adapter.d.ts +1 -0
  48. package/dist/crypto/pg-kms-adapter.js +12 -18
  49. package/dist/db/aggregate-sql.d.ts +2 -0
  50. package/dist/db/aggregate-sql.js +10 -0
  51. package/dist/db/closed-connection.js +12 -19
  52. package/dist/db/connection.d.ts +4 -5
  53. package/dist/db/connection.js +29 -20
  54. package/dist/db/driver-row-coercion.js +4 -4
  55. package/dist/db/driver-value-preparation.js +6 -4
  56. package/dist/db/event-store-executor-read-aggregate-currencies.d.ts +17 -0
  57. package/dist/db/event-store-executor-read-aggregate-currencies.js +40 -0
  58. package/dist/db/event-store-executor-read-aggregate.js +36 -5
  59. package/dist/db/event-store-executor-read-filter.js +6 -3
  60. package/dist/db/event-store-executor-write-atomic.d.ts +4 -0
  61. package/dist/db/event-store-executor-write-atomic.js +41 -0
  62. package/dist/db/event-store-executor-write-steps.d.ts +0 -3
  63. package/dist/db/event-store-executor-write-steps.js +0 -5
  64. package/dist/db/event-store-executor-write.js +15 -15
  65. package/dist/db/event-store-executor.js +2 -1
  66. package/dist/db/executor-managed-tables.js +1 -1
  67. package/dist/db/index.d.ts +1 -1
  68. package/dist/db/index.js +1 -1
  69. package/dist/db/migrate-runner.js +3 -3
  70. package/dist/db/pg-error.js +26 -21
  71. package/dist/db/queries/backfill-pii.js +3 -6
  72. package/dist/db/queries/database-now.js +2 -1
  73. package/dist/db/queries/shadow-swap.js +2 -3
  74. package/dist/db/query.d.ts +14 -0
  75. package/dist/db/query.js +68 -43
  76. package/dist/db/reference-data.js +14 -2
  77. package/dist/db/statement-timeout.js +2 -1
  78. package/dist/db/tenant-db-upsert.d.ts +5 -0
  79. package/dist/db/tenant-db-upsert.js +91 -0
  80. package/dist/db/tenant-db.js +11 -1
  81. package/dist/engine/boot-validator/bundled-lists-table.d.ts +2 -0
  82. package/dist/engine/boot-validator/bundled-lists-table.js +36 -0
  83. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +3 -0
  84. package/dist/engine/boot-validator/entity-list-aggregate-options.js +23 -0
  85. package/dist/engine/boot-validator/list-bulk-actions.d.ts +3 -0
  86. package/dist/engine/boot-validator/list-bulk-actions.js +49 -0
  87. package/dist/engine/boot-validator/list-column-layout.d.ts +8 -0
  88. package/dist/engine/boot-validator/list-column-layout.js +41 -0
  89. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +24 -0
  90. package/dist/engine/boot-validator/list-table-aggregate-options.js +145 -0
  91. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +10 -0
  92. package/dist/engine/boot-validator/list-table-aggregate-query.js +31 -0
  93. package/dist/engine/boot-validator/list-table-export-options.d.ts +1 -0
  94. package/dist/engine/boot-validator/list-table-export-options.js +27 -0
  95. package/dist/engine/boot-validator/list-table-options.d.ts +3 -0
  96. package/dist/engine/boot-validator/list-table-options.js +77 -0
  97. package/dist/engine/boot-validator/list-table-reject-unknown-keys.d.ts +1 -0
  98. package/dist/engine/boot-validator/list-table-reject-unknown-keys.js +7 -0
  99. package/dist/engine/boot-validator/projection-list-screens.d.ts +1 -1
  100. package/dist/engine/boot-validator/projection-list-screens.js +3 -13
  101. package/dist/engine/boot-validator/related-list-table-rules.d.ts +4 -0
  102. package/dist/engine/boot-validator/related-list-table-rules.js +42 -0
  103. package/dist/engine/boot-validator/screens-kind-entity-list.js +7 -0
  104. package/dist/engine/boot-validator/screens-kind-projection-list.js +4 -0
  105. package/dist/engine/boot-validator/screens-lists.js +12 -2
  106. package/dist/engine/build-app-schema.d.ts +2 -1
  107. package/dist/engine/build-app-schema.js +9 -1
  108. package/dist/engine/build-config-feature-schema.js +6 -1
  109. package/dist/engine/define-feature.js +4 -0
  110. package/dist/engine/feature-ast/extractors/index.d.ts +1 -1
  111. package/dist/engine/feature-ast/extractors/index.js +1 -1
  112. package/dist/engine/feature-ast/extractors/round1.d.ts +2 -1
  113. package/dist/engine/feature-ast/extractors/round1.js +6 -0
  114. package/dist/engine/feature-ast/index.d.ts +1 -1
  115. package/dist/engine/feature-ast/parse.js +3 -1
  116. package/dist/engine/feature-ast/patch.d.ts +2 -0
  117. package/dist/engine/feature-ast/patch.js +1 -0
  118. package/dist/engine/feature-ast/pattern-change-schema.d.ts +7 -245
  119. package/dist/engine/feature-ast/pattern-change-schema.js +9 -163
  120. package/dist/engine/feature-ast/pattern-id-matchers.js +1 -0
  121. package/dist/engine/feature-ast/pattern-id-schema.d.ts +251 -0
  122. package/dist/engine/feature-ast/pattern-id-schema.js +166 -0
  123. package/dist/engine/feature-ast/patterns.d.ts +5 -1
  124. package/dist/engine/feature-ast/patterns.js +1 -0
  125. package/dist/engine/feature-ast/render.js +4 -0
  126. package/dist/engine/feature-builder-state.d.ts +1 -0
  127. package/dist/engine/feature-builder-state.js +1 -0
  128. package/dist/engine/feature-manifest.d.ts +1 -0
  129. package/dist/engine/feature-manifest.js +1 -0
  130. package/dist/engine/field-access.d.ts +1 -0
  131. package/dist/engine/field-access.js +12 -0
  132. package/dist/engine/index.d.ts +2 -2
  133. package/dist/engine/index.js +1 -1
  134. package/dist/engine/pattern-library/library.js +2 -1
  135. package/dist/engine/pattern-library/static-schemas.d.ts +1 -0
  136. package/dist/engine/pattern-library/static-schemas.js +9 -0
  137. package/dist/engine/screen-filter-ops.js +2 -0
  138. package/dist/engine/strip-disabled-features-from-app-schema.js +7 -3
  139. package/dist/engine/types/feature.d.ts +1 -0
  140. package/dist/engine/types/index.d.ts +4 -3
  141. package/dist/engine/types/screen.d.ts +1 -1
  142. package/dist/engine/types/screen.js +1 -1
  143. package/dist/entrypoint/index.d.ts +2 -0
  144. package/dist/entrypoint/index.js +3 -0
  145. package/dist/event-store/event-store.d.ts +1 -0
  146. package/dist/event-store/event-store.js +7 -4
  147. package/dist/event-store/provenance-append.js +1 -1
  148. package/dist/files/create-file-ref-from-bytes.js +3 -0
  149. package/dist/files/create-file-ref.d.ts +3 -0
  150. package/dist/files/create-file-ref.js +11 -2
  151. package/dist/files/file-routes.d.ts +2 -0
  152. package/dist/files/file-routes.js +29 -2
  153. package/dist/files/provider-resolver.d.ts +1 -0
  154. package/dist/files/provider-resolver.js +1 -1
  155. package/dist/files/record-write-check.d.ts +6 -0
  156. package/dist/files/record-write-check.js +13 -0
  157. package/dist/files/upload-ledger.d.ts +2 -2
  158. package/dist/files/upload-ledger.js +4 -4
  159. package/dist/i18n/required-surface-keys.js +7 -2
  160. package/dist/internal/testing.js +1 -1
  161. package/dist/jobs/job-runner-scope.js +6 -6
  162. package/dist/jobs/job-runner.js +3 -0
  163. package/dist/observability/escape-hatch-report.js +9 -2
  164. package/dist/pipeline/after-rollback-sink.d.ts +6 -0
  165. package/dist/pipeline/after-rollback-sink.js +32 -0
  166. package/dist/pipeline/dispatch-batch.js +8 -1
  167. package/dist/pipeline/dispatch-shared.js +4 -0
  168. package/dist/pipeline/event-dispatcher-delivery.js +3 -1
  169. package/dist/pipeline/event-dispatcher.d.ts +1 -0
  170. package/dist/pipeline/event-dispatcher.js +6 -9
  171. package/dist/pipeline/handler-context-dispatch.d.ts +2 -0
  172. package/dist/pipeline/handler-context-dispatch.js +13 -1
  173. package/dist/pipeline/handler-context-events.d.ts +2 -4
  174. package/dist/pipeline/handler-context-events.js +6 -4
  175. package/dist/pipeline/system-hooks.d.ts +3 -1
  176. package/dist/pipeline/system-hooks.js +55 -6
  177. package/dist/pipeline/write-result-masking.js +13 -10
  178. package/dist/schema-cli/baseline-command.js +1 -1
  179. package/dist/schema-cli/status-command.js +1 -1
  180. package/dist/search/reindex-entity.js +15 -5
  181. package/dist/ui-types/index.d.ts +2 -2
  182. package/dist/ui-types/index.js +1 -1
  183. package/dist/upgrade-changelog.d.ts +2 -0
  184. package/dist/upgrade-changelog.js +14 -0
  185. package/dist/upgrade-cli.d.ts +3 -12
  186. package/dist/upgrade-cli.js +22 -76
  187. package/dist/upgrade-marker-parse.d.ts +32 -0
  188. package/dist/upgrade-marker-parse.js +73 -0
  189. package/package.json +9 -6
  190. package/src/changes.json +245 -0
  191. package/src/scripts/codemod/codemod-support.ts +1 -1
  192. package/src/scripts/codemod/db-factory.ts +1 -1
  193. package/dist/engine/provider-plugin-context.d.ts +0 -3
  194. package/dist/engine/provider-plugin-context.js +0 -28
@@ -2,6 +2,9 @@ import { REFERENCE_LOOKUP_SOURCES } from "../../ui-types/list-row-meta.js";
2
2
  import { parseRefTarget } from "../parse-ref-target.js";
3
3
  import { qualifyEntityName } from "../qualified-name.js";
4
4
  import { explicitListScreenId, normalizeListColumn, resolveNavParentScreen, } from "../screen-helpers.js";
5
+ import { validateListBulkActions } from "./list-bulk-actions.js";
6
+ import { validateListTableOptions } from "./list-table-options.js";
7
+ import { validateRelatedListGroupingRules } from "./related-list-table-rules.js";
5
8
  import { assertWriteHandlerRegistered, isRowClickAction, rejectRedirectOnListRowAction, resolveRowActionNavigateTarget, validateClientActionName, validateDrawerTargetAction, validateRowActionNavigateParams, } from "./screens-actions.js";
6
9
  // validateScreenHasNavArea runs once per screen; the index is built once per
7
10
  // featureMap (immutable during boot) instead of re-scanning every feature each call.
@@ -70,6 +73,14 @@ export function validateScreenHasNavArea(feature, screenId, screen, featureMap)
70
73
  }
71
74
  // Shared by projectionDetail relatedList sections and entityList.expandableRow:
72
75
  // both render a relatedList whose rows come from an arbitrary query.
76
+ function validateRelatedListTableAndBulk(args) {
77
+ const { featureName, where, section } = args;
78
+ validateRelatedListGroupingRules(`[Feature ${featureName}] ${where}`, section, args.screenType === "entityList expandableRow");
79
+ validateListTableOptions(`[Feature ${featureName}] ${where}`, section.table, section.columns);
80
+ if (section.rowActions !== undefined)
81
+ validateRelatedListRowActions(args, section.rowActions);
82
+ validateListBulkActions(`[Feature ${featureName}] ${where}`, section.bulkActions, section.rowActions);
83
+ }
73
84
  export function validateRelatedListSection(args) {
74
85
  const { featureName, featureMap, where, section } = args;
75
86
  if (!section.query || typeof section.query !== "string") {
@@ -93,8 +104,7 @@ export function validateRelatedListSection(args) {
93
104
  `detailFor: "${targetEntity}". Add detailFor: "${targetEntity}" to the screen that shows it.`);
94
105
  }
95
106
  }
96
- if (section.rowActions !== undefined)
97
- validateRelatedListRowActions(args, section.rowActions);
107
+ validateRelatedListTableAndBulk(args);
98
108
  if (section.defaultSort !== undefined)
99
109
  validateRelatedListDefaultSort(args, section.defaultSort);
100
110
  if (section.facets !== undefined) {
@@ -1,5 +1,6 @@
1
- import type { AppSchema } from "../ui-types/index.ts";
1
+ import type { AppSchema, WorkspaceSchema } from "../ui-types/index.ts";
2
2
  import type { Registry } from "./types/feature.ts";
3
+ export declare function workspaceOwnerOf(definition: WorkspaceSchema["definition"]): string | undefined;
3
4
  export type BuildAppSchemaOptions = {
4
5
  /** Dev-server authoring hints (Settings-Hub placement). Default off — only
5
6
  * `createKumikoServer` opts in; prod boot + unit tests stay silent. */
@@ -31,6 +31,12 @@ import { isEncryptedAtRest } from "./config-helpers.js";
31
31
  import { isListQueryWithoutSearchableFields } from "./entity-list-searchability.js";
32
32
  import { QnTypes, qualifyEntityName } from "./qualified-name.js";
33
33
  const log = createFallbackLogger("kumiko");
34
+ // Workspace ids are only unique per feature, and the schema carries the short id. The owner stays
35
+ // off the serialized schema; the tenant-level feature strip reads it from here by object identity.
36
+ const workspaceOwnerByDefinition = new WeakMap();
37
+ export function workspaceOwnerOf(definition) {
38
+ return workspaceOwnerByDefinition.get(definition);
39
+ }
34
40
  export function buildAppSchema(registry, options = {}) {
35
41
  const features = [];
36
42
  const urlPrefillFieldsByScreenQn = collectUrlPrefillFieldsByScreenQn([
@@ -74,8 +80,10 @@ export function buildAppSchema(registry, options = {}) {
74
80
  for (const [featureName, feature] of registry.features) {
75
81
  for (const [shortId, definition] of Object.entries(feature.workspaces)) {
76
82
  const qualified = `${featureName}:workspace:${shortId}`;
83
+ const projectedDefinition = { ...definition, id: shortId };
84
+ workspaceOwnerByDefinition.set(projectedDefinition, featureName);
77
85
  workspaces.push({
78
- definition: { ...definition, id: shortId },
86
+ definition: projectedDefinition,
79
87
  navMembers: registry.getWorkspaceNavs(qualified),
80
88
  });
81
89
  }
@@ -656,8 +656,13 @@ function buildScreen(shortId, scope, feature, keys, access, hub, options = {}) {
656
656
  // feature's group (100% of today's apps — byte-identical output). Only a
657
657
  // cross-feature `group` (feature !== ownerFeature) needs the owner prefix,
658
658
  // to keep two features sharing a group from clobbering the same shortKey.
659
+ // A selector's option labels hang on its field id in one global key space
660
+ // (`config:entity:__config-edit__:field:<id>:option:<value>`), so two owners
661
+ // whose selector is both named `provider` need distinct ids.
659
662
  const fieldId = options.fieldIdOf ??
660
- ((k) => (k.feature === k.ownerFeature ? k.shortKey : qualifiedFieldId(k)));
663
+ ((k) => k.feature === k.ownerFeature && !hub.selectorOptions.has(k.qn)
664
+ ? k.shortKey
665
+ : qualifiedFieldId(k));
661
666
  const seenFieldIds = new Map();
662
667
  for (const k of keys) {
663
668
  const id = fieldId(k);
@@ -77,6 +77,9 @@ export function defineFeature(name, setup, settings) {
77
77
  }
78
78
  state.toggleableDefault = options.default;
79
79
  },
80
+ adoptsBundledLists() {
81
+ state.adoptsBundledLists = true;
82
+ },
80
83
  uiHints(hints) {
81
84
  if (state.uiHints !== undefined) {
82
85
  throw new Error(`[Feature ${name}] r.uiHints() called twice — UI hints are declared once`);
@@ -98,6 +101,7 @@ export function defineFeature(name, setup, settings) {
98
101
  requiredProjections: state.requiredProjections,
99
102
  requiredSteps: state.requiredSteps,
100
103
  ...(state.toggleableDefault !== undefined && { toggleableDefault: state.toggleableDefault }),
104
+ ...(state.adoptsBundledLists && { adoptsBundledLists: true }),
101
105
  ...(state.uiHints !== undefined && { uiHints: state.uiHints }),
102
106
  entities: state.entities,
103
107
  entityTables: state.entityTables,
@@ -5,7 +5,7 @@ export { extractAuthClaims, extractHook, isHookType, readOptionalAccessRule, rea
5
5
  export { extractHttpRoute, extractJob, isHttpRouteMethod, } from "./jobs-routes.ts";
6
6
  export { collectScreenOpaqueProps, extractMultiStreamProjection, extractProjection, extractScreen, readApplyBodies, readScreenStatic, } from "./projections-screens.ts";
7
7
  export { findImportBindingForLocalName, resolveModuleFile, } from "./resolve-import.ts";
8
- export { extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.ts";
8
+ export { extractAdoptsBundledLists, extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.ts";
9
9
  export { extractEntity, extractNav, extractRelation, extractWorkspace, } from "./round2.ts";
10
10
  export { extractClaimKey, extractConfig, extractMetric, extractReferenceData, extractSecret, extractSecretNamespace, extractTranslations, extractUseExtension, isClaimKeyType, type NamedOptionsResult, readNamedOptions, } from "./round3.ts";
11
11
  export { extractBootCheck, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractStoreTable, extractUsesApi, } from "./round5.ts";
@@ -5,7 +5,7 @@ export { extractAuthClaims, extractHook, isHookType, readOptionalAccessRule, rea
5
5
  export { extractHttpRoute, extractJob, isHttpRouteMethod, } from "./jobs-routes.js";
6
6
  export { collectScreenOpaqueProps, extractMultiStreamProjection, extractProjection, extractScreen, readApplyBodies, readScreenStatic, } from "./projections-screens.js";
7
7
  export { findImportBindingForLocalName, resolveModuleFile, } from "./resolve-import.js";
8
- export { extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.js";
8
+ export { extractAdoptsBundledLists, extractDescribe, extractOptionalRequires, extractReadsConfig, extractRequires, extractSystemScope, extractToggleable, extractUiHints, } from "./round1.js";
9
9
  export { extractEntity, extractNav, extractRelation, extractWorkspace, } from "./round2.js";
10
10
  export { extractClaimKey, extractConfig, extractMetric, extractReferenceData, extractSecret, extractSecretNamespace, extractTranslations, extractUseExtension, isClaimKeyType, readNamedOptions, } from "./round3.js";
11
11
  export { extractBootCheck, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractStoreTable, extractUsesApi, } from "./round5.js";
@@ -1,10 +1,11 @@
1
1
  import type { CallExpression, SourceFile } from "ts-morph";
2
- import type { DescribePattern, OptionalRequiresPattern, ReadsConfigPattern, RequiresPattern, SystemScopePattern, ToggleablePattern, UiHintsPattern } from "../patterns.ts";
2
+ import type { AdoptsBundledListsPattern, DescribePattern, OptionalRequiresPattern, ReadsConfigPattern, RequiresPattern, SystemScopePattern, ToggleablePattern, UiHintsPattern } from "../patterns.ts";
3
3
  import { type ExtractOutput } from "./shared.ts";
4
4
  export declare function extractRequires(call: CallExpression, sourceFile: SourceFile): ExtractOutput<RequiresPattern>;
5
5
  export declare function extractOptionalRequires(call: CallExpression, sourceFile: SourceFile): ExtractOutput<OptionalRequiresPattern>;
6
6
  export declare function extractReadsConfig(call: CallExpression, sourceFile: SourceFile): ExtractOutput<ReadsConfigPattern>;
7
7
  export declare function extractSystemScope(call: CallExpression, sourceFile: SourceFile): ExtractOutput<SystemScopePattern>;
8
+ export declare function extractAdoptsBundledLists(call: CallExpression, sourceFile: SourceFile): ExtractOutput<AdoptsBundledListsPattern>;
8
9
  export declare function extractUiHints(call: CallExpression, sourceFile: SourceFile): ExtractOutput<UiHintsPattern>;
9
10
  export declare function extractDescribe(call: CallExpression, sourceFile: SourceFile): ExtractOutput<DescribePattern>;
10
11
  export declare function extractToggleable(call: CallExpression, sourceFile: SourceFile): ExtractOutput<ToggleablePattern>;
@@ -39,6 +39,12 @@ export function extractSystemScope(call, sourceFile) {
39
39
  source: sourceLocationFromNode(call, sourceFile),
40
40
  });
41
41
  }
42
+ export function extractAdoptsBundledLists(call, sourceFile) {
43
+ return ok({
44
+ kind: "adoptsBundledLists",
45
+ source: sourceLocationFromNode(call, sourceFile),
46
+ });
47
+ }
42
48
  export function extractUiHints(call, sourceFile) {
43
49
  return ok({
44
50
  kind: "uiHints",
@@ -8,7 +8,7 @@ export type { AddAuthClaimsArgs, AddClaimKeyArgs, AddConfigArgs, AddDefineEventA
8
8
  export { createFeaturePatcher } from "./patcher.ts";
9
9
  export type { PatternChangeIssue, PatternChangesParseResult } from "./pattern-change-schema.ts";
10
10
  export { parsePatternChanges } from "./pattern-change-schema.ts";
11
- export type { AuthClaimsPattern, ClaimKeyPattern, ConfigPattern, DefineEventPattern, Editability, EntityPattern, ExtendsRegistrarPattern, FeaturePattern, FeaturePatternKind, HookPattern, HttpRoutePattern, JobPattern, MetricPattern, MultiStreamProjectionPattern, NavPattern, NotificationPattern, OptionalRequiresPattern, ProjectionPattern, QueryHandlerPattern, ReadsConfigPattern, ReferenceDataPattern, RelationPattern, RequiresPattern, ScreenPattern, SecretNamespacePattern, SecretPattern, StreamHandlerPattern, SystemScopePattern, ToggleablePattern, TranslationsPattern, UnknownPattern, UseExtensionPattern, WorkspacePattern, WriteHandlerPattern, } from "./patterns.ts";
11
+ export type { AdoptsBundledListsPattern, AuthClaimsPattern, ClaimKeyPattern, ConfigPattern, DefineEventPattern, Editability, EntityPattern, ExtendsRegistrarPattern, FeaturePattern, FeaturePatternKind, HookPattern, HttpRoutePattern, JobPattern, MetricPattern, MultiStreamProjectionPattern, NavPattern, NotificationPattern, OptionalRequiresPattern, ProjectionPattern, QueryHandlerPattern, ReadsConfigPattern, ReferenceDataPattern, RelationPattern, RequiresPattern, ScreenPattern, SecretNamespacePattern, SecretPattern, StreamHandlerPattern, SystemScopePattern, ToggleablePattern, TranslationsPattern, UnknownPattern, UseExtensionPattern, WorkspacePattern, WriteHandlerPattern, } from "./patterns.ts";
12
12
  export { getEditability } from "./patterns.ts";
13
13
  export type { RenderFeatureFileInput } from "./render.ts";
14
14
  export { FEATURE_FILE_VERSION, renderFeatureFile, renderPattern, renderValue, VERSION_HEADER, } from "./render.ts";
@@ -21,7 +21,7 @@
21
21
  // Per-pattern extractors fill in iteratively — each iteration adds
22
22
  // one extractor + a focused test.
23
23
  import { Project, SyntaxKind } from "ts-morph";
24
- import { extractAiClassify, extractAiExtract, extractAiGenerate, extractAuthClaims, extractBootCheck, extractClaimKey, extractConfig, extractDefineEvent, extractDescribe, extractEntity, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractHook, extractHttpRoute, extractJob, extractMetric, extractMultiStreamProjection, extractNav, extractNotification, extractOptionalRequires, extractProjection, extractQueryHandler, extractReadsConfig, extractReferenceData, extractRelation, extractRequires, extractScreen, extractSecret, extractSecretNamespace, extractStoreTable, extractStreamHandler, extractSystemScope, extractToggleable, extractTranslations, extractTreeActions, extractUiHints, extractUseExtension, extractUsesApi, extractWorkspace, extractWriteHandler, findFunctionLiteral, findImportBindingForLocalName, readObjectPropertyInitializer, resolveModuleFile, resolveSameFileObjectLiteral, } from "./extractors/index.js";
24
+ import { extractAdoptsBundledLists, extractAiClassify, extractAiExtract, extractAiGenerate, extractAuthClaims, extractBootCheck, extractClaimKey, extractConfig, extractDefineEvent, extractDescribe, extractEntity, extractEnvSchema, extractExposesApi, extractExtendsRegistrar, extractHook, extractHttpRoute, extractJob, extractMetric, extractMultiStreamProjection, extractNav, extractNotification, extractOptionalRequires, extractProjection, extractQueryHandler, extractReadsConfig, extractReferenceData, extractRelation, extractRequires, extractScreen, extractSecret, extractSecretNamespace, extractStoreTable, extractStreamHandler, extractSystemScope, extractToggleable, extractTranslations, extractTreeActions, extractUiHints, extractUseExtension, extractUsesApi, extractWorkspace, extractWriteHandler, findFunctionLiteral, findImportBindingForLocalName, readObjectPropertyInitializer, resolveModuleFile, resolveSameFileObjectLiteral, } from "./extractors/index.js";
25
25
  import { sourceLocationFromNode } from "./source-location.js";
26
26
  /**
27
27
  * Parse the given feature file and return all recognised r.* calls
@@ -397,6 +397,8 @@ function dispatchExtractor(methodName, call, sourceFile) {
397
397
  return extractDescribe(call, sourceFile);
398
398
  case "uiHints":
399
399
  return extractUiHints(call, sourceFile);
400
+ case "adoptsBundledLists":
401
+ return extractAdoptsBundledLists(call, sourceFile);
400
402
  // Object-literal-based static patterns
401
403
  case "entity":
402
404
  return extractEntity(call, sourceFile);
@@ -102,6 +102,8 @@ export type PatternId = {
102
102
  readonly kind: "describe";
103
103
  } | {
104
104
  readonly kind: "uiHints";
105
+ } | {
106
+ readonly kind: "adoptsBundledLists";
105
107
  } | {
106
108
  readonly kind: "config";
107
109
  } | {
@@ -482,6 +482,7 @@ export const SINGLETON_KINDS = new Set([
482
482
  "toggleable",
483
483
  "describe",
484
484
  "uiHints",
485
+ "adoptsBundledLists",
485
486
  "config",
486
487
  "translations",
487
488
  "authClaims",
@@ -84,6 +84,10 @@ export declare const PATTERN_SCHEMAS_BY_KIND: {
84
84
  kind: z.ZodLiteral<"uiHints">;
85
85
  source: z.ZodType<SourceLocation, unknown, z.core.$ZodTypeInternals<SourceLocation, unknown>>;
86
86
  }, z.core.$strict>;
87
+ adoptsBundledLists: z.ZodObject<{
88
+ kind: z.ZodLiteral<"adoptsBundledLists">;
89
+ source: z.ZodType<SourceLocation, unknown, z.core.$ZodTypeInternals<SourceLocation, unknown>>;
90
+ }, z.core.$strict>;
87
91
  metric: z.ZodObject<{
88
92
  kind: z.ZodLiteral<"metric">;
89
93
  source: z.ZodType<SourceLocation, unknown, z.core.$ZodTypeInternals<SourceLocation, unknown>>;
@@ -695,6 +699,9 @@ export declare const patternSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
695
699
  }, z.core.$strict>, z.ZodObject<{
696
700
  kind: z.ZodLiteral<"uiHints">;
697
701
  source: z.ZodType<SourceLocation, unknown, z.core.$ZodTypeInternals<SourceLocation, unknown>>;
702
+ }, z.core.$strict>, z.ZodObject<{
703
+ kind: z.ZodLiteral<"adoptsBundledLists">;
704
+ source: z.ZodType<SourceLocation, unknown, z.core.$ZodTypeInternals<SourceLocation, unknown>>;
698
705
  }, z.core.$strict>, z.ZodObject<{
699
706
  kind: z.ZodLiteral<"metric">;
700
707
  source: z.ZodType<SourceLocation, unknown, z.core.$ZodTypeInternals<SourceLocation, unknown>>;
@@ -1228,249 +1235,4 @@ export declare const patternSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
1228
1235
  source: z.ZodType<SourceLocation, unknown, z.core.$ZodTypeInternals<SourceLocation, unknown>>;
1229
1236
  methodName: z.ZodString;
1230
1237
  }, z.core.$strict>], "kind">;
1231
- export declare const PATTERN_ID_SCHEMAS_BY_KIND: {
1232
- entity: z.ZodObject<{
1233
- kind: z.ZodLiteral<"entity">;
1234
- entityName: z.ZodString;
1235
- }, z.core.$strict>;
1236
- relation: z.ZodObject<{
1237
- kind: z.ZodLiteral<"relation">;
1238
- entityName: z.ZodString;
1239
- relationName: z.ZodString;
1240
- }, z.core.$strict>;
1241
- nav: z.ZodObject<{
1242
- kind: z.ZodLiteral<"nav">;
1243
- id: z.ZodString;
1244
- }, z.core.$strict>;
1245
- workspace: z.ZodObject<{
1246
- kind: z.ZodLiteral<"workspace">;
1247
- id: z.ZodString;
1248
- }, z.core.$strict>;
1249
- screen: z.ZodObject<{
1250
- kind: z.ZodLiteral<"screen">;
1251
- id: z.ZodString;
1252
- }, z.core.$strict>;
1253
- writeHandler: z.ZodObject<{
1254
- kind: z.ZodLiteral<"writeHandler">;
1255
- handlerName: z.ZodString;
1256
- }, z.core.$strict>;
1257
- queryHandler: z.ZodObject<{
1258
- kind: z.ZodLiteral<"queryHandler">;
1259
- handlerName: z.ZodString;
1260
- }, z.core.$strict>;
1261
- streamHandler: z.ZodObject<{
1262
- kind: z.ZodLiteral<"streamHandler">;
1263
- handlerName: z.ZodString;
1264
- }, z.core.$strict>;
1265
- hook: z.ZodObject<{
1266
- kind: z.ZodLiteral<"hook">;
1267
- hookType: z.ZodString;
1268
- target: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
1269
- allOf: z.ZodString;
1270
- }, z.core.$strict>]>;
1271
- }, z.core.$strict>;
1272
- metric: z.ZodObject<{
1273
- kind: z.ZodLiteral<"metric">;
1274
- shortName: z.ZodString;
1275
- }, z.core.$strict>;
1276
- secret: z.ZodObject<{
1277
- kind: z.ZodLiteral<"secret">;
1278
- shortName: z.ZodString;
1279
- }, z.core.$strict>;
1280
- secretNamespace: z.ZodObject<{
1281
- kind: z.ZodLiteral<"secretNamespace">;
1282
- shortName: z.ZodString;
1283
- }, z.core.$strict>;
1284
- claimKey: z.ZodObject<{
1285
- kind: z.ZodLiteral<"claimKey">;
1286
- shortName: z.ZodString;
1287
- }, z.core.$strict>;
1288
- referenceData: z.ZodObject<{
1289
- kind: z.ZodLiteral<"referenceData">;
1290
- entityName: z.ZodString;
1291
- }, z.core.$strict>;
1292
- useExtension: z.ZodObject<{
1293
- kind: z.ZodLiteral<"useExtension">;
1294
- extensionName: z.ZodString;
1295
- entityName: z.ZodString;
1296
- }, z.core.$strict>;
1297
- job: z.ZodObject<{
1298
- kind: z.ZodLiteral<"job">;
1299
- jobName: z.ZodString;
1300
- }, z.core.$strict>;
1301
- notification: z.ZodObject<{
1302
- kind: z.ZodLiteral<"notification">;
1303
- notificationName: z.ZodString;
1304
- }, z.core.$strict>;
1305
- httpRoute: z.ZodObject<{
1306
- kind: z.ZodLiteral<"httpRoute">;
1307
- method: z.ZodString;
1308
- path: z.ZodString;
1309
- }, z.core.$strict>;
1310
- projection: z.ZodObject<{
1311
- kind: z.ZodLiteral<"projection">;
1312
- name: z.ZodString;
1313
- }, z.core.$strict>;
1314
- multiStreamProjection: z.ZodObject<{
1315
- kind: z.ZodLiteral<"multiStreamProjection">;
1316
- name: z.ZodString;
1317
- }, z.core.$strict>;
1318
- defineEvent: z.ZodObject<{
1319
- kind: z.ZodLiteral<"defineEvent">;
1320
- eventName: z.ZodString;
1321
- }, z.core.$strict>;
1322
- extendsRegistrar: z.ZodObject<{
1323
- kind: z.ZodLiteral<"extendsRegistrar">;
1324
- extensionName: z.ZodString;
1325
- }, z.core.$strict>;
1326
- "ai.generate": z.ZodObject<{
1327
- kind: z.ZodLiteral<"ai.generate">;
1328
- stepKey: z.ZodString;
1329
- }, z.core.$strict>;
1330
- "ai.extract": z.ZodObject<{
1331
- kind: z.ZodLiteral<"ai.extract">;
1332
- stepKey: z.ZodString;
1333
- }, z.core.$strict>;
1334
- "ai.classify": z.ZodObject<{
1335
- kind: z.ZodLiteral<"ai.classify">;
1336
- stepKey: z.ZodString;
1337
- }, z.core.$strict>;
1338
- requires: z.ZodObject<{
1339
- kind: z.ZodLiteral<"requires">;
1340
- }, z.core.$strict>;
1341
- optionalRequires: z.ZodObject<{
1342
- kind: z.ZodLiteral<"optionalRequires">;
1343
- }, z.core.$strict>;
1344
- readsConfig: z.ZodObject<{
1345
- kind: z.ZodLiteral<"readsConfig">;
1346
- }, z.core.$strict>;
1347
- systemScope: z.ZodObject<{
1348
- kind: z.ZodLiteral<"systemScope">;
1349
- }, z.core.$strict>;
1350
- toggleable: z.ZodObject<{
1351
- kind: z.ZodLiteral<"toggleable">;
1352
- }, z.core.$strict>;
1353
- describe: z.ZodObject<{
1354
- kind: z.ZodLiteral<"describe">;
1355
- }, z.core.$strict>;
1356
- uiHints: z.ZodObject<{
1357
- kind: z.ZodLiteral<"uiHints">;
1358
- }, z.core.$strict>;
1359
- config: z.ZodObject<{
1360
- kind: z.ZodLiteral<"config">;
1361
- }, z.core.$strict>;
1362
- translations: z.ZodObject<{
1363
- kind: z.ZodLiteral<"translations">;
1364
- }, z.core.$strict>;
1365
- authClaims: z.ZodObject<{
1366
- kind: z.ZodLiteral<"authClaims">;
1367
- }, z.core.$strict>;
1368
- treeActions: z.ZodObject<{
1369
- kind: z.ZodLiteral<"treeActions">;
1370
- }, z.core.$strict>;
1371
- };
1372
- export declare const patternIdSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
1373
- kind: z.ZodLiteral<"entity">;
1374
- entityName: z.ZodString;
1375
- }, z.core.$strict>, z.ZodObject<{
1376
- kind: z.ZodLiteral<"relation">;
1377
- entityName: z.ZodString;
1378
- relationName: z.ZodString;
1379
- }, z.core.$strict>, z.ZodObject<{
1380
- kind: z.ZodLiteral<"nav">;
1381
- id: z.ZodString;
1382
- }, z.core.$strict>, z.ZodObject<{
1383
- kind: z.ZodLiteral<"workspace">;
1384
- id: z.ZodString;
1385
- }, z.core.$strict>, z.ZodObject<{
1386
- kind: z.ZodLiteral<"screen">;
1387
- id: z.ZodString;
1388
- }, z.core.$strict>, z.ZodObject<{
1389
- kind: z.ZodLiteral<"writeHandler">;
1390
- handlerName: z.ZodString;
1391
- }, z.core.$strict>, z.ZodObject<{
1392
- kind: z.ZodLiteral<"queryHandler">;
1393
- handlerName: z.ZodString;
1394
- }, z.core.$strict>, z.ZodObject<{
1395
- kind: z.ZodLiteral<"streamHandler">;
1396
- handlerName: z.ZodString;
1397
- }, z.core.$strict>, z.ZodObject<{
1398
- kind: z.ZodLiteral<"hook">;
1399
- hookType: z.ZodString;
1400
- target: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
1401
- allOf: z.ZodString;
1402
- }, z.core.$strict>]>;
1403
- }, z.core.$strict>, z.ZodObject<{
1404
- kind: z.ZodLiteral<"metric">;
1405
- shortName: z.ZodString;
1406
- }, z.core.$strict>, z.ZodObject<{
1407
- kind: z.ZodLiteral<"secret">;
1408
- shortName: z.ZodString;
1409
- }, z.core.$strict>, z.ZodObject<{
1410
- kind: z.ZodLiteral<"secretNamespace">;
1411
- shortName: z.ZodString;
1412
- }, z.core.$strict>, z.ZodObject<{
1413
- kind: z.ZodLiteral<"claimKey">;
1414
- shortName: z.ZodString;
1415
- }, z.core.$strict>, z.ZodObject<{
1416
- kind: z.ZodLiteral<"referenceData">;
1417
- entityName: z.ZodString;
1418
- }, z.core.$strict>, z.ZodObject<{
1419
- kind: z.ZodLiteral<"useExtension">;
1420
- extensionName: z.ZodString;
1421
- entityName: z.ZodString;
1422
- }, z.core.$strict>, z.ZodObject<{
1423
- kind: z.ZodLiteral<"job">;
1424
- jobName: z.ZodString;
1425
- }, z.core.$strict>, z.ZodObject<{
1426
- kind: z.ZodLiteral<"notification">;
1427
- notificationName: z.ZodString;
1428
- }, z.core.$strict>, z.ZodObject<{
1429
- kind: z.ZodLiteral<"httpRoute">;
1430
- method: z.ZodString;
1431
- path: z.ZodString;
1432
- }, z.core.$strict>, z.ZodObject<{
1433
- kind: z.ZodLiteral<"projection">;
1434
- name: z.ZodString;
1435
- }, z.core.$strict>, z.ZodObject<{
1436
- kind: z.ZodLiteral<"multiStreamProjection">;
1437
- name: z.ZodString;
1438
- }, z.core.$strict>, z.ZodObject<{
1439
- kind: z.ZodLiteral<"defineEvent">;
1440
- eventName: z.ZodString;
1441
- }, z.core.$strict>, z.ZodObject<{
1442
- kind: z.ZodLiteral<"extendsRegistrar">;
1443
- extensionName: z.ZodString;
1444
- }, z.core.$strict>, z.ZodObject<{
1445
- kind: z.ZodLiteral<"ai.generate">;
1446
- stepKey: z.ZodString;
1447
- }, z.core.$strict>, z.ZodObject<{
1448
- kind: z.ZodLiteral<"ai.extract">;
1449
- stepKey: z.ZodString;
1450
- }, z.core.$strict>, z.ZodObject<{
1451
- kind: z.ZodLiteral<"ai.classify">;
1452
- stepKey: z.ZodString;
1453
- }, z.core.$strict>, z.ZodObject<{
1454
- kind: z.ZodLiteral<"requires">;
1455
- }, z.core.$strict>, z.ZodObject<{
1456
- kind: z.ZodLiteral<"optionalRequires">;
1457
- }, z.core.$strict>, z.ZodObject<{
1458
- kind: z.ZodLiteral<"readsConfig">;
1459
- }, z.core.$strict>, z.ZodObject<{
1460
- kind: z.ZodLiteral<"systemScope">;
1461
- }, z.core.$strict>, z.ZodObject<{
1462
- kind: z.ZodLiteral<"toggleable">;
1463
- }, z.core.$strict>, z.ZodObject<{
1464
- kind: z.ZodLiteral<"describe">;
1465
- }, z.core.$strict>, z.ZodObject<{
1466
- kind: z.ZodLiteral<"uiHints">;
1467
- }, z.core.$strict>, z.ZodObject<{
1468
- kind: z.ZodLiteral<"config">;
1469
- }, z.core.$strict>, z.ZodObject<{
1470
- kind: z.ZodLiteral<"translations">;
1471
- }, z.core.$strict>, z.ZodObject<{
1472
- kind: z.ZodLiteral<"authClaims">;
1473
- }, z.core.$strict>, z.ZodObject<{
1474
- kind: z.ZodLiteral<"treeActions">;
1475
- }, z.core.$strict>], "kind">;
1476
1238
  export declare function parsePatternChanges(input: unknown): PatternChangesParseResult;