@cosmicdrift/kumiko-framework 0.159.1 → 0.161.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 (90) hide show
  1. package/package.json +3 -3
  2. package/src/api/__tests__/api.test.ts +65 -0
  3. package/src/api/__tests__/auth-routes-cookie.test.ts +1 -0
  4. package/src/api/__tests__/auth-routes-invalid-body-invite.test.ts +237 -0
  5. package/src/api/__tests__/auth-routes-mfa-verify.test.ts +1 -0
  6. package/src/api/__tests__/dispatcher-live.integration.test.ts +74 -0
  7. package/src/api/__tests__/login-rate-limiter-sweep.test.ts +41 -0
  8. package/src/api/__tests__/server-boot-guards.test.ts +71 -0
  9. package/src/api/api-constants.ts +1 -0
  10. package/src/api/auth-middleware.ts +17 -44
  11. package/src/api/auth-routes.ts +6 -2
  12. package/src/api/index.ts +1 -0
  13. package/src/api/routes.ts +57 -0
  14. package/src/api/server.ts +5 -4
  15. package/src/bun-db/query.ts +12 -25
  16. package/src/crypto/kms-adapter.ts +2 -118
  17. package/src/db/__tests__/build-filter-where.test.ts +34 -0
  18. package/src/db/__tests__/event-store-executor-write-verbs.integration.test.ts +91 -0
  19. package/src/db/cursor.ts +1 -18
  20. package/src/db/dialect.ts +8 -19
  21. package/src/db/entity-table-meta-types.ts +2 -92
  22. package/src/db/event-store-executor.ts +4 -96
  23. package/src/db/table-builder.ts +2 -19
  24. package/src/db/tenant-db.ts +6 -55
  25. package/src/engine/__tests__/boot-validator.test.ts +46 -0
  26. package/src/engine/__tests__/codemod-pipeline.test.ts +139 -10
  27. package/src/engine/__tests__/engine.test.ts +28 -0
  28. package/src/engine/__tests__/registry-facade-sweep.test.ts +80 -0
  29. package/src/engine/__tests__/registry.test.ts +40 -0
  30. package/src/engine/__tests__/tier-resolver-extension.test.ts +19 -1
  31. package/src/engine/boot-validator/entity-handler.ts +10 -1
  32. package/src/engine/define-feature.ts +1 -0
  33. package/src/engine/define-handler.ts +1 -0
  34. package/src/engine/feature-ast/__tests__/canonical-form.test.ts +11 -1
  35. package/src/engine/feature-ast/__tests__/parse.test.ts +983 -3
  36. package/src/engine/feature-ast/__tests__/patch.test.ts +168 -0
  37. package/src/engine/feature-ast/__tests__/patcher.test.ts +7 -0
  38. package/src/engine/feature-ast/__tests__/render-roundtrip.test.ts +9 -0
  39. package/src/engine/feature-ast/extractors/handlers.ts +19 -2
  40. package/src/engine/feature-ast/extractors/index.ts +1 -0
  41. package/src/engine/feature-ast/index.ts +2 -0
  42. package/src/engine/feature-ast/parse.ts +3 -0
  43. package/src/engine/feature-ast/patch.ts +2 -0
  44. package/src/engine/feature-ast/patcher.ts +21 -0
  45. package/src/engine/feature-ast/patterns.ts +16 -0
  46. package/src/engine/feature-ast/render.ts +15 -0
  47. package/src/engine/feature-builder-state.ts +3 -0
  48. package/src/engine/feature-entity-handlers.ts +35 -1
  49. package/src/engine/index.ts +3 -0
  50. package/src/engine/pattern-library/__tests__/library.test.ts +9 -0
  51. package/src/engine/pattern-library/library.ts +2 -0
  52. package/src/engine/pattern-library/mixed-schemas.ts +37 -0
  53. package/src/engine/registry-facade.ts +9 -0
  54. package/src/engine/registry-ingest.ts +10 -0
  55. package/src/engine/registry-state.ts +3 -0
  56. package/src/engine/types/config.ts +2 -497
  57. package/src/engine/types/define-handler.ts +2 -94
  58. package/src/engine/types/entity-handlers.ts +2 -30
  59. package/src/engine/types/feature.ts +2 -1021
  60. package/src/engine/types/fields.ts +2 -685
  61. package/src/engine/types/handlers.ts +2 -820
  62. package/src/engine/types/hooks.ts +2 -170
  63. package/src/engine/types/index.ts +44 -36
  64. package/src/engine/types/nav.ts +2 -67
  65. package/src/engine/types/ownership.ts +2 -83
  66. package/src/engine/types/projection.ts +2 -165
  67. package/src/engine/types/screen.ts +2 -747
  68. package/src/engine/types/step.ts +2 -334
  69. package/src/engine/types/workspace.ts +2 -42
  70. package/src/errors/write-error-info.ts +6 -22
  71. package/src/event-store/errors.ts +2 -35
  72. package/src/event-store/event-store.ts +2 -21
  73. package/src/event-store/snapshot.ts +11 -35
  74. package/src/event-store/types.ts +2 -22
  75. package/src/files/provider-resolver.ts +3 -5
  76. package/src/files/types.ts +5 -54
  77. package/src/jobs/__tests__/jobs.integration.test.ts +102 -1
  78. package/src/pipeline/__tests__/dispatcher.test.ts +96 -0
  79. package/src/pipeline/__tests__/lifecycle-pipeline.test.ts +208 -0
  80. package/src/pipeline/dispatch-shared.ts +39 -1
  81. package/src/pipeline/dispatch-stream.ts +74 -0
  82. package/src/pipeline/dispatcher-utils.ts +1 -1
  83. package/src/pipeline/dispatcher.ts +7 -0
  84. package/src/pipeline/multi-stream-apply-context.ts +4 -42
  85. package/src/rate-limit/resolver.ts +10 -30
  86. package/src/secrets/envelope-cipher.ts +4 -6
  87. package/src/secrets/types.ts +2 -177
  88. package/src/stack/request-helper.ts +19 -2
  89. package/src/stack/test-stack.ts +33 -14
  90. package/src/time/tz-context.ts +9 -56
@@ -119,11 +119,20 @@ export function validateHandlerAccess(feature: FeatureDefinition): void {
119
119
  }
120
120
  validateAnonymousRateLimit(feature.name, "query", name, handler.access, handler.rateLimit);
121
121
  }
122
+ for (const [name, handler] of Object.entries(feature.streamHandlers)) {
123
+ if (!handler.access) {
124
+ throw new Error(
125
+ `Stream handler "${feature.name}:stream:${name}" is missing an access rule. ` +
126
+ `Set { roles: [...] } for role-based access, or { openToAll: true } for any authenticated user.`,
127
+ );
128
+ }
129
+ validateAnonymousRateLimit(feature.name, "stream", name, handler.access, handler.rateLimit);
130
+ }
122
131
  }
123
132
 
124
133
  export function validateAnonymousRateLimit(
125
134
  featureName: string,
126
- kind: "write" | "query",
135
+ kind: "write" | "query" | "stream",
127
136
  handlerName: string,
128
137
  access: NonNullable<FeatureDefinition["writeHandlers"][string]["access"]>,
129
138
  rateLimit: FeatureDefinition["writeHandlers"][string]["rateLimit"],
@@ -106,6 +106,7 @@ export function defineFeature<const TName extends string, TExports = undefined>(
106
106
  relations: state.relations,
107
107
  writeHandlers: state.writeHandlers,
108
108
  queryHandlers: state.queryHandlers,
109
+ streamHandlers: state.streamHandlers,
109
110
  translations: state.translations,
110
111
  hooks: {
111
112
  validation: state.validationHooks,
@@ -10,6 +10,7 @@ import type {
10
10
 
11
11
  export type {
12
12
  QueryHandlerDefinition,
13
+ StreamHandlerDefinition,
13
14
  WriteHandlerDefinition,
14
15
  WriteHandlerInput,
15
16
  } from "./types/define-handler";
@@ -78,6 +78,15 @@ defineFeature("todoList", (r) => {
78
78
  access: { openToAll: true },
79
79
  });
80
80
 
81
+ r.streamHandler({
82
+ name: "task:stream",
83
+ schema: z.object({ prompt: z.string() }),
84
+ handler: async function* (input, ctx) {
85
+ yield "token";
86
+ },
87
+ access: { roles: ["user"] },
88
+ });
89
+
81
90
  r.hook({
82
91
  type: "postSave",
83
92
  target: "task",
@@ -195,7 +204,7 @@ describe("Canonical Object-Form — parser akzeptiert + extrahiert", () => {
195
204
  expect(unknowns).toEqual([]);
196
205
  });
197
206
 
198
- test("alle 28 Pattern-Kinds sind erfasst", () => {
207
+ test("alle Pattern-Kinds sind erfasst", () => {
199
208
  const kinds: ReadonlySet<string> = new Set(result.patterns.map((p) => p.kind));
200
209
  const expected = [
201
210
  // Static
@@ -219,6 +228,7 @@ describe("Canonical Object-Form — parser akzeptiert + extrahiert", () => {
219
228
  "screen",
220
229
  "writeHandler",
221
230
  "queryHandler",
231
+ "streamHandler",
222
232
  "hook",
223
233
  "job",
224
234
  "notification",