@aglyn/plugins-ai 1.0.0-beta.246 → 1.0.0-beta.249

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 (130) hide show
  1. package/package.json +17 -17
  2. package/src/lib/activity/ai-activity-actions.js +5 -1
  3. package/src/lib/activity/ai-activity-actions.js.map +1 -1
  4. package/src/lib/components/ai-job-links.js +14 -0
  5. package/src/lib/components/ai-job-links.js.map +1 -1
  6. package/src/lib/components/ai-site-start-card.component.d.ts +1 -1
  7. package/src/lib/components/ai-site-start-card.component.js +92 -19
  8. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  9. package/src/lib/declarations.server.js +12 -0
  10. package/src/lib/declarations.server.js.map +1 -1
  11. package/src/lib/jobs/ai-build-capabilities.js +56 -2
  12. package/src/lib/jobs/ai-build-capabilities.js.map +1 -1
  13. package/src/lib/jobs/ai-job-build-step.d.ts +3 -8
  14. package/src/lib/jobs/ai-job-build-step.js +49 -12
  15. package/src/lib/jobs/ai-job-build-step.js.map +1 -1
  16. package/src/lib/jobs/ai-job-form-dataset.d.ts +8 -5
  17. package/src/lib/jobs/ai-job-form-dataset.js +28 -10
  18. package/src/lib/jobs/ai-job-form-dataset.js.map +1 -1
  19. package/src/lib/jobs/ai-job-form-step.d.ts +20 -4
  20. package/src/lib/jobs/ai-job-form-step.js +98 -28
  21. package/src/lib/jobs/ai-job-form-step.js.map +1 -1
  22. package/src/lib/jobs/ai-job-layout-language.d.ts +6 -2
  23. package/src/lib/jobs/ai-job-layout-language.js +16 -5
  24. package/src/lib/jobs/ai-job-layout-language.js.map +1 -1
  25. package/src/lib/jobs/ai-job-layout-step.js +4 -1
  26. package/src/lib/jobs/ai-job-layout-step.js.map +1 -1
  27. package/src/lib/jobs/ai-job-media-step.d.ts +239 -0
  28. package/src/lib/jobs/ai-job-media-step.js +610 -0
  29. package/src/lib/jobs/ai-job-media-step.js.map +1 -0
  30. package/src/lib/jobs/ai-job-page-language.d.ts +2 -0
  31. package/src/lib/jobs/ai-job-page-language.js +9 -0
  32. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  33. package/src/lib/jobs/ai-job-page-sections.js +4 -3
  34. package/src/lib/jobs/ai-job-page-sections.js.map +1 -1
  35. package/src/lib/jobs/ai-job-page-step.js +3 -2
  36. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  37. package/src/lib/jobs/ai-job-plan-step.d.ts +10 -1
  38. package/src/lib/jobs/ai-job-plan-step.js +73 -15
  39. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  40. package/src/lib/jobs/ai-job-settings-step.d.ts +0 -4
  41. package/src/lib/jobs/ai-job-settings-step.js +2 -7
  42. package/src/lib/jobs/ai-job-settings-step.js.map +1 -1
  43. package/src/lib/jobs/ai-job-site-content.d.ts +2 -2
  44. package/src/lib/jobs/ai-job-site-content.js +5 -3
  45. package/src/lib/jobs/ai-job-site-content.js.map +1 -1
  46. package/src/lib/jobs/ai-job-site-datasets.d.ts +1 -1
  47. package/src/lib/jobs/ai-job-site-datasets.js +3 -2
  48. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  49. package/src/lib/jobs/ai-job-site-events.d.ts +148 -0
  50. package/src/lib/jobs/ai-job-site-events.js +313 -0
  51. package/src/lib/jobs/ai-job-site-events.js.map +1 -0
  52. package/src/lib/jobs/ai-job-site-step.d.ts +9 -3
  53. package/src/lib/jobs/ai-job-site-step.js +63 -17
  54. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  55. package/src/lib/jobs/ai-job-tracking-step.d.ts +184 -0
  56. package/src/lib/jobs/ai-job-tracking-step.js +501 -0
  57. package/src/lib/jobs/ai-job-tracking-step.js.map +1 -0
  58. package/src/lib/jobs/ai-layout-stock-photos.d.ts +41 -0
  59. package/src/lib/jobs/ai-layout-stock-photos.js +71 -3
  60. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  61. package/src/lib/jobs/ai-site-publish.js +2 -3
  62. package/src/lib/jobs/ai-site-publish.js.map +1 -1
  63. package/src/lib/jobs/ai-stock-photo-picker.d.ts +24 -0
  64. package/src/lib/jobs/ai-stock-photo-picker.js +108 -0
  65. package/src/lib/jobs/ai-stock-photo-picker.js.map +1 -0
  66. package/src/lib/jobs/fixtures/ai-jazz-events-build-plan-recording.d.ts +37 -0
  67. package/src/lib/jobs/fixtures/ai-jazz-events-build-plan-recording.js +47 -0
  68. package/src/lib/jobs/fixtures/ai-jazz-events-build-plan-recording.js.map +1 -0
  69. package/src/lib/jobs/fixtures/ai-stock-photo-agl3760-recordings.d.ts +21 -0
  70. package/src/lib/jobs/fixtures/ai-stock-photo-agl3760-recordings.js +128 -0
  71. package/src/lib/jobs/fixtures/ai-stock-photo-agl3760-recordings.js.map +1 -0
  72. package/src/lib/jobs/fixtures/ai-stock-photo-agl3769-recordings.d.ts +21 -0
  73. package/src/lib/jobs/fixtures/ai-stock-photo-agl3769-recordings.js +126 -0
  74. package/src/lib/jobs/fixtures/ai-stock-photo-agl3769-recordings.js.map +1 -0
  75. package/src/lib/layout-language/ai-layout-compiler.d.ts +10 -4
  76. package/src/lib/layout-language/ai-layout-compiler.js +38 -19
  77. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  78. package/src/lib/layout-language/ai-layout-frame.d.ts +7 -5
  79. package/src/lib/layout-language/ai-layout-frame.js +12 -9
  80. package/src/lib/layout-language/ai-layout-frame.js.map +1 -1
  81. package/src/lib/layout-language/ai-layout-gaps.js +3 -1
  82. package/src/lib/layout-language/ai-layout-gaps.js.map +1 -1
  83. package/src/lib/layout-language/ai-layout-labels.d.ts +70 -0
  84. package/src/lib/layout-language/ai-layout-labels.js +162 -0
  85. package/src/lib/layout-language/ai-layout-labels.js.map +1 -0
  86. package/src/lib/layout-language/ai-layout-links.js +5 -2
  87. package/src/lib/layout-language/ai-layout-links.js.map +1 -1
  88. package/src/lib/layout-language/ai-layout-listings.d.ts +14 -1
  89. package/src/lib/layout-language/ai-layout-listings.js +32 -5
  90. package/src/lib/layout-language/ai-layout-listings.js.map +1 -1
  91. package/src/lib/model/ai-build-event-page.d.ts +70 -0
  92. package/src/lib/model/ai-build-event-page.js +145 -0
  93. package/src/lib/model/ai-build-event-page.js.map +1 -0
  94. package/src/lib/model/ai-build-job.d.ts +21 -0
  95. package/src/lib/model/ai-build-job.js +39 -0
  96. package/src/lib/model/ai-build-job.js.map +1 -1
  97. package/src/lib/model/ai-build-plan.d.ts +25 -14
  98. package/src/lib/model/ai-build-plan.js +33 -23
  99. package/src/lib/model/ai-build-plan.js.map +1 -1
  100. package/src/lib/model/ai-job-activity.js +3 -1
  101. package/src/lib/model/ai-job-activity.js.map +1 -1
  102. package/src/lib/model/ai-jobs.types.d.ts +10 -2
  103. package/src/lib/model/ai-jobs.types.js +3 -1
  104. package/src/lib/model/ai-jobs.types.js.map +1 -1
  105. package/src/lib/model/ai-plan-capabilities.d.ts +8 -0
  106. package/src/lib/model/ai-plan-capabilities.js.map +1 -1
  107. package/src/lib/model/ai-site-inventory.d.ts +2 -0
  108. package/src/lib/model/ai-site-inventory.js +5 -0
  109. package/src/lib/model/ai-site-inventory.js.map +1 -1
  110. package/src/lib/model/ai-site-job.d.ts +2 -2
  111. package/src/lib/model/ai-site-job.js +3 -3
  112. package/src/lib/model/ai-site-job.js.map +1 -1
  113. package/src/lib/runtime/ai-doctrine-validators.d.ts +25 -3
  114. package/src/lib/runtime/ai-doctrine-validators.js +53 -6
  115. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  116. package/src/lib/runtime/ai-doctrine.d.ts +6 -1
  117. package/src/lib/runtime/ai-doctrine.js +13 -9
  118. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  119. package/src/lib/runtime/ai-eval-live.d.ts +1 -1
  120. package/src/lib/runtime/ai-eval-live.js +1 -1
  121. package/src/lib/runtime/ai-eval-live.js.map +1 -1
  122. package/src/lib/runtime/ai-palette.d.ts +3 -1
  123. package/src/lib/runtime/ai-palette.generated.js +498 -10
  124. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  125. package/src/lib/runtime/ai-palette.js +5 -3
  126. package/src/lib/runtime/ai-palette.js.map +1 -1
  127. package/src/lib/runtime/ai-template-examples.js +8 -2
  128. package/src/lib/runtime/ai-template-examples.js.map +1 -1
  129. package/src/lib/server.js +8 -0
  130. package/src/lib/server.js.map +1 -1
@@ -38,6 +38,7 @@ import { aiJobPublishesSite, aiMergeSitePublish, aiPublishGuidedSite, aiRestoreG
38
38
  import { AI_SITE_CONTENT_INPUT, AI_SITE_POST_BUDGET, AI_SITE_POSTS, AI_SITE_POSTS_LABEL, AI_SITE_PRODUCTS_LABEL, AI_SITE_PRODUCTS_PRICE_NOTE, aiPublishSitePosts, aiSiteContentBriefLines, aiSiteContentPart, aiSiteContentRefusal, aiSiteListings, aiSiteProductsBriefLine, createAiSiteProductsRunner, runAiSitePostsUnit } from "./ai-job-site-content.js";
39
39
  import { dropPluginSiteCache } from "@aglyn/aglyn/plugin-manager/plugin-site-cache";
40
40
  import { AI_SITE_DATASET_BUDGET, AI_SITE_DATASET_INPUT, AI_SITE_DATASETS_MAX, aiSiteDatasetBriefLines, aiSiteDatasetInputOf, aiSiteDatasetListings, aiSiteDatasetPlacedPhotos, aiSiteDatasetRefusal, aiSitePlanDatasets, aiSiteRecordTemplateOf, runAiSiteDatasetUnit } from "./ai-job-site-datasets.js";
41
+ import { AI_SITE_EVENT_INPUT, AI_SITE_EVENT_LABEL, AI_SITE_EVENT_MINIMUM_MS, AI_SITE_EVENTS_MAX, aiSiteEventListings, aiSiteEventRefusal, aiSitePlanEvents, runAiSiteEventUnit } from "./ai-job-site-events.js";
41
42
  import { AI_SITE_LOOK_BUDGET, aiRunSiteLook } from "./ai-job-site-look.js";
42
43
  import { AI_SITE_STORE_PAGES_INPUT, aiSiteStorePagesRefusal, runAiSiteStorePagesUnit } from "./ai-job-site-store-pages.js";
43
44
  import { AI_SITE_STORE_LINKS_INPUT, AI_SITE_STORE_PAGES_LABEL, AI_SITE_STORE_PAGES_NOTE, aiStoreFrameLinks, aiStorePagesOfPlan } from "../model/ai-site-store-pages.js";
@@ -88,6 +89,12 @@ import { aiJobStepRunMinimumMs, aiJobStepRunnerFor, registerAiJobStep, registerA
88
89
  jobKind: 'text',
89
90
  resource: 'draft'
90
91
  },
92
+ // An event-led start's first events (AGL-3755): the events-calendar
93
+ // plugin's writer keeps each, run by the scaffold's own pass.
94
+ event: {
95
+ jobKind: 'text',
96
+ resource: 'draft'
97
+ },
91
98
  // The scaffold's own runner writes them, by code (`ai-job-site-store-pages.ts`).
92
99
  store: {
93
100
  jobKind: 'text',
@@ -138,7 +145,7 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
138
145
  * (one a pass, the largest part) and a welcome email — with nothing to
139
146
  * spare, so a runner that never finishes is still bounded while a real site
140
147
  * is not.
141
- */ export const AI_SITE_MAX_PASSES = AI_SITE_PAGES.max * (AI_SITE_MAX_SECTIONS + 1) + CREATION_UNITS.length + AI_SITE_DATASETS_MAX + AI_SITE_POSTS + 2;
148
+ */ export const AI_SITE_MAX_PASSES = AI_SITE_PAGES.max * (AI_SITE_MAX_SECTIONS + 1) + CREATION_UNITS.length + AI_SITE_DATASETS_MAX + AI_SITE_EVENTS_MAX + AI_SITE_POSTS + 2;
142
149
  /**
143
150
  * The units a plan implies, in build order: the palette first, because a
144
151
  * member reads it while the pages are still building; then the layout every
@@ -200,6 +207,16 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
200
207
  label: AI_SITE_PRODUCTS_LABEL
201
208
  }));
202
209
  }
210
+ // An event-led start's first events (AGL-3755), before the pages that list them.
211
+ aiSitePlanEvents(plan).forEach((item, index)=>{
212
+ units.push(_extends({
213
+ kind: 'event'
214
+ }, UNIT_KINDS.event, {
215
+ slot: `v${index}`,
216
+ item,
217
+ label: item.name || AI_SITE_EVENT_LABEL
218
+ }));
219
+ });
203
220
  plan.screens.forEach((screen, index)=>{
204
221
  units.push(_extends({
205
222
  kind: 'page'
@@ -376,9 +393,9 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
376
393
  * palette change — and a unit whose plan recorded no id are named by this
377
394
  * job's id and the unit's slot, the name every draft of such a plan has.
378
395
  */ export function aiSiteUnitJobId(job, unit) {
379
- var _ref, _ref1;
380
- var _unit_creation, _unit_screen;
381
- const recorded = (_ref = (_ref1 = (_unit_creation = unit.creation) == null ? void 0 : _unit_creation.id) != null ? _ref1 : (_unit_screen = unit.screen) == null ? void 0 : _unit_screen.id) != null ? _ref : unit.kind === 'email' ? aiRecordedJobDraftId(job, 'email') : null;
396
+ var _ref, _ref1, _ref2;
397
+ var _unit_creation, _unit_screen, _unit_item;
398
+ const recorded = (_ref = (_ref1 = (_ref2 = (_unit_creation = unit.creation) == null ? void 0 : _unit_creation.id) != null ? _ref2 : (_unit_screen = unit.screen) == null ? void 0 : _unit_screen.id) != null ? _ref1 : (_unit_item = unit.item) == null ? void 0 : _unit_item.id) != null ? _ref : unit.kind === 'email' ? aiRecordedJobDraftId(job, 'email') : null;
382
399
  return recorded || `${job.$id}-${unit.slot}`;
383
400
  }
384
401
  /**
@@ -491,7 +508,7 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
491
508
  // ids are minted on the plan, and the platform writes the header's links.
492
509
  // A page is told them too, so its buttons may go to a page built after it.
493
510
  if (job.kind === 'site' && (unit.kind === 'layout' || unit.kind === 'page')) {
494
- var _job_outputs4, _job_outputs5;
511
+ var _job_outputs4, _job_outputs5, _job_outputs6;
495
512
  var _aiSiteKindOfInputs, _aiSiteKindOfInputs1;
496
513
  // A guided start links every page the person asked for (AGL-3660), and
497
514
  // the blog its first posts are written into, by its path, second after
@@ -551,6 +568,11 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
551
568
  datasets: aiSitePlanDatasets(plan),
552
569
  screens: merged.screens,
553
570
  delivered
571
+ }), // The events this start drafted, in the section that names them (AGL-3755).
572
+ ...aiSiteEventListings({
573
+ outputs: (_job_outputs6 = job.outputs) != null ? _job_outputs6 : [],
574
+ items: aiSitePlanEvents(plan),
575
+ screens: merged.screens
554
576
  }));
555
577
  if (listings.length) unitInputs[AI_LAYOUT_LISTINGS_INPUT] = listings;
556
578
  // A paid store's header links its account beside the cart, and its footer
@@ -565,10 +587,10 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
565
587
  // A site's pages and its layout are designed in the layout language and
566
588
  // compiled (AGL-3660), and a page is told which page places the site's form.
567
589
  if (unit.kind === 'layout' || unit.kind === 'page') {
568
- var _job_outputs6;
590
+ var _job_outputs7;
569
591
  var _look_proposal;
570
592
  // The look designed first (AGL-3660): its header arrangement and band rhythm.
571
- const look = ((_job_outputs6 = job.outputs) != null ? _job_outputs6 : []).find((output)=>output.resource === 'theme' && output.id === 'look');
593
+ const look = ((_job_outputs7 = job.outputs) != null ? _job_outputs7 : []).find((output)=>output.resource === 'theme' && output.id === 'look');
572
594
  const style = look == null ? void 0 : (_look_proposal = look.proposal) == null ? void 0 : _look_proposal['style'];
573
595
  if (style) unitInputs['siteStyle'] = {
574
596
  headerAlign: style['headerAlign'],
@@ -580,11 +602,11 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
580
602
  if (formPage) unitInputs[AI_LAYOUT_FORM_PAGE_INPUT] = formPage;
581
603
  }
582
604
  if (unit.kind === 'posts') {
583
- var _job_outputs7, _inputs_businessName;
605
+ var _job_outputs8, _inputs_businessName;
584
606
  // The posts already written (one a pass), the addresses the site's own
585
607
  // pages answer at, and the byline the person gave (AGL-3676).
586
608
  const posts = {
587
- written: ((_job_outputs7 = job.outputs) != null ? _job_outputs7 : []).filter((output)=>output.resource === 'entry').map((output)=>({
609
+ written: ((_job_outputs8 = job.outputs) != null ? _job_outputs8 : []).filter((output)=>output.resource === 'entry').map((output)=>({
588
610
  id: output.id,
589
611
  title: output.label
590
612
  })),
@@ -596,6 +618,8 @@ export const AI_SITE_NO_PLAN_COPY = 'This site job has no confirmed plan to buil
596
618
  unitInputs[AI_SITE_CONTENT_INPUT] = posts;
597
619
  }
598
620
  if (unit.kind === 'products') unitInputs['target'] = 'catalog';
621
+ // The event an event unit drafts (AGL-3755).
622
+ if (unit.kind === 'event' && unit.item) unitInputs[AI_SITE_EVENT_INPUT] = unit.item;
599
623
  // Where the plan lists a dataset, which its design reads, and the form
600
624
  // that writes to it (AGL-3616).
601
625
  if (unit.kind === 'dataset' && unit.creation) {
@@ -845,7 +869,7 @@ export const aiSiteJobAdmission = createAiSiteJobAdmission();
845
869
  }).map((unit)=>unit.slot);
846
870
  return units.map((unit)=>_extends({
847
871
  slot: unit.slot,
848
- op: unit.kind === 'theme' || unit.kind === 'posts' || unit.kind === 'products' || unit.kind === 'dataset' || unit.kind === 'store' ? unit.kind : unit.jobKind,
872
+ op: unit.kind === 'theme' || unit.kind === 'posts' || unit.kind === 'products' || unit.kind === 'dataset' || unit.kind === 'event' || unit.kind === 'store' ? unit.kind : unit.jobKind,
849
873
  label: unit.label
850
874
  }, unit.creation ? {
851
875
  creation: unit.creation
@@ -891,23 +915,24 @@ export const aiSiteJobAdmission = createAiSiteJobAdmission();
891
915
  return aiSiteJobUnits(plan, {
892
916
  welcomeEmail: aiSiteWelcomeEmail(inputs, freeTaste),
893
917
  content: aiSiteContentPart(job.inputs, freeTaste)
894
- }).filter((unit)=>unit.kind === 'store' && ledgered || unit.kind === 'theme' || unit.kind === 'posts' || unit.kind === 'dataset' || unit.kind !== 'store' && runnerFor(unit.jobKind));
918
+ }).filter((unit)=>unit.kind === 'store' && ledgered || unit.kind === 'theme' || unit.kind === 'posts' || unit.kind === 'dataset' || unit.kind === 'event' || unit.kind !== 'store' && runnerFor(unit.jobKind));
895
919
  }
896
920
  export function createAiJobSiteStep(deps = {}) {
897
- var _deps_runnerFor, _deps_readNodes, _deps_publish, _deps_look, _deps_contentRefusal, _deps_datasetRefusal, _deps_storePagesRefusal, _deps_publishPosts, _deps_dropCache, _deps_restoreBlogEntry;
921
+ var _deps_runnerFor, _deps_readNodes, _deps_publish, _deps_look, _deps_contentRefusal, _deps_datasetRefusal, _deps_eventRefusal, _deps_storePagesRefusal, _deps_publishPosts, _deps_dropCache, _deps_restoreBlogEntry;
898
922
  const runnerFor = (_deps_runnerFor = deps.runnerFor) != null ? _deps_runnerFor : aiJobStepRunnerFor;
899
923
  const readNodes = (_deps_readNodes = deps.readNodes) != null ? _deps_readNodes : readAiDraftNodes;
900
924
  const publish = (_deps_publish = deps.publish) != null ? _deps_publish : aiPublishGuidedSite;
901
925
  const look = (_deps_look = deps.look) != null ? _deps_look : aiRunSiteLook;
902
926
  const contentRefusal = (_deps_contentRefusal = deps.contentRefusal) != null ? _deps_contentRefusal : aiSiteContentRefusal;
903
927
  const datasetRefusal = (_deps_datasetRefusal = deps.datasetRefusal) != null ? _deps_datasetRefusal : aiSiteDatasetRefusal;
928
+ const eventRefusal = (_deps_eventRefusal = deps.eventRefusal) != null ? _deps_eventRefusal : aiSiteEventRefusal;
904
929
  const storePagesRefusal = (_deps_storePagesRefusal = deps.storePagesRefusal) != null ? _deps_storePagesRefusal : aiSiteStorePagesRefusal;
905
930
  const publishPosts = (_deps_publishPosts = deps.publishPosts) != null ? _deps_publishPosts : aiPublishSitePosts;
906
931
  const dropCache = (_deps_dropCache = deps.dropCache) != null ? _deps_dropCache : dropPluginSiteCache;
907
932
  const restoreBlogEntry = (_deps_restoreBlogEntry = deps.restoreBlogEntry) != null ? _deps_restoreBlogEntry : aiRestoreGuidedBlogEntry;
908
933
  return async (context)=>{
909
- var _ref, _job_outputs, _deps_posts, _deps_products, _deps_dataset, _deps_storePages, _job_outputs1;
910
- var _job_items, _rows_get, _rows_get1, _rows_get2;
934
+ var _ref, _job_outputs, _deps_posts, _deps_products, _deps_dataset, _deps_event, _deps_storePages, _job_outputs1;
935
+ var _job_items, _rows_get, _rows_get1, _rows_get2, _rows_get3;
911
936
  const { job } = context;
912
937
  // The scaffold asks no model of its own. What it names where it spends
913
938
  // nothing is the model its plan ran on, which is the one exchange this
@@ -1113,7 +1138,7 @@ export function createAiJobSiteStep(deps = {}) {
1113
1138
  const catalog = unit.kind === 'products' ? runnerFor('products') : undefined;
1114
1139
  const runner = unit.kind === 'theme' ? (lookContext)=>look(lookContext, lookContext.job) : unit.kind === 'posts' ? (_deps_posts = deps.posts) != null ? _deps_posts : runAiSitePostsUnit : unit.kind === 'products' ? (_deps_products = deps.products) != null ? _deps_products : catalog ? createAiSiteProductsRunner({
1115
1140
  catalog
1116
- }) : undefined : unit.kind === 'dataset' ? (_deps_dataset = deps.dataset) != null ? _deps_dataset : runAiSiteDatasetUnit : unit.kind === 'store' ? (_deps_storePages = deps.storePages) != null ? _deps_storePages : runAiSiteStorePagesUnit : runnerFor(unit.jobKind);
1141
+ }) : undefined : unit.kind === 'dataset' ? (_deps_dataset = deps.dataset) != null ? _deps_dataset : runAiSiteDatasetUnit : unit.kind === 'event' ? (_deps_event = deps.event) != null ? _deps_event : runAiSiteEventUnit : unit.kind === 'store' ? (_deps_storePages = deps.storePages) != null ? _deps_storePages : runAiSiteStorePagesUnit : runnerFor(unit.jobKind);
1117
1142
  if (!runner) return _extends({}, aiUnspentOutcome(model), init);
1118
1143
  const othersOpen = ledgerUnits.some((one)=>{
1119
1144
  var _rows_get;
@@ -1192,9 +1217,29 @@ export function createAiJobSiteStep(deps = {}) {
1192
1217
  note: `Not built: ${refusal}`
1193
1218
  }));
1194
1219
  }
1220
+ // An event asks the same (AGL-3755): the events plugin runs here, and its
1221
+ // writer admits this member now.
1222
+ if (unit.kind === 'event' && ((_rows_get2 = rows.get(unit.slot)) == null ? void 0 : _rows_get2.status) !== 'running') {
1223
+ const refusal = await eventRefusal(_extends({}, context, {
1224
+ job
1225
+ })).catch((error)=>{
1226
+ console.error('ai site event admission failed', {
1227
+ orgId: job.orgId,
1228
+ jobId: job.$id,
1229
+ slot: unit.slot,
1230
+ error
1231
+ });
1232
+ return AI_SITE_UNIT_EMPTY_COPY;
1233
+ });
1234
+ if (refusal) return closing(settle({
1235
+ slot: unit.slot,
1236
+ status: 'skipped',
1237
+ note: `Not built: ${refusal}`
1238
+ }));
1239
+ }
1195
1240
  // The store's own pages ask the same (AGL-3676): a plan with a store, the
1196
1241
  // commerce plugin here, and a member who may edit the site's pages.
1197
- if (unit.kind === 'store' && ((_rows_get2 = rows.get(unit.slot)) == null ? void 0 : _rows_get2.status) !== 'running') {
1242
+ if (unit.kind === 'store' && ((_rows_get3 = rows.get(unit.slot)) == null ? void 0 : _rows_get3.status) !== 'running') {
1198
1243
  const refusal = await storePagesRefusal(_extends({}, context, {
1199
1244
  job
1200
1245
  })).catch((error)=>{
@@ -1342,7 +1387,7 @@ export const runAiJobSiteStep = createAiJobSiteStep();
1342
1387
  const units = aiSiteJobUnits(plan, {
1343
1388
  welcomeEmail: inputs.welcomeEmail,
1344
1389
  content: aiSiteContentPart(job.inputs, false)
1345
- }).filter((unit)=>(unit.kind === 'theme' || unit.kind === 'posts' || unit.kind === 'dataset' || unit.kind === 'store' || aiJobStepRunnerFor(unit.jobKind)) && (!owed.size || owed.has(unit.slot)));
1390
+ }).filter((unit)=>(unit.kind === 'theme' || unit.kind === 'posts' || unit.kind === 'dataset' || unit.kind === 'event' || unit.kind === 'store' || aiJobStepRunnerFor(unit.jobKind)) && (!owed.size || owed.has(unit.slot)));
1346
1391
  const outputs = (_job_outputs = job.outputs) != null ? _job_outputs : [];
1347
1392
  const ledger = ((_job_items1 = job.items) == null ? void 0 : _job_items1.length) ? job.items : aiSiteInitialLedger(units, outputs);
1348
1393
  const next = aiBuildNextUnit(aiSiteLedgerUnits(units), ledger);
@@ -1351,6 +1396,7 @@ export const runAiJobSiteStep = createAiJobSiteStep();
1351
1396
  if (unit.kind === 'theme') return AI_SITE_LOOK_BUDGET.minimumMs;
1352
1397
  if (unit.kind === 'posts') return AI_SITE_POST_BUDGET.minimumMs;
1353
1398
  if (unit.kind === 'dataset') return AI_SITE_DATASET_BUDGET.minimumMs;
1399
+ if (unit.kind === 'event') return AI_SITE_EVENT_MINIMUM_MS;
1354
1400
  // The store's pages ask no model: five draft writes (AGL-3676).
1355
1401
  if (unit.kind === 'store') return AI_SITE_STORE_PAGES_MINIMUM_MS;
1356
1402
  return aiJobStepRunMinimumMs(aiSiteUnitJob(job, unit, aiBuildBuiltRefs(aiSiteLedgerUnits(units), ledger, outputs)));