@maudecode/kanvil 0.3.0 → 0.4.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 (125) hide show
  1. package/apps/server/dist/{auth-JcS53IcO.mjs → auth-Cuo7ECLh.mjs} +119 -4773
  2. package/apps/server/dist/client.mjs +884 -0
  3. package/apps/server/dist/{config-D3cAABi7.mjs → config-DtNfVSnB.mjs} +2 -132
  4. package/apps/server/dist/index.mjs +6 -4
  5. package/apps/server/dist/instance-CCeXRJ6m.mjs +133 -0
  6. package/apps/server/dist/migrate.mjs +1 -1
  7. package/apps/server/dist/recover.mjs +3 -2
  8. package/apps/server/dist/src-tQ82UI8k.mjs +4818 -0
  9. package/apps/server/drizzle/0038_time_entries.sql +19 -0
  10. package/apps/server/drizzle/meta/0038_snapshot.json +6998 -0
  11. package/apps/server/drizzle/meta/_journal.json +7 -0
  12. package/apps/web/dist/assets/{CompositeItem-BbuEp99X.js → CompositeItem-DgnfVvrF.js} +1 -1
  13. package/apps/web/dist/assets/{Trans-DJGH63s1.js → Trans-f2VYVS9z.js} +1 -1
  14. package/apps/web/dist/assets/admin-settings-DBZL4siY.js +1 -0
  15. package/apps/web/dist/assets/{archive-restore-B6_SsOIP.js → archive-restore-CGuLxoHC.js} +1 -1
  16. package/apps/web/dist/assets/az-AZ-DesqXNg5.js +1 -0
  17. package/apps/web/dist/assets/{az-DqY__MpS.js → az-BE5iqNIE.js} +1 -1
  18. package/apps/web/dist/assets/{corner-left-up-DA7MG5uX.js → corner-left-up-BCro--Gl.js} +1 -1
  19. package/apps/web/dist/assets/de-DE-BIGY9SNm.js +1 -0
  20. package/apps/web/dist/assets/{de-UHreLwyV.js → de-DLGjUGf_.js} +1 -1
  21. package/apps/web/dist/assets/{default-D5TdIZQS.js → default-BgvtI7HK.js} +1 -1
  22. package/apps/web/dist/assets/delivery-settings-CZOtb4X8.js +1 -0
  23. package/apps/web/dist/assets/{el-EJnrsyVr.js → el-CG6Xy42v.js} +1 -1
  24. package/apps/web/dist/assets/el-GR-D2TjImt0.js +1 -0
  25. package/apps/web/dist/assets/{ellipsis-D6154JKs.js → ellipsis-ZJM26JNS.js} +1 -1
  26. package/apps/web/dist/assets/{es-D2ScuV-5.js → es-Bbj5WuMM.js} +1 -1
  27. package/apps/web/dist/assets/es-ES-C_fRqLGU.js +1 -0
  28. package/apps/web/dist/assets/{forms-BcD6Wwyv.js → forms-C3pNy-qY.js} +1 -1
  29. package/apps/web/dist/assets/{fr-C_VpS8u6.js → fr-CjuIKc1o.js} +1 -1
  30. package/apps/web/dist/assets/fr-FR-_tnQsn4j.js +1 -0
  31. package/apps/web/dist/assets/{hi-CW4rdp_m.js → hi-BVVrZ-zZ.js} +1 -1
  32. package/apps/web/dist/assets/hi-IN-CcmFsZYy.js +1 -0
  33. package/apps/web/dist/assets/{highlight-CMydIf9M.js → highlight-CKyEM4jx.js} +1 -1
  34. package/apps/web/dist/assets/{id-CvL3yBVr.js → id-BhNWOQnp.js} +1 -1
  35. package/apps/web/dist/assets/id-ID-C59tC61D.js +1 -0
  36. package/apps/web/dist/assets/index-BIuqxnJn.js +17 -0
  37. package/apps/web/dist/assets/{invitations-BmpelTJu.js → invitations-D5unaga2.js} +1 -1
  38. package/apps/web/dist/assets/{it-DOLotXOj.js → it-Cav3_-xd.js} +1 -1
  39. package/apps/web/dist/assets/it-IT-BAP5O3gK.js +1 -0
  40. package/apps/web/dist/assets/{item-Cq_ZbivE.js → item-Cj8xpMLk.js} +1 -1
  41. package/apps/web/dist/assets/{ja-B1iJt9qB.js → ja-DTmZE0Qe.js} +1 -1
  42. package/apps/web/dist/assets/ja-JP-vQa7mEdh.js +1 -0
  43. package/apps/web/dist/assets/{ko-fmUq1-8W.js → ko-BuYCMOUj.js} +1 -1
  44. package/apps/web/dist/assets/ko-KR-CXlpmX0-.js +1 -0
  45. package/apps/web/dist/assets/{label-settings-B3LsJxhk.js → label-settings-B89Ehf78.js} +1 -1
  46. package/apps/web/dist/assets/{markdown-blocks-Bw26pRKB.js → markdown-blocks-DSEA68s5.js} +1 -1
  47. package/apps/web/dist/assets/{member-directory-CHKUw0u4.js → member-directory-48yD01yN.js} +1 -1
  48. package/apps/web/dist/assets/{mk-LWVrR-T-.js → mk-BZ2Rg2sU.js} +1 -1
  49. package/apps/web/dist/assets/mk-MK-BU5BLpXM.js +1 -0
  50. package/apps/web/dist/assets/{nl-ro6hbqo5.js → nl-BtnPzRih.js} +1 -1
  51. package/apps/web/dist/assets/nl-NL-2aSpdZkg.js +1 -0
  52. package/apps/web/dist/assets/{pl-Bx_fYLKY.js → pl-Beg8hEdK.js} +1 -1
  53. package/apps/web/dist/assets/pl-PL-C5Wvnv7f.js +1 -0
  54. package/apps/web/dist/assets/project-lifecycle-CIAMJ-SX.js +1 -0
  55. package/apps/web/dist/assets/project-settings-C7lolDSl.js +1 -0
  56. package/apps/web/dist/assets/{pt-BR-D-a7F5zJ.js → pt-BR-B4VZ35N_.js} +1 -1
  57. package/apps/web/dist/assets/pt-BR-CVvI-ZB7.js +1 -0
  58. package/apps/web/dist/assets/public-project-DvvfaUd2.js +1 -0
  59. package/apps/web/dist/assets/{rotate-ccw-Bm0ESNH_.js → rotate-ccw-GjVJPDML.js} +1 -1
  60. package/apps/web/dist/assets/{ru-D-WIMI5_.js → ru-DjVJVHzv.js} +1 -1
  61. package/apps/web/dist/assets/ru-RU-C7UUdGIh.js +1 -0
  62. package/apps/web/dist/assets/search-ZaQmVnj1.js +85 -0
  63. package/apps/web/dist/assets/{send-D9TETK3s.js → send-Dr9bXHhf.js} +1 -1
  64. package/apps/web/dist/assets/settings-DXvrVvyS.js +1 -0
  65. package/apps/web/dist/assets/{sliders-horizontal-CiZZFL1o.js → sliders-horizontal-C1t_zA7D.js} +1 -1
  66. package/apps/web/dist/assets/{switch-B_u8n1o6.js → switch-D-WTDajm.js} +1 -1
  67. package/apps/web/dist/assets/{table-DcCLC7fi.js → table-BaRMFP84.js} +1 -1
  68. package/apps/web/dist/assets/ticket-detail-CFJI4qoK.js +2 -0
  69. package/apps/web/dist/assets/ticket-editor-DL3nHG_q.js +2 -0
  70. package/apps/web/dist/assets/ticket-list-CDkweYGS.js +5 -0
  71. package/apps/web/dist/assets/ticket-list-controls-CmTgFQQ-.js +1 -0
  72. package/apps/web/dist/assets/{tr-BZEJyY-F.js → tr-Ckc4TA71.js} +1 -1
  73. package/apps/web/dist/assets/tr-TR-VVsL3uMp.js +1 -0
  74. package/apps/web/dist/assets/{uk-f8X5q5C_.js → uk-B4ZvJ8xG.js} +1 -1
  75. package/apps/web/dist/assets/uk-UA-DRpCbOps.js +1 -0
  76. package/apps/web/dist/assets/{upload-CGpna3R2.js → upload-BwGa8shS.js} +1 -1
  77. package/apps/web/dist/assets/{useQueries-BihXYrAP.js → useQueries-sQEHjB0a.js} +1 -1
  78. package/apps/web/dist/assets/{vi-CSGaJFlR.js → vi-Dq2krfY8.js} +1 -1
  79. package/apps/web/dist/assets/vi-VN-C0YFqq9j.js +1 -0
  80. package/apps/web/dist/assets/{visual-editor-B6HiiLMg.js → visual-editor-CBhwqTDu.js} +1 -1
  81. package/apps/web/dist/assets/workspace-settings-DgLyieJN.js +1 -0
  82. package/apps/web/dist/assets/{zh-CN-BdRcimyZ.js → zh-CN-B7Rxc3Mp.js} +1 -1
  83. package/apps/web/dist/assets/zh-CN-pcgTdR8c.js +1 -0
  84. package/apps/web/dist/assets/zh-TW-DymSXkFg.js +1 -0
  85. package/apps/web/dist/assets/{zh-TW-BH1L9tOt.js → zh-TW-awiwHjeM.js} +1 -1
  86. package/apps/web/dist/index.html +7 -7
  87. package/bin/kanvil.mjs +3 -1
  88. package/docs/api.md +27 -1
  89. package/docs/cli.md +74 -0
  90. package/docs/plan.md +6 -1
  91. package/docs/workspaces.md +1 -1
  92. package/package.json +1 -1
  93. package/apps/web/dist/assets/admin-settings-CJG9PMKR.js +0 -1
  94. package/apps/web/dist/assets/az-AZ-BtrlbgjS.js +0 -1
  95. package/apps/web/dist/assets/de-DE-Bu_Ko2QA.js +0 -1
  96. package/apps/web/dist/assets/delivery-settings-BE5MW8U0.js +0 -1
  97. package/apps/web/dist/assets/el-GR-CpKEps47.js +0 -1
  98. package/apps/web/dist/assets/es-ES-DVkfi7H-.js +0 -1
  99. package/apps/web/dist/assets/fr-FR-DkHaEHqi.js +0 -1
  100. package/apps/web/dist/assets/hi-IN-CbUDNSTK.js +0 -1
  101. package/apps/web/dist/assets/id-ID-DLTkxt2j.js +0 -1
  102. package/apps/web/dist/assets/index-DoqlyejP.js +0 -17
  103. package/apps/web/dist/assets/it-IT-CIzq0YwC.js +0 -1
  104. package/apps/web/dist/assets/ja-JP-CIE4-D-v.js +0 -1
  105. package/apps/web/dist/assets/ko-KR-DYP5Zae6.js +0 -1
  106. package/apps/web/dist/assets/mk-MK-CpOo5Bd8.js +0 -1
  107. package/apps/web/dist/assets/nl-NL-Mu8G8RON.js +0 -1
  108. package/apps/web/dist/assets/pl-PL-DGuxe2Aq.js +0 -1
  109. package/apps/web/dist/assets/project-lifecycle-Ba7iRF3u.js +0 -1
  110. package/apps/web/dist/assets/project-settings-CtOWgEam.js +0 -1
  111. package/apps/web/dist/assets/pt-BR-DwkMPgq1.js +0 -1
  112. package/apps/web/dist/assets/public-project-CHRjhFIn.js +0 -1
  113. package/apps/web/dist/assets/ru-RU-DrXnqZbV.js +0 -1
  114. package/apps/web/dist/assets/search-D94SZwrC.js +0 -85
  115. package/apps/web/dist/assets/settings-Dd9EVxua.js +0 -1
  116. package/apps/web/dist/assets/ticket-detail-C9egaVSf.js +0 -2
  117. package/apps/web/dist/assets/ticket-editor-UlSZgpWF.js +0 -2
  118. package/apps/web/dist/assets/ticket-list-controls-BidzkMOD.js +0 -1
  119. package/apps/web/dist/assets/ticket-list-vNBO8mkk.js +0 -5
  120. package/apps/web/dist/assets/tr-TR-B92YeFW5.js +0 -1
  121. package/apps/web/dist/assets/uk-UA-DmcDs-MU.js +0 -1
  122. package/apps/web/dist/assets/vi-VN-DM5JYNuP.js +0 -1
  123. package/apps/web/dist/assets/workspace-settings-CSvVqaL6.js +0 -1
  124. package/apps/web/dist/assets/zh-CN-CiUOkQXe.js +0 -1
  125. package/apps/web/dist/assets/zh-TW-Co4UBSfi.js +0 -1
@@ -1,3 +1,4 @@
1
+ import { l as searchSettingsSchema, r as brokerSettingsSchema, s as s3SettingsSchema } from "./instance-CCeXRJ6m.mjs";
1
2
  import pg from "pg";
2
3
  import { drizzle } from "drizzle-orm/node-postgres";
3
4
  import { relations } from "drizzle-orm";
@@ -355,137 +356,6 @@ function createDatabase(url) {
355
356
  };
356
357
  }
357
358
  //#endregion
358
- //#region ../../packages/contracts/src/instance.ts
359
- const endpoint = z.url({ protocol: /^https?$/ }).refine((value) => !/^https?:\/\/[^/]*@/.test(value) && !/[?#]/.test(value), "Use an HTTP(S) endpoint without embedded credentials");
360
- const s3SettingsSchema = z.object({
361
- endpoint: z.union([endpoint, z.literal("")]).default(""),
362
- region: z.string().min(1).max(100).default("us-east-1"),
363
- bucket: z.string().min(3).max(255),
364
- prefix: z.string().max(200).regex(/^[a-zA-Z0-9/_-]*$/).default("kanvil/"),
365
- forcePathStyle: z.boolean().default(true),
366
- accessKeyId: z.string().max(500).default(""),
367
- secretAccessKey: z.string().max(2e3).optional()
368
- }).strict();
369
- const searchAuthenticationSchema = z.enum([
370
- "none",
371
- "apiKey",
372
- "basic"
373
- ]);
374
- const searchSettingsSchema = z.object({
375
- url: endpoint,
376
- auth: searchAuthenticationSchema.optional(),
377
- index: z.string().regex(/^[a-z0-9][a-z0-9_-]{0,100}$/),
378
- apiKey: z.string().max(4e3).optional(),
379
- username: z.string().max(500).default(""),
380
- password: z.string().max(2e3).optional()
381
- }).strict();
382
- const storageSettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("local") }).strict(), s3SettingsSchema.extend({ provider: z.literal("s3") })]);
383
- const externalSearchSettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("postgres") }).strict(), searchSettingsSchema.extend({ provider: z.literal("elasticsearch") })]);
384
- const brokerSettingsSchema = z.object({
385
- url: z.url({ protocol: /^amqps?$/ }).max(4e3).optional(),
386
- exchange: z.string().min(1).max(200).regex(/^[a-zA-Z0-9_.-]+$/).refine((value) => !value.startsWith("amq."), "Use an application exchange").default("kanvil.events")
387
- }).strict();
388
- const eventDeliverySettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("postgres") }).strict(), brokerSettingsSchema.extend({ provider: z.literal("rabbitmq") })]);
389
- const authenticationPolicySchema = z.object({
390
- emailPasswordEnabled: z.boolean().default(true),
391
- ssoAutoProvision: z.boolean().default(false)
392
- }).strict();
393
- const instanceUpdateSchema = z.object({
394
- expectedVersion: z.number().int().positive(),
395
- name: z.string().trim().min(1).max(100),
396
- description: z.string().max(500),
397
- storage: storageSettingsSchema,
398
- search: externalSearchSettingsSchema,
399
- broker: eventDeliverySettingsSchema.optional(),
400
- authentication: authenticationPolicySchema.optional()
401
- }).strict();
402
- z.object({
403
- name: z.string(),
404
- description: z.string()
405
- });
406
- const adminInstanceSchema = z.object({
407
- id: z.uuid(),
408
- version: z.number().int(),
409
- name: z.string(),
410
- description: z.string(),
411
- authentication: authenticationPolicySchema.default(() => authenticationPolicySchema.parse({})),
412
- storage: z.object({
413
- provider: z.enum(["local", "s3"]),
414
- source: z.enum(["deployment", "admin"]),
415
- settings: s3SettingsSchema.omit({ secretAccessKey: true }).nullable(),
416
- secretConfigured: z.boolean(),
417
- pending: z.number().int(),
418
- status: z.enum([
419
- "ready",
420
- "transferring",
421
- "unavailable"
422
- ]),
423
- error: z.string().nullable()
424
- }),
425
- search: z.object({
426
- provider: z.enum(["postgres", "elasticsearch"]),
427
- source: z.enum(["deployment", "admin"]),
428
- settings: searchSettingsSchema.omit({
429
- apiKey: true,
430
- password: true
431
- }).nullable(),
432
- secretConfigured: z.boolean(),
433
- status: z.enum([
434
- "builtin",
435
- "indexing",
436
- "ready",
437
- "unavailable"
438
- ]),
439
- cursor: z.string(),
440
- error: z.string().nullable()
441
- }),
442
- broker: z.object({
443
- provider: z.enum(["postgres", "rabbitmq"]),
444
- source: z.enum(["deployment", "admin"]),
445
- settings: z.object({
446
- endpoint: z.string(),
447
- exchange: z.string()
448
- }).nullable(),
449
- secretConfigured: z.boolean(),
450
- status: z.enum([
451
- "builtin",
452
- "connecting",
453
- "ready",
454
- "unavailable"
455
- ]),
456
- error: z.string().nullable()
457
- }),
458
- deployment: z.object({
459
- url: z.string(),
460
- oidc: z.object({
461
- name: z.string(),
462
- discoveryUrl: z.string(),
463
- clientId: z.string()
464
- }).nullable(),
465
- push: z.boolean(),
466
- version: z.string()
467
- }),
468
- locations: z.array(z.object({
469
- id: z.uuid(),
470
- bucket: z.string(),
471
- endpoint: z.string(),
472
- prefix: z.string(),
473
- objects: z.number().int()
474
- }))
475
- });
476
- const photoInputSchema = z.object({
477
- data: z.string().max(7e5),
478
- contentType: z.enum([
479
- "image/png",
480
- "image/jpeg",
481
- "image/webp"
482
- ])
483
- }).strict();
484
- const photoResultSchema = z.object({ image: z.string().nullable() });
485
- function searchAuthentication(settings) {
486
- return settings.auth ?? (settings.apiKey ? "apiKey" : settings.username && settings.password ? "basic" : "none");
487
- }
488
- //#endregion
489
359
  //#region src/config.ts
490
360
  const optionalEnv = (schema) => z.preprocess((value) => value === "" ? void 0 : value, schema.optional());
491
361
  const envSchema = z.object({
@@ -603,4 +473,4 @@ function readConfig(env = process.env) {
603
473
  };
604
474
  }
605
475
  //#endregion
606
- export { oauthConsent as _, instanceUpdateSchema as a, user as b, s3SettingsSchema as c, createDatabase as d, account as f, oauthClient as g, oauthAccessToken as h, brokerSettingsSchema as i, searchAuthentication as l, auth_schema_exports as m, adminInstanceSchema as n, photoInputSchema as o, apikey as p, authenticationPolicySchema as r, photoResultSchema as s, readConfig as t, searchSettingsSchema as u, oauthRefreshToken as v, session as y };
476
+ export { auth_schema_exports as a, oauthConsent as c, user as d, apikey as i, oauthRefreshToken as l, createDatabase as n, oauthAccessToken as o, account as r, oauthClient as s, readConfig as t, session as u };
@@ -1,6 +1,8 @@
1
- import { a as instanceUpdateSchema, b as user$1, c as s3SettingsSchema, d as createDatabase, f as account, i as brokerSettingsSchema, m as auth_schema_exports, n as adminInstanceSchema, o as photoInputSchema, p as apikey, s as photoResultSchema, t as readConfig, u as searchSettingsSchema, y as session } from "./config-D3cAABi7.mjs";
1
+ import { a as auth_schema_exports, d as user$1, i as apikey, n as createDatabase, r as account, t as readConfig, u as session } from "./config-DtNfVSnB.mjs";
2
+ import { a as photoInputSchema, i as instanceUpdateSchema, l as searchSettingsSchema, o as photoResultSchema, r as brokerSettingsSchema, s as s3SettingsSchema, t as adminInstanceSchema } from "./instance-CCeXRJ6m.mjs";
2
3
  import { t as migrateDatabase } from "./migrate-C9f4ozB4.mjs";
3
- import { $ as subscriptions, A as createTicketSearch, B as blobObjects, C as DeliveryError, Ct as roles, D as requireInstanceAdmin, Dt as matchesOIDCBinding, E as createWriteLimiter, Et as ticketExportFormat, F as stagedUploadCutoff, G as members, H as eventClock, I as createObjectStore, J as profilePhotos, K as notificationPreferences, L as createPollingJob, M as createBlobStorage, N as decodeImage, O as requireSession, P as imageResponse, Q as storageBackends, R as attachmentContent, S as deliverBatch, St as pushDeviceInput, T as createAccess, Tt as stateLabels, U as events, V as deliveryCheckpoints, X as pushDevices, Y as projects, Z as stagedUploads, _ as recipientColumns, _t as notificationPreferencesSchema, a as deliverySecrets, at as credentialInput, b as receiveRepositoryWebhook, bt as operations, c as ownerBlocker, ct as hasAdminRole, d as createDomain, dt as isOperation, et as tickets, f as fail, ft as isPresetColor, g as reachable, gt as notificationPreferencesInput, h as one, ht as notificationIdsInput, i as createInstance, it as closedStates, j as createTicketIndex, k as readCalendarFeed, l as appendEvents, lt as importLimits, m as notify, mt as memberSchema, n as emailCodesAvailable, nt as workspaces, o as otherActiveAdministrator, ot as defaultWorkflow, p as json, pt as isPublicOperation, q as notifications, r as signInProviders, rt as ApiError, s as ownedWorkspaces, st as errorSchema, t as createAuth, tt as workspaceMembers, u as assertVersion, ut as importProviderDefinitions, v as requireRow, vt as notificationReadInput, w as createHttpSender, wt as scopes, x as defaultSenders, xt as publicOperations, y as processImports, yt as okSchema, z as attachments } from "./auth-JcS53IcO.mjs";
4
+ import { $ as subscriptions, A as createTicketSearch, B as blobObjects, C as DeliveryError, D as requireInstanceAdmin, E as createWriteLimiter, F as stagedUploadCutoff, G as members, H as eventClock, I as createObjectStore, J as profilePhotos, K as notificationPreferences, L as createPollingJob, M as createBlobStorage, N as decodeImage, O as requireSession, P as imageResponse, Q as storageBackends, R as attachmentContent, S as deliverBatch, T as createAccess, U as events, V as deliveryCheckpoints, X as pushDevices, Y as projects, Z as stagedUploads, _ as recipientColumns, a as deliverySecrets, b as receiveRepositoryWebhook, c as ownerBlocker, d as createDomain, et as tickets, f as fail, g as reachable, h as one, i as createInstance, j as createTicketIndex, k as readCalendarFeed, l as appendEvents, m as notify, n as emailCodesAvailable, nt as workspaces, o as otherActiveAdministrator, p as json, q as notifications, r as signInProviders, rt as matchesOIDCBinding, s as ownedWorkspaces, t as createAuth, tt as workspaceMembers, u as assertVersion, v as requireRow, w as createHttpSender, x as defaultSenders, y as processImports, z as attachments } from "./auth-Cuo7ECLh.mjs";
5
+ import { A as importProviderDefinitions, B as notificationIdsInput, F as isPresetColor, G as okSchema, H as notificationPreferencesSchema, I as isPublicOperation, O as hasAdminRole, P as isOperation, R as memberSchema, St as ticketExportFormat, U as notificationReadInput, V as notificationPreferencesInput, ft as roles, it as pushDeviceInput, k as importLimits, m as defaultWorkflow, o as closedStates, pt as scopes, q as operations, rt as publicOperations, s as credentialInput, t as ApiError, x as errorSchema, yt as stateLabels } from "./src-tQ82UI8k.mjs";
4
6
  import { serve } from "@hono/node-server";
5
7
  import pg from "pg";
6
8
  import { drizzle } from "drizzle-orm/node-postgres";
@@ -324,7 +326,7 @@ function createAccountAdministration(database, auth, config) {
324
326
  }
325
327
  //#endregion
326
328
  //#region src/version.ts
327
- const applicationVersion = "0.3.0";
329
+ const applicationVersion = "0.4.0";
328
330
  //#endregion
329
331
  //#region src/realtime.ts
330
332
  async function createRealtime(config) {
@@ -3447,7 +3449,7 @@ async function createApplication(database, config, overrides = {}) {
3447
3449
  const identity = c.get("actor");
3448
3450
  if (identity.machine) fail(403, "forbidden", "Use a signed-in account to manage credentials");
3449
3451
  const input = credentialInput.parse(await c.req.json()), allowed = await domain.accessibleProjects(identity);
3450
- if (input.projectIds.some((id) => !allowed.some((row) => row.id === id))) fail(403, "forbidden", "Choose projects you can access");
3452
+ if (input.projectIds?.some((id) => !allowed.some((row) => row.id === id))) fail(403, "forbidden", "Choose projects you can access");
3451
3453
  const key = await auth.api.createApiKey({ body: {
3452
3454
  userId: identity.id,
3453
3455
  name: input.name,
@@ -0,0 +1,133 @@
1
+ import { z } from "zod";
2
+ //#region ../../packages/contracts/src/instance.ts
3
+ const endpoint = z.url({ protocol: /^https?$/ }).refine((value) => !/^https?:\/\/[^/]*@/.test(value) && !/[?#]/.test(value), "Use an HTTP(S) endpoint without embedded credentials");
4
+ const s3SettingsSchema = z.object({
5
+ endpoint: z.union([endpoint, z.literal("")]).default(""),
6
+ region: z.string().min(1).max(100).default("us-east-1"),
7
+ bucket: z.string().min(3).max(255),
8
+ prefix: z.string().max(200).regex(/^[a-zA-Z0-9/_-]*$/).default("kanvil/"),
9
+ forcePathStyle: z.boolean().default(true),
10
+ accessKeyId: z.string().max(500).default(""),
11
+ secretAccessKey: z.string().max(2e3).optional()
12
+ }).strict();
13
+ const searchAuthenticationSchema = z.enum([
14
+ "none",
15
+ "apiKey",
16
+ "basic"
17
+ ]);
18
+ const searchSettingsSchema = z.object({
19
+ url: endpoint,
20
+ auth: searchAuthenticationSchema.optional(),
21
+ index: z.string().regex(/^[a-z0-9][a-z0-9_-]{0,100}$/),
22
+ apiKey: z.string().max(4e3).optional(),
23
+ username: z.string().max(500).default(""),
24
+ password: z.string().max(2e3).optional()
25
+ }).strict();
26
+ const storageSettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("local") }).strict(), s3SettingsSchema.extend({ provider: z.literal("s3") })]);
27
+ const externalSearchSettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("postgres") }).strict(), searchSettingsSchema.extend({ provider: z.literal("elasticsearch") })]);
28
+ const brokerSettingsSchema = z.object({
29
+ url: z.url({ protocol: /^amqps?$/ }).max(4e3).optional(),
30
+ exchange: z.string().min(1).max(200).regex(/^[a-zA-Z0-9_.-]+$/).refine((value) => !value.startsWith("amq."), "Use an application exchange").default("kanvil.events")
31
+ }).strict();
32
+ const eventDeliverySettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("postgres") }).strict(), brokerSettingsSchema.extend({ provider: z.literal("rabbitmq") })]);
33
+ const authenticationPolicySchema = z.object({
34
+ emailPasswordEnabled: z.boolean().default(true),
35
+ ssoAutoProvision: z.boolean().default(false)
36
+ }).strict();
37
+ const instanceUpdateSchema = z.object({
38
+ expectedVersion: z.number().int().positive(),
39
+ name: z.string().trim().min(1).max(100),
40
+ description: z.string().max(500),
41
+ storage: storageSettingsSchema,
42
+ search: externalSearchSettingsSchema,
43
+ broker: eventDeliverySettingsSchema.optional(),
44
+ authentication: authenticationPolicySchema.optional()
45
+ }).strict();
46
+ z.object({
47
+ name: z.string(),
48
+ description: z.string()
49
+ });
50
+ const adminInstanceSchema = z.object({
51
+ id: z.uuid(),
52
+ version: z.number().int(),
53
+ name: z.string(),
54
+ description: z.string(),
55
+ authentication: authenticationPolicySchema.default(() => authenticationPolicySchema.parse({})),
56
+ storage: z.object({
57
+ provider: z.enum(["local", "s3"]),
58
+ source: z.enum(["deployment", "admin"]),
59
+ settings: s3SettingsSchema.omit({ secretAccessKey: true }).nullable(),
60
+ secretConfigured: z.boolean(),
61
+ pending: z.number().int(),
62
+ status: z.enum([
63
+ "ready",
64
+ "transferring",
65
+ "unavailable"
66
+ ]),
67
+ error: z.string().nullable()
68
+ }),
69
+ search: z.object({
70
+ provider: z.enum(["postgres", "elasticsearch"]),
71
+ source: z.enum(["deployment", "admin"]),
72
+ settings: searchSettingsSchema.omit({
73
+ apiKey: true,
74
+ password: true
75
+ }).nullable(),
76
+ secretConfigured: z.boolean(),
77
+ status: z.enum([
78
+ "builtin",
79
+ "indexing",
80
+ "ready",
81
+ "unavailable"
82
+ ]),
83
+ cursor: z.string(),
84
+ error: z.string().nullable()
85
+ }),
86
+ broker: z.object({
87
+ provider: z.enum(["postgres", "rabbitmq"]),
88
+ source: z.enum(["deployment", "admin"]),
89
+ settings: z.object({
90
+ endpoint: z.string(),
91
+ exchange: z.string()
92
+ }).nullable(),
93
+ secretConfigured: z.boolean(),
94
+ status: z.enum([
95
+ "builtin",
96
+ "connecting",
97
+ "ready",
98
+ "unavailable"
99
+ ]),
100
+ error: z.string().nullable()
101
+ }),
102
+ deployment: z.object({
103
+ url: z.string(),
104
+ oidc: z.object({
105
+ name: z.string(),
106
+ discoveryUrl: z.string(),
107
+ clientId: z.string()
108
+ }).nullable(),
109
+ push: z.boolean(),
110
+ version: z.string()
111
+ }),
112
+ locations: z.array(z.object({
113
+ id: z.uuid(),
114
+ bucket: z.string(),
115
+ endpoint: z.string(),
116
+ prefix: z.string(),
117
+ objects: z.number().int()
118
+ }))
119
+ });
120
+ const photoInputSchema = z.object({
121
+ data: z.string().max(7e5),
122
+ contentType: z.enum([
123
+ "image/png",
124
+ "image/jpeg",
125
+ "image/webp"
126
+ ])
127
+ }).strict();
128
+ const photoResultSchema = z.object({ image: z.string().nullable() });
129
+ function searchAuthentication(settings) {
130
+ return settings.auth ?? (settings.apiKey ? "apiKey" : settings.username && settings.password ? "basic" : "none");
131
+ }
132
+ //#endregion
133
+ export { photoInputSchema as a, searchAuthentication as c, instanceUpdateSchema as i, searchSettingsSchema as l, authenticationPolicySchema as n, photoResultSchema as o, brokerSettingsSchema as r, s3SettingsSchema as s, adminInstanceSchema as t };
@@ -1,4 +1,4 @@
1
- import { d as createDatabase, t as readConfig } from "./config-D3cAABi7.mjs";
1
+ import { n as createDatabase, t as readConfig } from "./config-DtNfVSnB.mjs";
2
2
  import { t as migrateDatabase } from "./migrate-C9f4ozB4.mjs";
3
3
  //#region src/cli/migrate.ts
4
4
  const database = createDatabase(readConfig().DATABASE_URL);
@@ -1,5 +1,6 @@
1
- import { b as user, d as createDatabase, f as account, t as readConfig, y as session } from "./config-D3cAABi7.mjs";
2
- import { W as instanceSettings, ct as hasAdminRole, f as fail, t as createAuth } from "./auth-JcS53IcO.mjs";
1
+ import { d as user, n as createDatabase, r as account, t as readConfig, u as session } from "./config-DtNfVSnB.mjs";
2
+ import { W as instanceSettings, f as fail, t as createAuth } from "./auth-Cuo7ECLh.mjs";
3
+ import { O as hasAdminRole } from "./src-tQ82UI8k.mjs";
3
4
  import { and, eq, isNull, sql } from "drizzle-orm";
4
5
  import { z } from "zod";
5
6
  import { parseArgs } from "node:util";