@growth-labs/cms 0.8.2 → 0.8.3

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 (77) hide show
  1. package/dist/engine/ai-dek-notifications.d.ts +2 -0
  2. package/dist/engine/ai-dek-notifications.d.ts.map +1 -1
  3. package/dist/engine/ai-dek-notifications.js +11 -2
  4. package/dist/engine/ai-dek-notifications.js.map +1 -1
  5. package/dist/engine/ai-dek.d.ts +23 -0
  6. package/dist/engine/ai-dek.d.ts.map +1 -1
  7. package/dist/engine/ai-dek.js +94 -31
  8. package/dist/engine/ai-dek.js.map +1 -1
  9. package/dist/engine/foundry-dispatch.d.ts +13 -3
  10. package/dist/engine/foundry-dispatch.d.ts.map +1 -1
  11. package/dist/engine/foundry-dispatch.js +80 -25
  12. package/dist/engine/foundry-dispatch.js.map +1 -1
  13. package/dist/engine/fronts-publish-intent.d.ts +55 -0
  14. package/dist/engine/fronts-publish-intent.d.ts.map +1 -1
  15. package/dist/engine/fronts-publish-intent.js +181 -55
  16. package/dist/engine/fronts-publish-intent.js.map +1 -1
  17. package/dist/engine/fronts-publish.d.ts +11 -0
  18. package/dist/engine/fronts-publish.d.ts.map +1 -1
  19. package/dist/engine/fronts-publish.js +106 -4
  20. package/dist/engine/fronts-publish.js.map +1 -1
  21. package/dist/engine/index.d.ts +1 -1
  22. package/dist/engine/index.d.ts.map +1 -1
  23. package/dist/engine/index.js +1 -1
  24. package/dist/engine/index.js.map +1 -1
  25. package/dist/engine/podcast-source.d.ts +3 -2
  26. package/dist/engine/podcast-source.d.ts.map +1 -1
  27. package/dist/engine/podcast-source.js +6 -4
  28. package/dist/engine/podcast-source.js.map +1 -1
  29. package/dist/engine/publisher.d.ts.map +1 -1
  30. package/dist/engine/publisher.js +16 -8
  31. package/dist/engine/publisher.js.map +1 -1
  32. package/dist/engine/soft-delete.d.ts +3 -1
  33. package/dist/engine/soft-delete.d.ts.map +1 -1
  34. package/dist/engine/soft-delete.js +21 -5
  35. package/dist/engine/soft-delete.js.map +1 -1
  36. package/dist/engine/video-source.d.ts +4 -2
  37. package/dist/engine/video-source.d.ts.map +1 -1
  38. package/dist/engine/video-source.js +7 -4
  39. package/dist/engine/video-source.js.map +1 -1
  40. package/dist/routes/content.d.ts +14 -0
  41. package/dist/routes/content.d.ts.map +1 -1
  42. package/dist/routes/content.js +37 -24
  43. package/dist/routes/content.js.map +1 -1
  44. package/dist/routes/context.d.ts +6 -0
  45. package/dist/routes/context.d.ts.map +1 -1
  46. package/dist/routes/context.js.map +1 -1
  47. package/dist/routes/fronts-publish.d.ts +2 -0
  48. package/dist/routes/fronts-publish.d.ts.map +1 -1
  49. package/dist/routes/fronts-publish.js +178 -2
  50. package/dist/routes/fronts-publish.js.map +1 -1
  51. package/dist/ui/api/_content-config.d.ts.map +1 -1
  52. package/dist/ui/api/_content-config.js +7 -0
  53. package/dist/ui/api/_content-config.js.map +1 -1
  54. package/dist/ui/api/fronts/schedule.d.ts +2 -0
  55. package/dist/ui/api/fronts/schedule.d.ts.map +1 -1
  56. package/dist/ui/api/fronts/schedule.js +2 -0
  57. package/dist/ui/api/fronts/schedule.js.map +1 -1
  58. package/dist/ui/editor/ContentForm.d.ts.map +1 -1
  59. package/dist/ui/editor/ContentForm.js +2 -2
  60. package/dist/ui/editor/ContentForm.js.map +1 -1
  61. package/package.json +1 -1
  62. package/src/engine/ai-dek-notifications.ts +19 -2
  63. package/src/engine/ai-dek.ts +131 -40
  64. package/src/engine/foundry-dispatch.ts +110 -24
  65. package/src/engine/fronts-publish-intent.ts +289 -65
  66. package/src/engine/fronts-publish.ts +121 -4
  67. package/src/engine/index.ts +1 -0
  68. package/src/engine/podcast-source.ts +6 -4
  69. package/src/engine/publisher.ts +20 -8
  70. package/src/engine/soft-delete.ts +28 -8
  71. package/src/engine/video-source.ts +7 -4
  72. package/src/routes/content.ts +56 -31
  73. package/src/routes/context.ts +6 -0
  74. package/src/routes/fronts-publish.ts +213 -2
  75. package/src/ui/api/_content-config.ts +15 -0
  76. package/src/ui/api/fronts/schedule.ts +4 -0
  77. package/src/ui/editor/ContentForm.tsx +4 -5
@@ -6,6 +6,8 @@ export interface DekFailureNotificationInput {
6
6
  title: string;
7
7
  reason: string;
8
8
  userId?: string | null;
9
+ /** Stable callback/attempt identity for replay-safe background notifications. */
10
+ occurrenceId?: string;
9
11
  }
10
12
  /**
11
13
  * Create unread, in-app notifications when publication ships without a dek.
@@ -1 +1 @@
1
- {"version":3,"file":"ai-dek-notifications.d.ts","sourceRoot":"","sources":["../../src/engine/ai-dek-notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,MAAM,WAAW,2BAA2B;IAC3C,EAAE,EAAE,UAAU,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CAClD,KAAK,EAAE,2BAA2B,GAChC,OAAO,CAAC,MAAM,CAAC,CA+BjB"}
1
+ {"version":3,"file":"ai-dek-notifications.d.ts","sourceRoot":"","sources":["../../src/engine/ai-dek-notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAazC,MAAM,WAAW,2BAA2B;IAC3C,EAAE,EAAE,UAAU,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CAClD,KAAK,EAAE,2BAA2B,GAChC,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
@@ -1,3 +1,8 @@
1
+ async function deterministicNotificationId(occurrenceId, userId) {
2
+ const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(JSON.stringify(['ai-dek-failed.v1', occurrenceId, userId])));
3
+ const hex = Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, '0')).join('');
4
+ return `ai-dek-failed:${hex}`;
5
+ }
1
6
  /**
2
7
  * Create unread, in-app notifications when publication ships without a dek.
3
8
  * Interactive publishes target the actor; background publishes target every
@@ -22,11 +27,15 @@ export async function createDekFailureNotifications(input) {
22
27
  const reason = input.reason.trim().slice(0, 160) || 'unknown error';
23
28
  const body = `Content was published without a subheading: “${input.title}”. AI generation failed (${reason}). Open the item to add one manually.`;
24
29
  for (const userId of [...new Set(userIds)]) {
30
+ const notificationId = input.occurrenceId
31
+ ? await deterministicNotificationId(input.occurrenceId, userId)
32
+ : crypto.randomUUID();
25
33
  await input.db
26
34
  .prepare(`INSERT INTO cms_notifications
27
35
  (id, workspace_id, user_id, kind, body, created_at)
28
- VALUES (?, ?, ?, 'ai_dek_failed', ?, unixepoch())`)
29
- .bind(crypto.randomUUID(), input.workspaceId, userId, body)
36
+ VALUES (?, ?, ?, 'ai_dek_failed', ?, unixepoch())
37
+ ON CONFLICT(id) DO NOTHING`)
38
+ .bind(notificationId, input.workspaceId, userId, body)
30
39
  .run();
31
40
  }
32
41
  return new Set(userIds).size;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-dek-notifications.js","sourceRoot":"","sources":["../../src/engine/ai-dek-notifications.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAClD,KAAkC;IAElC,IAAI,OAAiB,CAAA;IACrB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE;aACzB,OAAO,CACP;;;;0BAIsB,CACtB;aACA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;aACvB,GAAG,EAAuB,CAAA;QAC5B,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,eAAe,CAAA;IACnE,MAAM,IAAI,GAAG,gDAAgD,KAAK,CAAC,KAAK,4BAA4B,MAAM,uCAAuC,CAAA;IACjJ,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC5C,MAAM,KAAK,CAAC,EAAE;aACZ,OAAO,CACP;;uDAEmD,CACnD;aACA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC;aAC1D,GAAG,EAAE,CAAA;IACR,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAA;AAC7B,CAAC"}
1
+ {"version":3,"file":"ai-dek-notifications.js","sourceRoot":"","sources":["../../src/engine/ai-dek-notifications.ts"],"names":[],"mappings":"AAEA,KAAK,UAAU,2BAA2B,CAAC,YAAoB,EAAE,MAAc;IAC9E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CACxC,SAAS,EACT,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CACpF,CAAA;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAChG,EAAE,CACF,CAAA;IACD,OAAO,iBAAiB,GAAG,EAAE,CAAA;AAC9B,CAAC;AAaD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAClD,KAAkC;IAElC,IAAI,OAAiB,CAAA;IACrB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE;aACzB,OAAO,CACP;;;;0BAIsB,CACtB;aACA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;aACvB,GAAG,EAAuB,CAAA;QAC5B,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,eAAe,CAAA;IACnE,MAAM,IAAI,GAAG,gDAAgD,KAAK,CAAC,KAAK,4BAA4B,MAAM,uCAAuC,CAAA;IACjJ,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC5C,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY;YACxC,CAAC,CAAC,MAAM,2BAA2B,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC;YAC/D,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAA;QACtB,MAAM,KAAK,CAAC,EAAE;aACZ,OAAO,CACP;;;gCAG4B,CAC5B;aACA,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC;aACrD,GAAG,EAAE,CAAA;IACR,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAA;AAC7B,CAAC"}
@@ -26,7 +26,30 @@ export type GenerateContentDekResult = {
26
26
  written: false;
27
27
  reason: 'not_found';
28
28
  };
29
+ export type GenerateContentDekSuggestionResult = {
30
+ status: 'generated';
31
+ dek: string;
32
+ } | {
33
+ status: 'unavailable';
34
+ dek: null;
35
+ reason: string;
36
+ };
29
37
  export declare function loadDekGenerationContext(db: D1Database, contentId: string): Promise<DekGenerationContext | null>;
38
+ /** Build the prompt context from an already-authorized publication snapshot. */
39
+ export declare function loadDekGenerationContextFromSnapshot(db: D1Database, snapshot: Record<string, unknown>): Promise<DekGenerationContext | null>;
40
+ /** Dispatch and normalize a dek suggestion without creating any D1 write continuation. */
41
+ export declare function generateContentDekSuggestion(input: {
42
+ context: DekGenerationContext;
43
+ llm: LlmDispatch;
44
+ }): Promise<GenerateContentDekSuggestionResult>;
45
+ /** Apply a generated suggestion only while its captured editor/publication state is current. */
46
+ export declare function applyGeneratedContentDek(input: {
47
+ db: D1Database;
48
+ contentId: string;
49
+ dek: string;
50
+ context: DekGenerationContext;
51
+ expectedPublicationSnapshot?: Record<string, unknown>;
52
+ }): Promise<GenerateContentDekResult>;
30
53
  export declare function generateContentDek(input: {
31
54
  db: D1Database;
32
55
  contentId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-dek.d.ts","sourceRoot":"","sources":["../../src/engine/ai-dek.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,gBAAgB,CAAA;AAEvE,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,iBAAiB,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,MAAM,wBAAwB,GACjC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GACnD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAA;AA+B1E,wBAAsB,wBAAwB,CAC7C,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA4BtC;AAUD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC/C,EAAE,EAAE,UAAU,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,WAAW,CAAA;CAChB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA2CpC"}
1
+ {"version":3,"file":"ai-dek.d.ts","sourceRoot":"","sources":["../../src/engine/ai-dek.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAMzC,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,gBAAgB,CAAA;AAEvE,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,iBAAiB,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,MAAM,wBAAwB,GACjC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GACnD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAA;AAE1E,MAAM,MAAM,kCAAkC,GAC3C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAmDvD,wBAAsB,wBAAwB,CAC7C,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAQtC;AAED,gFAAgF;AAChF,wBAAsB,oCAAoC,CACzD,EAAE,EAAE,UAAU,EACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAgBtC;AAUD,0FAA0F;AAC1F,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACzD,OAAO,EAAE,oBAAoB,CAAA;IAC7B,GAAG,EAAE,WAAW,CAAA;CAChB,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAuB9C;AAED,gGAAgG;AAChG,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACrD,EAAE,EAAE,UAAU,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,oBAAoB,CAAA;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrD,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA4CpC;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC/C,EAAE,EAAE,UAAU,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,WAAW,CAAA;CAChB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAqBpC"}
@@ -1,5 +1,6 @@
1
1
  import { dekPrompt } from './ai-prompts.js';
2
2
  import { applyAiWrite, parseLockedFields } from './ai-writeback.js';
3
+ import { CURRENT_PUBLICATION_GUARD, currentPublicationSqlGuard, snapshotRecord, } from './publication-current-guard.js';
3
4
  import { getContentItem } from './publisher.js';
4
5
  export const DEK_EXEMPLAR_LIMIT = 6;
5
6
  async function loadTypeSource(db, item) {
@@ -24,13 +25,7 @@ async function loadTypeSource(db, item) {
24
25
  .first();
25
26
  return (row?.body_markdown || row?.body_html || row?.subtitle || '').trim();
26
27
  }
27
- export async function loadDekGenerationContext(db, contentId) {
28
- const item = await getContentItem(db, contentId);
29
- if (!item)
30
- return null;
31
- const typeSource = await loadTypeSource(db, item);
32
- const description = item.description?.trim() ?? '';
33
- const source = [description, typeSource].filter(Boolean).join('\n\n');
28
+ async function loadExemplars(db, item) {
34
29
  const rows = await db
35
30
  .prepare(`SELECT title, excerpt
36
31
  FROM content_items
@@ -43,10 +38,36 @@ export async function loadDekGenerationContext(db, contentId) {
43
38
  COALESCE(published_at, 0) DESC,
44
39
  id ASC
45
40
  LIMIT ?`)
46
- .bind(contentId, item.type, DEK_EXEMPLAR_LIMIT)
41
+ .bind(item.id, item.type, DEK_EXEMPLAR_LIMIT)
47
42
  .all();
48
- const exemplars = (rows.results ?? []).map((row) => `Headline: ${row.title}\nDek: ${row.excerpt.trim()}`);
49
- return { item, source, exemplars };
43
+ return (rows.results ?? []).map((row) => `Headline: ${row.title}\nDek: ${row.excerpt.trim()}`);
44
+ }
45
+ export async function loadDekGenerationContext(db, contentId) {
46
+ const item = await getContentItem(db, contentId);
47
+ if (!item)
48
+ return null;
49
+ const typeSource = await loadTypeSource(db, item);
50
+ const description = item.description?.trim() ?? '';
51
+ const source = [description, typeSource].filter(Boolean).join('\n\n');
52
+ return { item, source, exemplars: await loadExemplars(db, item) };
53
+ }
54
+ /** Build the prompt context from an already-authorized publication snapshot. */
55
+ export async function loadDekGenerationContextFromSnapshot(db, snapshot) {
56
+ const item = snapshotRecord(snapshot.item);
57
+ if (!item.id || !item.type || !item.title)
58
+ return null;
59
+ const content = snapshotRecord(snapshot.content);
60
+ const typeSource = item.type === 'video'
61
+ ? String(content.script ?? '').trim()
62
+ : item.type === 'podcast'
63
+ ? String(content.transcript ?? '').trim()
64
+ : String(content.body_markdown || content.body_html || content.subtitle || '').trim();
65
+ const description = item.description?.trim() ?? '';
66
+ return {
67
+ item,
68
+ source: [description, typeSource].filter(Boolean).join('\n\n'),
69
+ exemplars: await loadExemplars(db, item),
70
+ };
50
71
  }
51
72
  function normalizeDek(text) {
52
73
  return text
@@ -55,45 +76,87 @@ function normalizeDek(text) {
55
76
  .replace(/\s+/g, ' ')
56
77
  .trim();
57
78
  }
58
- export async function generateContentDek(input) {
59
- const context = await loadDekGenerationContext(input.db, input.contentId);
60
- if (!context) {
61
- return { status: 'not_found', dek: null, written: false, reason: 'not_found' };
62
- }
79
+ /** Dispatch and normalize a dek suggestion without creating any D1 write continuation. */
80
+ export async function generateContentDekSuggestion(input) {
63
81
  const result = await input.llm.dispatch({
64
82
  ...dekPrompt({
65
- title: context.item.title,
66
- source: context.source,
67
- exemplars: context.exemplars,
83
+ title: input.context.item.title,
84
+ source: input.context.source,
85
+ exemplars: input.context.exemplars,
68
86
  }),
69
87
  stream: false,
70
88
  });
71
89
  if (result instanceof ReadableStream) {
72
- return { status: 'unavailable', dek: null, written: false, reason: 'stream_result' };
90
+ return { status: 'unavailable', dek: null, reason: 'stream_result' };
73
91
  }
74
92
  if (result.status === 'unavailable') {
75
93
  return {
76
94
  status: 'unavailable',
77
95
  dek: null,
78
- written: false,
79
96
  reason: result.reason ?? 'unavailable',
80
97
  };
81
98
  }
82
99
  const dek = normalizeDek(result.text);
83
- if (!dek) {
84
- return { status: 'unavailable', dek: null, written: false, reason: 'empty_result' };
85
- }
100
+ if (!dek)
101
+ return { status: 'unavailable', dek: null, reason: 'empty_result' };
102
+ return { status: 'generated', dek };
103
+ }
104
+ /** Apply a generated suggestion only while its captured editor/publication state is current. */
105
+ export async function applyGeneratedContentDek(input) {
86
106
  const write = applyAiWrite({
87
- locked: parseLockedFields(context.item.ai_locked_fields),
107
+ locked: parseLockedFields(input.context.item.ai_locked_fields),
88
108
  field: 'excerpt',
89
- value: dek,
109
+ value: input.dek,
90
110
  });
91
111
  if (!write.written)
92
- return { status: 'locked', dek, written: false };
93
- await input.db
94
- .prepare('UPDATE content_items SET excerpt = ?, updated_at = unixepoch() WHERE id = ?')
95
- .bind(dek, input.contentId)
96
- .run();
97
- return { status: 'generated', dek, written: true };
112
+ return { status: 'locked', dek: input.dek, written: false };
113
+ const capturedItem = input.context.item;
114
+ const guardPayload = input.expectedPublicationSnapshot
115
+ ? JSON.stringify({
116
+ ...input.expectedPublicationSnapshot,
117
+ publication_guard: CURRENT_PUBLICATION_GUARD,
118
+ })
119
+ : null;
120
+ const publicationPredicate = guardPayload
121
+ ? `AND EXISTS (
122
+ SELECT 1 FROM (SELECT ? AS payload_json) dek_expected
123
+ WHERE ${currentPublicationSqlGuard('dek_expected')}
124
+ )`
125
+ : '';
126
+ const statement = input.db
127
+ .prepare(`UPDATE content_items
128
+ SET excerpt = ?, updated_at = unixepoch()
129
+ WHERE id = ?
130
+ AND canonical_version IS ?
131
+ AND excerpt IS ?
132
+ AND ai_locked_fields IS ?
133
+ ${publicationPredicate}`)
134
+ .bind(input.dek, input.contentId, capturedItem.canonical_version, capturedItem.excerpt, capturedItem.ai_locked_fields, ...(guardPayload ? [guardPayload] : []));
135
+ const result = await statement.run();
136
+ if (result.meta?.changes !== 1) {
137
+ return { status: 'unavailable', dek: null, written: false, reason: 'content_changed' };
138
+ }
139
+ return { status: 'generated', dek: input.dek, written: true };
140
+ }
141
+ export async function generateContentDek(input) {
142
+ const context = await loadDekGenerationContext(input.db, input.contentId);
143
+ if (!context) {
144
+ return { status: 'not_found', dek: null, written: false, reason: 'not_found' };
145
+ }
146
+ const suggestion = await generateContentDekSuggestion({ context, llm: input.llm });
147
+ if (suggestion.status === 'unavailable') {
148
+ return {
149
+ status: 'unavailable',
150
+ dek: null,
151
+ written: false,
152
+ reason: suggestion.reason,
153
+ };
154
+ }
155
+ return applyGeneratedContentDek({
156
+ db: input.db,
157
+ contentId: input.contentId,
158
+ dek: suggestion.dek,
159
+ context,
160
+ });
98
161
  }
99
162
  //# sourceMappingURL=ai-dek.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-dek.js","sourceRoot":"","sources":["../../src/engine/ai-dek.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-dek.js","sourceRoot":"","sources":["../../src/engine/ai-dek.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,10 @@ import type { FoundryDispatch } from '../providers/types.js';
2
2
  import type { D1Database } from './d1.js';
3
3
  export type ProcessingState = 'pending' | 'queued' | 'fetching' | 'transcribing' | 'transcoding' | 'ready' | 'failed';
4
4
  export interface DispatchResult {
5
- correlationId: string;
5
+ /** Podcast capture reuse has no persisted correlation to return. */
6
+ correlationId: string | null;
6
7
  triggerToken: string;
8
+ skipped?: boolean;
7
9
  }
8
10
  export declare class FoundryDispatchPrerequisiteError extends Error {
9
11
  readonly code: "missing_duration";
@@ -21,16 +23,24 @@ export interface CallbackInput {
21
23
  description?: string | null;
22
24
  excerpt?: string | null;
23
25
  }
26
+ /**
27
+ * Mint a fresh source identity for the caller's source-snapshot CAS. Capture
28
+ * time records initiation, not worker admission; this helper does not dispatch
29
+ * work or change readiness. The raw token stays in the private capture record.
30
+ */
31
+ export declare function createFoundrySourceCaptureToken(capturedAtSeconds?: number): string;
24
32
  /**
25
33
  * Dispatch a video or podcast content item to Foundry via the injected hook.
26
- * Mints a fresh `processing_trigger_token` (UUID), calls
34
+ * Mints a fresh versioned `processing_trigger_token` (capture time + UUID), calls
27
35
  * `hook.dispatchVideo({ contentId, sourceUrl, kind, durationSeconds })`, and writes
28
36
  * `processing_correlation_id` + advances to `'queued'` in either
29
37
  * `video_content` or `podcast_content`.
30
38
  *
31
39
  * Throws if the item is not a video/podcast.
32
40
  */
33
- export declare function dispatchToFoundry(db: D1Database, contentId: string, hook: Pick<FoundryDispatch, 'dispatchVideo'>): Promise<DispatchResult>;
41
+ export declare function dispatchToFoundry(db: D1Database, contentId: string, hook: Pick<FoundryDispatch, 'dispatchVideo'>, options?: {
42
+ ifUncaptured?: boolean;
43
+ }): Promise<DispatchResult>;
34
44
  /**
35
45
  * Apply a Foundry callback event to the state machine.
36
46
  *
@@ -1 +1 @@
1
- {"version":3,"file":"foundry-dispatch.d.ts","sourceRoot":"","sources":["../../src/engine/foundry-dispatch.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAazC,MAAM,MAAM,eAAe,GACxB,SAAS,GACT,QAAQ,GACR,UAAU,GACV,cAAc,GACd,aAAa,GACb,OAAO,GACP,QAAQ,CAAA;AAIX,MAAM,WAAW,cAAc;IAC9B,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,gCAAiC,SAAQ,KAAK;IAC1D,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAS;gBAE/B,SAAS,EAAE,MAAM;CAI7B;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,eAAe,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAwCD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACtC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,GAC1C,OAAO,CAAC,cAAc,CAAC,CA8KzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAoJjG;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CA8ClB"}
1
+ {"version":3,"file":"foundry-dispatch.d.ts","sourceRoot":"","sources":["../../src/engine/foundry-dispatch.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,SAAS,CAAA;AAanD,MAAM,MAAM,eAAe,GACxB,SAAS,GACT,QAAQ,GACR,UAAU,GACV,cAAc,GACd,aAAa,GACb,OAAO,GACP,QAAQ,CAAA;AAIX,MAAM,WAAW,cAAc;IAC9B,oEAAoE;IACpE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,qBAAa,gCAAiC,SAAQ,KAAK;IAC1D,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAS;gBAE/B,SAAS,EAAE,MAAM;CAI7B;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,eAAe,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAwCD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC9C,iBAAiB,SAAgC,GAC/C,MAAM,CAKR;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACtC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,EAC5C,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,OAAO,CAAC,cAAc,CAAC,CAoOzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAmKjG;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CA8ClB"}
@@ -49,16 +49,27 @@ function inferVideoSourceKind(sourceUrl) {
49
49
  }
50
50
  return 'http_url';
51
51
  }
52
+ /**
53
+ * Mint a fresh source identity for the caller's source-snapshot CAS. Capture
54
+ * time records initiation, not worker admission; this helper does not dispatch
55
+ * work or change readiness. The raw token stays in the private capture record.
56
+ */
57
+ export function createFoundrySourceCaptureToken(capturedAtSeconds = Math.floor(Date.now() / 1000)) {
58
+ if (!Number.isSafeInteger(capturedAtSeconds) || capturedAtSeconds <= 0) {
59
+ throw new RangeError('Capture time must be positive safe integer Unix seconds');
60
+ }
61
+ return `fronts-source-v2:${capturedAtSeconds}:${crypto.randomUUID()}`;
62
+ }
52
63
  /**
53
64
  * Dispatch a video or podcast content item to Foundry via the injected hook.
54
- * Mints a fresh `processing_trigger_token` (UUID), calls
65
+ * Mints a fresh versioned `processing_trigger_token` (capture time + UUID), calls
55
66
  * `hook.dispatchVideo({ contentId, sourceUrl, kind, durationSeconds })`, and writes
56
67
  * `processing_correlation_id` + advances to `'queued'` in either
57
68
  * `video_content` or `podcast_content`.
58
69
  *
59
70
  * Throws if the item is not a video/podcast.
60
71
  */
61
- export async function dispatchToFoundry(db, contentId, hook) {
72
+ export async function dispatchToFoundry(db, contentId, hook, options = {}) {
62
73
  const content = await db
63
74
  .prepare('SELECT id, type, slug, title, description, canonical_version, status, deleted_at FROM content_items WHERE id = ? LIMIT 1')
64
75
  .bind(contentId)
@@ -68,7 +79,7 @@ export async function dispatchToFoundry(db, contentId, hook) {
68
79
  }
69
80
  // Determine which media table owns this content id.
70
81
  const videoRow = await db
71
- .prepare('SELECT content_id, video_id, duration_seconds, processing_source_url, processing_source_kind FROM video_content WHERE content_id = ?')
82
+ .prepare('SELECT content_id, video_id, duration_seconds, processing_source_url, processing_source_kind, processing_trigger_token, processing_correlation_id FROM video_content WHERE content_id = ?')
72
83
  .bind(contentId)
73
84
  .first();
74
85
  let table;
@@ -79,6 +90,18 @@ export async function dispatchToFoundry(db, contentId, hook) {
79
90
  let durationSeconds;
80
91
  let podcastSnapshot = null;
81
92
  if (videoRow) {
93
+ if (content.type !== 'video' || content.deleted_at != null || content.status === 'archived') {
94
+ throw new Error(`dispatchToFoundry: video ${contentId} is inactive`);
95
+ }
96
+ if (options.ifUncaptured &&
97
+ videoRow.processing_trigger_token &&
98
+ videoRow.processing_correlation_id) {
99
+ return {
100
+ correlationId: videoRow.processing_correlation_id,
101
+ triggerToken: videoRow.processing_trigger_token,
102
+ skipped: true,
103
+ };
104
+ }
82
105
  table = 'video_content';
83
106
  sourceUrl = videoRow.processing_source_url?.trim() ?? '';
84
107
  if (!sourceUrl) {
@@ -116,7 +139,19 @@ export async function dispatchToFoundry(db, contentId, hook) {
116
139
  durationSeconds <= 0) {
117
140
  throw new FoundryDispatchPrerequisiteError(contentId);
118
141
  }
119
- const triggerToken = crypto.randomUUID();
142
+ if (options.ifUncaptured &&
143
+ podcastSnapshot?.processing_trigger_token?.trim() &&
144
+ podcastSnapshot.processing_source_kind === 'https' &&
145
+ validPodcastSourceUrl(podcastSnapshot.processing_source_url)) {
146
+ // Source edits clear the token. This source/token pair is the CMS's
147
+ // committed capture evidence; a metadata save need not call the host again.
148
+ return {
149
+ correlationId: null,
150
+ triggerToken: podcastSnapshot.processing_trigger_token,
151
+ skipped: true,
152
+ };
153
+ }
154
+ const triggerToken = createFoundrySourceCaptureToken();
120
155
  const processingTriggerTokenHash = `sha256:${await sha256Hex(triggerToken)}`;
121
156
  const { correlationId, podcastSource } = await hook.dispatchVideo({
122
157
  contentId,
@@ -131,7 +166,9 @@ export async function dispatchToFoundry(db, contentId, hook) {
131
166
  });
132
167
  const now = Math.floor(Date.now() / 1000);
133
168
  if (table === 'video_content') {
134
- await db
169
+ if (!videoRow)
170
+ throw new Error('Video dispatch snapshot is missing');
171
+ const written = await db
135
172
  .prepare(`UPDATE video_content
136
173
  SET processing_state = 'queued',
137
174
  video_id = ?,
@@ -148,9 +185,16 @@ export async function dispatchToFoundry(db, contentId, hook) {
148
185
  transcript_url = NULL,
149
186
  hls_manifest_url = NULL,
150
187
  hls_poster_url = NULL
151
- WHERE content_id = ?`)
152
- .bind(videoId, sourceKind, correlationId, triggerToken, now, contentId)
188
+ WHERE content_id = ? AND video_id IS ? AND duration_seconds IS ?
189
+ AND processing_source_url IS ? AND processing_source_kind IS ?
190
+ AND processing_trigger_token IS ? AND processing_correlation_id IS ?
191
+ AND EXISTS (SELECT 1 FROM content_items ci WHERE ci.id = video_content.content_id
192
+ AND ci.type = 'video' AND ci.slug = ? AND ci.canonical_version = ?
193
+ AND ci.status = ? AND ci.deleted_at IS NULL)`)
194
+ .bind(videoId, sourceKind, correlationId, triggerToken, now, contentId, videoRow.video_id, videoRow.duration_seconds, videoRow.processing_source_url, videoRow.processing_source_kind, videoRow.processing_trigger_token, videoRow.processing_correlation_id, content.slug, content.canonical_version, content.status)
153
195
  .run();
196
+ if (written.meta?.changes !== 1)
197
+ throw new Error('Video source changed before dispatch acknowledgement');
154
198
  }
155
199
  else {
156
200
  if (!podcastSnapshot)
@@ -171,7 +215,7 @@ export async function dispatchToFoundry(db, contentId, hook) {
171
215
  // source/audio/editor snapshot is still current. No stale acknowledgement
172
216
  // can restore a replaced source or overwrite a newer processing token.
173
217
  const written = await db
174
- .prepare(`UPDATE podcast_content SET processing_source_url = ?, processing_source_kind = ?, processing_trigger_token = ?
218
+ .prepare(`UPDATE podcast_content SET processing_source_url = ?, processing_source_kind = ?, processing_trigger_token = ?, transcript = ''
175
219
  WHERE content_id = ? AND audio_r2_key IS ? AND duration_seconds IS ? AND transcript IS ?
176
220
  AND processing_source_url IS ? AND processing_source_kind IS ? AND processing_trigger_token IS ?
177
221
  AND EXISTS (SELECT 1 FROM content_items ci WHERE ci.id = podcast_content.content_id
@@ -241,60 +285,71 @@ export async function applyFoundryCallback(db, input) {
241
285
  ? Math.max(0, Math.floor(durationSeconds))
242
286
  : null;
243
287
  if (nextTranscript !== null || nextDurationSeconds !== null) {
244
- await db
288
+ const updated = await db
245
289
  .prepare(`UPDATE podcast_content
246
290
  SET transcript = CASE WHEN ? THEN ? ELSE transcript END,
247
291
  duration_seconds = CASE WHEN ? THEN ? ELSE duration_seconds END
248
- WHERE content_id = ?`)
249
- .bind(nextTranscript !== null ? 1 : 0, nextTranscript, nextDurationSeconds !== null ? 1 : 0, nextDurationSeconds, podcastRow.content_id)
292
+ WHERE content_id = ? AND processing_trigger_token = ?`)
293
+ .bind(nextTranscript !== null ? 1 : 0, nextTranscript, nextDurationSeconds !== null ? 1 : 0, nextDurationSeconds, podcastRow.content_id, triggerToken)
250
294
  .run();
295
+ if (updated.meta?.changes !== 1)
296
+ return false;
251
297
  }
252
298
  const nextDescription = typeof description === 'string' && description.trim() ? description.trim() : null;
253
299
  const nextExcerpt = typeof excerpt === 'string' && excerpt.trim() ? excerpt.trim() : null;
254
300
  if (nextDescription !== null || nextExcerpt !== null) {
255
- await db
301
+ const updated = await db
256
302
  .prepare(`UPDATE content_items
257
303
  SET description = CASE WHEN ? THEN ? ELSE description END,
258
304
  excerpt = CASE WHEN ? THEN ? ELSE excerpt END,
259
305
  updated_at = unixepoch()
260
- WHERE id = ?`)
261
- .bind(nextDescription !== null ? 1 : 0, nextDescription, nextExcerpt !== null ? 1 : 0, nextExcerpt, podcastRow.content_id)
306
+ WHERE id = ? AND EXISTS (
307
+ SELECT 1 FROM podcast_content p WHERE p.content_id = content_items.id
308
+ AND p.processing_trigger_token = ?
309
+ )`)
310
+ .bind(nextDescription !== null ? 1 : 0, nextDescription, nextExcerpt !== null ? 1 : 0, nextExcerpt, podcastRow.content_id, triggerToken)
262
311
  .run();
312
+ if (updated.meta?.changes !== 1)
313
+ return false;
263
314
  }
264
- return true;
315
+ return Boolean(await db
316
+ .prepare('SELECT content_id FROM podcast_content WHERE content_id = ? AND processing_trigger_token = ?')
317
+ .bind(podcastRow.content_id, triggerToken)
318
+ .first());
265
319
  }
266
320
  if (!videoRow)
267
321
  return false;
268
322
  const row = videoRow;
323
+ let updated;
269
324
  if (nextState === 'failed') {
270
- await db
325
+ updated = await db
271
326
  .prepare(`UPDATE video_content
272
327
  SET processing_state = ?,
273
328
  processing_last_event_at = ?,
274
329
  processing_completed_at = ?,
275
330
  processing_error = ?
276
- WHERE content_id = ?`)
277
- .bind(nextState, now, now, error ?? null, row.content_id)
331
+ WHERE content_id = ? AND processing_trigger_token = ?`)
332
+ .bind(nextState, now, now, error ?? null, row.content_id, triggerToken)
278
333
  .run();
279
334
  }
280
335
  else if (isTerminal) {
281
336
  // 'ready'
282
- await db
337
+ updated = await db
283
338
  .prepare(`UPDATE video_content
284
339
  SET processing_state = ?,
285
340
  processing_last_event_at = ?,
286
341
  processing_completed_at = ?
287
- WHERE content_id = ?`)
288
- .bind(nextState, now, now, row.content_id)
342
+ WHERE content_id = ? AND processing_trigger_token = ?`)
343
+ .bind(nextState, now, now, row.content_id, triggerToken)
289
344
  .run();
290
345
  }
291
346
  else {
292
- await db
293
- .prepare('UPDATE video_content SET processing_state = ?, processing_last_event_at = ? WHERE content_id = ?')
294
- .bind(nextState, now, row.content_id)
347
+ updated = await db
348
+ .prepare('UPDATE video_content SET processing_state = ?, processing_last_event_at = ? WHERE content_id = ? AND processing_trigger_token = ?')
349
+ .bind(nextState, now, row.content_id, triggerToken)
295
350
  .run();
296
351
  }
297
- return true;
352
+ return updated.meta?.changes === 1;
298
353
  }
299
354
  /**
300
355
  * Verify a HMAC-SHA256 signature over `rawBody` using `secret`.
@@ -1 +1 @@
1
- {"version":3,"file":"foundry-dispatch.js","sourceRoot":"","sources":["../../src/engine/foundry-dispatch.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,qCAAqC;AACrC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,gEAAgE;AAIhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAqB3D,MAAM,eAAe,GAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AAO9D,MAAM,OAAO,gCAAiC,SAAQ,KAAK;IACjD,IAAI,GAAG,kBAA2B,CAAA;IAE3C,YAAY,SAAiB;QAC5B,KAAK,CAAC,WAAW,SAAS,sDAAsD,CAAC,CAAA;QACjF,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAA;IAC/C,CAAC;CACD;AAeD,KAAK,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC3D,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC9F,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC9B,OAAO,CACN,KAAK;SACH,IAAI,EAAE;SACN,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CACzB,CAAA;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAgC,EAAE,QAAgB;IAC3E,MAAM,SAAS,GAAG,KAAK,EAAE,IAAI,EAAE,CAAA;IAC/B,IAAI,SAAS,IAAI,6BAA6B,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IAChF,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAiB;IAC9C,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;QACtD,IACC,IAAI,KAAK,aAAa;YACtB,IAAI,KAAK,iBAAiB;YAC1B,IAAI,KAAK,2BAA2B,EACnC,CAAC;YACF,OAAO,SAAS,CAAA;QACjB,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,oFAAoF;IACrF,CAAC;IACD,OAAO,UAAU,CAAA;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,EAAc,EACd,SAAiB,EACjB,IAA4C;IAE5C,MAAM,OAAO,GAAG,MAAM,EAAE;SACtB,OAAO,CACP,0HAA0H,CAC1H;SACA,IAAI,CAAC,SAAS,CAAC;SACf,KAAK,EASF,CAAA;IACL,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,YAAY,CAAC,CAAA;IACrE,CAAC;IAED,oDAAoD;IACpD,MAAM,QAAQ,GAAG,MAAM,EAAE;SACvB,OAAO,CACP,sIAAsI,CACtI;SACA,IAAI,CAAC,SAAS,CAAC;SACf,KAAK,EAMF,CAAA;IAEL,IAAI,KAA0C,CAAA;IAC9C,IAAI,SAAiB,CAAA;IACrB,IAAI,IAAY,CAAA;IAChB,IAAI,UAAU,GAAkB,IAAI,CAAA;IACpC,IAAI,OAAO,GAAkB,IAAI,CAAA;IACjC,IAAI,eAA8B,CAAA;IAClC,IAAI,eAAe,GAAmC,IAAI,CAAA;IAE1D,IAAI,QAAQ,EAAE,CAAC;QACd,KAAK,GAAG,eAAe,CAAA;QACvB,SAAS,GAAG,QAAQ,CAAC,qBAAqB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QACxD,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,0BAA0B,CAAC,CAAA;QACnF,CAAC;QACD,IAAI,GAAG,OAAO,CAAA;QACd,UAAU,GAAG,QAAQ,CAAC,sBAAsB,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAC/E,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3D,eAAe,GAAG,QAAQ,CAAC,gBAAgB,CAAA;IAC5C,CAAC;SAAM,CAAC;QACP,MAAM,UAAU,GAAG,MAAM,EAAE;aACzB,OAAO,CACP,kLAAkL,CAClL;aACA,IAAI,CAAC,SAAS,CAAC;aACf,KAAK,EAA2B,CAAA;QAElC,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACd,8BAA8B,SAAS,8CAA8C,CACrF,CAAA;QACF,CAAC;QACD,KAAK,GAAG,iBAAiB,CAAA;QACzB,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,cAAc,CAAC,CAAA;QACvE,CAAC;QACD,eAAe,GAAG,UAAU,CAAA;QAC5B,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QACjD,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,8BAA8B,CAAC,CAAA;QACvF,CAAC;QACD,IAAI,GAAG,SAAS,CAAA;QAChB,UAAU,GAAG,QAAQ,CAAA;QACrB,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QACtD,eAAe,GAAG,UAAU,CAAC,gBAAgB,CAAA;IAC9C,CAAC;IAED,IACC,OAAO,eAAe,KAAK,QAAQ;QACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;QACjC,eAAe,IAAI,CAAC,EACnB,CAAC;QACF,MAAM,IAAI,gCAAgC,CAAC,SAAS,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;IACxC,MAAM,0BAA0B,GAAG,UAAU,MAAM,SAAS,CAAC,YAAY,CAAC,EAAE,CAAA;IAC5E,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;QACjE,SAAS;QACT,SAAS;QACT,IAAI;QACJ,eAAe;QACf,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,0BAA0B;KAC1B,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IAEzC,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;QAC/B,MAAM,EAAE;aACN,OAAO,CACP;;;;;;;;;;;;;;;;8BAgB0B,CAC1B;aACA,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,CAAC;aACtE,GAAG,EAAE,CAAA;IACR,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QAC7E,IACC,aAAa;YACb,CAAC,aAAa,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAC5E,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAC/D,CAAC;QACD,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7E,MAAM,WAAW,GAAG,cAAc;YACjC,CAAC,CAAC,eAAe,CAAC,qBAAqB;YACvC,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAA;QAChE,MAAM,YAAY,GAAG,cAAc;YAClC,CAAC,CAAC,eAAe,CAAC,sBAAsB;YACxC,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,IAAI,eAAe,CAAC,sBAAsB,CAAC,CAAA;QAClE,sEAAsE;QACtE,uEAAuE;QACvE,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,OAAO,GAAG,MAAM,EAAE;aACtB,OAAO,CAAC;;;;;gDAKoC,CAAC;aAC7C,IAAI,CACJ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,eAAe,CAAC,YAAY,EAC5B,eAAe,CAAC,gBAAgB,EAChC,eAAe,CAAC,UAAU,EAC1B,eAAe,CAAC,qBAAqB,EACrC,eAAe,CAAC,sBAAsB,EACtC,eAAe,CAAC,wBAAwB,EACxC,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,iBAAiB,EACzB,OAAO,CAAC,MAAM,CACd;aACA,GAAG,EAAE,CAAA;QACP,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,KAAK,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAA;AACvC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,EAAc,EAAE,KAAoB;IAC9E,MAAM,EACL,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,EACZ,SAAS,EACT,KAAK,EACL,UAAU,EACV,eAAe,EACf,WAAW,EACX,OAAO,GACP,GAAG,KAAK,CAAA;IAET,qEAAqE;IACrE,MAAM,aAAa,GAAG,MAAM,EAAE;SAC5B,OAAO,CAAC,yEAAyE,CAAC;SAClF,IAAI,CAAC,OAAO,CAAC;SACb,KAAK,EAAwB,CAAA;IAE/B,IAAI,aAAa,EAAE,CAAC;QACnB,OAAO,KAAK,CAAA,CAAC,uCAAuC;IACrD,CAAC;IAED,4DAA4D;IAC5D,6EAA6E;IAC7E,sEAAsE;IACtE,wEAAwE;IACxE,iEAAiE;IACjE,MAAM,QAAQ,GAAG,MAAM,EAAE;SACvB,OAAO,CACP,2GAA2G,CAC3G;SACA,IAAI,CAAC,YAAY,CAAC;SAClB,KAAK,EAAmE,CAAA;IAE1E,MAAM,UAAU,GAAG,QAAQ;QAC1B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,MAAM,EAAE;aACP,OAAO,CACP,6GAA6G,CAC7G;aACA,IAAI,CAAC,YAAY,CAAC;aAClB,KAAK,EAAmE,CAAA;IAE5E,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA,CAAC,yCAAyC;IACvD,CAAC;IAED,wBAAwB;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IACzC,MAAM,EAAE;SACN,OAAO,CACP,6GAA6G,CAC7G;SACA,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC;SAC5C,GAAG,EAAE,CAAA;IAEP,6BAA6B;IAC7B,MAAM,UAAU,GAAI,eAA4B,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IAEpE,IAAI,UAAU,EAAE,CAAC;QAChB,MAAM,cAAc,GACnB,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAC/E,MAAM,mBAAmB,GACxB,OAAO,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;YACtE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAA;QACR,IAAI,cAAc,KAAK,IAAI,IAAI,mBAAmB,KAAK,IAAI,EAAE,CAAC;YAC7D,MAAM,EAAE;iBACN,OAAO,CACP;;;0BAGqB,CACrB;iBACA,IAAI,CACJ,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/B,cAAc,EACd,mBAAmB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACpC,mBAAmB,EACnB,UAAU,CAAC,UAAU,CACrB;iBACA,GAAG,EAAE,CAAA;QACR,CAAC;QAED,MAAM,eAAe,GACpB,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAClF,MAAM,WAAW,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QACzF,IAAI,eAAe,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,EAAE;iBACN,OAAO,CACP;;;;kBAIa,CACb;iBACA,IAAI,CACJ,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAChC,eAAe,EACf,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5B,WAAW,EACX,UAAU,CAAC,UAAU,CACrB;iBACA,GAAG,EAAE,CAAA;QACR,CAAC;QAED,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3B,MAAM,GAAG,GAAG,QAAQ,CAAA;IAEpB,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE;aACN,OAAO,CACP;;;;;8BAK0B,CAC1B;aACA,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;aACxD,GAAG,EAAE,CAAA;IACR,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACvB,UAAU;QACV,MAAM,EAAE;aACN,OAAO,CACP;;;;8BAI0B,CAC1B;aACA,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC;aACzC,GAAG,EAAE,CAAA;IACR,CAAC;SAAM,CAAC;QACP,MAAM,EAAE;aACN,OAAO,CACP,kGAAkG,CAClG;aACA,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC;aACpC,GAAG,EAAE,CAAA;IACR,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,MAAc,EACd,OAAe,EACf,SAAiB;IAEjB,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAA;IAE5B,wEAAwE;IACxE,yDAAyD;IACzD,IAAI,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;IACnE,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACtB,6EAA6E;IAC7E,0EAA0E;IAC1E,0EAA0E;IAC1E,+DAA+D;IAC/D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IAE3C,IAAI,QAAoB,CAAA;IACxB,IAAI,CAAC;QACJ,0BAA0B;QAC1B,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QACtC,QAAQ,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACrD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAA;YACpC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;QACvB,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAA;IACb,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACxC,KAAK,EACL,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAChC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACR,CAAA;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IACzF,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAA;IAE9C,wBAAwB;IACxB,IAAI,aAAa,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAC1D,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,IAAI,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,CAAA;AAClB,CAAC"}
1
+ {"version":3,"file":"foundry-dispatch.js","sourceRoot":"","sources":["../../src/engine/foundry-dispatch.ts"],"names":[],"mappings":"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"}