@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
@@ -18,6 +18,7 @@ import { type PluginMediaIngest } from '@aglyn/aglyn/plugin-manager/plugin-media
18
18
  import { type StockPhoto, type StockPhotoOrientation, type StockPhotoProvider, type StockPhotoSearchRequest } from '@aglyn/aglyn/plugin-manager/stock-photo-provider';
19
19
  import type { NodesMap } from '@aglyn/aglyn/types/nodes';
20
20
  import { type AiLayoutPictureSlot, type AiLayoutPictureSource } from '../layout-language/ai-layout-pictures';
21
+ import type { AiBuildPlan } from '../model/ai-build-plan';
21
22
  /**
22
23
  * STOCK PHOTOS FOR A LANGUAGE PAGE'S PICTURE SLOTS (AGL-3660).
23
24
  *
@@ -241,6 +242,13 @@ export interface AiStockSearch extends StockPhotoSearchRequest {
241
242
  lead?: boolean;
242
243
  /** Whether the hit's first tags must name the site's world, where the object need not lead (AGL-3660). */
243
244
  leadWorld?: boolean;
245
+ /**
246
+ * Whether the hit's FIRST tag must name the site's world (AGL-3760): what
247
+ * the photo is of, most of all. A hero is the site's opening picture; the
248
+ * copper-fern-candle-co start (beta.246) took a latte with a candle behind
249
+ * it, its tags "coffee, mobile wallpaper 4k, latte art, …, candle".
250
+ */
251
+ first?: boolean;
244
252
  /** Phrases (as stems) of which one must be among the hit's first tags: a borrowed photo is OF the product's category (AGL-3660). */
245
253
  leadAny?: readonly string[];
246
254
  /** Whether it fills a product: no room, no scene, no fragrance bottle ({@link PRODUCT_SCENES}, AGL-3660). */
@@ -342,6 +350,8 @@ export interface AiStockJudgement {
342
350
  lead?: boolean;
343
351
  /** Whether the hit's first tags must name the site's world ({@link AiStockSearch.leadWorld}). */
344
352
  leadWorld?: boolean;
353
+ /** Whether the hit's first tag must name the site's world ({@link AiStockSearch.first}). */
354
+ first?: boolean;
345
355
  /** The stems of the site's business type or brief, which let a sensitive topic in ({@link AiStockSiteTerms.named}). */
346
356
  named?: readonly string[];
347
357
  /** Rival crafts: a hit naming one is rejected unless it names the site's core words ({@link AiStockSiteTerms.rivals}). */
@@ -398,6 +408,13 @@ export interface AiLayoutStockPhotoSourceInput {
398
408
  seed: string;
399
409
  /** The site's business type, else the job's brief. */
400
410
  business: string;
411
+ /** The site's language, from its plan (AGL-3750); absent, English. */
412
+ language?: string;
413
+ /**
414
+ * The plan's photo words, in English (AGL-3760): what a site in another
415
+ * language is searched by, in place of its business type and its alt texts.
416
+ */
417
+ photoWords?: string;
401
418
  /** The page's section names, by plan index. */
402
419
  sectionNames: readonly string[];
403
420
  /**
@@ -416,6 +433,30 @@ export interface AiLayoutStockPhotoDeps {
416
433
  ingest?: () => PluginMediaIngest | null;
417
434
  budgetMs?: number;
418
435
  }
436
+ /** A job's language and English photo words (AGL-3760), as a stock photo source takes them. */
437
+ export declare function aiStockPhotoWordsOf(job: {
438
+ plan?: Pick<AiBuildPlan, 'language' | 'photoWords'> | null;
439
+ }): Pick<AiLayoutStockPhotoSourceInput, 'language' | 'photoWords'>;
440
+ /**
441
+ * The subject a plan's photo words lead with (AGL-3769): its first word that
442
+ * is not filler, with the place or person words that follow it — "bakery" of
443
+ * "bakery pan dulce conchas", "candle shop" of "candle shop soy candles",
444
+ * "ceramic artist" of "ceramic artist stoneware bowls". The words are subject
445
+ * first, never an English noun phrase with its head last, and what follows
446
+ * the subject may be the brief's own names in English letters: Panaderia La
447
+ * Espiga Dorada's "pan dulce conchas" read as the business, made "concha" its
448
+ * craft, and placed purple ceanothus flowers, tagged "ceanothus concha", as
449
+ * its hero. Empty when every word is filler.
450
+ */
451
+ export declare function aiStockPhotoWordsSubject(photoWords: string): string;
452
+ /**
453
+ * What a source's photos are searched and judged by (AGL-3760, AGL-3769): a
454
+ * site in another language by the subject of its plan's English photo words,
455
+ * every other site by its business type. One reading for every slot of every
456
+ * source — hero, background, gallery, card, product, post — so no slot
457
+ * searches by words another slot is held against.
458
+ */
459
+ export declare function aiStockSourceTerms(input: Pick<AiLayoutStockPhotoSourceInput, 'business' | 'language' | 'photoWords'>): AiStockSiteTerms;
419
460
  /**
420
461
  * The source for one page, or `null` when this deployment has no stock
421
462
  * photo library or no media door, which leaves every slot to the starters.
@@ -18,6 +18,7 @@ import { _ as _extends } from "@swc/helpers/_/_extends";
18
18
  import { STOCK_PHOTO_QUERY_MAX_CHARS, stockPhotoProvider, stockPhotoSourceKey } from "@aglyn/aglyn/plugin-manager/stock-photo-provider";
19
19
  import { aiLayoutSeedNumber } from "../layout-language/ai-layout-pictures.js";
20
20
  import { aiStorefrontSays } from "../layout-language/ai-layout-storefront.js";
21
+ import { aiLayoutSpeaksOtherThanEnglish } from "../layout-language/ai-layout-labels.js";
21
22
  /**
22
23
  * STOCK PHOTOS FOR A LANGUAGE PAGE'S PICTURE SLOTS (AGL-3660).
23
24
  *
@@ -1525,6 +1526,8 @@ const clip = (query)=>query.replace(/\s+/g, ' ').trim().slice(0, STOCK_PHOTO_QUE
1525
1526
  ]
1526
1527
  } : {}) : {}, slot.role === 'hero' && core.length ? {
1527
1528
  category: core
1529
+ } : {}, slot.role === 'hero' ? {
1530
+ first: true
1528
1531
  } : {}));
1529
1532
  }
1530
1533
  return searches;
@@ -1650,6 +1653,20 @@ const clip = (query)=>query.replace(/\s+/g, ' ').trim().slice(0, STOCK_PHOTO_QUE
1650
1653
  const world = demanded || kinNamed || domain.some((stem)=>hit.all.has(stem));
1651
1654
  const worldLead = (anyOf.length ? anyOf.some((stem)=>hit.lead.has(stem)) : required.length > 0 && required.every((stem)=>hit.lead.has(stem))) || kinLead || domain.some((stem)=>hit.lead.has(stem));
1652
1655
  if (judgement.leadWorld && !worldLead) return 0;
1656
+ // The first tag alone, never the page's address: Pixabay's slug repeats a
1657
+ // late tag ("coffee-latte-art-candle-…"). A site whose words name no world
1658
+ // holds its hero to none.
1659
+ const worldStems = new Set([
1660
+ ...anyOf,
1661
+ ...required,
1662
+ ...domain
1663
+ ]);
1664
+ if (judgement.first && (worldStems.size || kin.length)) {
1665
+ const firstWorld = hit.firstPhrase.split(' ').some((stem)=>worldStems.has(stem)) || kin.some((phrase)=>among([
1666
+ hit.firstPhrase
1667
+ ], phrase));
1668
+ if (!firstWorld) return 0;
1669
+ }
1653
1670
  // What the photo is most of all: its first tag names the object, its kin or what it must be OF.
1654
1671
  const firstNamed = (phrases)=>phrases.some((phrase)=>Boolean(phrase) && among([
1655
1672
  hit.firstPhrase
@@ -1752,6 +1769,45 @@ const EXTENSIONS = {
1752
1769
  'image/png': 'png',
1753
1770
  'image/webp': 'webp'
1754
1771
  };
1772
+ /** A job's language and English photo words (AGL-3760), as a stock photo source takes them. */ export function aiStockPhotoWordsOf(job) {
1773
+ const plan = job.plan;
1774
+ return _extends({}, (plan == null ? void 0 : plan.language) ? {
1775
+ language: plan.language
1776
+ } : {}, (plan == null ? void 0 : plan.photoWords) ? {
1777
+ photoWords: plan.photoWords
1778
+ } : {});
1779
+ }
1780
+ /**
1781
+ * The subject a plan's photo words lead with (AGL-3769): its first word that
1782
+ * is not filler, with the place or person words that follow it — "bakery" of
1783
+ * "bakery pan dulce conchas", "candle shop" of "candle shop soy candles",
1784
+ * "ceramic artist" of "ceramic artist stoneware bowls". The words are subject
1785
+ * first, never an English noun phrase with its head last, and what follows
1786
+ * the subject may be the brief's own names in English letters: Panaderia La
1787
+ * Espiga Dorada's "pan dulce conchas" read as the business, made "concha" its
1788
+ * craft, and placed purple ceanothus flowers, tagged "ceanothus concha", as
1789
+ * its hero. Empty when every word is filler.
1790
+ */ export function aiStockPhotoWordsSubject(photoWords) {
1791
+ const list = contentWords(photoWords);
1792
+ const start = list.findIndex((word)=>!FILLER.has(word) && !SITE_KINDS.has(word));
1793
+ if (start < 0) return '';
1794
+ let end = start + 1;
1795
+ while(end < list.length && (VENUES.has(list[end]) || ROLES.has(list[end])))end += 1;
1796
+ return list.slice(start, end).join(' ');
1797
+ }
1798
+ /**
1799
+ * What a source's photos are searched and judged by (AGL-3760, AGL-3769): a
1800
+ * site in another language by the subject of its plan's English photo words,
1801
+ * every other site by its business type. One reading for every slot of every
1802
+ * source — hero, background, gallery, card, product, post — so no slot
1803
+ * searches by words another slot is held against.
1804
+ */ export function aiStockSourceTerms(input) {
1805
+ return aiStockSiteTerms(aiStockSourceSubject(input) || input.business);
1806
+ }
1807
+ /** The photo words' subject a site in another language is searched by ({@link aiStockSourceTerms}); empty for every other site. */ function aiStockSourceSubject(input) {
1808
+ var _input_photoWords;
1809
+ return aiLayoutSpeaksOtherThanEnglish(input.language) ? aiStockPhotoWordsSubject((_input_photoWords = input.photoWords) != null ? _input_photoWords : '') : '';
1810
+ }
1755
1811
  /**
1756
1812
  * The source for one page, or `null` when this deployment has no stock
1757
1813
  * photo library or no media door, which leaves every slot to the starters.
@@ -1760,7 +1816,14 @@ const EXTENSIONS = {
1760
1816
  const provider = ((_deps_provider = deps.provider) != null ? _deps_provider : stockPhotoProvider)();
1761
1817
  const ingest = ((_deps_ingest = deps.ingest) != null ? _deps_ingest : pluginMediaIngest)();
1762
1818
  if (!provider || !ingest || !input.hostId || !input.uid) return null;
1763
- const terms = aiStockSiteTerms(input.business);
1819
+ // The libraries are tagged in English (AGL-3760). A Spanish bakery's type,
1820
+ // "Una panadería familiar de San Antonio con pan dulce…", read as the
1821
+ // business "con pan dulce", and its hero searched that and placed the Río
1822
+ // Dulce at dusk; a site in another language is searched by its plan's
1823
+ // English photo words' subject ({@link aiStockSourceTerms}), and its slots'
1824
+ // alt texts, in its own language, name no subject a search could use.
1825
+ const english = aiStockSourceSubject(input);
1826
+ const terms = aiStockSourceTerms(input);
1764
1827
  return async (slots)=>{
1765
1828
  var _deps_budgetMs, _input_avoid;
1766
1829
  const timeout = AbortSignal.timeout((_deps_budgetMs = deps.budgetMs) != null ? _deps_budgetMs : AI_LAYOUT_STOCK_PHOTOS_BUDGET_MS);
@@ -1792,6 +1855,7 @@ const EXTENSIONS = {
1792
1855
  delete request.kin;
1793
1856
  delete request.lead;
1794
1857
  delete request.leadWorld;
1858
+ delete request.first;
1795
1859
  delete request.category;
1796
1860
  const key = JSON.stringify([
1797
1861
  request.query,
@@ -1917,6 +1981,8 @@ const EXTENSIONS = {
1917
1981
  lead: true
1918
1982
  } : {}, request.leadWorld ? {
1919
1983
  leadWorld: true
1984
+ } : {}, request.first ? {
1985
+ first: true
1920
1986
  } : {});
1921
1987
  };
1922
1988
  /**
@@ -1939,7 +2005,9 @@ const EXTENSIONS = {
1939
2005
  }, size, {
1940
2006
  broad: true,
1941
2007
  category: terms.core
1942
- }, slot.product ? {
2008
+ }, slot.role === 'hero' ? {
2009
+ first: true
2010
+ } : {}, slot.product ? {
1943
2011
  product: true,
1944
2012
  tier: 'weak'
1945
2013
  } : {}));
@@ -1954,7 +2022,7 @@ const EXTENSIONS = {
1954
2022
  continue;
1955
2023
  }
1956
2024
  const sectionName = (_input_sectionNames_slot_sectionIndex = input.sectionNames[slot.sectionIndex]) != null ? _input_sectionNames_slot_sectionIndex : '';
1957
- const subject = aiStockSubjectWords(slot.alt, sectionName);
2025
+ const subject = english ? '' : aiStockSubjectWords(slot.alt, sectionName);
1958
2026
  let choice = null;
1959
2027
  const requests = [
1960
2028
  ...slot.product ? aiStockProductSearches(slot, terms.craft, terms.domain, {