@prenta/core 8.6.1 → 8.8.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 (157) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/api/handlers.d.ts.map +1 -1
  3. package/dist/api/handlers.js +4 -0
  4. package/dist/api/handlers.js.map +1 -1
  5. package/dist/api/index.d.ts +2 -0
  6. package/dist/api/index.d.ts.map +1 -1
  7. package/dist/api/index.js +2 -0
  8. package/dist/api/index.js.map +1 -1
  9. package/dist/api/route-helpers/auth.d.ts +24 -2
  10. package/dist/api/route-helpers/auth.d.ts.map +1 -1
  11. package/dist/api/route-helpers/auth.js +93 -1
  12. package/dist/api/route-helpers/auth.js.map +1 -1
  13. package/dist/api/route-helpers.d.ts +1 -1
  14. package/dist/api/route-helpers.d.ts.map +1 -1
  15. package/dist/api/route-helpers.js +1 -1
  16. package/dist/api/route-helpers.js.map +1 -1
  17. package/dist/api/routes/ai-authoring.d.ts.map +1 -1
  18. package/dist/api/routes/ai-authoring.js +8 -3
  19. package/dist/api/routes/ai-authoring.js.map +1 -1
  20. package/dist/api/routes/forms.d.ts.map +1 -1
  21. package/dist/api/routes/forms.js +50 -34
  22. package/dist/api/routes/forms.js.map +1 -1
  23. package/dist/api/routes/globals.d.ts.map +1 -1
  24. package/dist/api/routes/globals.js +42 -3
  25. package/dist/api/routes/globals.js.map +1 -1
  26. package/dist/api/routes/mcp-oauth.d.ts +3 -0
  27. package/dist/api/routes/mcp-oauth.d.ts.map +1 -0
  28. package/dist/api/routes/mcp-oauth.js +143 -0
  29. package/dist/api/routes/mcp-oauth.js.map +1 -0
  30. package/dist/api/routes/preview.d.ts.map +1 -1
  31. package/dist/api/routes/preview.js +43 -2
  32. package/dist/api/routes/preview.js.map +1 -1
  33. package/dist/api/routes/privacy.d.ts +3 -0
  34. package/dist/api/routes/privacy.d.ts.map +1 -0
  35. package/dist/api/routes/privacy.js +44 -0
  36. package/dist/api/routes/privacy.js.map +1 -0
  37. package/dist/api/routes/scheduling.d.ts.map +1 -1
  38. package/dist/api/routes/scheduling.js +4 -1
  39. package/dist/api/routes/scheduling.js.map +1 -1
  40. package/dist/api/routes/seo/handlers/audits.d.ts.map +1 -1
  41. package/dist/api/routes/seo/handlers/audits.js +3 -3
  42. package/dist/api/routes/seo/handlers/audits.js.map +1 -1
  43. package/dist/api/routes/seo/handlers/content.d.ts.map +1 -1
  44. package/dist/api/routes/seo/handlers/content.js +2 -2
  45. package/dist/api/routes/seo/handlers/content.js.map +1 -1
  46. package/dist/api/routes/seo/handlers/issue-helpers.d.ts.map +1 -1
  47. package/dist/api/routes/seo/handlers/issue-helpers.js +2 -2
  48. package/dist/api/routes/seo/handlers/issue-helpers.js.map +1 -1
  49. package/dist/api/routes/seo/handlers/issues-fixes.js +3 -3
  50. package/dist/api/routes/seo/handlers/issues-fixes.js.map +1 -1
  51. package/dist/api/routes/seo/handlers/links.d.ts.map +1 -1
  52. package/dist/api/routes/seo/handlers/links.js +6 -6
  53. package/dist/api/routes/seo/handlers/links.js.map +1 -1
  54. package/dist/api/routes/seo/handlers/proposals.js +2 -2
  55. package/dist/api/routes/seo/handlers/proposals.js.map +1 -1
  56. package/dist/api/routes/seo-public.d.ts.map +1 -1
  57. package/dist/api/routes/seo-public.js +9 -0
  58. package/dist/api/routes/seo-public.js.map +1 -1
  59. package/dist/appearance/index.d.ts +2 -0
  60. package/dist/appearance/index.d.ts.map +1 -1
  61. package/dist/appearance/index.js +1 -0
  62. package/dist/appearance/index.js.map +1 -1
  63. package/dist/appearance/public-theme.d.ts +24 -0
  64. package/dist/appearance/public-theme.d.ts.map +1 -0
  65. package/dist/appearance/public-theme.js +87 -0
  66. package/dist/appearance/public-theme.js.map +1 -0
  67. package/dist/appearance/resolve.d.ts.map +1 -1
  68. package/dist/appearance/resolve.js +3 -0
  69. package/dist/appearance/resolve.js.map +1 -1
  70. package/dist/appearance/types.d.ts +3 -0
  71. package/dist/appearance/types.d.ts.map +1 -1
  72. package/dist/appearance/types.js +0 -14
  73. package/dist/appearance/types.js.map +1 -1
  74. package/dist/db/model-types.d.ts +40 -0
  75. package/dist/db/model-types.d.ts.map +1 -1
  76. package/dist/forms/delivery.d.ts.map +1 -1
  77. package/dist/forms/delivery.js +16 -10
  78. package/dist/forms/delivery.js.map +1 -1
  79. package/dist/forms/encryption.d.ts +4 -2
  80. package/dist/forms/encryption.d.ts.map +1 -1
  81. package/dist/forms/encryption.js +6 -4
  82. package/dist/forms/encryption.js.map +1 -1
  83. package/dist/forms/submission.d.ts.map +1 -1
  84. package/dist/forms/submission.js +17 -10
  85. package/dist/forms/submission.js.map +1 -1
  86. package/dist/generated/browser.d.ts +19 -0
  87. package/dist/generated/client.d.ts +19 -0
  88. package/dist/generated/internal/class.d.ts +33 -0
  89. package/dist/generated/internal/class.js +4 -4
  90. package/dist/generated/internal/prismaNamespace.d.ts +296 -1
  91. package/dist/generated/internal/prismaNamespace.js +65 -1
  92. package/dist/generated/internal/prismaNamespaceBrowser.d.ts +70 -0
  93. package/dist/generated/internal/prismaNamespaceBrowser.js +65 -1
  94. package/dist/generated/models/McpOauthGrant.d.ts +1577 -0
  95. package/dist/generated/models/McpOauthGrant.js +1 -0
  96. package/dist/generated/models/McpOauthRefreshReplay.d.ts +957 -0
  97. package/dist/generated/models/McpOauthRefreshReplay.js +1 -0
  98. package/dist/generated/models/McpOauthTransaction.d.ts +1153 -0
  99. package/dist/generated/models/McpOauthTransaction.js +1 -0
  100. package/dist/generated/models/User.d.ts +279 -0
  101. package/dist/generated/models.d.ts +3 -0
  102. package/dist/index.d.ts +2 -2
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +1 -1
  105. package/dist/index.js.map +1 -1
  106. package/dist/mcp/cimd.d.ts +12 -0
  107. package/dist/mcp/cimd.d.ts.map +1 -0
  108. package/dist/mcp/cimd.js +67 -0
  109. package/dist/mcp/cimd.js.map +1 -0
  110. package/dist/mcp/gate.d.ts +11 -0
  111. package/dist/mcp/gate.d.ts.map +1 -0
  112. package/dist/mcp/gate.js +75 -0
  113. package/dist/mcp/gate.js.map +1 -0
  114. package/dist/mcp/memory-grant-store.d.ts +5 -0
  115. package/dist/mcp/memory-grant-store.d.ts.map +1 -0
  116. package/dist/mcp/memory-grant-store.js +44 -0
  117. package/dist/mcp/memory-grant-store.js.map +1 -0
  118. package/dist/mcp/oauth-grants.d.ts +83 -0
  119. package/dist/mcp/oauth-grants.d.ts.map +1 -0
  120. package/dist/mcp/oauth-grants.js +129 -0
  121. package/dist/mcp/oauth-grants.js.map +1 -0
  122. package/dist/mcp/oauth-http.d.ts +43 -0
  123. package/dist/mcp/oauth-http.d.ts.map +1 -0
  124. package/dist/mcp/oauth-http.js +243 -0
  125. package/dist/mcp/oauth-http.js.map +1 -0
  126. package/dist/mcp/oauth-token.d.ts +43 -0
  127. package/dist/mcp/oauth-token.d.ts.map +1 -0
  128. package/dist/mcp/oauth-token.js +78 -0
  129. package/dist/mcp/oauth-token.js.map +1 -0
  130. package/dist/mcp/prisma-store.d.ts +5 -0
  131. package/dist/mcp/prisma-store.d.ts.map +1 -0
  132. package/dist/mcp/prisma-store.js +69 -0
  133. package/dist/mcp/prisma-store.js.map +1 -0
  134. package/dist/mcp/public.d.ts +5 -0
  135. package/dist/mcp/public.d.ts.map +1 -0
  136. package/dist/mcp/public.js +30 -0
  137. package/dist/mcp/public.js.map +1 -0
  138. package/dist/mcp/runtime.d.ts +4 -0
  139. package/dist/mcp/runtime.d.ts.map +1 -0
  140. package/dist/mcp/runtime.js +46 -0
  141. package/dist/mcp/runtime.js.map +1 -0
  142. package/dist/mcp/transactions.d.ts +18 -0
  143. package/dist/mcp/transactions.d.ts.map +1 -0
  144. package/dist/mcp/transactions.js +15 -0
  145. package/dist/mcp/transactions.js.map +1 -0
  146. package/dist/privacy/phi.d.ts +5 -0
  147. package/dist/privacy/phi.d.ts.map +1 -0
  148. package/dist/privacy/phi.js +69 -0
  149. package/dist/privacy/phi.js.map +1 -0
  150. package/dist/seo/document-path.d.ts +13 -0
  151. package/dist/seo/document-path.d.ts.map +1 -1
  152. package/dist/seo/document-path.js +10 -0
  153. package/dist/seo/document-path.js.map +1 -1
  154. package/package.json +3 -3
  155. package/prisma/migrations/0023_mcp_oauth/migration.sql +40 -0
  156. package/prisma/migrations/0024_mcp_oauth_transactions/migration.sql +16 -0
  157. package/prisma/schema.prisma +58 -0
@@ -0,0 +1,18 @@
1
+ export type OauthTransaction = {
2
+ id: string;
3
+ clientId: string;
4
+ clientName: string;
5
+ redirectUri: string;
6
+ resource: string;
7
+ scope: string;
8
+ codeChallenge: string;
9
+ state: string | null;
10
+ expiresAt: Date;
11
+ };
12
+ export interface TransactionStore {
13
+ put(row: OauthTransaction): Promise<void>;
14
+ get(id: string): Promise<OauthTransaction | null>;
15
+ delete(id: string): Promise<void>;
16
+ }
17
+ export declare function createMemoryTransactionStore(): TransactionStore;
18
+ //# sourceMappingURL=transactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../src/mcp/transactions.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,IAAI,CAAA;CAChB,CAAA;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IACjD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClC;AAED,wBAAgB,4BAA4B,IAAI,gBAAgB,CAa/D"}
@@ -0,0 +1,15 @@
1
+ export function createMemoryTransactionStore() {
2
+ const rows = new Map();
3
+ return {
4
+ async put(row) {
5
+ rows.set(row.id, { ...row });
6
+ },
7
+ async get(id) {
8
+ return rows.get(id) ?? null;
9
+ },
10
+ async delete(id) {
11
+ rows.delete(id);
12
+ },
13
+ };
14
+ }
15
+ //# sourceMappingURL=transactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../src/mcp/transactions.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,4BAA4B;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAA4B,CAAA;IAChD,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA;QAC9B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACV,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAA;QAC7B,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACjB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { AuthSession } from '../api/route-helpers/auth.js';
2
+ export declare function phiSafeguardsEnabled(): Promise<boolean>;
3
+ export declare function phiDisclosureDenied(session: AuthSession): Promise<Response | null>;
4
+ export declare function setPhiSafeguards(enabled: boolean, userId: string): Promise<void>;
5
+ //# sourceMappingURL=phi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phi.d.ts","sourceRoot":"","sources":["../../src/privacy/phi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAgC/D,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAM7D;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQxF;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBtF"}
@@ -0,0 +1,69 @@
1
+ import { getDB } from '../db.js';
2
+ import { errorResponse } from '../api/route-helpers/http.js';
3
+ const SETTINGS_COLLECTION = 'settings';
4
+ /**
5
+ * "Protect health information" — a technical disclosure boundary, not a
6
+ * certification. When on, API keys, MCP, and AI must not receive form
7
+ * submission values. Admin browser sessions still read the inbox.
8
+ *
9
+ * Public submit treats a failed lookup as off so a database blip does not
10
+ * reject a visitor. Disclosure paths fail closed: if the lookup throws, the
11
+ * API key is refused.
12
+ */
13
+ async function readPhiSafeguardsFlag() {
14
+ const db = getDB();
15
+ const doc = await db.document.findFirst({
16
+ where: { collection: SETTINGS_COLLECTION, deletedAt: null },
17
+ select: { data: true },
18
+ });
19
+ const data = doc?.data;
20
+ if (!data || typeof data !== 'object')
21
+ return false;
22
+ const privacy = data.privacy;
23
+ return privacy?.phiSafeguards === true;
24
+ }
25
+ export async function phiSafeguardsEnabled() {
26
+ try {
27
+ return await readPhiSafeguardsFlag();
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ export async function phiDisclosureDenied(session) {
34
+ if (!session.apiKey)
35
+ return null;
36
+ try {
37
+ if (!(await readPhiSafeguardsFlag()))
38
+ return null;
39
+ }
40
+ catch {
41
+ return errorResponse('phi_restricted', 403);
42
+ }
43
+ return errorResponse('phi_restricted', 403);
44
+ }
45
+ export async function setPhiSafeguards(enabled, userId) {
46
+ const db = getDB();
47
+ const doc = await db.document.findFirst({
48
+ where: { collection: SETTINGS_COLLECTION, deletedAt: null },
49
+ });
50
+ const current = doc?.data && typeof doc.data === 'object' ? doc.data : {};
51
+ const privacy = current.privacy && typeof current.privacy === 'object'
52
+ ? current.privacy
53
+ : {};
54
+ const next = {
55
+ ...current,
56
+ privacy: {
57
+ ...privacy,
58
+ phiSafeguards: enabled,
59
+ updatedAt: new Date().toISOString(),
60
+ updatedBy: userId,
61
+ },
62
+ };
63
+ if (doc?.id) {
64
+ await db.document.update({ where: { id: doc.id }, data: { data: next } });
65
+ return;
66
+ }
67
+ throw new Error('Settings global is missing');
68
+ }
69
+ //# sourceMappingURL=phi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phi.js","sourceRoot":"","sources":["../../src/privacy/phi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAG5D,MAAM,mBAAmB,GAAG,UAAU,CAAA;AAStC;;;;;;;;GAQG;AACH,KAAK,UAAU,qBAAqB;IAClC,MAAM,EAAE,GAAG,KAAK,EAAc,CAAA;IAC9B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtC,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,IAAI,EAAE;QAC3D,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;KACvB,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,CAAA;IACtB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACnD,MAAM,OAAO,GAAI,IAAkD,CAAC,OAAO,CAAA;IAC3E,OAAO,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC;QACH,OAAO,MAAM,qBAAqB,EAAE,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAoB;IAC5D,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAChC,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,qBAAqB,EAAE,CAAC;YAAE,OAAO,IAAI,CAAA;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,aAAa,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAgB,EAAE,MAAc;IACrE,MAAM,EAAE,GAAG,KAAK,EAAc,CAAA;IAC9B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtC,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,IAAI,EAAE;KAC5D,CAAC,CAAA;IACF,MAAM,OAAO,GACX,GAAG,EAAE,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAA;IACxF,MAAM,OAAO,GACX,OAAO,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QACpD,CAAC,CAAE,OAAO,CAAC,OAAmC;QAC9C,CAAC,CAAC,EAAE,CAAA;IACR,MAAM,IAAI,GAAG;QACX,GAAG,OAAO;QACV,OAAO,EAAE;YACP,GAAG,OAAO;YACV,aAAa,EAAE,OAAO;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,MAAM;SAClB;KACF,CAAA;IACD,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QACzE,OAAM;IACR,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;AAC/C,CAAC"}
@@ -58,4 +58,17 @@ export declare function resolveDocumentUrl(params: {
58
58
  */
59
59
  trailingSlash?: TrailingSlashPolicy | null;
60
60
  }): string;
61
+ /**
62
+ * Public URL that opens a draft in the site renderer. The path comes from
63
+ * {@link documentPublicPath}; the token is the `preview` query value the
64
+ * public site already accepts.
65
+ */
66
+ export declare function documentPreviewUrl(params: {
67
+ siteUrl: string;
68
+ token: string;
69
+ urlPrefix?: string | null;
70
+ slug?: string | null;
71
+ data?: Record<string, unknown> | null;
72
+ path?: string | null;
73
+ }): string;
61
74
  //# sourceMappingURL=document-path.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"document-path.d.ts","sourceRoot":"","sources":["../../src/seo/document-path.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEpD,qFAAqF;AACrF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAE9E;AAMD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,mBAA6B,GACpC,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,mBAA6B,GACpC,MAAM,CAYR;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,mBAAmB,GAC1B,MAAM,GAAG,IAAI,CAYf;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,GAAG,MAAM,CAeT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAC3C,GAAG,MAAM,CAOT"}
1
+ {"version":3,"file":"document-path.d.ts","sourceRoot":"","sources":["../../src/seo/document-path.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEpD,qFAAqF;AACrF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAE9E;AAMD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,mBAA6B,GACpC,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,mBAA6B,GACpC,MAAM,CAYR;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,mBAAmB,GAC1B,MAAM,GAAG,IAAI,CAYf;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,GAAG,MAAM,CAeT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAC3C,GAAG,MAAM,CAOT;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,GAAG,MAAM,CAIT"}
@@ -100,4 +100,14 @@ export function resolveDocumentUrl(params) {
100
100
  return policy === 'always' ? `${base}/` : base;
101
101
  return policy === 'always' ? `${base}${path}/` : `${base}${path}`;
102
102
  }
103
+ /**
104
+ * Public URL that opens a draft in the site renderer. The path comes from
105
+ * {@link documentPublicPath}; the token is the `preview` query value the
106
+ * public site already accepts.
107
+ */
108
+ export function documentPreviewUrl(params) {
109
+ const canonical = resolveDocumentUrl(params);
110
+ const join = canonical.includes('?') ? '&' : '?';
111
+ return `${canonical}${join}preview=${encodeURIComponent(params.token)}`;
112
+ }
103
113
  //# sourceMappingURL=document-path.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"document-path.js","sourceRoot":"","sources":["../../src/seo/document-path.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document-path.js","sourceRoot":"","sources":["../../src/seo/document-path.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prenta/core",
3
- "version": "8.6.1",
3
+ "version": "8.8.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -191,7 +191,7 @@
191
191
  "@prisma/client": "^7.8.0",
192
192
  "jose": "^6.2.9",
193
193
  "sanitize-html": "^2.17.7",
194
- "sharp": "^0.35.4",
194
+ "sharp": "^0.35.5",
195
195
  "turndown": "^7.2.4",
196
196
  "yjs": "^13.6.0",
197
197
  "zod": "^3.23.0",
@@ -239,7 +239,7 @@
239
239
  "@vitest/coverage-v8": "4.1.8",
240
240
  "dotenv": "^17.3.1",
241
241
  "graphql": "^16.13.2",
242
- "graphql-yoga": "^5.19.0",
242
+ "graphql-yoga": "^5.24.4",
243
243
  "next": "^16.3.6",
244
244
  "pg": "^8.20.0",
245
245
  "prisma": "^7.8.0",
@@ -0,0 +1,40 @@
1
+ -- MCP OAuth grants. Codes and refresh tokens are stored as hashes.
2
+
3
+ CREATE TABLE "prenta_mcp_oauth_grants" (
4
+ "id" TEXT NOT NULL,
5
+ "userId" TEXT NOT NULL,
6
+ "clientId" TEXT NOT NULL,
7
+ "redirectUri" TEXT NOT NULL,
8
+ "resource" TEXT NOT NULL,
9
+ "scope" TEXT NOT NULL,
10
+ "codeChallenge" TEXT NOT NULL,
11
+ "codeHash" TEXT,
12
+ "codeExpiresAt" TIMESTAMP(3),
13
+ "codeConsumedAt" TIMESTAMP(3),
14
+ "refreshHash" TEXT,
15
+ "refreshExpiresAt" TIMESTAMP(3),
16
+ "familyId" TEXT NOT NULL,
17
+ "revokedAt" TIMESTAMP(3),
18
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
19
+ "updatedAt" TIMESTAMP(3) NOT NULL,
20
+
21
+ CONSTRAINT "prenta_mcp_oauth_grants_pkey" PRIMARY KEY ("id")
22
+ );
23
+
24
+ CREATE UNIQUE INDEX "prenta_mcp_oauth_grants_codeHash_key" ON "prenta_mcp_oauth_grants"("codeHash");
25
+ CREATE UNIQUE INDEX "prenta_mcp_oauth_grants_refreshHash_key" ON "prenta_mcp_oauth_grants"("refreshHash");
26
+ CREATE INDEX "prenta_mcp_oauth_grants_userId_idx" ON "prenta_mcp_oauth_grants"("userId");
27
+ CREATE INDEX "prenta_mcp_oauth_grants_familyId_idx" ON "prenta_mcp_oauth_grants"("familyId");
28
+ CREATE INDEX "prenta_mcp_oauth_grants_clientId_idx" ON "prenta_mcp_oauth_grants"("clientId");
29
+
30
+ ALTER TABLE "prenta_mcp_oauth_grants" ADD CONSTRAINT "prenta_mcp_oauth_grants_userId_fkey" FOREIGN KEY ("userId") REFERENCES "prenta_users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
31
+
32
+ CREATE TABLE "prenta_mcp_oauth_refresh_replays" (
33
+ "hash" TEXT NOT NULL,
34
+ "familyId" TEXT NOT NULL,
35
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
36
+
37
+ CONSTRAINT "prenta_mcp_oauth_refresh_replays_pkey" PRIMARY KEY ("hash")
38
+ );
39
+
40
+ CREATE INDEX "prenta_mcp_oauth_refresh_replays_familyId_idx" ON "prenta_mcp_oauth_refresh_replays"("familyId");
@@ -0,0 +1,16 @@
1
+ CREATE TABLE "prenta_mcp_oauth_transactions" (
2
+ "id" TEXT NOT NULL,
3
+ "clientId" TEXT NOT NULL,
4
+ "clientName" TEXT NOT NULL,
5
+ "redirectUri" TEXT NOT NULL,
6
+ "resource" TEXT NOT NULL,
7
+ "scope" TEXT NOT NULL,
8
+ "codeChallenge" TEXT NOT NULL,
9
+ "state" TEXT,
10
+ "expiresAt" TIMESTAMP(3) NOT NULL,
11
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
+
13
+ CONSTRAINT "prenta_mcp_oauth_transactions_pkey" PRIMARY KEY ("id")
14
+ );
15
+
16
+ CREATE INDEX "prenta_mcp_oauth_transactions_expiresAt_idx" ON "prenta_mcp_oauth_transactions"("expiresAt");
@@ -121,6 +121,7 @@ model User {
121
121
  sessions Session[]
122
122
  oauthAccounts OAuthAccount[]
123
123
  apiKeys ApiKey[]
124
+ mcpOauthGrants McpOauthGrant[]
124
125
  documents Document[] @relation("CreatedDocuments")
125
126
  updatedDocuments Document[] @relation("UpdatedDocuments")
126
127
  versions Version[]
@@ -1138,3 +1139,60 @@ model Job {
1138
1139
  @@index([status, runAt])
1139
1140
  @@map("prenta_jobs")
1140
1141
  }
1142
+
1143
+ /// One MCP OAuth grant. The authorization code and the current refresh token
1144
+ /// are stored only as SHA-256 hashes. `familyId` groups rotations; replaying a
1145
+ /// replaced refresh token revokes every row in the family.
1146
+ model McpOauthGrant {
1147
+ id String @id @default(cuid())
1148
+ userId String
1149
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1150
+ clientId String
1151
+ redirectUri String
1152
+ resource String
1153
+ scope String
1154
+ codeChallenge String
1155
+ codeHash String? @unique
1156
+ codeExpiresAt DateTime?
1157
+ codeConsumedAt DateTime?
1158
+ refreshHash String? @unique
1159
+ refreshExpiresAt DateTime?
1160
+ familyId String
1161
+ revokedAt DateTime?
1162
+ createdAt DateTime @default(now())
1163
+ updatedAt DateTime @updatedAt
1164
+
1165
+ @@index([userId])
1166
+ @@index([familyId])
1167
+ @@index([clientId])
1168
+ @@map("prenta_mcp_oauth_grants")
1169
+ }
1170
+
1171
+ /// Hashes of refresh tokens that have already been rotated. Presenting one
1172
+ /// revokes the family.
1173
+ model McpOauthRefreshReplay {
1174
+ hash String @id
1175
+ familyId String
1176
+ createdAt DateTime @default(now())
1177
+
1178
+ @@index([familyId])
1179
+ @@map("prenta_mcp_oauth_refresh_replays")
1180
+ }
1181
+
1182
+ /// Pending authorize request, before the person allows or denies it.
1183
+ /// Short-lived. The id is the browser transaction, not a credential.
1184
+ model McpOauthTransaction {
1185
+ id String @id
1186
+ clientId String
1187
+ clientName String
1188
+ redirectUri String
1189
+ resource String
1190
+ scope String
1191
+ codeChallenge String
1192
+ state String?
1193
+ expiresAt DateTime
1194
+ createdAt DateTime @default(now())
1195
+
1196
+ @@index([expiresAt])
1197
+ @@map("prenta_mcp_oauth_transactions")
1198
+ }