@cosmicdrift/kumiko-framework 0.389.0 → 0.390.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 (616) hide show
  1. package/AGENTS.md +9 -4
  2. package/README.md +1 -1
  3. package/agents/examples/apex-surface-auth.md +2 -3
  4. package/agents/examples/api-worker-split.md +9 -2
  5. package/agents/examples/auth-claims.md +1 -1
  6. package/agents/examples/cross-feature-events.md +12 -12
  7. package/agents/examples/crypto-shredding-hr.md +2 -2
  8. package/agents/examples/encrypted-tenant-config.md +1 -1
  9. package/agents/examples/error-contract.md +12 -7
  10. package/agents/examples/event-sourcing.md +29 -29
  11. package/agents/examples/files-post-processing.md +10 -8
  12. package/agents/examples/inbound-mail-triage.md +1 -0
  13. package/agents/examples/lane-routing.md +2 -1
  14. package/agents/examples/legal-pages.md +2 -2
  15. package/agents/examples/lifecycle-hooks.md +3 -3
  16. package/agents/examples/managed-config.md +4 -4
  17. package/agents/examples/managed-pages.md +1 -1
  18. package/agents/examples/relations.md +19 -4
  19. package/agents/examples/search.md +4 -4
  20. package/agents/examples/secrets-demo.md +9 -6
  21. package/agents/examples/state-machine.md +2 -2
  22. package/agents/examples/tenant-settings.md +1 -1
  23. package/agents/examples/user-data-rights.md +3 -6
  24. package/agents/examples/workflow-engine.md +53 -47
  25. package/agents/examples.md +4 -4
  26. package/agents/features.md +1 -1
  27. package/dist/api/auth-middleware.js +1 -1
  28. package/dist/api/auth-routes-invite.js +2 -1
  29. package/dist/api/entity-read-access.d.ts +3 -1
  30. package/dist/api/export/export-columns.d.ts +3 -1
  31. package/dist/api/export/export-route.js +3 -2
  32. package/dist/api/export/export-screen.d.ts +2 -1
  33. package/dist/api/extra-route.d.ts +3 -1
  34. package/dist/api/index.d.ts +23 -27
  35. package/dist/api/index.js +13 -15
  36. package/dist/api/jwt.js +1 -1
  37. package/dist/api/observability-middleware.d.ts +1 -1
  38. package/dist/api/observability-middleware.js +2 -1
  39. package/dist/api/request-context-internals.d.ts +31 -0
  40. package/dist/api/request-context-internals.js +11 -0
  41. package/dist/api/request-context-scopes.d.ts +14 -0
  42. package/dist/api/request-context-scopes.js +69 -0
  43. package/dist/api/request-context.d.ts +1 -40
  44. package/dist/api/request-context.js +22 -51
  45. package/dist/api/request-id-middleware.d.ts +1 -1
  46. package/dist/api/route-registrars.d.ts +2 -1
  47. package/dist/api/route-registrars.js +1 -1
  48. package/dist/api/routes.js +7 -3
  49. package/dist/api/server-boot-checks.d.ts +1 -1
  50. package/dist/api/server-boot-checks.js +2 -2
  51. package/dist/api/server-event-dispatcher.d.ts +6 -1
  52. package/dist/api/server-event-dispatcher.js +3 -4
  53. package/dist/api/server-extra-routes.d.ts +1 -1
  54. package/dist/api/server-extra-routes.js +2 -1
  55. package/dist/api/server-middleware.js +3 -1
  56. package/dist/api/server-routes.d.ts +2 -1
  57. package/dist/api/server-wiring.js +6 -4
  58. package/dist/api/server.d.ts +2 -1
  59. package/dist/api/sse-route.d.ts +2 -1
  60. package/dist/api/tenant-scoped-secrets.d.ts +2 -0
  61. package/dist/api/tenant-scoped-secrets.js +13 -0
  62. package/dist/api/websocket-route.d.ts +1 -1
  63. package/dist/auth/index.d.ts +0 -1
  64. package/dist/auth/roles.d.ts +0 -5
  65. package/dist/compliance/duration-spec.d.ts +0 -1
  66. package/dist/compliance/duration-spec.js +0 -5
  67. package/dist/compliance/index.d.ts +4 -4
  68. package/dist/compliance/index.js +2 -2
  69. package/dist/compliance/profiles.d.ts +0 -15
  70. package/dist/compliance/profiles.js +0 -23
  71. package/dist/config/index.d.ts +10 -10
  72. package/dist/config/index.js +13 -1
  73. package/dist/config/internals.d.ts +9 -0
  74. package/dist/config/internals.js +1 -0
  75. package/dist/consumer-cli-internals.d.ts +4 -0
  76. package/dist/consumer-cli-internals.js +1 -0
  77. package/dist/consumer-cli.d.ts +1 -4
  78. package/dist/consumer-cli.js +5 -1
  79. package/dist/crypto/event-pii.js +1 -1
  80. package/dist/crypto/index.d.ts +8 -9
  81. package/dist/crypto/index.js +7 -8
  82. package/dist/crypto/pg-kms-adapter.js +6 -1
  83. package/dist/db/apply-entity-event.d.ts +1 -1
  84. package/dist/db/apply-entity-event.js +15 -47
  85. package/dist/db/blind-index-cleanup.js +91 -77
  86. package/dist/db/collect-table-metas.js +1 -1
  87. package/dist/db/compound-types.d.ts +1 -1
  88. package/dist/db/compound-types.js +0 -7
  89. package/dist/db/config-seed.d.ts +2 -1
  90. package/dist/db/config-seed.js +6 -1
  91. package/dist/db/connection.d.ts +3 -1
  92. package/dist/db/connection.js +15 -5
  93. package/dist/db/cross-tenant-reads.d.ts +1 -1
  94. package/dist/db/cross-tenant-reads.js +1 -1
  95. package/dist/db/dialect.d.ts +0 -5
  96. package/dist/db/dialect.js +0 -3
  97. package/dist/db/eagerload.d.ts +2 -1
  98. package/dist/db/entity-field-encryption.d.ts +1 -1
  99. package/dist/db/entity-table-meta.d.ts +1 -1
  100. package/dist/db/event-store-executor-context.d.ts +3 -1
  101. package/dist/db/event-store-executor-context.js +4 -3
  102. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  103. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  104. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  105. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  106. package/dist/db/event-store-executor-read.js +2 -2
  107. package/dist/db/event-store-executor-write-atomic.js +8 -7
  108. package/dist/db/event-store-executor-write-steps.d.ts +3 -2
  109. package/dist/db/event-store-executor-write.js +7 -4
  110. package/dist/db/event-store-executor.d.ts +1 -1
  111. package/dist/db/executor-managed-tables.d.ts +7 -1
  112. package/dist/db/executor-managed-tables.js +11 -2
  113. package/dist/db/index.d.ts +29 -28
  114. package/dist/db/index.js +22 -20
  115. package/dist/db/known-table-names.d.ts +6 -0
  116. package/dist/db/known-table-names.js +21 -0
  117. package/dist/db/list-aggregate-labels.d.ts +1 -1
  118. package/dist/db/located-timestamp.d.ts +1 -1
  119. package/dist/db/located-timestamp.js +0 -5
  120. package/dist/db/migrate-generator.d.ts +17 -1
  121. package/dist/db/migrate-generator.js +50 -20
  122. package/dist/db/migrate-primary-key.d.ts +12 -0
  123. package/dist/db/migrate-primary-key.js +45 -0
  124. package/dist/db/migrate-rls-diff.d.ts +20 -0
  125. package/dist/db/migrate-rls-diff.js +61 -0
  126. package/dist/db/migrate-runner.js +4 -0
  127. package/dist/db/money.d.ts +1 -1
  128. package/dist/db/money.js +1 -1
  129. package/dist/db/parent-ref-clause.d.ts +2 -1
  130. package/dist/db/pg-error.d.ts +2 -0
  131. package/dist/db/pg-error.js +11 -0
  132. package/dist/db/queries/ddl.d.ts +3 -0
  133. package/dist/db/queries/ddl.js +34 -1
  134. package/dist/db/queries/event-store.js +4 -2
  135. package/dist/db/queries/event-tenants.d.ts +2 -0
  136. package/dist/db/queries/event-tenants.js +17 -0
  137. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  138. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  139. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  140. package/dist/db/queries/rls-boot-catalog.js +39 -0
  141. package/dist/db/queries/rls-catalog.d.ts +6 -0
  142. package/dist/db/queries/rls-catalog.js +82 -0
  143. package/dist/db/queries/rls-scope.d.ts +3 -0
  144. package/dist/db/queries/rls-scope.js +17 -0
  145. package/dist/db/queries/rls-shape.d.ts +10 -0
  146. package/dist/db/queries/rls-shape.js +42 -0
  147. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  148. package/dist/db/queries/session-advisory-lock.js +23 -0
  149. package/dist/db/queries/shadow-swap.d.ts +1 -2
  150. package/dist/db/queries/shadow-swap.js +9 -25
  151. package/dist/db/queries/test-stack.d.ts +4 -1
  152. package/dist/db/queries/test-stack.js +83 -2
  153. package/dist/db/query.js +11 -7
  154. package/dist/db/reference-data.d.ts +1 -1
  155. package/dist/db/reference-data.js +6 -1
  156. package/dist/db/render-ddl.d.ts +6 -2
  157. package/dist/db/render-ddl.js +7 -7
  158. package/dist/db/render-rls-ddl.d.ts +35 -0
  159. package/dist/db/render-rls-ddl.js +127 -0
  160. package/dist/db/replay-migration-sql.d.ts +3 -1
  161. package/dist/db/replay-migration-sql.js +22 -5
  162. package/dist/db/replay-rls.d.ts +25 -0
  163. package/dist/db/replay-rls.js +156 -0
  164. package/dist/db/row-level-security-boot-check.d.ts +5 -0
  165. package/dist/db/row-level-security-boot-check.js +85 -0
  166. package/dist/db/row-level-security-connection.d.ts +3 -0
  167. package/dist/db/row-level-security-connection.js +213 -0
  168. package/dist/db/row-level-security-scope.d.ts +33 -0
  169. package/dist/db/row-level-security-scope.js +127 -0
  170. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  171. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  172. package/dist/db/sql-identifier.d.ts +1 -0
  173. package/dist/db/sql-identifier.js +3 -0
  174. package/dist/db/table-builder.d.ts +2 -1
  175. package/dist/db/table-builder.js +1 -1
  176. package/dist/db/table-info.js +1 -1
  177. package/dist/db/table-push.d.ts +11 -2
  178. package/dist/db/table-push.js +15 -2
  179. package/dist/db/tenant-db-runner.d.ts +3 -1
  180. package/dist/db/tenant-db-runner.js +4 -3
  181. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  182. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  183. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  184. package/dist/db/tenant-db-statement-runner.js +48 -0
  185. package/dist/db/tenant-db.d.ts +17 -12
  186. package/dist/db/tenant-db.js +49 -120
  187. package/dist/db/tenant-id-filter.d.ts +3 -0
  188. package/dist/db/tenant-id-filter.js +30 -0
  189. package/dist/db/transaction-serialization.d.ts +6 -0
  190. package/dist/db/transaction-serialization.js +60 -0
  191. package/dist/derivatives/delete-stored-file.js +1 -1
  192. package/dist/derivatives/index.d.ts +2 -5
  193. package/dist/derivatives/index.js +2 -3
  194. package/dist/engine/access.d.ts +2 -1
  195. package/dist/engine/access.js +1 -1
  196. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  197. package/dist/engine/boot-validator/entity-handler.js +1 -1
  198. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +1 -1
  199. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
  200. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
  201. package/dist/engine/boot-validator/nav.d.ts +3 -1
  202. package/dist/engine/boot-validator/nav.js +1 -1
  203. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  204. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  205. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  206. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  207. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  208. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  209. package/dist/engine/boot-validator/screens.d.ts +2 -1
  210. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  211. package/dist/engine/bridge-stub.d.ts +5 -2
  212. package/dist/engine/bridge-stub.js +39 -24
  213. package/dist/engine/config-helpers.d.ts +2 -2
  214. package/dist/engine/config-helpers.js +0 -9
  215. package/dist/engine/constants.d.ts +0 -10
  216. package/dist/engine/constants.js +0 -8
  217. package/dist/engine/create-app.js +1 -1
  218. package/dist/engine/define-feature.d.ts +2 -1
  219. package/dist/engine/define-feature.js +1 -2
  220. package/dist/engine/define-handler.d.ts +1 -1
  221. package/dist/engine/define-step.d.ts +0 -1
  222. package/dist/engine/define-step.js +0 -3
  223. package/dist/engine/embedded-derived.d.ts +1 -1
  224. package/dist/engine/entity-handlers.d.ts +2 -1
  225. package/dist/engine/entity-handlers.js +7 -7
  226. package/dist/engine/entity-list-runtime-options.js +3 -1
  227. package/dist/engine/entity-list-searchability.d.ts +2 -1
  228. package/dist/engine/event-def.d.ts +2 -1
  229. package/dist/engine/event-helpers.d.ts +3 -1
  230. package/dist/engine/event-helpers.js +3 -3
  231. package/dist/engine/extension-names.d.ts +2 -8
  232. package/dist/engine/extension-names.js +2 -2
  233. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  234. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  235. package/dist/engine/extensions/user-data.d.ts +0 -8
  236. package/dist/engine/factories.d.ts +2 -1
  237. package/dist/engine/feature-builder-state.d.ts +8 -1
  238. package/dist/engine/feature-changelog.d.ts +1 -1
  239. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  240. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  241. package/dist/engine/feature-manifest.js +1 -1
  242. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  243. package/dist/engine/feature-ui-extensions.js +6 -4
  244. package/dist/engine/field-access.d.ts +2 -1
  245. package/dist/engine/handler-field-references.d.ts +0 -4
  246. package/dist/engine/index.d.ts +57 -54
  247. package/dist/engine/index.js +22 -27
  248. package/dist/engine/instruction-fields.d.ts +1 -1
  249. package/dist/engine/personal-data-fields.d.ts +1 -1
  250. package/dist/engine/qualified-name.d.ts +0 -1
  251. package/dist/engine/read-claim.d.ts +2 -1
  252. package/dist/engine/registry-facade.js +0 -3
  253. package/dist/engine/registry-ingest.d.ts +2 -1
  254. package/dist/engine/registry-ingest.js +1 -2
  255. package/dist/engine/registry-state.d.ts +12 -2
  256. package/dist/engine/registry-state.js +2 -3
  257. package/dist/engine/registry-validate.d.ts +3 -1
  258. package/dist/engine/registry-validate.js +7 -7
  259. package/dist/engine/run-in.d.ts +1 -1
  260. package/dist/engine/run-in.js +0 -1
  261. package/dist/engine/schema-builder.d.ts +1 -1
  262. package/dist/engine/schema-builder.js +1 -1
  263. package/dist/engine/screen-filter-ops.d.ts +2 -1
  264. package/dist/engine/screen-filter-ops.js +0 -5
  265. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  266. package/dist/engine/soft-delete-cleanup.js +4 -4
  267. package/dist/engine/state-machine.js +2 -1
  268. package/dist/engine/steps/_read-source.js +1 -1
  269. package/dist/engine/steps/aggregate-append-event.js +2 -2
  270. package/dist/engine/steps/call-feature.js +2 -2
  271. package/dist/engine/steps/mail-send.js +1 -1
  272. package/dist/engine/steps/retry.js +1 -1
  273. package/dist/engine/steps/wait-for-event.js +1 -1
  274. package/dist/engine/steps/wait.js +1 -1
  275. package/dist/engine/steps/webhook-send.js +1 -1
  276. package/dist/engine/template-variables.d.ts +2 -1
  277. package/dist/engine/transfer-adjacency.d.ts +1 -1
  278. package/dist/engine/types/index.d.ts +8 -31
  279. package/dist/engine/types/index.js +2 -10
  280. package/dist/engine/validation.d.ts +2 -1
  281. package/dist/entrypoint/index.d.ts +7 -35
  282. package/dist/entrypoint/index.js +7 -1
  283. package/dist/entrypoint/internals.d.ts +40 -0
  284. package/dist/entrypoint/internals.js +1 -0
  285. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  286. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  287. package/dist/env/dry-run-internals.d.ts +10 -0
  288. package/dist/env/dry-run-internals.js +1 -0
  289. package/dist/env/dry-run.d.ts +1 -10
  290. package/dist/env/dry-run.js +2 -1
  291. package/dist/env/index.d.ts +1 -85
  292. package/dist/env/index.js +6 -50
  293. package/dist/env/internals.d.ts +87 -0
  294. package/dist/env/internals.js +53 -0
  295. package/dist/errors/classes.js +2 -2
  296. package/dist/errors/index.d.ts +5 -14
  297. package/dist/errors/index.js +4 -9
  298. package/dist/errors/member-resolution.js +1 -1
  299. package/dist/errors/reasons.d.ts +0 -1
  300. package/dist/errors/reasons.js +7 -7
  301. package/dist/errors/serialize.d.ts +0 -18
  302. package/dist/errors/serialize.js +0 -27
  303. package/dist/es-ops/index.d.ts +4 -4
  304. package/dist/es-ops/index.js +2 -2
  305. package/dist/es-ops/operations-schema.d.ts +1 -1
  306. package/dist/es-ops/types.d.ts +4 -5
  307. package/dist/event-store/admin-api-internals.d.ts +14 -0
  308. package/dist/event-store/admin-api-internals.js +1 -0
  309. package/dist/event-store/admin-api.d.ts +1 -14
  310. package/dist/event-store/admin-api.js +11 -6
  311. package/dist/event-store/archive.js +4 -2
  312. package/dist/event-store/errors.js +2 -2
  313. package/dist/event-store/event-store.js +41 -34
  314. package/dist/event-store/events-schema.js +4 -1
  315. package/dist/event-store/index.d.ts +11 -13
  316. package/dist/event-store/index.js +7 -9
  317. package/dist/event-store/rebuild-dead-letter.js +4 -2
  318. package/dist/event-store/snapshot.js +4 -3
  319. package/dist/event-store/stream-scope.d.ts +2 -0
  320. package/dist/event-store/stream-scope.js +6 -0
  321. package/dist/event-store/upcaster-dead-letter.js +4 -2
  322. package/dist/event-store/upcaster.d.ts +2 -1
  323. package/dist/files/action-form-upload.d.ts +2 -1
  324. package/dist/files/action-form-upload.js +1 -1
  325. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  326. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  327. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  328. package/dist/files/bind-pending-file-refs.js +2 -1
  329. package/dist/files/bind-referenced-files.write.js +1 -1
  330. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  331. package/dist/files/create-file-ref-from-bytes.js +3 -3
  332. package/dist/files/create-file-ref.d.ts +3 -2
  333. package/dist/files/create-file-ref.js +2 -2
  334. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  335. package/dist/files/dispose-removed-file-refs.js +1 -1
  336. package/dist/files/feature.js +2 -2
  337. package/dist/files/file-handle.js +1 -1
  338. package/dist/files/file-routes.d.ts +1 -1
  339. package/dist/files/file-routes.js +12 -2
  340. package/dist/files/index.d.ts +11 -13
  341. package/dist/files/index.js +5 -7
  342. package/dist/files/load-save-file-refs.d.ts +2 -1
  343. package/dist/files/load-save-file-refs.js +1 -1
  344. package/dist/files/provider-resolver.d.ts +5 -4
  345. package/dist/files/provider-resolver.js +4 -4
  346. package/dist/files/storage-tracking.js +4 -2
  347. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  348. package/dist/files/sweep-orphaned-uploads.js +1 -1
  349. package/dist/i18n/index.d.ts +2 -8
  350. package/dist/i18n/index.js +1 -1
  351. package/dist/i18n/internals.d.ts +7 -0
  352. package/dist/i18n/internals.js +1 -0
  353. package/dist/i18n/required-surface-keys.d.ts +4 -1
  354. package/dist/internal/row-level-security.d.ts +3 -0
  355. package/dist/internal/row-level-security.js +3 -0
  356. package/dist/internal/stack-support.d.ts +1 -1
  357. package/dist/internal/stack-support.js +1 -1
  358. package/dist/internal/testing.d.ts +1 -0
  359. package/dist/internal/testing.js +9 -5
  360. package/dist/jobs/index.d.ts +1 -1
  361. package/dist/jobs/job-append-event.d.ts +12 -0
  362. package/dist/jobs/job-append-event.js +30 -0
  363. package/dist/jobs/job-runner-context.d.ts +2 -2
  364. package/dist/jobs/job-runner-context.js +46 -16
  365. package/dist/jobs/job-runner-execution.d.ts +1 -1
  366. package/dist/jobs/job-runner-execution.js +6 -4
  367. package/dist/jobs/job-runner-gates.d.ts +1 -1
  368. package/dist/jobs/job-runner-gates.js +0 -1
  369. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  370. package/dist/jobs/job-runner-helpers.js +10 -1
  371. package/dist/jobs/job-runner-scope.d.ts +5 -2
  372. package/dist/jobs/job-runner-types.d.ts +2 -1
  373. package/dist/jobs/job-runner.js +19 -6
  374. package/dist/jobs/max-per-tenant.d.ts +1 -1
  375. package/dist/logging/index.d.ts +1 -2
  376. package/dist/logging/index.js +1 -1
  377. package/dist/logging/pino-logger.js +1 -1
  378. package/dist/logging/utils.d.ts +1 -0
  379. package/dist/logging/utils.js +6 -0
  380. package/dist/migrations/index.d.ts +3 -3
  381. package/dist/migrations/index.js +3 -3
  382. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  383. package/dist/migrations/pending-rebuilds.js +1 -1
  384. package/dist/migrations/pii-event-backfill.js +4 -1
  385. package/dist/observability/escape-hatch-report.d.ts +2 -1
  386. package/dist/observability/index.d.ts +7 -15
  387. package/dist/observability/index.js +4 -12
  388. package/dist/observability/metric-validator.js +1 -1
  389. package/dist/observability/metrics-handle.d.ts +0 -1
  390. package/dist/observability/metrics-handle.js +2 -15
  391. package/dist/observability/recording-tracer.d.ts +1 -2
  392. package/dist/observability/recording-tracer.js +0 -6
  393. package/dist/observability/sensitive-filter.d.ts +0 -2
  394. package/dist/observability/sensitive-filter.js +0 -29
  395. package/dist/pipeline/active-membership.d.ts +2 -1
  396. package/dist/pipeline/active-membership.js +6 -2
  397. package/dist/pipeline/append-event-core.d.ts +2 -1
  398. package/dist/pipeline/append-event-core.js +2 -2
  399. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  400. package/dist/pipeline/attach-outside-transaction.js +13 -0
  401. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  402. package/dist/pipeline/cascade-handler.d.ts +2 -1
  403. package/dist/pipeline/cascade-handler.js +3 -2
  404. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  405. package/dist/pipeline/config-accessor-factory.js +1 -1
  406. package/dist/pipeline/context-services.d.ts +56 -0
  407. package/dist/pipeline/context-services.js +73 -0
  408. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  409. package/dist/pipeline/dispatch-batch.js +31 -18
  410. package/dist/pipeline/dispatch-query.js +5 -4
  411. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  412. package/dist/pipeline/dispatch-scope.js +27 -0
  413. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  414. package/dist/pipeline/dispatch-shared.js +75 -198
  415. package/dist/pipeline/dispatch-stream.js +8 -4
  416. package/dist/pipeline/dispatch-write.d.ts +2 -1
  417. package/dist/pipeline/dispatch-write.js +10 -8
  418. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  419. package/dist/pipeline/dispatcher-utils.js +8 -2
  420. package/dist/pipeline/dispatcher.d.ts +3 -2
  421. package/dist/pipeline/dispatcher.js +4 -3
  422. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  423. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  424. package/dist/pipeline/event-dispatcher-delivery.js +4 -2
  425. package/dist/pipeline/event-dispatcher.d.ts +2 -2
  426. package/dist/pipeline/event-dispatcher.js +7 -3
  427. package/dist/pipeline/event-retention.js +59 -56
  428. package/dist/pipeline/handler-access-error.js +2 -1
  429. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  430. package/dist/pipeline/handler-context-auth.js +7 -4
  431. package/dist/pipeline/handler-context-config.d.ts +2 -5
  432. package/dist/pipeline/handler-context-config.js +2 -2
  433. package/dist/pipeline/handler-context-db.d.ts +32 -7
  434. package/dist/pipeline/handler-context-db.js +26 -17
  435. package/dist/pipeline/handler-context-dispatch.d.ts +13 -7
  436. package/dist/pipeline/handler-context-dispatch.js +9 -8
  437. package/dist/pipeline/handler-context-events.d.ts +22 -36
  438. package/dist/pipeline/handler-context-events.js +36 -31
  439. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  440. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  441. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  442. package/dist/pipeline/handler-context-notify.js +1 -1
  443. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  444. package/dist/pipeline/handler-context-observability.js +7 -5
  445. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  446. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  447. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  448. package/dist/pipeline/handler-context-scope.js +18 -20
  449. package/dist/pipeline/index.d.ts +9 -21
  450. package/dist/pipeline/index.js +5 -7
  451. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  452. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  453. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  454. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  455. package/dist/pipeline/member-read-only-transaction.js +11 -3
  456. package/dist/pipeline/member-reader.d.ts +1 -1
  457. package/dist/pipeline/member-reader.js +2 -2
  458. package/dist/pipeline/msp-rebuild.js +5 -3
  459. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  460. package/dist/pipeline/notify-scope.d.ts +2 -1
  461. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  462. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  463. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  464. package/dist/pipeline/projection-rebuild.js +12 -5
  465. package/dist/pipeline/projection-state.d.ts +0 -6
  466. package/dist/pipeline/projection-state.js +0 -5
  467. package/dist/pipeline/projections-runner.d.ts +2 -1
  468. package/dist/pipeline/projections-runner.js +10 -6
  469. package/dist/pipeline/system-hooks.d.ts +3 -1
  470. package/dist/pipeline/system-hooks.js +6 -4
  471. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  472. package/dist/pipeline/system-identity-switch.js +51 -36
  473. package/dist/pipeline/typed-append-event.d.ts +2 -0
  474. package/dist/pipeline/typed-append-event.js +4 -0
  475. package/dist/pipeline/write-origin.js +2 -2
  476. package/dist/pipeline/write-result-masking.d.ts +1 -1
  477. package/dist/random/index.d.ts +1 -2
  478. package/dist/random/index.js +1 -2
  479. package/dist/rate-limit/bucket.d.ts +2 -1
  480. package/dist/rate-limit/middleware.js +2 -1
  481. package/dist/redis/index.d.ts +3 -4
  482. package/dist/redis/index.js +2 -2
  483. package/dist/schema-cli/apply-command.js +5 -2
  484. package/dist/schema-cli/baseline-command.js +7 -2
  485. package/dist/schema-cli/generate-command.js +7 -9
  486. package/dist/schema-cli/shared.d.ts +4 -0
  487. package/dist/schema-cli/shared.js +21 -2
  488. package/dist/schema-cli/status-command.js +8 -2
  489. package/dist/schema-cli/validate-command.js +52 -4
  490. package/dist/schema-cli.d.ts +0 -1
  491. package/dist/search/configure-tenant-index.d.ts +1 -3
  492. package/dist/search/configure-tenant-index.js +0 -4
  493. package/dist/search/index.d.ts +1 -4
  494. package/dist/search/index.js +0 -2
  495. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  496. package/dist/search/meilisearch-adapter-internals.js +9 -0
  497. package/dist/search/meilisearch-adapter.d.ts +1 -8
  498. package/dist/search/meilisearch-adapter.js +6 -7
  499. package/dist/search/meilisearch-peer.d.ts +2 -0
  500. package/dist/search/meilisearch-peer.js +5 -0
  501. package/dist/search/reindex-entity.js +93 -87
  502. package/dist/secrets/index.d.ts +3 -4
  503. package/dist/secrets/index.js +2 -3
  504. package/dist/seeding/index.d.ts +2 -2
  505. package/dist/seeding/index.js +1 -2
  506. package/dist/time/index.d.ts +2 -2
  507. package/dist/time/index.js +1 -1
  508. package/dist/time/tz-context.d.ts +0 -5
  509. package/dist/time/tz-context.js +0 -9
  510. package/dist/ui-types/index.d.ts +8 -11
  511. package/dist/ui-types/index.js +3 -3
  512. package/dist/upgrade-changelog.d.ts +3 -2
  513. package/dist/upgrade-changelog.js +12 -8
  514. package/dist/upgrade-cli-internals.d.ts +8 -0
  515. package/dist/upgrade-cli-internals.js +63 -0
  516. package/dist/upgrade-cli.d.ts +1 -9
  517. package/dist/upgrade-cli.js +10 -64
  518. package/dist/utils/import-optional-peer.d.ts +6 -0
  519. package/dist/utils/import-optional-peer.js +19 -0
  520. package/dist/utils/index.d.ts +1 -4
  521. package/dist/utils/index.js +1 -4
  522. package/package.json +22 -18
  523. package/src/changes.json +206 -0
  524. package/dist/crypto/request-kms-cache.d.ts +0 -8
  525. package/dist/crypto/request-kms-cache.js +0 -21
  526. package/dist/engine/codemod/index.d.ts +0 -2
  527. package/dist/engine/codemod/index.js +0 -1
  528. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  529. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  530. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  531. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  532. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  533. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  534. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  535. package/dist/engine/feature-ast/extractors/events.js +0 -275
  536. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  537. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  538. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  539. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  540. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  541. package/dist/engine/feature-ast/extractors/index.js +0 -13
  542. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  543. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  544. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  545. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  546. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  547. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  548. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -11
  549. package/dist/engine/feature-ast/extractors/round1.js +0 -87
  550. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  551. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  552. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  553. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  554. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  555. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  556. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  557. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  558. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  559. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  560. package/dist/engine/feature-ast/index.d.ts +0 -16
  561. package/dist/engine/feature-ast/index.js +0 -10
  562. package/dist/engine/feature-ast/parse.d.ts +0 -31
  563. package/dist/engine/feature-ast/parse.js +0 -485
  564. package/dist/engine/feature-ast/patch.d.ts +0 -212
  565. package/dist/engine/feature-ast/patch.js +0 -611
  566. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  567. package/dist/engine/feature-ast/patcher.js +0 -281
  568. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1238
  569. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
  570. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  571. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
  572. package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
  573. package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
  574. package/dist/engine/feature-ast/patterns.d.ts +0 -322
  575. package/dist/engine/feature-ast/patterns.js +0 -107
  576. package/dist/engine/feature-ast/render.d.ts +0 -47
  577. package/dist/engine/feature-ast/render.js +0 -666
  578. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  579. package/dist/engine/feature-ast/source-location.js +0 -27
  580. package/dist/engine/pattern-library/index.d.ts +0 -2
  581. package/dist/engine/pattern-library/index.js +0 -3
  582. package/dist/engine/pattern-library/library.d.ts +0 -14
  583. package/dist/engine/pattern-library/library.js +0 -94
  584. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  585. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  586. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  587. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  588. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  589. package/dist/engine/pattern-library/shared-fields.js +0 -88
  590. package/dist/engine/pattern-library/static-schemas.d.ts +0 -21
  591. package/dist/engine/pattern-library/static-schemas.js +0 -487
  592. package/dist/engine/pattern-library/types.d.ts +0 -158
  593. package/dist/engine/pattern-library/types.js +0 -36
  594. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  595. package/dist/engine/resolve-config-or-param.js +0 -76
  596. package/src/scripts/codemod/README.md +0 -187
  597. package/src/scripts/codemod/codemod-support.ts +0 -334
  598. package/src/scripts/codemod/collect-source-files.ts +0 -48
  599. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  600. package/src/scripts/codemod/db-factory.ts +0 -810
  601. package/src/scripts/codemod/feature-factory.ts +0 -429
  602. package/src/scripts/codemod/feature-layout.ts +0 -424
  603. package/src/scripts/codemod/import-extensions.ts +0 -118
  604. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  605. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  606. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  607. package/src/scripts/codemod/object-form.ts +0 -746
  608. package/src/scripts/codemod/package-merge.ts +0 -299
  609. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  610. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  611. package/src/scripts/codemod/s3-imports.ts +0 -236
  612. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  613. package/src/scripts/codemod/testing-injection.ts +0 -215
  614. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  615. package/src/scripts/codemod/testing-move.ts +0 -542
  616. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
@@ -1,5 +1,10 @@
1
1
  import { errorCodeOf } from "@cosmicdrift/kumiko-types/type-guards";
2
- import { ErrorStatusCode, Meilisearch } from "meilisearch";
2
+ import { importOptionalPeer } from "../utils/import-optional-peer.js";
3
+ import { meilisearchDocId, meilisearchTenantIndex, } from "./meilisearch-adapter-internals.js";
4
+ import { MEILISEARCH_PEER } from "./meilisearch-peer.js";
5
+ // meilisearch is an optional peer; a static import would fail with the runtime's bare
6
+ // "Cannot find package" error instead of naming the peer and how to install it.
7
+ const { ErrorStatusCode, Meilisearch } = await importOptionalPeer(MEILISEARCH_PEER, () => import("meilisearch"));
3
8
  // meilisearch's waitTask() RESOLVES (never rejects) once the server task
4
9
  // reaches a terminal state, even "failed" — a rejected doc (e.g. an id over
5
10
  // Meili's 511-byte limit) otherwise fails silently and the caller thinks
@@ -50,14 +55,8 @@ function isIndexNotFound(err) {
50
55
  return errorCodeOf(cause) === ErrorStatusCode.INDEX_NOT_FOUND;
51
56
  }
52
57
  // Exported for unit tests (index-name / primary-key shape) without a live Meili.
53
- export function meilisearchTenantIndex(prefix, tenantId) {
54
- return `${prefix}t${tenantId}`;
55
- }
56
58
  // Meilisearch primary-key-ids: alphanumerics, `-`, `_`. UUIDs contain `-` —
57
59
  // legal. Replace anything else just in case callers pass unexpected shapes.
58
- export function meilisearchDocId(entityType, entityId) {
59
- return `${entityType}_${String(entityId).replace(/[^0-9A-Za-z_-]/g, "_")}`;
60
- }
61
60
  export function createMeilisearchAdapter(options) {
62
61
  const client = new Meilisearch({ host: options.url, apiKey: options.apiKey });
63
62
  const prefix = options.indexPrefix ?? "kumiko_";
@@ -0,0 +1,2 @@
1
+ import type { OptionalPeer } from "../utils/import-optional-peer.ts";
2
+ export declare const MEILISEARCH_PEER: OptionalPeer;
@@ -0,0 +1,5 @@
1
+ export const MEILISEARCH_PEER = {
2
+ name: "meilisearch",
3
+ range: "^0.58.0",
4
+ requiredBy: "@cosmicdrift/kumiko-framework/search/meilisearch",
5
+ };
@@ -7,6 +7,7 @@
7
7
  import { resolveTableName } from "../db/entity-table-meta.js";
8
8
  import { executeRawQueryRead } from "../db/queries/raw-sql.js";
9
9
  import { runInNewTransaction, runnerCanBeginTransaction } from "../db/query.js";
10
+ import { runInSystemRowLevelSecurityScope } from "../db/row-level-security-scope.js";
10
11
  import { buildSearchDocument, decryptSearchableSubjectFields, hasErasedSearchableSubjectField, } from "../pipeline/system-hooks.js";
11
12
  import { toSnakeCase } from "../utils/case.js";
12
13
  function quoteIdent(name) {
@@ -40,107 +41,112 @@ async function readBatchWithoutStatementTimeout(db, sqlText, params) {
40
41
  });
41
42
  }
42
43
  export async function reindexEntity(db, registry, searchAdapter, entityName, tenantId, options = {}) {
43
- const entity = registry.getEntity(entityName);
44
- if (!entity) {
45
- throw new Error(`reindexEntity: unknown entity "${entityName}"`);
46
- }
47
- const searchableFields = registry.getSearchableFields(entityName);
48
- const extensions = registry.getSearchPayloadExtensions(entityName);
49
- if (searchableFields.length === 0 && extensions.length === 0) {
50
- throw new Error(`reindexEntity: entity "${entityName}" has no searchable fields and no search-payload ` +
51
- `extensions — nothing to index.`);
52
- }
53
- const batchSize = options.batchSize ?? 500;
54
- const tableName = resolveTableName(entityName, entity, undefined);
55
- const fieldNames = Object.keys(entity.fields);
56
- // Soft-deleted rows already left the live index (the .deleted consumer
57
- // calls searchAdapter.remove()) — resurrecting them here would make
58
- // erased entities findable again.
59
- const deletedFilter = entity.softDelete === true ? `AND ${quoteIdent("is_deleted")} IS NOT TRUE` : "";
60
- const failures = [];
61
- const result = { scannedRows: 0, indexedRows: 0, wouldIndexRows: 0, failures };
62
- let lastId;
63
- // Whether a searchable field lacks a matching read-table column depends
64
- // only on the table's column set (rowToState/Object.hasOwn), not on any
65
- // particular row's data — every row from the same SELECT * has the same
66
- // columns. Check once against the first row instead of every row, so a
67
- // dropped/never-migrated column fails fast with one clear error instead
68
- // of one identical failures[] entry per scanned row (1M rows → 1M
69
- // entries, and the real schema problem is buried in "x failed").
70
- let uncheckedSchema = true;
71
- for (;;) {
72
- // Keyset, not OFFSET: rows deleted or changed while the loop runs must not shift the window.
73
- const afterLastId = lastId === undefined ? "" : `AND ${quoteIdent("id")} > $3`;
74
- const rows = await readBatchWithoutStatementTimeout(db, `SELECT * FROM ${quoteIdent(tableName)}
44
+ return runInSystemRowLevelSecurityScope("search reindex reads entity rows of all tenants", async () => {
45
+ const entity = registry.getEntity(entityName);
46
+ if (!entity) {
47
+ throw new Error(`reindexEntity: unknown entity "${entityName}"`);
48
+ }
49
+ const searchableFields = registry.getSearchableFields(entityName);
50
+ const extensions = registry.getSearchPayloadExtensions(entityName);
51
+ if (searchableFields.length === 0 && extensions.length === 0) {
52
+ throw new Error(`reindexEntity: entity "${entityName}" has no searchable fields and no search-payload ` +
53
+ `extensions — nothing to index.`);
54
+ }
55
+ const batchSize = options.batchSize ?? 500;
56
+ const tableName = resolveTableName(entityName, entity, undefined);
57
+ const fieldNames = Object.keys(entity.fields);
58
+ // Soft-deleted rows already left the live index (the .deleted consumer
59
+ // calls searchAdapter.remove()) — resurrecting them here would make
60
+ // erased entities findable again.
61
+ const deletedFilter = entity.softDelete === true ? `AND ${quoteIdent("is_deleted")} IS NOT TRUE` : "";
62
+ const failures = [];
63
+ const result = { scannedRows: 0, indexedRows: 0, wouldIndexRows: 0, failures };
64
+ let lastId;
65
+ // Whether a searchable field lacks a matching read-table column depends
66
+ // only on the table's column set (rowToState/Object.hasOwn), not on any
67
+ // particular row's data — every row from the same SELECT * has the same
68
+ // columns. Check once against the first row instead of every row, so a
69
+ // dropped/never-migrated column fails fast with one clear error instead
70
+ // of one identical failures[] entry per scanned row (1M rows → 1M
71
+ // entries, and the real schema problem is buried in "x failed").
72
+ let uncheckedSchema = true;
73
+ for (;;) {
74
+ // Keyset, not OFFSET: rows deleted or changed while the loop runs must not shift the window.
75
+ const afterLastId = lastId === undefined ? "" : `AND ${quoteIdent("id")} > $3`;
76
+ const rows = await readBatchWithoutStatementTimeout(db, `SELECT * FROM ${quoteIdent(tableName)}
75
77
  WHERE ${quoteIdent("tenant_id")} = $1 ${deletedFilter} ${afterLastId}
76
78
  ORDER BY ${quoteIdent("id")} ASC
77
79
  LIMIT $2`, lastId === undefined ? [tenantId, batchSize] : [tenantId, batchSize, lastId]);
78
- const [firstRow] = rows;
79
- if (firstRow === undefined)
80
- break;
81
- if (uncheckedSchema) {
82
- uncheckedSchema = false;
83
- const sampleState = rowToState(firstRow, fieldNames);
84
- const unmappedField = searchableFields.find((fieldName) => !(fieldName in sampleState));
85
- if (unmappedField !== undefined) {
86
- throw new Error(`reindexEntity: searchable field "${unmappedField}" is not mappable from read-table ` +
87
- `column ${quoteIdent(tableName)} — likely a dropped/never-migrated column.`);
88
- }
89
- }
90
- const docs = [];
91
- for (const row of rows) {
92
- result.scannedRows++;
93
- const entityId = String(row["id"]);
94
- try {
95
- const rawState = rowToState(row, fieldNames);
96
- // `pii + searchable` fields hold ciphertext on the read-table row —
97
- // decrypt the same way the live write-path consumer does. An
98
- // erased subject key doesn't throw, it swaps the value for
99
- // PII_ERASED_SENTINEL (see decryptSearchableSubjectFields) — check
100
- // for that AFTER decrypting, mirroring the softDelete filter above:
101
- // resurrecting a crypto-shredded row here would undo
102
- // purgeSearchDocumentsForSubject and make it findable again.
103
- const state = await decryptSearchableSubjectFields(entityName, rawState, registry);
104
- if (hasErasedSearchableSubjectField(entityName, state, registry))
105
- continue;
106
- const doc = await buildSearchDocument(entityName, entityId, state, registry);
107
- if (doc)
108
- docs.push({ entityId, doc });
109
- }
110
- catch (e) {
111
- result.failures.push({ entityId, reason: e instanceof Error ? e.message : String(e) });
80
+ const [firstRow] = rows;
81
+ if (firstRow === undefined)
82
+ break;
83
+ if (uncheckedSchema) {
84
+ uncheckedSchema = false;
85
+ const sampleState = rowToState(firstRow, fieldNames);
86
+ const unmappedField = searchableFields.find((fieldName) => !(fieldName in sampleState));
87
+ if (unmappedField !== undefined) {
88
+ throw new Error(`reindexEntity: searchable field "${unmappedField}" is not mappable from read-table ` +
89
+ `column ${quoteIdent(tableName)} — likely a dropped/never-migrated column.`);
90
+ }
112
91
  }
113
- }
114
- if (!options.dryRun && docs.length > 0) {
115
- if (searchAdapter.indexBatch) {
92
+ const docs = [];
93
+ for (const row of rows) {
94
+ result.scannedRows++;
95
+ const entityId = String(row["id"]);
116
96
  try {
117
- await searchAdapter.indexBatch(tenantId, docs.map((d) => d.doc));
118
- result.indexedRows += docs.length;
97
+ const rawState = rowToState(row, fieldNames);
98
+ // `pii + searchable` fields hold ciphertext on the read-table row —
99
+ // decrypt the same way the live write-path consumer does. An
100
+ // erased subject key doesn't throw, it swaps the value for
101
+ // PII_ERASED_SENTINEL (see decryptSearchableSubjectFields) — check
102
+ // for that AFTER decrypting, mirroring the softDelete filter above:
103
+ // resurrecting a crypto-shredded row here would undo
104
+ // purgeSearchDocumentsForSubject and make it findable again.
105
+ const state = await decryptSearchableSubjectFields(entityName, rawState, registry);
106
+ if (hasErasedSearchableSubjectField(entityName, state, registry))
107
+ continue;
108
+ const doc = await buildSearchDocument(entityName, entityId, state, registry);
109
+ if (doc)
110
+ docs.push({ entityId, doc });
119
111
  }
120
112
  catch (e) {
121
- const reason = e instanceof Error ? e.message : String(e);
122
- for (const { entityId } of docs)
123
- result.failures.push({ entityId, reason });
113
+ result.failures.push({ entityId, reason: e instanceof Error ? e.message : String(e) });
124
114
  }
125
115
  }
126
- else {
127
- for (const { entityId, doc } of docs) {
116
+ if (!options.dryRun && docs.length > 0) {
117
+ if (searchAdapter.indexBatch) {
128
118
  try {
129
- await searchAdapter.index(tenantId, doc);
130
- result.indexedRows++;
119
+ await searchAdapter.indexBatch(tenantId, docs.map((d) => d.doc));
120
+ result.indexedRows += docs.length;
131
121
  }
132
122
  catch (e) {
133
- result.failures.push({ entityId, reason: e instanceof Error ? e.message : String(e) });
123
+ const reason = e instanceof Error ? e.message : String(e);
124
+ for (const { entityId } of docs)
125
+ result.failures.push({ entityId, reason });
126
+ }
127
+ }
128
+ else {
129
+ for (const { entityId, doc } of docs) {
130
+ try {
131
+ await searchAdapter.index(tenantId, doc);
132
+ result.indexedRows++;
133
+ }
134
+ catch (e) {
135
+ result.failures.push({
136
+ entityId,
137
+ reason: e instanceof Error ? e.message : String(e),
138
+ });
139
+ }
134
140
  }
135
141
  }
136
142
  }
143
+ else if (options.dryRun) {
144
+ result.wouldIndexRows += docs.length;
145
+ }
146
+ lastId = rows[rows.length - 1]?.["id"];
147
+ if (rows.length < batchSize)
148
+ break;
137
149
  }
138
- else if (options.dryRun) {
139
- result.wouldIndexRows += docs.length;
140
- }
141
- lastId = rows[rows.length - 1]?.["id"];
142
- if (rows.length < batchSize)
143
- break;
144
- }
145
- return result;
150
+ return result;
151
+ });
146
152
  }
@@ -1,9 +1,8 @@
1
- export { createDekCache, type DekCache, type DekCacheOptions, withDekCache } from "./dek-cache.ts";
1
+ export { createDekCache, type DekCache, withDekCache } from "./dek-cache.ts";
2
2
  export { derivePurposeSecret } from "./derive-purpose-secret.ts";
3
- export { createEnvMasterKeyProvider, type EnvMasterKeyProviderOptions, type Keyring, } from "./env-master-key-provider.ts";
3
+ export { createEnvMasterKeyProvider } from "./env-master-key-provider.ts";
4
4
  export { decryptValue, encryptValue } from "./envelope.ts";
5
5
  export { createEnvelopeCipher, type EnvelopeCipher, type EnvelopeCipherOptions, } from "./envelope-cipher.ts";
6
- export { assertNoSecretLeak } from "./leak-guard.ts";
7
6
  export { rewrapDek } from "./rotation.ts";
8
7
  export { decodeStoredEnvelope, encodeStoredEnvelope, isStoredEnvelope, type StoredEnvelope, } from "./stored-envelope.ts";
9
- export { type ContainsSecret, createSecret, type Envelope, isSecret, type KeyScope, type MasterKeyProvider, type Secret, type SecretAuditContext, type SecretKeyRef, type SecretsContext, } from "./types.ts";
8
+ export { createSecret, type MasterKeyProvider, type Secret, type SecretsContext, } from "./types.ts";
@@ -1,9 +1,8 @@
1
1
  export { createDekCache, withDekCache } from "./dek-cache.js";
2
2
  export { derivePurposeSecret } from "./derive-purpose-secret.js";
3
- export { createEnvMasterKeyProvider, } from "./env-master-key-provider.js";
3
+ export { createEnvMasterKeyProvider } from "./env-master-key-provider.js";
4
4
  export { decryptValue, encryptValue } from "./envelope.js";
5
5
  export { createEnvelopeCipher, } from "./envelope-cipher.js";
6
- export { assertNoSecretLeak } from "./leak-guard.js";
7
6
  export { rewrapDek } from "./rotation.js";
8
7
  export { decodeStoredEnvelope, encodeStoredEnvelope, isStoredEnvelope, } from "./stored-envelope.js";
9
- export { createSecret, isSecret, } from "./types.js";
8
+ export { createSecret, } from "./types.js";
@@ -1,3 +1,3 @@
1
- export { type EventStoreSeedExisting, type RunEventStoreSeedOptions, runEventStoreSeed, } from "./entity-seed.ts";
1
+ export { runEventStoreSeed } from "./entity-seed.ts";
2
2
  export { createTestUser, TestUsers, testTenantId, testUserId } from "./seed-users.ts";
3
- export { DEFAULT_SEED_IF_EXISTS, type SeedIfExists } from "./types.ts";
3
+ export type { SeedIfExists } from "./types.ts";
@@ -1,3 +1,2 @@
1
- export { runEventStoreSeed, } from "./entity-seed.js";
1
+ export { runEventStoreSeed } from "./entity-seed.js";
2
2
  export { createTestUser, TestUsers, testTenantId, testUserId } from "./seed-users.js";
3
- export { DEFAULT_SEED_IF_EXISTS } from "./types.js";
@@ -1,6 +1,6 @@
1
1
  export { warnIfNonUtcServerTimeZone } from "./boot-tz-warning.ts";
2
- export type { GeoAddress, GeoCoordinates, GeoTzProvider } from "./geo-tz.ts";
2
+ export type { GeoTzProvider } from "./geo-tz.ts";
3
3
  export { isValidIanaTimeZone } from "./iana.ts";
4
4
  export { instantToLegacyDate, legacyDateToInstant } from "./legacy-date.ts";
5
5
  export { ensureTemporalPolyfill, getTemporal } from "./polyfill.ts";
6
- export { type Clock, createTzContext, createTzContextAsync, type LocatedTimestampJson, type TzContext, type TzContextOptions, } from "./tz-context.ts";
6
+ export { createTzContext, type TzContext, } from "./tz-context.ts";
@@ -12,4 +12,4 @@ export { warnIfNonUtcServerTimeZone } from "./boot-tz-warning.js";
12
12
  export { isValidIanaTimeZone } from "./iana.js";
13
13
  export { instantToLegacyDate, legacyDateToInstant } from "./legacy-date.js";
14
14
  export { ensureTemporalPolyfill, getTemporal } from "./polyfill.js";
15
- export { createTzContext, createTzContextAsync, } from "./tz-context.js";
15
+ export { createTzContext, } from "./tz-context.js";
@@ -6,8 +6,3 @@ export type { Clock, LocatedTimestampJson, TzContext, TzContextOptions, } from "
6
6
  * buildHandlerContext stays ambient-free.
7
7
  */
8
8
  export declare function createTzContext(options?: TzContextOptions): TzContext;
9
- /**
10
- * Convenience: ensures the polyfill is loaded AND creates the TzContext in
11
- * one await. Prefer this in boot code.
12
- */
13
- export declare function createTzContextAsync(options?: TzContextOptions): Promise<TzContext>;
@@ -18,7 +18,6 @@
18
18
  // The pure type contracts (TzContext, TzContextOptions, LocatedTimestampJson)
19
19
  // live in @cosmicdrift/kumiko-types/tz-context — only the factories are here.
20
20
  import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
21
- import { ensureTemporalPolyfill } from "./polyfill.js";
22
21
  const SYSTEM_CLOCK = {
23
22
  now: () => Temporal.Now.instant(), // @wrapper-known semantic-alias
24
23
  };
@@ -72,11 +71,3 @@ export function createTzContext(options = {}) {
72
71
  },
73
72
  };
74
73
  }
75
- /**
76
- * Convenience: ensures the polyfill is loaded AND creates the TzContext in
77
- * one await. Prefer this in boot code.
78
- */
79
- export async function createTzContextAsync(options) {
80
- await ensureTemporalPolyfill();
81
- return createTzContext(options);
82
- }
@@ -5,22 +5,19 @@ export type { FormDerivationScreen } from "../engine/form-derivations.ts";
5
5
  export { applyFormDerivations, isFormDerivationInputMode, isUnusedFallbackOperand, } from "../engine/form-derivations.ts";
6
6
  export type { ParsedRefTarget } from "../engine/parse-ref-target.ts";
7
7
  export { parseRefTarget } from "../engine/parse-ref-target.ts";
8
- export type { FieldsOrGroupsSection, UnavailableSelectOption } from "../engine/screen-helpers.ts";
9
- export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, explicitListScreenId, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.ts";
10
- export type { BooleanFieldDef, DateFieldDef, EmbeddedDerivedCellDef, EntityDefinition, FieldDefinition, FileFieldDef, FilesFieldDef, ImageFieldDef, ImagesFieldDef, NumberFieldDef, OptionsQueryPayload, OptionsQueryPayloadValue, SelectFieldDef, SelectOptionTone, TextFieldDef, } from "../engine/types/fields.ts";
11
- export type { AccessRule, OpenToAllAccessRule, OpenToAllDeclaration, OpenToAllPersonalData, RoleAccessPersonalData, RoleAccessRule, } from "../engine/types/handlers.ts";
8
+ export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.ts";
9
+ export type { EmbeddedDerivedCellDef, EntityDefinition, FieldDefinition, OptionsQueryPayload, SelectOptionTone, TextFieldDef, } from "../engine/types/fields.ts";
10
+ export type { AccessRule } from "../engine/types/handlers.ts";
12
11
  export { isOpenToAllGranted, isUiAccessGranted } from "../engine/types/handlers.ts";
13
12
  export type { IconKey, NavDefinition, NavIconKey } from "../engine/types/nav.ts";
14
- export type { ActionFormFooterAction, ActionFormLoad, ActionFormRedirect, ActionFormScreenDefinition, ActionFormSuccessFact, ActionFormSuccessLink, ConfigEditScreenDefinition, CustomScreenDefinition, CustomScreenRoute, DashboardChartKind, DashboardChartMarkerKind, DashboardChartPanel, DashboardChartRangeOption, DashboardChartRanges, DashboardChartTone, DashboardCurrencyFormat, DashboardCustomPanel, DashboardDateParam, DashboardFeedPanel, DashboardFilterDefinition, DashboardI18nText, DashboardListPanel, DashboardMoneyParam, DashboardPanelDefinition, DashboardPanelEmptyState, DashboardPanelGate, DashboardPanelQueryOptions, DashboardPanelSpan, DashboardPanelVisibility, DashboardProgressListPanel, DashboardProgressTone, DashboardRecordBinding, DashboardRefresh, DashboardRelativeTimeFormat, DashboardRelativeTimeParam, DashboardScopeDefinition, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardText, DashboardTextBlock, DashboardTextPanel, DashboardTextParam, DashboardTimeRangeDefinition, DashboardValueFormat, EditExtensionSection, EditFieldPrefill, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EmbeddedListEditSpec, EntityEditAction, EntityEditActionPlacement, EntityEditScreenDefinition, EntityListExpandableRow, EntityListFacetConfig, EntityListFacetExtraOption, EntityListScreenDefinition, EntityWriteExcludedFields, ExpandableRowGrouping, FieldAffix, FieldCondition, FieldFillAction, FieldIconKey, FieldRenderer, FormWidth, ListBadgeTone, ListBulkAction, ListColumnDisplay, ListColumnSpec, ListEmptyStateSpec, ListFacetSpec, ListSortSpec, ListTableDensity, ListTableOptions, MetricNavigate, MetricSpec, PlatformComponent, ProjectionDetailScreenDefinition, ProjectionListScreenDefinition, RecordHeaderSubtitlePart, RelatedListRowTone, RelatedListToolbarAction, RowAction, RowActionClientAction, RowActionDisplay, RowActionDrawer, RowActionMode, RowActionNavigate, RowActionWriteHandler, RowFieldExtractor, ScreenDefinition, ScreenFilter, ScreenFilterOp, ScreenSlots, SecretMintConfirmStep, SecretMintScreenDefinition, SecretReveal, SecretRevealField, SecretsEditScreenDefinition, SecretsEditSection, ToolbarAction, } from "../engine/types/screen.ts";
15
- export { MAX_BULK_SELECTION, relatedListGroupHeaderLabel, relatedListGroupKey, } from "../engine/types/screen.ts";
13
+ export type { ActionFormFooterAction, ActionFormLoad, ActionFormRedirect, ActionFormScreenDefinition, ActionFormSuccessFact, ActionFormSuccessLink, ConfigEditScreenDefinition, CustomScreenDefinition, DashboardChartMarkerKind, DashboardChartPanel, DashboardCurrencyFormat, DashboardCustomPanel, DashboardDateParam, DashboardFeedPanel, DashboardFilterDefinition, DashboardI18nText, DashboardListPanel, DashboardMoneyParam, DashboardPanelDefinition, DashboardPanelEmptyState, DashboardPanelQueryOptions, DashboardPanelSpan, DashboardPanelVisibility, DashboardProgressListPanel, DashboardProgressTone, DashboardRefresh, DashboardRelativeTimeParam, DashboardScopeDefinition, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardText, DashboardTextBlock, DashboardTextPanel, DashboardTextParam, DashboardTimeRangeDefinition, EditExtensionSection, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EmbeddedListEditSpec, EntityEditAction, EntityEditScreenDefinition, EntityListFacetConfig, EntityListScreenDefinition, FieldAffix, FieldCondition, FieldFillAction, FieldIconKey, FieldRenderer, FormWidth, ListBulkAction, ListColumnSpec, ListEmptyStateSpec, ListFacetSpec, ListSortSpec, ListTableOptions, MetricNavigate, PlatformComponent, ProjectionDetailScreenDefinition, ProjectionListScreenDefinition, RecordHeaderSubtitlePart, RelatedListRowTone, RelatedListToolbarAction, RowAction, RowActionClientAction, RowActionDisplay, RowActionDrawer, RowActionMode, RowActionNavigate, RowActionWriteHandler, RowFieldExtractor, ScreenDefinition, ScreenSlots, SecretMintConfirmStep, SecretMintScreenDefinition, SecretsEditScreenDefinition, ToolbarAction, } from "../engine/types/screen.ts";
14
+ export { MAX_BULK_SELECTION } from "../engine/types/screen.ts";
16
15
  export type { TargetRef } from "../engine/types/target-ref.ts";
17
- export type { TreeAction, TreeNode, TreeNodeState } from "../engine/types/tree-node.ts";
16
+ export type { TreeAction } from "../engine/types/tree-node.ts";
18
17
  export type { WorkspaceDefinition } from "../engine/types/workspace.ts";
19
18
  export { ACTION_FORM_ENTITY, handlerFieldLabelKey, handlerTitleKey, PROJECTION_DETAIL_ENTITY, WRITE_FORM_SECTION_ENTITY, } from "../i18n/required-surface-keys.ts";
20
19
  export type { AppSchema, FeatureSchema, QualifiedContentCollection, WorkspaceSchema, } from "./app-schema.ts";
21
- export type { CardColumnRoles, CardRoleColumn } from "./card-column-roles.ts";
22
- export { CARD_META_MAX, cardColumnRoles, cardFileDisplayKind } from "./card-column-roles.ts";
20
+ export { CARD_META_MAX, cardColumnRoles } from "./card-column-roles.ts";
23
21
  export { type Formality, formalLocaleTag } from "./formality.ts";
24
- export type { ListRowMetaColumnType, ListRowMetaReference, ReferenceLookupSource, SystemReferenceLabel, } from "./list-row-meta.ts";
25
22
  export { LIST_ROW_META_COLUMNS, LIST_ROW_META_REFERENCES, REFERENCE_LOOKUP_SOURCES, SYSTEM_REFERENCE_LABELS, UNRESOLVED_REFERENCE_LABEL_KEYS, } from "./list-row-meta.ts";
26
- export { type PluralForms, resolveTranslationValue, type TranslationValue, translationValueOtherText, } from "./plural.ts";
23
+ export { resolveTranslationValue, type TranslationValue, translationValueOtherText, } from "./plural.ts";
@@ -23,11 +23,11 @@ export { NO_WIDGET_FIELD_TYPES } from "@cosmicdrift/kumiko-types/fields";
23
23
  export { computeDerivedCellValue, roundDerivedCellValue } from "../engine/embedded-derived.js";
24
24
  export { applyFormDerivations, isFormDerivationInputMode, isUnusedFallbackOperand, } from "../engine/form-derivations.js";
25
25
  export { parseRefTarget } from "../engine/parse-ref-target.js";
26
- export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, explicitListScreenId, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.js";
26
+ export { ACTION_FORM_PSEUDO_ENTITY, availableSelectOptions, evalFieldCondition, findUnavailableSelectOptions, isExtensionEditSection, isFieldsEditSection, isFormatSpec, isRecordLocked, isUnchangedValue, isWriteFormEditSection, normalizeEditField, normalizeListColumn, resolveNavParentScreen, sectionFieldSpecs, } from "../engine/screen-helpers.js";
27
27
  export { isOpenToAllGranted, isUiAccessGranted } from "../engine/types/handlers.js";
28
- export { MAX_BULK_SELECTION, relatedListGroupHeaderLabel, relatedListGroupKey, } from "../engine/types/screen.js";
28
+ export { MAX_BULK_SELECTION } from "../engine/types/screen.js";
29
29
  export { ACTION_FORM_ENTITY, handlerFieldLabelKey, handlerTitleKey, PROJECTION_DETAIL_ENTITY, WRITE_FORM_SECTION_ENTITY, } from "../i18n/required-surface-keys.js";
30
- export { CARD_META_MAX, cardColumnRoles, cardFileDisplayKind } from "./card-column-roles.js";
30
+ export { CARD_META_MAX, cardColumnRoles } from "./card-column-roles.js";
31
31
  export { formalLocaleTag } from "./formality.js";
32
32
  export { LIST_ROW_META_COLUMNS, LIST_ROW_META_REFERENCES, REFERENCE_LOOKUP_SOURCES, SYSTEM_REFERENCE_LABELS, UNRESOLVED_REFERENCE_LABEL_KEYS, } from "./list-row-meta.js";
33
33
  export { resolveTranslationValue, translationValueOtherText, } from "./plural.js";
@@ -1,3 +1,4 @@
1
+ import type { UpgradeMarkerResolvedManual } from "./upgrade-marker-parse.ts";
1
2
  export type UpgradeChangelogManual = {
2
3
  readonly id: string;
3
4
  readonly version: string;
@@ -23,5 +24,5 @@ export type UpgradeChangelogSection = {
23
24
  export declare function renderUpgradeSection(section: UpgradeChangelogSection): string;
24
25
  /** Puts the section on top; a section for the same target version is replaced, so a re-run stays idempotent. */
25
26
  export declare function mergeUpgradeSection(existing: string | undefined, section: UpgradeChangelogSection): string;
26
- /** Pure string match on the rendered `- [open] <id> · ` prefix, in every section. */
27
- export declare function setManualStatusInChangelog(content: string, ids: ReadonlySet<string>, resolution: "migrated" | "not-applicable"): string;
27
+ /** Pure string match on the rendered `- [open] <id> · ` prefix, in every section; each id gets its own resolution. */
28
+ export declare function syncResolvedManualStatuses(content: string, resolved: readonly Pick<UpgradeMarkerResolvedManual, "id" | "resolution">[]): string;
@@ -46,17 +46,21 @@ export function mergeUpgradeSection(existing, section) {
46
46
  const others = sections.filter((candidate) => !candidate.startsWith(prefix));
47
47
  return [header, renderUpgradeSection(section), ...others].join("\n");
48
48
  }
49
- /** Pure string match on the rendered `- [open] <id> · ` prefix, in every section. */
50
- export function setManualStatusInChangelog(content, ids, resolution) {
49
+ /** Pure string match on the rendered `- [open] <id> · ` prefix, in every section; each id gets its own resolution. */
50
+ export function syncResolvedManualStatuses(content, resolved) {
51
+ const resolutionById = new Map(resolved.map((entry) => [entry.id, entry.resolution]));
52
+ if (resolutionById.size === 0)
53
+ return content;
54
+ const openPrefix = "- [open] ";
51
55
  return content
52
56
  .split("\n")
53
57
  .map((line) => {
54
- for (const id of ids) {
55
- const open = `- [open] ${id} · `;
56
- if (line.startsWith(open))
57
- return `- [${resolution}] ${id} · ${line.slice(open.length)}`;
58
- }
59
- return line;
58
+ if (!line.startsWith(openPrefix))
59
+ return line;
60
+ const rest = line.slice(openPrefix.length);
61
+ const idEnd = rest.indexOf(" · ");
62
+ const resolution = idEnd === -1 ? undefined : resolutionById.get(rest.slice(0, idEnd));
63
+ return resolution === undefined ? line : `- [${resolution}] ${rest}`;
60
64
  })
61
65
  .join("\n");
62
66
  }
@@ -0,0 +1,8 @@
1
+ export declare const CODEMOD_SUBDIR = "scripts/codemod";
2
+ export declare const CODEMOD_PACKAGE_NAME = "@cosmicdrift/kumiko-feature-ast";
3
+ export type UpgradeCliOut = {
4
+ readonly log: (line: string) => void;
5
+ readonly err: (line: string) => void;
6
+ };
7
+ export declare function findFeatureChangelogFiles(featuresDir: string): string[];
8
+ export declare function findCodemodScriptsRoot(repoRoot: string): string | null;
@@ -0,0 +1,63 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { propertyOf } from "@cosmicdrift/kumiko-types/type-guards";
4
+ export const CODEMOD_SUBDIR = "scripts/codemod";
5
+ export const CODEMOD_PACKAGE_NAME = "@cosmicdrift/kumiko-feature-ast";
6
+ export function findFeatureChangelogFiles(featuresDir) {
7
+ if (!existsSync(featuresDir))
8
+ return [];
9
+ const files = [];
10
+ const features = readdirSync(featuresDir, { withFileTypes: true })
11
+ .filter((d) => d.isDirectory())
12
+ .map((d) => d.name);
13
+ for (const name of features) {
14
+ // Layout is detected per-package, not guessed from a naming convention:
15
+ // enterprise packages keep changes.json under src/, framework's
16
+ // bundled-features keep it flat. A name-prefix heuristic (e.g. "ai-*")
17
+ // silently drops packages that don't match it.
18
+ const srcLayout = join(featuresDir, name, "src", "changes.json");
19
+ const flatLayout = join(featuresDir, name, "changes.json");
20
+ const changelogPath = existsSync(srcLayout) ? srcLayout : flatLayout;
21
+ if (existsSync(changelogPath))
22
+ files.push(changelogPath);
23
+ }
24
+ return files;
25
+ }
26
+ // Consumer-facing codemod scripts ship inside the published
27
+ // @cosmicdrift/kumiko-feature-ast package (src/scripts/codemod), not at the
28
+ // git repo root — only the installed package path exists in a consumer's
29
+ // node_modules after a plain npm/bun install.
30
+ export function findCodemodScriptsRoot(repoRoot) {
31
+ const local = join(repoRoot, "packages/feature-ast/src");
32
+ if (existsSync(join(local, CODEMOD_SUBDIR))) {
33
+ // If package.json exists, require it to be kumiko-feature-ast so a generic
34
+ // monorepo `packages/feature-ast` cannot shadow the installed package.
35
+ // Missing package.json (test fixtures / incomplete trees) keeps prior behavior.
36
+ const pkgPath = join(repoRoot, "packages/feature-ast/package.json");
37
+ if (existsSync(pkgPath)) {
38
+ try {
39
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
40
+ if (propertyOf(pkg, "name") === CODEMOD_PACKAGE_NAME)
41
+ return local;
42
+ // wrong name → fall through
43
+ }
44
+ catch {
45
+ // unreadable → fall through
46
+ }
47
+ }
48
+ else {
49
+ return local;
50
+ }
51
+ }
52
+ let dir = repoRoot;
53
+ for (let i = 0; i < 10; i++) {
54
+ const nmSrc = join(dir, "node_modules", CODEMOD_PACKAGE_NAME, "src");
55
+ if (existsSync(join(nmSrc, CODEMOD_SUBDIR)))
56
+ return nmSrc;
57
+ const parent = join(dir, "..");
58
+ if (parent === dir)
59
+ break;
60
+ dir = parent;
61
+ }
62
+ return null;
63
+ }
@@ -1,14 +1,6 @@
1
- import { type ManualResolution, manualEntryId, type UpgradeMarkerManual, type UpgradeMarkerResolvedManual } from "./upgrade-marker-parse.ts";
2
- export type { ManualResolution, UpgradeMarkerManual, UpgradeMarkerResolvedManual };
3
- export { manualEntryId };
4
- export type UpgradeCliOut = {
5
- readonly log: (line: string) => void;
6
- readonly err: (line: string) => void;
7
- };
8
- export declare function findFeatureChangelogFiles(featuresDir: string): string[];
1
+ import { type UpgradeCliOut } from "./upgrade-cli-internals.ts";
9
2
  export declare function findPackageChangelogFiles(cwd: string): string[];
10
3
  export declare function findFeaturesDirs(cwd: string): string[];
11
- export declare function findCodemodScriptsRoot(repoRoot: string): string | null;
12
4
  export declare function resolveCodemodScript(repoRoot: string, codemodField: string | undefined): string | null;
13
5
  export declare function runUpgradeCli(argv: readonly string[], cwd: string, out: UpgradeCliOut, options?: {
14
6
  readonly repoRoot?: string;