@cosmicdrift/kumiko-framework 0.389.0 → 0.390.1

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 (617) 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/driver-value-preparation.js +23 -2
  98. package/dist/db/eagerload.d.ts +2 -1
  99. package/dist/db/entity-field-encryption.d.ts +1 -1
  100. package/dist/db/entity-table-meta.d.ts +1 -1
  101. package/dist/db/event-store-executor-context.d.ts +3 -1
  102. package/dist/db/event-store-executor-context.js +4 -3
  103. package/dist/db/event-store-executor-read-filter.d.ts +1 -1
  104. package/dist/db/event-store-executor-read-rows.d.ts +2 -1
  105. package/dist/db/event-store-executor-read-search.d.ts +2 -1
  106. package/dist/db/event-store-executor-read-sort.d.ts +2 -1
  107. package/dist/db/event-store-executor-read.js +2 -2
  108. package/dist/db/event-store-executor-write-atomic.js +8 -7
  109. package/dist/db/event-store-executor-write-steps.d.ts +3 -2
  110. package/dist/db/event-store-executor-write.js +7 -4
  111. package/dist/db/event-store-executor.d.ts +1 -1
  112. package/dist/db/executor-managed-tables.d.ts +7 -1
  113. package/dist/db/executor-managed-tables.js +11 -2
  114. package/dist/db/index.d.ts +29 -28
  115. package/dist/db/index.js +22 -20
  116. package/dist/db/known-table-names.d.ts +6 -0
  117. package/dist/db/known-table-names.js +21 -0
  118. package/dist/db/list-aggregate-labels.d.ts +1 -1
  119. package/dist/db/located-timestamp.d.ts +1 -1
  120. package/dist/db/located-timestamp.js +0 -5
  121. package/dist/db/migrate-generator.d.ts +17 -1
  122. package/dist/db/migrate-generator.js +50 -20
  123. package/dist/db/migrate-primary-key.d.ts +12 -0
  124. package/dist/db/migrate-primary-key.js +45 -0
  125. package/dist/db/migrate-rls-diff.d.ts +20 -0
  126. package/dist/db/migrate-rls-diff.js +61 -0
  127. package/dist/db/migrate-runner.js +4 -0
  128. package/dist/db/money.d.ts +1 -1
  129. package/dist/db/money.js +1 -1
  130. package/dist/db/parent-ref-clause.d.ts +2 -1
  131. package/dist/db/pg-error.d.ts +2 -0
  132. package/dist/db/pg-error.js +11 -0
  133. package/dist/db/queries/ddl.d.ts +3 -0
  134. package/dist/db/queries/ddl.js +34 -1
  135. package/dist/db/queries/event-store.js +4 -2
  136. package/dist/db/queries/event-tenants.d.ts +2 -0
  137. package/dist/db/queries/event-tenants.js +17 -0
  138. package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
  139. package/dist/db/queries/rebuild-rls-guard.js +29 -0
  140. package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
  141. package/dist/db/queries/rls-boot-catalog.js +39 -0
  142. package/dist/db/queries/rls-catalog.d.ts +6 -0
  143. package/dist/db/queries/rls-catalog.js +82 -0
  144. package/dist/db/queries/rls-scope.d.ts +3 -0
  145. package/dist/db/queries/rls-scope.js +17 -0
  146. package/dist/db/queries/rls-shape.d.ts +10 -0
  147. package/dist/db/queries/rls-shape.js +42 -0
  148. package/dist/db/queries/session-advisory-lock.d.ts +2 -0
  149. package/dist/db/queries/session-advisory-lock.js +23 -0
  150. package/dist/db/queries/shadow-swap.d.ts +1 -2
  151. package/dist/db/queries/shadow-swap.js +9 -25
  152. package/dist/db/queries/test-stack.d.ts +4 -1
  153. package/dist/db/queries/test-stack.js +84 -2
  154. package/dist/db/query.js +11 -7
  155. package/dist/db/reference-data.d.ts +1 -1
  156. package/dist/db/reference-data.js +6 -1
  157. package/dist/db/render-ddl.d.ts +6 -2
  158. package/dist/db/render-ddl.js +7 -7
  159. package/dist/db/render-rls-ddl.d.ts +35 -0
  160. package/dist/db/render-rls-ddl.js +127 -0
  161. package/dist/db/replay-migration-sql.d.ts +3 -1
  162. package/dist/db/replay-migration-sql.js +22 -5
  163. package/dist/db/replay-rls.d.ts +25 -0
  164. package/dist/db/replay-rls.js +156 -0
  165. package/dist/db/row-level-security-boot-check.d.ts +6 -0
  166. package/dist/db/row-level-security-boot-check.js +86 -0
  167. package/dist/db/row-level-security-connection.d.ts +3 -0
  168. package/dist/db/row-level-security-connection.js +213 -0
  169. package/dist/db/row-level-security-scope.d.ts +33 -0
  170. package/dist/db/row-level-security-scope.js +127 -0
  171. package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
  172. package/dist/db/scope-tenant-db-to-tenant.js +14 -0
  173. package/dist/db/sql-identifier.d.ts +1 -0
  174. package/dist/db/sql-identifier.js +3 -0
  175. package/dist/db/table-builder.d.ts +2 -1
  176. package/dist/db/table-builder.js +1 -1
  177. package/dist/db/table-info.js +1 -1
  178. package/dist/db/table-push.d.ts +11 -2
  179. package/dist/db/table-push.js +15 -2
  180. package/dist/db/tenant-db-runner.d.ts +3 -1
  181. package/dist/db/tenant-db-runner.js +4 -3
  182. package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
  183. package/dist/db/tenant-db-scoped-rebind.js +33 -0
  184. package/dist/db/tenant-db-statement-runner.d.ts +13 -0
  185. package/dist/db/tenant-db-statement-runner.js +48 -0
  186. package/dist/db/tenant-db.d.ts +17 -12
  187. package/dist/db/tenant-db.js +49 -120
  188. package/dist/db/tenant-id-filter.d.ts +3 -0
  189. package/dist/db/tenant-id-filter.js +30 -0
  190. package/dist/db/transaction-serialization.d.ts +6 -0
  191. package/dist/db/transaction-serialization.js +60 -0
  192. package/dist/derivatives/delete-stored-file.js +1 -1
  193. package/dist/derivatives/index.d.ts +2 -5
  194. package/dist/derivatives/index.js +2 -3
  195. package/dist/engine/access.d.ts +2 -1
  196. package/dist/engine/access.js +1 -1
  197. package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
  198. package/dist/engine/boot-validator/entity-handler.js +1 -1
  199. package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +1 -1
  200. package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
  201. package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
  202. package/dist/engine/boot-validator/nav.d.ts +3 -1
  203. package/dist/engine/boot-validator/nav.js +1 -1
  204. package/dist/engine/boot-validator/ownership.d.ts +2 -1
  205. package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
  206. package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
  207. package/dist/engine/boot-validator/query-refs.d.ts +2 -1
  208. package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
  209. package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
  210. package/dist/engine/boot-validator/screens.d.ts +2 -1
  211. package/dist/engine/boot-validator/workspaces.d.ts +3 -1
  212. package/dist/engine/bridge-stub.d.ts +5 -2
  213. package/dist/engine/bridge-stub.js +39 -24
  214. package/dist/engine/config-helpers.d.ts +2 -2
  215. package/dist/engine/config-helpers.js +0 -9
  216. package/dist/engine/constants.d.ts +0 -10
  217. package/dist/engine/constants.js +0 -8
  218. package/dist/engine/create-app.js +1 -1
  219. package/dist/engine/define-feature.d.ts +2 -1
  220. package/dist/engine/define-feature.js +1 -2
  221. package/dist/engine/define-handler.d.ts +1 -1
  222. package/dist/engine/define-step.d.ts +0 -1
  223. package/dist/engine/define-step.js +0 -3
  224. package/dist/engine/embedded-derived.d.ts +1 -1
  225. package/dist/engine/entity-handlers.d.ts +2 -1
  226. package/dist/engine/entity-handlers.js +7 -7
  227. package/dist/engine/entity-list-runtime-options.js +3 -1
  228. package/dist/engine/entity-list-searchability.d.ts +2 -1
  229. package/dist/engine/event-def.d.ts +2 -1
  230. package/dist/engine/event-helpers.d.ts +3 -1
  231. package/dist/engine/event-helpers.js +3 -3
  232. package/dist/engine/extension-names.d.ts +2 -8
  233. package/dist/engine/extension-names.js +2 -2
  234. package/dist/engine/extension-selector-plugins.d.ts +1 -1
  235. package/dist/engine/extensions/storage-provider.d.ts +1 -2
  236. package/dist/engine/extensions/user-data.d.ts +0 -8
  237. package/dist/engine/factories.d.ts +2 -1
  238. package/dist/engine/feature-builder-state.d.ts +8 -1
  239. package/dist/engine/feature-changelog.d.ts +1 -1
  240. package/dist/engine/feature-config-events-jobs.d.ts +4 -1
  241. package/dist/engine/feature-entity-handlers.d.ts +5 -1
  242. package/dist/engine/feature-manifest.js +1 -1
  243. package/dist/engine/feature-ui-extensions.d.ts +7 -1
  244. package/dist/engine/feature-ui-extensions.js +6 -4
  245. package/dist/engine/field-access.d.ts +2 -1
  246. package/dist/engine/handler-field-references.d.ts +0 -4
  247. package/dist/engine/index.d.ts +57 -54
  248. package/dist/engine/index.js +22 -27
  249. package/dist/engine/instruction-fields.d.ts +1 -1
  250. package/dist/engine/personal-data-fields.d.ts +1 -1
  251. package/dist/engine/qualified-name.d.ts +0 -1
  252. package/dist/engine/read-claim.d.ts +2 -1
  253. package/dist/engine/registry-facade.js +0 -3
  254. package/dist/engine/registry-ingest.d.ts +2 -1
  255. package/dist/engine/registry-ingest.js +1 -2
  256. package/dist/engine/registry-state.d.ts +12 -2
  257. package/dist/engine/registry-state.js +2 -3
  258. package/dist/engine/registry-validate.d.ts +3 -1
  259. package/dist/engine/registry-validate.js +7 -7
  260. package/dist/engine/run-in.d.ts +1 -1
  261. package/dist/engine/run-in.js +0 -1
  262. package/dist/engine/schema-builder.d.ts +1 -1
  263. package/dist/engine/schema-builder.js +1 -1
  264. package/dist/engine/screen-filter-ops.d.ts +2 -1
  265. package/dist/engine/screen-filter-ops.js +0 -5
  266. package/dist/engine/soft-delete-cleanup.d.ts +1 -1
  267. package/dist/engine/soft-delete-cleanup.js +4 -4
  268. package/dist/engine/state-machine.js +2 -1
  269. package/dist/engine/steps/_read-source.js +1 -1
  270. package/dist/engine/steps/aggregate-append-event.js +2 -2
  271. package/dist/engine/steps/call-feature.js +2 -2
  272. package/dist/engine/steps/mail-send.js +1 -1
  273. package/dist/engine/steps/retry.js +1 -1
  274. package/dist/engine/steps/wait-for-event.js +1 -1
  275. package/dist/engine/steps/wait.js +1 -1
  276. package/dist/engine/steps/webhook-send.js +1 -1
  277. package/dist/engine/template-variables.d.ts +2 -1
  278. package/dist/engine/transfer-adjacency.d.ts +1 -1
  279. package/dist/engine/types/index.d.ts +8 -31
  280. package/dist/engine/types/index.js +2 -10
  281. package/dist/engine/validation.d.ts +2 -1
  282. package/dist/entrypoint/index.d.ts +7 -35
  283. package/dist/entrypoint/index.js +7 -1
  284. package/dist/entrypoint/internals.d.ts +40 -0
  285. package/dist/entrypoint/internals.js +1 -0
  286. package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
  287. package/dist/entrypoint/row-level-security-mode-check.js +19 -0
  288. package/dist/env/dry-run-internals.d.ts +10 -0
  289. package/dist/env/dry-run-internals.js +1 -0
  290. package/dist/env/dry-run.d.ts +1 -10
  291. package/dist/env/dry-run.js +2 -1
  292. package/dist/env/index.d.ts +1 -85
  293. package/dist/env/index.js +6 -50
  294. package/dist/env/internals.d.ts +87 -0
  295. package/dist/env/internals.js +53 -0
  296. package/dist/errors/classes.js +2 -2
  297. package/dist/errors/index.d.ts +5 -14
  298. package/dist/errors/index.js +4 -9
  299. package/dist/errors/member-resolution.js +1 -1
  300. package/dist/errors/reasons.d.ts +0 -1
  301. package/dist/errors/reasons.js +7 -7
  302. package/dist/errors/serialize.d.ts +0 -18
  303. package/dist/errors/serialize.js +0 -27
  304. package/dist/es-ops/index.d.ts +4 -4
  305. package/dist/es-ops/index.js +2 -2
  306. package/dist/es-ops/operations-schema.d.ts +1 -1
  307. package/dist/es-ops/types.d.ts +4 -5
  308. package/dist/event-store/admin-api-internals.d.ts +14 -0
  309. package/dist/event-store/admin-api-internals.js +1 -0
  310. package/dist/event-store/admin-api.d.ts +1 -14
  311. package/dist/event-store/admin-api.js +11 -6
  312. package/dist/event-store/archive.js +4 -2
  313. package/dist/event-store/errors.js +2 -2
  314. package/dist/event-store/event-store.js +41 -34
  315. package/dist/event-store/events-schema.js +4 -1
  316. package/dist/event-store/index.d.ts +11 -13
  317. package/dist/event-store/index.js +7 -9
  318. package/dist/event-store/rebuild-dead-letter.js +4 -2
  319. package/dist/event-store/snapshot.js +4 -3
  320. package/dist/event-store/stream-scope.d.ts +2 -0
  321. package/dist/event-store/stream-scope.js +6 -0
  322. package/dist/event-store/upcaster-dead-letter.js +4 -2
  323. package/dist/event-store/upcaster.d.ts +2 -1
  324. package/dist/files/action-form-upload.d.ts +2 -1
  325. package/dist/files/action-form-upload.js +1 -1
  326. package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
  327. package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
  328. package/dist/files/bind-pending-file-refs.d.ts +2 -1
  329. package/dist/files/bind-pending-file-refs.js +2 -1
  330. package/dist/files/bind-referenced-files.write.js +1 -1
  331. package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
  332. package/dist/files/create-file-ref-from-bytes.js +3 -3
  333. package/dist/files/create-file-ref.d.ts +3 -2
  334. package/dist/files/create-file-ref.js +2 -2
  335. package/dist/files/dispose-removed-file-refs.d.ts +2 -1
  336. package/dist/files/dispose-removed-file-refs.js +1 -1
  337. package/dist/files/feature.js +2 -2
  338. package/dist/files/file-handle.js +1 -1
  339. package/dist/files/file-routes.d.ts +1 -1
  340. package/dist/files/file-routes.js +12 -2
  341. package/dist/files/index.d.ts +11 -13
  342. package/dist/files/index.js +5 -7
  343. package/dist/files/load-save-file-refs.d.ts +2 -1
  344. package/dist/files/load-save-file-refs.js +1 -1
  345. package/dist/files/provider-resolver.d.ts +5 -4
  346. package/dist/files/provider-resolver.js +4 -4
  347. package/dist/files/storage-tracking.js +4 -2
  348. package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
  349. package/dist/files/sweep-orphaned-uploads.js +1 -1
  350. package/dist/i18n/index.d.ts +2 -8
  351. package/dist/i18n/index.js +1 -1
  352. package/dist/i18n/internals.d.ts +7 -0
  353. package/dist/i18n/internals.js +1 -0
  354. package/dist/i18n/required-surface-keys.d.ts +4 -1
  355. package/dist/internal/row-level-security.d.ts +3 -0
  356. package/dist/internal/row-level-security.js +3 -0
  357. package/dist/internal/stack-support.d.ts +1 -1
  358. package/dist/internal/stack-support.js +1 -1
  359. package/dist/internal/testing.d.ts +1 -0
  360. package/dist/internal/testing.js +9 -5
  361. package/dist/jobs/index.d.ts +1 -1
  362. package/dist/jobs/job-append-event.d.ts +12 -0
  363. package/dist/jobs/job-append-event.js +30 -0
  364. package/dist/jobs/job-runner-context.d.ts +2 -2
  365. package/dist/jobs/job-runner-context.js +46 -16
  366. package/dist/jobs/job-runner-execution.d.ts +1 -1
  367. package/dist/jobs/job-runner-execution.js +6 -4
  368. package/dist/jobs/job-runner-gates.d.ts +1 -1
  369. package/dist/jobs/job-runner-gates.js +0 -1
  370. package/dist/jobs/job-runner-helpers.d.ts +11 -4
  371. package/dist/jobs/job-runner-helpers.js +10 -1
  372. package/dist/jobs/job-runner-scope.d.ts +5 -2
  373. package/dist/jobs/job-runner-types.d.ts +2 -1
  374. package/dist/jobs/job-runner.js +19 -6
  375. package/dist/jobs/max-per-tenant.d.ts +1 -1
  376. package/dist/logging/index.d.ts +1 -2
  377. package/dist/logging/index.js +1 -1
  378. package/dist/logging/pino-logger.js +1 -1
  379. package/dist/logging/utils.d.ts +1 -0
  380. package/dist/logging/utils.js +6 -0
  381. package/dist/migrations/index.d.ts +3 -3
  382. package/dist/migrations/index.js +3 -3
  383. package/dist/migrations/pending-rebuilds.d.ts +1 -1
  384. package/dist/migrations/pending-rebuilds.js +1 -1
  385. package/dist/migrations/pii-event-backfill.js +4 -1
  386. package/dist/observability/escape-hatch-report.d.ts +2 -1
  387. package/dist/observability/index.d.ts +7 -15
  388. package/dist/observability/index.js +4 -12
  389. package/dist/observability/metric-validator.js +1 -1
  390. package/dist/observability/metrics-handle.d.ts +0 -1
  391. package/dist/observability/metrics-handle.js +2 -15
  392. package/dist/observability/recording-tracer.d.ts +1 -2
  393. package/dist/observability/recording-tracer.js +0 -6
  394. package/dist/observability/sensitive-filter.d.ts +0 -2
  395. package/dist/observability/sensitive-filter.js +0 -29
  396. package/dist/pipeline/active-membership.d.ts +2 -1
  397. package/dist/pipeline/active-membership.js +6 -2
  398. package/dist/pipeline/append-event-core.d.ts +2 -1
  399. package/dist/pipeline/append-event-core.js +2 -2
  400. package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
  401. package/dist/pipeline/attach-outside-transaction.js +13 -0
  402. package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
  403. package/dist/pipeline/cascade-handler.d.ts +2 -1
  404. package/dist/pipeline/cascade-handler.js +3 -2
  405. package/dist/pipeline/config-accessor-factory.d.ts +1 -1
  406. package/dist/pipeline/config-accessor-factory.js +1 -1
  407. package/dist/pipeline/context-services.d.ts +56 -0
  408. package/dist/pipeline/context-services.js +73 -0
  409. package/dist/pipeline/dispatch-batch.d.ts +2 -1
  410. package/dist/pipeline/dispatch-batch.js +31 -18
  411. package/dist/pipeline/dispatch-query.js +5 -4
  412. package/dist/pipeline/dispatch-scope.d.ts +6 -0
  413. package/dist/pipeline/dispatch-scope.js +27 -0
  414. package/dist/pipeline/dispatch-shared.d.ts +13 -9
  415. package/dist/pipeline/dispatch-shared.js +75 -198
  416. package/dist/pipeline/dispatch-stream.js +8 -4
  417. package/dist/pipeline/dispatch-write.d.ts +2 -1
  418. package/dist/pipeline/dispatch-write.js +10 -8
  419. package/dist/pipeline/dispatcher-utils.d.ts +3 -1
  420. package/dist/pipeline/dispatcher-utils.js +8 -2
  421. package/dist/pipeline/dispatcher.d.ts +3 -2
  422. package/dist/pipeline/dispatcher.js +4 -3
  423. package/dist/pipeline/event-consumer-state.d.ts +0 -1
  424. package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
  425. package/dist/pipeline/event-dispatcher-delivery.js +4 -2
  426. package/dist/pipeline/event-dispatcher.d.ts +2 -2
  427. package/dist/pipeline/event-dispatcher.js +7 -3
  428. package/dist/pipeline/event-retention.js +59 -56
  429. package/dist/pipeline/handler-access-error.js +2 -1
  430. package/dist/pipeline/handler-context-auth.d.ts +5 -6
  431. package/dist/pipeline/handler-context-auth.js +7 -4
  432. package/dist/pipeline/handler-context-config.d.ts +2 -5
  433. package/dist/pipeline/handler-context-config.js +2 -2
  434. package/dist/pipeline/handler-context-db.d.ts +32 -7
  435. package/dist/pipeline/handler-context-db.js +26 -17
  436. package/dist/pipeline/handler-context-dispatch.d.ts +13 -7
  437. package/dist/pipeline/handler-context-dispatch.js +9 -8
  438. package/dist/pipeline/handler-context-events.d.ts +22 -36
  439. package/dist/pipeline/handler-context-events.js +36 -31
  440. package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
  441. package/dist/pipeline/handler-context-member-resolution.js +110 -0
  442. package/dist/pipeline/handler-context-notify.d.ts +3 -2
  443. package/dist/pipeline/handler-context-notify.js +1 -1
  444. package/dist/pipeline/handler-context-observability.d.ts +2 -4
  445. package/dist/pipeline/handler-context-observability.js +7 -5
  446. package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
  447. package/dist/pipeline/handler-context-phase-denials.js +98 -0
  448. package/dist/pipeline/handler-context-scope.d.ts +7 -10
  449. package/dist/pipeline/handler-context-scope.js +18 -20
  450. package/dist/pipeline/index.d.ts +9 -21
  451. package/dist/pipeline/index.js +5 -7
  452. package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
  453. package/dist/pipeline/irreversible-operation-gate.js +2 -2
  454. package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
  455. package/dist/pipeline/lifecycle-pipeline.js +9 -15
  456. package/dist/pipeline/member-read-only-transaction.js +11 -3
  457. package/dist/pipeline/member-reader.d.ts +1 -1
  458. package/dist/pipeline/member-reader.js +2 -2
  459. package/dist/pipeline/msp-rebuild.js +5 -3
  460. package/dist/pipeline/multi-stream-apply-context.js +3 -2
  461. package/dist/pipeline/notify-scope.d.ts +2 -1
  462. package/dist/pipeline/pre-handler-gates.d.ts +2 -1
  463. package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
  464. package/dist/pipeline/pre-transaction-reservations.js +9 -7
  465. package/dist/pipeline/projection-rebuild.js +12 -5
  466. package/dist/pipeline/projection-state.d.ts +0 -6
  467. package/dist/pipeline/projection-state.js +0 -5
  468. package/dist/pipeline/projections-runner.d.ts +2 -1
  469. package/dist/pipeline/projections-runner.js +10 -6
  470. package/dist/pipeline/system-hooks.d.ts +3 -1
  471. package/dist/pipeline/system-hooks.js +6 -4
  472. package/dist/pipeline/system-identity-switch.d.ts +4 -2
  473. package/dist/pipeline/system-identity-switch.js +51 -36
  474. package/dist/pipeline/typed-append-event.d.ts +2 -0
  475. package/dist/pipeline/typed-append-event.js +4 -0
  476. package/dist/pipeline/write-origin.js +2 -2
  477. package/dist/pipeline/write-result-masking.d.ts +1 -1
  478. package/dist/random/index.d.ts +1 -2
  479. package/dist/random/index.js +1 -2
  480. package/dist/rate-limit/bucket.d.ts +2 -1
  481. package/dist/rate-limit/middleware.js +2 -1
  482. package/dist/redis/index.d.ts +3 -4
  483. package/dist/redis/index.js +2 -2
  484. package/dist/schema-cli/apply-command.js +5 -2
  485. package/dist/schema-cli/baseline-command.js +7 -2
  486. package/dist/schema-cli/generate-command.js +7 -9
  487. package/dist/schema-cli/shared.d.ts +12 -2
  488. package/dist/schema-cli/shared.js +24 -2
  489. package/dist/schema-cli/status-command.js +8 -2
  490. package/dist/schema-cli/validate-command.js +48 -4
  491. package/dist/schema-cli.d.ts +0 -1
  492. package/dist/search/configure-tenant-index.d.ts +1 -3
  493. package/dist/search/configure-tenant-index.js +0 -4
  494. package/dist/search/index.d.ts +1 -4
  495. package/dist/search/index.js +0 -2
  496. package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
  497. package/dist/search/meilisearch-adapter-internals.js +9 -0
  498. package/dist/search/meilisearch-adapter.d.ts +1 -8
  499. package/dist/search/meilisearch-adapter.js +6 -7
  500. package/dist/search/meilisearch-peer.d.ts +2 -0
  501. package/dist/search/meilisearch-peer.js +5 -0
  502. package/dist/search/reindex-entity.js +93 -87
  503. package/dist/secrets/index.d.ts +3 -4
  504. package/dist/secrets/index.js +2 -3
  505. package/dist/seeding/index.d.ts +2 -2
  506. package/dist/seeding/index.js +1 -2
  507. package/dist/time/index.d.ts +2 -2
  508. package/dist/time/index.js +1 -1
  509. package/dist/time/tz-context.d.ts +0 -5
  510. package/dist/time/tz-context.js +0 -9
  511. package/dist/ui-types/index.d.ts +8 -11
  512. package/dist/ui-types/index.js +3 -3
  513. package/dist/upgrade-changelog.d.ts +3 -2
  514. package/dist/upgrade-changelog.js +12 -8
  515. package/dist/upgrade-cli-internals.d.ts +8 -0
  516. package/dist/upgrade-cli-internals.js +63 -0
  517. package/dist/upgrade-cli.d.ts +2 -9
  518. package/dist/upgrade-cli.js +28 -70
  519. package/dist/utils/import-optional-peer.d.ts +6 -0
  520. package/dist/utils/import-optional-peer.js +19 -0
  521. package/dist/utils/index.d.ts +1 -4
  522. package/dist/utils/index.js +1 -4
  523. package/package.json +23 -19
  524. package/src/changes.json +236 -0
  525. package/dist/crypto/request-kms-cache.d.ts +0 -8
  526. package/dist/crypto/request-kms-cache.js +0 -21
  527. package/dist/engine/codemod/index.d.ts +0 -2
  528. package/dist/engine/codemod/index.js +0 -1
  529. package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
  530. package/dist/engine/codemod/pipeline-codemod.js +0 -536
  531. package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
  532. package/dist/engine/feature-ast/entity-field-types.js +0 -35
  533. package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
  534. package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
  535. package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
  536. package/dist/engine/feature-ast/extractors/events.js +0 -275
  537. package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
  538. package/dist/engine/feature-ast/extractors/handlers.js +0 -358
  539. package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
  540. package/dist/engine/feature-ast/extractors/hooks.js +0 -248
  541. package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
  542. package/dist/engine/feature-ast/extractors/index.js +0 -13
  543. package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
  544. package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
  545. package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
  546. package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
  547. package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
  548. package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
  549. package/dist/engine/feature-ast/extractors/round1.d.ts +0 -11
  550. package/dist/engine/feature-ast/extractors/round1.js +0 -87
  551. package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
  552. package/dist/engine/feature-ast/extractors/round2.js +0 -191
  553. package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
  554. package/dist/engine/feature-ast/extractors/round3.js +0 -292
  555. package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
  556. package/dist/engine/feature-ast/extractors/round5.js +0 -68
  557. package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
  558. package/dist/engine/feature-ast/extractors/round6.js +0 -17
  559. package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
  560. package/dist/engine/feature-ast/extractors/shared.js +0 -343
  561. package/dist/engine/feature-ast/index.d.ts +0 -16
  562. package/dist/engine/feature-ast/index.js +0 -10
  563. package/dist/engine/feature-ast/parse.d.ts +0 -31
  564. package/dist/engine/feature-ast/parse.js +0 -485
  565. package/dist/engine/feature-ast/patch.d.ts +0 -212
  566. package/dist/engine/feature-ast/patch.js +0 -611
  567. package/dist/engine/feature-ast/patcher.d.ts +0 -217
  568. package/dist/engine/feature-ast/patcher.js +0 -281
  569. package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1238
  570. package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
  571. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
  572. package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
  573. package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
  574. package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
  575. package/dist/engine/feature-ast/patterns.d.ts +0 -322
  576. package/dist/engine/feature-ast/patterns.js +0 -107
  577. package/dist/engine/feature-ast/render.d.ts +0 -47
  578. package/dist/engine/feature-ast/render.js +0 -666
  579. package/dist/engine/feature-ast/source-location.d.ts +0 -17
  580. package/dist/engine/feature-ast/source-location.js +0 -27
  581. package/dist/engine/pattern-library/index.d.ts +0 -2
  582. package/dist/engine/pattern-library/index.js +0 -3
  583. package/dist/engine/pattern-library/library.d.ts +0 -14
  584. package/dist/engine/pattern-library/library.js +0 -94
  585. package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
  586. package/dist/engine/pattern-library/mixed-schemas.js +0 -559
  587. package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
  588. package/dist/engine/pattern-library/opaque-schemas.js +0 -115
  589. package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
  590. package/dist/engine/pattern-library/shared-fields.js +0 -88
  591. package/dist/engine/pattern-library/static-schemas.d.ts +0 -21
  592. package/dist/engine/pattern-library/static-schemas.js +0 -487
  593. package/dist/engine/pattern-library/types.d.ts +0 -158
  594. package/dist/engine/pattern-library/types.js +0 -36
  595. package/dist/engine/resolve-config-or-param.d.ts +0 -18
  596. package/dist/engine/resolve-config-or-param.js +0 -76
  597. package/src/scripts/codemod/README.md +0 -187
  598. package/src/scripts/codemod/codemod-support.ts +0 -334
  599. package/src/scripts/codemod/collect-source-files.ts +0 -48
  600. package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
  601. package/src/scripts/codemod/db-factory.ts +0 -810
  602. package/src/scripts/codemod/feature-factory.ts +0 -429
  603. package/src/scripts/codemod/feature-layout.ts +0 -424
  604. package/src/scripts/codemod/import-extensions.ts +0 -118
  605. package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
  606. package/src/scripts/codemod/migrate-db-raw.ts +0 -401
  607. package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
  608. package/src/scripts/codemod/object-form.ts +0 -746
  609. package/src/scripts/codemod/package-merge.ts +0 -299
  610. package/src/scripts/codemod/pii-personal-migration.ts +0 -816
  611. package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
  612. package/src/scripts/codemod/s3-imports.ts +0 -236
  613. package/src/scripts/codemod/tenant-db-options.ts +0 -454
  614. package/src/scripts/codemod/testing-injection.ts +0 -215
  615. package/src/scripts/codemod/testing-move-targets.ts +0 -161
  616. package/src/scripts/codemod/testing-move.ts +0 -542
  617. package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
@@ -0,0 +1,9 @@
1
+ // Exported for unit tests (index-name / primary-key shape) without a live Meili.
2
+ export function meilisearchTenantIndex(prefix, tenantId) {
3
+ return `${prefix}t${tenantId}`;
4
+ }
5
+ // Meilisearch primary-key-ids: alphanumerics, `-`, `_`. UUIDs contain `-` —
6
+ // legal. Replace anything else just in case callers pass unexpected shapes.
7
+ export function meilisearchDocId(entityType, entityId) {
8
+ return `${entityType}_${String(entityId).replace(/[^0-9A-Za-z_-]/g, "_")}`;
9
+ }
@@ -1,10 +1,3 @@
1
- import type { EntityId, TenantId } from "../engine/types/identifiers.ts";
1
+ import { type MeilisearchAdapterOptions } from "./meilisearch-adapter-internals.ts";
2
2
  import type { SearchAdapter } from "./types.ts";
3
- export type MeilisearchAdapterOptions = {
4
- url: string;
5
- apiKey: string;
6
- indexPrefix?: string;
7
- };
8
- export declare function meilisearchTenantIndex(prefix: string, tenantId: TenantId): string;
9
- export declare function meilisearchDocId(entityType: string, entityId: EntityId): string;
10
3
  export declare function createMeilisearchAdapter(options: MeilisearchAdapterOptions): SearchAdapter;
@@ -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,15 +1,8 @@
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;
7
+ readonly codemodResolveFrom?: string;
15
8
  }): Promise<number>;