@cosmicdrift/kumiko-framework 0.384.0 → 0.386.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 (78) hide show
  1. package/agents/examples/i18n.md +36 -1
  2. package/agents/features.md +4 -0
  3. package/dist/api/auth-rate-limiters.d.ts +8 -0
  4. package/dist/api/auth-rate-limiters.js +105 -0
  5. package/dist/api/auth-routes-context.d.ts +34 -0
  6. package/dist/api/auth-routes-context.js +192 -0
  7. package/dist/api/auth-routes-invite.d.ts +2 -0
  8. package/dist/api/auth-routes-invite.js +171 -0
  9. package/dist/api/auth-routes-login.d.ts +2 -0
  10. package/dist/api/auth-routes-login.js +103 -0
  11. package/dist/api/auth-routes-mfa.d.ts +4 -0
  12. package/dist/api/auth-routes-mfa.js +211 -0
  13. package/dist/api/auth-routes-session.d.ts +2 -0
  14. package/dist/api/auth-routes-session.js +144 -0
  15. package/dist/api/auth-routes-shared.d.ts +33 -0
  16. package/dist/api/auth-routes-shared.js +81 -0
  17. package/dist/api/auth-routes-signup.d.ts +2 -0
  18. package/dist/api/auth-routes-signup.js +75 -0
  19. package/dist/api/auth-routes-token-flows.d.ts +4 -0
  20. package/dist/api/auth-routes-token-flows.js +91 -0
  21. package/dist/api/auth-routes-types.d.ts +76 -0
  22. package/dist/api/auth-routes-types.js +1 -0
  23. package/dist/api/auth-routes.d.ts +5 -85
  24. package/dist/api/auth-routes.js +20 -1095
  25. package/dist/api/request-context.d.ts +2 -0
  26. package/dist/api/request-context.js +16 -7
  27. package/dist/config/index.d.ts +1 -1
  28. package/dist/crypto/pii-ciphertext-format.js +1 -1
  29. package/dist/db/blind-index-cleanup.js +1 -1
  30. package/dist/db/cross-tenant-reads.d.ts +8 -0
  31. package/dist/db/cross-tenant-reads.js +23 -0
  32. package/dist/db/dialect.js +1 -1
  33. package/dist/db/distinct-on.d.ts +9 -0
  34. package/dist/db/distinct-on.js +28 -0
  35. package/dist/db/event-store-executor-write.js +2 -2
  36. package/dist/db/migrate-runner.js +4 -4
  37. package/dist/db/pg-error.js +0 -12
  38. package/dist/db/queries/event-consumer.js +3 -3
  39. package/dist/db/queries/postgres-array-literal.js +2 -2
  40. package/dist/db/queries/test-stack.d.ts +4 -1
  41. package/dist/db/queries/test-stack.js +15 -2
  42. package/dist/db/query.js +19 -19
  43. package/dist/db/tenant-db.js +1 -1
  44. package/dist/engine/boot-validator/i18n-keys.d.ts +1 -0
  45. package/dist/engine/boot-validator/i18n-keys.js +8 -1
  46. package/dist/engine/boot-validator/index.d.ts +4 -0
  47. package/dist/engine/boot-validator/index.js +2 -1
  48. package/dist/engine/boot-validator/screens-actions.d.ts +67 -0
  49. package/dist/engine/boot-validator/screens-actions.js +488 -0
  50. package/dist/engine/boot-validator/screens-dashboard.d.ts +15 -0
  51. package/dist/engine/boot-validator/screens-dashboard.js +467 -0
  52. package/dist/engine/boot-validator/screens-forms.d.ts +24 -0
  53. package/dist/engine/boot-validator/screens-forms.js +516 -0
  54. package/dist/engine/boot-validator/screens-lists.d.ts +47 -0
  55. package/dist/engine/boot-validator/screens-lists.js +319 -0
  56. package/dist/engine/boot-validator/screens.d.ts +4 -21
  57. package/dist/engine/boot-validator/screens.js +26 -1799
  58. package/dist/engine/feature-ast/pattern-change-schema.d.ts +8 -0
  59. package/dist/engine/steps/read-find-one.js +1 -1
  60. package/dist/event-store/provenance-append.js +1 -1
  61. package/dist/files/file-routes.js +1 -1
  62. package/dist/i18n/required-surface-keys.d.ts +16 -0
  63. package/dist/i18n/required-surface-keys.js +62 -0
  64. package/dist/internal/stack-support.d.ts +1 -1
  65. package/dist/internal/stack-support.js +1 -1
  66. package/dist/jobs/job-runner-helpers.d.ts +44 -0
  67. package/dist/jobs/job-runner-helpers.js +265 -0
  68. package/dist/jobs/job-runner-schedulers.d.ts +23 -0
  69. package/dist/jobs/job-runner-schedulers.js +106 -0
  70. package/dist/jobs/job-runner-types.d.ts +65 -0
  71. package/dist/jobs/job-runner-types.js +2 -0
  72. package/dist/jobs/job-runner.d.ts +4 -75
  73. package/dist/jobs/job-runner.js +10 -386
  74. package/dist/pipeline/dispatch-shared.js +29 -4
  75. package/dist/pipeline/event-dispatcher.js +2 -3
  76. package/dist/schema-cli.js +5 -0
  77. package/package.json +3 -3
  78. package/src/changes.json +19 -0
@@ -0,0 +1,4 @@
1
+ import type { AuthRouteContext } from "./auth-routes-context.ts";
2
+ export declare function registerPasswordResetRoutes(ctx: AuthRouteContext): void;
3
+ export declare function registerEmailVerificationRoutes(ctx: AuthRouteContext): void;
4
+ export declare function registerAccountUnlockRoutes(ctx: AuthRouteContext): void;
@@ -0,0 +1,91 @@
1
+ import * as z from "zod";
2
+ import { createAnonymousUser } from "../engine/system-user.js";
3
+ import { SYSTEM_TENANT_ID } from "../engine/types/index.js";
4
+ import { Routes } from "./api-constants.js";
5
+ import { registerTokenRequestRoute } from "./auth-routes-shared.js";
6
+ const ResetPasswordBody = z.object({
7
+ token: z.string().min(1),
8
+ newPassword: z.string().min(8).max(200),
9
+ });
10
+ const VerifyEmailBody = z.object({
11
+ token: z.string().min(1),
12
+ });
13
+ function registerTokenConfirmRoute(opts) {
14
+ opts.api.post(opts.path, async (c) => {
15
+ const raw = await c.req.json().catch(() => null);
16
+ const parsed = opts.schema.safeParse(raw);
17
+ if (!parsed.success) {
18
+ return c.json({ isSuccess: false, error: "invalid_body" }, 400);
19
+ }
20
+ const result = await opts.dispatcher.write(opts.confirmHandler, parsed.data, createAnonymousUser(SYSTEM_TENANT_ID));
21
+ if (!result.isSuccess) {
22
+ const status = result.error.httpStatus; // @cast-boundary engine-payload
23
+ return c.json({ isSuccess: false, error: result.error }, status);
24
+ }
25
+ return c.json({ isSuccess: true });
26
+ });
27
+ }
28
+ export function registerPasswordResetRoutes(ctx) {
29
+ const { api, dispatcher, config } = ctx;
30
+ // POST /auth/request-password-reset + /auth/reset-password — public.
31
+ // Silent-success on request (no enumeration), typed failure on confirm.
32
+ // Rate-limit covered via config.rateLimit.auth (Sprint G.5 L2, /auth/*).
33
+ if (config.passwordReset) {
34
+ const pr = config.passwordReset;
35
+ registerTokenRequestRoute({
36
+ api,
37
+ dispatcher,
38
+ path: Routes.authRequestPasswordReset,
39
+ requestHandler: pr.requestHandler,
40
+ });
41
+ registerTokenConfirmRoute({
42
+ api,
43
+ dispatcher,
44
+ path: Routes.authResetPassword,
45
+ confirmHandler: pr.confirmHandler,
46
+ schema: ResetPasswordBody,
47
+ });
48
+ }
49
+ }
50
+ export function registerEmailVerificationRoutes(ctx) {
51
+ const { api, dispatcher, config } = ctx;
52
+ // Email-verification mirrors password-reset.
53
+ if (config.emailVerification) {
54
+ const ev = config.emailVerification;
55
+ registerTokenRequestRoute({
56
+ api,
57
+ dispatcher,
58
+ path: Routes.authRequestEmailVerification,
59
+ requestHandler: ev.requestHandler,
60
+ });
61
+ registerTokenConfirmRoute({
62
+ api,
63
+ dispatcher,
64
+ path: Routes.authVerifyEmail,
65
+ confirmHandler: ev.confirmHandler,
66
+ schema: VerifyEmailBody,
67
+ });
68
+ }
69
+ }
70
+ export function registerAccountUnlockRoutes(ctx) {
71
+ const { api, dispatcher, config } = ctx;
72
+ // Account-unlock mirrors email-verification (token-only confirm body) —
73
+ // clears the Redis lockout state instead of an entity field, see
74
+ // confirm-account-unlock.write.ts.
75
+ if (config.accountUnlock) {
76
+ const au = config.accountUnlock;
77
+ registerTokenRequestRoute({
78
+ api,
79
+ dispatcher,
80
+ path: Routes.authRequestAccountUnlock,
81
+ requestHandler: au.requestHandler,
82
+ });
83
+ registerTokenConfirmRoute({
84
+ api,
85
+ dispatcher,
86
+ path: Routes.authConfirmAccountUnlock,
87
+ confirmHandler: au.confirmHandler,
88
+ schema: VerifyEmailBody,
89
+ });
90
+ }
91
+ }
@@ -0,0 +1,76 @@
1
+ import type { SessionUser } from "../engine/types/index.ts";
2
+ import type { AuthSessionChecker, TokenVerifier } from "./auth-middleware.ts";
3
+ import type { ClientIpResolver } from "./client-ip.ts";
4
+ import type { PostAuthLandingResolver } from "./post-auth-landing.ts";
5
+ export type LoginRateLimiter = {
6
+ check(key: string): Promise<boolean>;
7
+ reset(key: string): Promise<void>;
8
+ };
9
+ export type SessionMetadata = {
10
+ readonly ip: string;
11
+ readonly userAgent: string;
12
+ };
13
+ export type SessionCreator = (user: SessionUser, meta: SessionMetadata) => Promise<string>;
14
+ export type SessionRevoker = (sid: string) => Promise<void>;
15
+ export type SessionMassRevoker = (userId: string) => Promise<number>;
16
+ export type SessionChecker = AuthSessionChecker;
17
+ export type AuthRoutesConfig = {
18
+ membershipQuery: string;
19
+ userQuery?: string;
20
+ loginHandler?: string;
21
+ loginErrorStatusMap?: Readonly<Record<string, number>>;
22
+ loginRateLimit?: LoginRateLimiter | null;
23
+ mfaVerifyHandler?: string;
24
+ switchTenantMfaGateHandler?: string;
25
+ mfaVerifyErrorStatusMap?: Readonly<Record<string, number>>;
26
+ mfaVerifyRateLimit?: LoginRateLimiter | null;
27
+ mfaPreauthEnableStartHandler?: string;
28
+ mfaPreauthEnableStartErrorStatusMap?: Readonly<Record<string, number>>;
29
+ mfaPreauthEnableStartRateLimit?: LoginRateLimiter | null;
30
+ mfaPreauthConfirmHandler?: string;
31
+ mfaPreauthConfirmErrorStatusMap?: Readonly<Record<string, number>>;
32
+ mfaPreauthConfirmRateLimit?: LoginRateLimiter | null;
33
+ sessionCreator?: SessionCreator;
34
+ sessionRevoker?: SessionRevoker;
35
+ sessionChecker?: SessionChecker;
36
+ tokenVerifier?: TokenVerifier;
37
+ patRateLimiter?: LoginRateLimiter;
38
+ resolveTenantLifecycleStatus?: import("./auth-middleware.ts").TenantLifecycleStatusResolver;
39
+ passwordReset?: PasswordResetConfig;
40
+ emailVerification?: EmailVerificationConfig;
41
+ accountUnlock?: AccountUnlockConfig;
42
+ signup?: SignupConfig;
43
+ invite?: InviteConfig;
44
+ cookieSameSite?: "lax" | "strict";
45
+ cookieDomain?: string;
46
+ secureCookies?: boolean;
47
+ retiredCookieDomains?: readonly string[];
48
+ allowedOrigins?: readonly string[];
49
+ publicOrigin?: string;
50
+ unsafeSkipOriginCheck?: boolean;
51
+ trustedProxyHops?: number;
52
+ postAuthLanding?: PostAuthLandingResolver;
53
+ resolver?: ClientIpResolver;
54
+ };
55
+ export type PasswordResetConfig = {
56
+ requestHandler: string;
57
+ confirmHandler: string;
58
+ };
59
+ export type EmailVerificationConfig = {
60
+ requestHandler: string;
61
+ confirmHandler: string;
62
+ };
63
+ export type AccountUnlockConfig = {
64
+ requestHandler: string;
65
+ confirmHandler: string;
66
+ };
67
+ export type InviteConfig = {
68
+ readonly acceptHandler: string;
69
+ readonly acceptWithLoginHandler: string;
70
+ readonly signupCompleteHandler: string;
71
+ readonly infoHandler?: string;
72
+ };
73
+ export type SignupConfig = {
74
+ requestHandler: string;
75
+ confirmHandler: string;
76
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,89 +1,9 @@
1
- import { Hono } from "hono";
2
- import type { Redis } from "ioredis";
3
- import { type SessionUser } from "../engine/types/index.ts";
1
+ import type { Hono } from "hono";
4
2
  import type { Dispatcher } from "../pipeline/dispatcher.ts";
5
- import { type AuthSessionChecker, type AuthSessionStatus, type TokenVerifier } from "./auth-middleware.ts";
6
- import { type ClientIpResolver } from "./client-ip.ts";
3
+ import type { AuthRoutesConfig } from "./auth-routes-types.ts";
7
4
  import type { JwtHelper } from "./jwt.ts";
8
- import type { PostAuthLandingResolver } from "./post-auth-landing.ts";
9
- export type LoginRateLimiter = {
10
- check(key: string): Promise<boolean>;
11
- reset(key: string): Promise<void>;
12
- };
13
- export type SessionMetadata = {
14
- readonly ip: string;
15
- readonly userAgent: string;
16
- };
17
- export type SessionCreator = (user: SessionUser, meta: SessionMetadata) => Promise<string>;
18
- export type SessionRevoker = (sid: string) => Promise<void>;
19
- export type SessionMassRevoker = (userId: string) => Promise<number>;
20
- export type SessionChecker = AuthSessionChecker;
21
- export type { AuthSessionStatus };
5
+ export type { AuthSessionStatus } from "./auth-middleware.ts";
6
+ export { createInMemoryLoginRateLimiter, createRedisLoginRateLimiter, inMemoryLoginRateLimiterFallback, } from "./auth-rate-limiters.ts";
7
+ export type { AccountUnlockConfig, AuthRoutesConfig, EmailVerificationConfig, InviteConfig, LoginRateLimiter, PasswordResetConfig, SessionChecker, SessionCreator, SessionMassRevoker, SessionMetadata, SessionRevoker, SignupConfig, } from "./auth-routes-types.ts";
22
8
  export declare function assertSessionCallbacksPaired(auth: Pick<AuthRoutesConfig, "sessionCreator" | "sessionRevoker" | "sessionChecker"> | undefined): void;
23
- export type AuthRoutesConfig = {
24
- membershipQuery: string;
25
- userQuery?: string;
26
- loginHandler?: string;
27
- loginErrorStatusMap?: Readonly<Record<string, number>>;
28
- loginRateLimit?: LoginRateLimiter | null;
29
- mfaVerifyHandler?: string;
30
- switchTenantMfaGateHandler?: string;
31
- mfaVerifyErrorStatusMap?: Readonly<Record<string, number>>;
32
- mfaVerifyRateLimit?: LoginRateLimiter | null;
33
- mfaPreauthEnableStartHandler?: string;
34
- mfaPreauthEnableStartErrorStatusMap?: Readonly<Record<string, number>>;
35
- mfaPreauthEnableStartRateLimit?: LoginRateLimiter | null;
36
- mfaPreauthConfirmHandler?: string;
37
- mfaPreauthConfirmErrorStatusMap?: Readonly<Record<string, number>>;
38
- mfaPreauthConfirmRateLimit?: LoginRateLimiter | null;
39
- sessionCreator?: SessionCreator;
40
- sessionRevoker?: SessionRevoker;
41
- sessionChecker?: SessionChecker;
42
- tokenVerifier?: TokenVerifier;
43
- patRateLimiter?: LoginRateLimiter;
44
- resolveTenantLifecycleStatus?: import("./auth-middleware.ts").TenantLifecycleStatusResolver;
45
- passwordReset?: PasswordResetConfig;
46
- emailVerification?: EmailVerificationConfig;
47
- accountUnlock?: AccountUnlockConfig;
48
- signup?: SignupConfig;
49
- invite?: InviteConfig;
50
- cookieSameSite?: "lax" | "strict";
51
- cookieDomain?: string;
52
- secureCookies?: boolean;
53
- retiredCookieDomains?: readonly string[];
54
- allowedOrigins?: readonly string[];
55
- publicOrigin?: string;
56
- unsafeSkipOriginCheck?: boolean;
57
- trustedProxyHops?: number;
58
- postAuthLanding?: PostAuthLandingResolver;
59
- resolver?: ClientIpResolver;
60
- };
61
- export type PasswordResetConfig = {
62
- requestHandler: string;
63
- confirmHandler: string;
64
- };
65
- export type EmailVerificationConfig = {
66
- requestHandler: string;
67
- confirmHandler: string;
68
- };
69
- export type AccountUnlockConfig = {
70
- requestHandler: string;
71
- confirmHandler: string;
72
- };
73
- export type InviteConfig = {
74
- readonly acceptHandler: string;
75
- readonly acceptWithLoginHandler: string;
76
- readonly signupCompleteHandler: string;
77
- readonly infoHandler?: string;
78
- };
79
- export type SignupConfig = {
80
- requestHandler: string;
81
- confirmHandler: string;
82
- };
83
- export declare function inMemoryLoginRateLimiterFallback(): LoginRateLimiter;
84
- export declare function createInMemoryLoginRateLimiter(maxAttempts?: number, windowMs?: number, { maxEntries, sweepThreshold, }?: {
85
- maxEntries?: number;
86
- sweepThreshold?: number;
87
- }): LoginRateLimiter;
88
- export declare function createRedisLoginRateLimiter(redis: Redis, maxAttempts?: number, windowMs?: number, namespace?: string): LoginRateLimiter;
89
9
  export declare function createAuthRoutes(dispatcher: Dispatcher, jwt: JwtHelper, config: AuthRoutesConfig): Hono;