@aglyn/plugins-ai 1.0.0-beta.264 → 1.0.0-beta.268

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 (124) hide show
  1. package/package.json +18 -18
  2. package/src/lib/assets/site-styles/beauty.webp +0 -0
  3. package/src/lib/assets/site-styles/blog.webp +0 -0
  4. package/src/lib/assets/site-styles/business.webp +0 -0
  5. package/src/lib/assets/site-styles/coming-soon.webp +0 -0
  6. package/src/lib/assets/site-styles/education.webp +0 -0
  7. package/src/lib/assets/site-styles/events.webp +0 -0
  8. package/src/lib/assets/site-styles/fitness.webp +0 -0
  9. package/src/lib/assets/site-styles/landing.webp +0 -0
  10. package/src/lib/assets/site-styles/music.webp +0 -0
  11. package/src/lib/assets/site-styles/nonprofit.webp +0 -0
  12. package/src/lib/assets/site-styles/personal.webp +0 -0
  13. package/src/lib/assets/site-styles/photography.webp +0 -0
  14. package/src/lib/assets/site-styles/portfolio.webp +0 -0
  15. package/src/lib/assets/site-styles/professional.webp +0 -0
  16. package/src/lib/assets/site-styles/realestate.webp +0 -0
  17. package/src/lib/assets/site-styles/restaurant.webp +0 -0
  18. package/src/lib/assets/site-styles/store.webp +0 -0
  19. package/src/lib/assets/site-styles/studio.webp +0 -0
  20. package/src/lib/assets/site-styles/trades.webp +0 -0
  21. package/src/lib/assets/site-styles/wellness.webp +0 -0
  22. package/src/lib/assets/site-styles/yoga.webp +0 -0
  23. package/src/lib/components/ai-job-site.d.ts +8 -1
  24. package/src/lib/components/ai-job-site.js +7 -0
  25. package/src/lib/components/ai-job-site.js.map +1 -1
  26. package/src/lib/components/ai-site-build-page.component.js +37 -0
  27. package/src/lib/components/ai-site-build-page.component.js.map +1 -1
  28. package/src/lib/components/ai-site-start-card.component.d.ts +12 -0
  29. package/src/lib/components/ai-site-start-card.component.js +279 -240
  30. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  31. package/src/lib/components/ai-site-start-steps.component.d.ts +114 -0
  32. package/src/lib/components/ai-site-start-steps.component.js +480 -0
  33. package/src/lib/components/ai-site-start-steps.component.js.map +1 -0
  34. package/src/lib/components/ai-site-start-tracking.d.ts +122 -0
  35. package/src/lib/components/ai-site-start-tracking.js +296 -0
  36. package/src/lib/components/ai-site-start-tracking.js.map +1 -0
  37. package/src/lib/components/ai-site-style-previews.d.ts +26 -0
  38. package/src/lib/components/ai-site-style-previews.js +115 -0
  39. package/src/lib/components/ai-site-style-previews.js.map +1 -0
  40. package/src/lib/components/assist-jobs-drawer.component.js +24 -2
  41. package/src/lib/components/assist-jobs-drawer.component.js.map +1 -1
  42. package/src/lib/insights/ai-insight-digest.d.ts +9 -0
  43. package/src/lib/insights/ai-insight-digest.js +35 -11
  44. package/src/lib/insights/ai-insight-digest.js.map +1 -1
  45. package/src/lib/jobs/ai-empty-site-sweep.d.ts +154 -0
  46. package/src/lib/jobs/ai-empty-site-sweep.js +346 -0
  47. package/src/lib/jobs/ai-empty-site-sweep.js.map +1 -0
  48. package/src/lib/jobs/ai-job-page-language.d.ts +9 -0
  49. package/src/lib/jobs/ai-job-page-language.js +20 -2
  50. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  51. package/src/lib/jobs/ai-job-plan-step.d.ts +43 -8
  52. package/src/lib/jobs/ai-job-plan-step.js +99 -18
  53. package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
  54. package/src/lib/jobs/ai-job-site-datasets.d.ts +82 -1
  55. package/src/lib/jobs/ai-job-site-datasets.js +276 -14
  56. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  57. package/src/lib/jobs/ai-jobs-beat.d.ts +11 -3
  58. package/src/lib/jobs/ai-jobs-beat.js +23 -6
  59. package/src/lib/jobs/ai-jobs-beat.js.map +1 -1
  60. package/src/lib/jobs/ai-jobs.js +46 -7
  61. package/src/lib/jobs/ai-jobs.js.map +1 -1
  62. package/src/lib/jobs/ai-layout-stock-photos.d.ts +143 -10
  63. package/src/lib/jobs/ai-layout-stock-photos.js +1046 -102
  64. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  65. package/src/lib/jobs/fixtures/ai-site-foreign-datasets-recording.d.ts +58 -0
  66. package/src/lib/jobs/fixtures/ai-site-foreign-datasets-recording.js +678 -0
  67. package/src/lib/jobs/fixtures/ai-site-foreign-datasets-recording.js.map +1 -0
  68. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-beta265-recordings.d.ts +33 -0
  69. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-beta265-recordings.js +270 -0
  70. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-beta265-recordings.js.map +1 -0
  71. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-people-recordings.d.ts +33 -0
  72. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-people-recordings.js +277 -0
  73. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-people-recordings.js.map +1 -0
  74. package/src/lib/jobs/fixtures/ai-stock-photo-agl3923-recordings.d.ts +35 -0
  75. package/src/lib/jobs/fixtures/ai-stock-photo-agl3923-recordings.js +379 -0
  76. package/src/lib/jobs/fixtures/ai-stock-photo-agl3923-recordings.js.map +1 -0
  77. package/src/lib/jobs/fixtures/ai-stock-photo-brightvale-recordings.d.ts +31 -0
  78. package/src/lib/jobs/fixtures/ai-stock-photo-brightvale-recordings.js +208 -0
  79. package/src/lib/jobs/fixtures/ai-stock-photo-brightvale-recordings.js.map +1 -0
  80. package/src/lib/layout-language/ai-layout-compiler.js +49 -12
  81. package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
  82. package/src/lib/layout-language/ai-layout-design.d.ts +6 -3
  83. package/src/lib/layout-language/ai-layout-design.js +19 -13
  84. package/src/lib/layout-language/ai-layout-design.js.map +1 -1
  85. package/src/lib/layout-language/ai-layout-listings.d.ts +48 -0
  86. package/src/lib/layout-language/ai-layout-listings.js +91 -5
  87. package/src/lib/layout-language/ai-layout-listings.js.map +1 -1
  88. package/src/lib/layout-language/ai-layout-pictures.d.ts +15 -0
  89. package/src/lib/layout-language/ai-layout-pictures.js +6 -2
  90. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  91. package/src/lib/model/ai-jobs.types.d.ts +20 -0
  92. package/src/lib/model/ai-jobs.types.js.map +1 -1
  93. package/src/lib/model/ai-site-home-arcs.d.ts +75 -0
  94. package/src/lib/model/ai-site-home-arcs.js +741 -0
  95. package/src/lib/model/ai-site-home-arcs.js.map +1 -0
  96. package/src/lib/model/ai-site-inventory.d.ts +18 -0
  97. package/src/lib/model/ai-site-inventory.js.map +1 -1
  98. package/src/lib/model/ai-site-job.d.ts +9 -6
  99. package/src/lib/model/ai-site-job.js +8 -5
  100. package/src/lib/model/ai-site-job.js.map +1 -1
  101. package/src/lib/model/ai-site-kinds.js +24 -24
  102. package/src/lib/model/ai-site-kinds.js.map +1 -1
  103. package/src/lib/model/ai-site-start-handoff.d.ts +49 -0
  104. package/src/lib/model/ai-site-start-handoff.js +88 -0
  105. package/src/lib/model/ai-site-start-handoff.js.map +1 -0
  106. package/src/lib/model/ai-site-start-steps.d.ts +67 -0
  107. package/src/lib/model/ai-site-start-steps.js +127 -0
  108. package/src/lib/model/ai-site-start-steps.js.map +1 -0
  109. package/src/lib/model/ai-site-start.js +4 -1
  110. package/src/lib/model/ai-site-start.js.map +1 -1
  111. package/src/lib/runtime/ai-doctrine-validators.d.ts +32 -0
  112. package/src/lib/runtime/ai-doctrine-validators.js +119 -2
  113. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  114. package/src/lib/runtime/ai-doctrine.d.ts +6 -1
  115. package/src/lib/runtime/ai-doctrine.js +9 -5
  116. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  117. package/src/lib/runtime/ai-palette.generated.js +5 -2
  118. package/src/lib/runtime/ai-palette.generated.js.map +1 -1
  119. package/src/lib/runtime/site-inventory.js +6 -0
  120. package/src/lib/runtime/site-inventory.js.map +1 -1
  121. package/src/lib/server/ai-insight-digest-route.js +2 -2
  122. package/src/lib/server/ai-insight-digest-route.js.map +1 -1
  123. package/src/lib/usage/assist-free-taste.js +3 -0
  124. package/src/lib/usage/assist-free-taste.js.map +1 -1
@@ -158,6 +158,15 @@ export declare const AI_LAYOUT_STOCK_SEARCHES_PER_PAGE = 18;
158
158
  export declare const AI_LAYOUT_STOCK_PICK_WINDOW = 40;
159
159
  /** The largest photo copied: inside one direct upload. */
160
160
  export declare const AI_LAYOUT_STOCK_MAX_BYTES: number;
161
+ /**
162
+ * The media library's refusals that are about ONE photo's own bytes, as the
163
+ * console's `ingestMedia` returns them (AGL-3923): 415 for a type or contents
164
+ * it does not accept, 413 for a photo too large to store, 451 for a file
165
+ * held in quarantine. The slot then tries its next hit, and the page goes on
166
+ * storing. Every other refusal (403 from the storage band, the site's scope
167
+ * or a lockdown; 500) holds for the whole page.
168
+ */
169
+ export declare const AI_STOCK_PHOTO_OWN_REFUSALS: ReadonlySet<number>;
161
170
  /**
162
171
  * The unit job input naming the screen drafts the job's other pages were
163
172
  * written to, whose photos a page does not place again (AGL-3660).
@@ -228,6 +237,12 @@ export interface AiStockSiteTerms {
228
237
  shun: string[];
229
238
  /** Words no photo of the site's craft is OF, among its first tags, unless the slot or the brief names them ({@link CRAFT_KIN}). */
230
239
  shunLead: string[];
240
+ /** Whether the site is for adults alone, so no photo of a child is placed on it ({@link aiStockAdultsOnly}, AGL-3856). */
241
+ adults?: boolean;
242
+ /** Where the site's own words set its pictures ({@link aiStockSetting}): a record's moment is set there where its words say nowhere (AGL-3856). */
243
+ setting?: string;
244
+ /** The craft's maker and tools as stems, which a record of its work never leads with ({@link CRAFT_KIN}, AGL-3856). */
245
+ maker?: string[];
231
246
  }
232
247
  /** The site's terms, read from its business type. */
233
248
  export declare function aiStockSiteTerms(businessType: string): AiStockSiteTerms;
@@ -289,6 +304,10 @@ export interface AiStockSearch extends StockPhotoSearchRequest {
289
304
  needs?: readonly string[];
290
305
  /** Stems its own words name, which let a topic in as the brief's do: a family session's children ({@link aiStockScene}). */
291
306
  allow?: readonly string[];
307
+ /** Stems no hit's first tags carry: a photographer or a camera on a portfolio's record, a toy frog ({@link aiStockRecordScene}, AGL-3856). */
308
+ refuseLead?: readonly string[];
309
+ /** Whether its hits are held to no world of the site's: a portfolio's record is of its subject, never of the craft (AGL-3856). */
310
+ worldless?: boolean;
292
311
  /** Whether it fills a product: no room, no scene, no fragrance bottle ({@link PRODUCT_SCENES}, AGL-3660). */
293
312
  product?: boolean;
294
313
  /** Words its hits never carry unless the slot or the brief names them ({@link AiStockSiteTerms.shun}). */
@@ -309,6 +328,33 @@ export type AiStockSlotPart = 'collection' | 'story';
309
328
  * the craft, or of a thing made by hand, shows the maker at work.
310
329
  */
311
330
  export declare function aiStockSlotPart(slot: Pick<AiLayoutPictureSlot, 'role' | 'alt'>, sectionName: string): AiStockSlotPart | undefined;
331
+ /** A role {@link aiStockPeopleRole} reads: its kin's stems, its search word, and whether a photo must name it. */
332
+ export interface AiStockPeopleRole {
333
+ kin: string[];
334
+ query: string;
335
+ required: boolean;
336
+ /** Stems of the role being done, one of which a photo's first tags name ({@link AI_STOCK_ROLE_TAGS_READ}). */
337
+ scene?: string[];
338
+ /** Stems of something else being done, which none of a photo's first tags name. */
339
+ refuse?: string[];
340
+ }
341
+ /** How many of a photo's first tags show a role being done: "teacher, presentation, education, man, students" (AGL-3856). */
342
+ export declare const AI_STOCK_ROLE_TAGS_READ = 6;
343
+ /**
344
+ * The role a person's words say, else the first of the other texts that names
345
+ * one (their list's name): "Online learning coach" of the "Instructors" list
346
+ * is a coach. `null` where none names a listed role.
347
+ */
348
+ export declare function aiStockPeopleRole(...texts: readonly string[]): AiStockPeopleRole | null;
349
+ /** A role's refusals, less what the person's own words name: a "Drawing instructor" may be drawing. */
350
+ export declare function aiStockRoleRefusals(role: Pick<AiStockPeopleRole, 'refuse'>, words: string): string[];
351
+ /**
352
+ * Whether a site is for adults alone (AGL-3856), as its audience, its name
353
+ * or its business type says: "Adults finishing a high school diploma",
354
+ * "Brightpath Adult Learning Center". Then no photo of a child is placed
355
+ * anywhere on it, whatever else its words name ("school").
356
+ */
357
+ export declare function aiStockAdultsOnly(texts: ReadonlyArray<string | undefined>): boolean;
312
358
  /** What a picture of a moment shows ({@link aiStockScene}). */
313
359
  export interface AiStockScene {
314
360
  /** The searches that ask for it, the people and their setting first. */
@@ -332,6 +378,19 @@ export interface AiStockScene {
332
378
  * `null` where it names no people.
333
379
  */
334
380
  export declare function aiStockScene(text: string): AiStockScene | null;
381
+ /** Where a text's words set a picture ({@link SCENE_SETTINGS}): "mountains" of "Couples planning mountain weddings"; empty for none. */
382
+ export declare function aiStockSetting(text: string): string;
383
+ /**
384
+ * The moment a portfolio's record shows (AGL-3856): read from the record's
385
+ * own name first, then from what it is filed under, then as a portrait, and
386
+ * set where its name, its category or else the site's own words say. A
387
+ * photographer's "Getting Ready" filed under "Weddings and elopements" is a
388
+ * wedding couple in the mountains; "Milestone Portraits" filed under "Family
389
+ * portraits" a family. Its searches end on the people alone ("couple"), so a
390
+ * moment no photo shows in its setting still shows its people. `null` where
391
+ * neither names people at a moment nor a portrait.
392
+ */
393
+ export declare function aiStockRecordScene(name: string, category?: string, siteSetting?: string): AiStockScene | null;
335
394
  /** What a product falls back to once its own searches find nothing ({@link aiStockProductSearches}). */
336
395
  export interface AiStockProductFallback {
337
396
  /** The site's broad searches ({@link AiStockSiteTerms.broad}): "handmade soap". */
@@ -386,8 +445,21 @@ export interface AiStockProductFallback {
386
445
  * Size" is a bath gift set.
387
446
  */
388
447
  export declare function aiStockProductSearches(slot: Pick<AiLayoutPictureSlot, 'aspect' | 'product'>, craft: string, domain?: readonly string[], fallback?: AiStockProductFallback): AiStockSearch[];
389
- /** The searches a slot tries, in order, most specific first, each distinct. */
390
- export declare function aiStockSearchesFor(slot: Pick<AiLayoutPictureSlot, 'role' | 'alt' | 'aspect'>, terms: Pick<AiStockSiteTerms, 'business' | 'craft' | 'domain' | 'broad'> & Partial<Pick<AiStockSiteTerms, 'making' | 'core' | 'scenes'>>, subject: string, part?: AiStockSlotPart): AiStockSearch[];
448
+ /**
449
+ * The searches a slot tries, in order, most specific first, each distinct.
450
+ * A portrait of one of the business's people ({@link AiLayoutPictureSlot.people})
451
+ * asks first for the role its words or its list's name (`sectionName`) say,
452
+ * in the site's world: "teacher classroom" for a "Math instructor" (AGL-3856).
453
+ */
454
+ export declare function aiStockSearchesFor(slot: Pick<AiLayoutPictureSlot, 'role' | 'alt' | 'aspect' | 'people' | 'record' | 'product'>, terms: Pick<AiStockSiteTerms, 'business' | 'craft' | 'domain' | 'broad'> & Partial<Pick<AiStockSiteTerms, 'making' | 'core' | 'scenes' | 'setting' | 'maker'>>, subject: string, part?: AiStockSlotPart, sectionName?: string): AiStockSearch[];
455
+ /**
456
+ * Whether a slot is a portfolio's record of a craft whose work is people at a
457
+ * moment (AGL-3856): a photographer's "Mountain Elopements" shows an
458
+ * elopement, never the photographer. Searched by the moment its words and its
459
+ * category name, held to no world of the craft, and never led by the craft's
460
+ * own words, an animal or a toy unless the record names them.
461
+ */
462
+ export declare function aiStockShowsTheWork(slot: Pick<AiLayoutPictureSlot, 'record' | 'role' | 'people' | 'product'>, terms: Partial<Pick<AiStockSiteTerms, 'scenes'>>): boolean;
391
463
  /** What a hit is judged by. */
392
464
  export interface AiStockJudgement {
393
465
  /** The words the picture is of; empty for a picture of the site's world. */
@@ -432,6 +504,14 @@ export interface AiStockJudgement {
432
504
  refuse?: readonly string[];
433
505
  /** Stems of which a hit names one ({@link AiStockSearch.needs}). */
434
506
  needs?: readonly string[];
507
+ /** Stems no hit's first tags carry: a child, for a portrait of one of the business's people (AGL-3856). */
508
+ refuseLead?: readonly string[];
509
+ /** Stems naming the role a portrait shows, which a hit is preferred for naming, most of all first (AGL-3856). */
510
+ roles?: readonly string[];
511
+ /** Stems of the role being done, one of which a hit's first tags must name ({@link AiStockPeopleRole.scene}). */
512
+ roleScene?: readonly string[];
513
+ /** Stems of something else being done, which none of a hit's first tags may name ({@link AiStockPeopleRole.refuse}). */
514
+ roleRefuse?: readonly string[];
435
515
  }
436
516
  /**
437
517
  * Whether a hit carries a topic its site never named ({@link SENSITIVE_TOPICS}):
@@ -457,6 +537,19 @@ export declare function aiStockRelevance(photo: Pick<StockPhoto, 'tags' | 'alt'
457
537
  * the hits that score alike, so two jobs differ and one job repeats itself.
458
538
  */
459
539
  export declare function aiStockRank(photos: readonly StockPhoto[], used: ReadonlySet<string>, seed: string, judgement?: AiStockJudgement): StockPhoto[];
540
+ /**
541
+ * Whether two hits are of one shoot (AGL-3856): one contributor's photos a few
542
+ * uploads apart, as Pixabay numbers them — the beta.265 Granite Peak Barbell
543
+ * coaches were four of one model, 728223 to 728229 — else one page address.
544
+ */
545
+ export declare function aiStockSameShoot(a: Pick<StockPhoto, 'id' | 'photographer' | 'pageUrl'>, b: Pick<StockPhoto, 'id' | 'photographer' | 'pageUrl'>): boolean;
546
+ /**
547
+ * A search's ranked hits with those of a shoot no slot shows yet first among
548
+ * the best (AGL-3856): a team's three cards are three people where the
549
+ * library has them, never one model three times while another fits as well.
550
+ * Every other order is kept.
551
+ */
552
+ export declare function aiStockFreshShootsFirst(ranked: readonly StockPhoto[], shown: readonly StockPhoto[], judgement: AiStockJudgement): StockPhoto[];
460
553
  /** The pick among a search's hits: the first {@link aiStockRank} would try, or `null`. */
461
554
  export declare function aiStockPick(photos: readonly StockPhoto[], used: ReadonlySet<string>, seed: string, judgement?: AiStockJudgement): StockPhoto | null;
462
555
  /**
@@ -469,13 +562,26 @@ export declare function aiStockPlacedSrcs(nodes: NodesMap | null | undefined): s
469
562
  export declare function aiStockForgetJobPhotos(): void;
470
563
  /**
471
564
  * A photo described from its own tags (AGL-3856): a short English phrase of
472
- * what its first tags show — one or two things, or a thing and where it is,
473
- * one person at most — never the library's comma-separated list: "A train at
474
- * a station", "A confident lawyer in court", "A portrait of a businessman",
475
- * "A board and chalk". A tag of how it looks is said before the thing it
476
- * qualifies; an idea ("law", "feedback") is left out; a word inside another
477
- * ("law" of "lawyer", "man" of "businessman") gives way to it; a mass noun
478
- * takes no article. `null` where no tag names a thing.
565
+ * concrete things, never the library's comma-separated list: "A train at a
566
+ * station", "A confident lawyer in court", "A portrait of a businessman", "A
567
+ * photographer with a camera on a beach", "A kettlebell in a gym", "An analog
568
+ * camera". It says one person at most (a role over a man or a woman, an adult
569
+ * over a girl), what they hold or wear, or one or two things, and where:
570
+ *
571
+ * - an idea or a doing ("law", "feedback", "training", "a read",
572
+ * "participation"), a maker's name ("sony"), a word for the photo itself
573
+ * ("photo", "spot") and a look ("moody", "analog" alone, a season) are left
574
+ * out; a quality ("elderly", "analog") is said before the one thing it
575
+ * qualifies;
576
+ * - of two words for one thing the first tag's stays ("book" over
577
+ * "bookwork", "camera" over "photo-camera"), unless the later phrase holds
578
+ * it whole ("wedding dress" over "wedding");
579
+ * - a second thing comes only from the first two tags and where no place is
580
+ * said, what a person holds only from the first three, where it is set
581
+ * from the first ten;
582
+ * - no word is said twice: never "an elderly couple and an elderly".
583
+ *
584
+ * `null` where no tag names a thing.
479
585
  */
480
586
  export declare function aiStockTagsAlt(tags: readonly string[], proper?: ReadonlySet<string>): string | null;
481
587
  /**
@@ -599,7 +705,8 @@ export declare function aiStockPhotoWordsSubject(photoWords: string): string;
599
705
  * its business named in English, else its plan's photo words' subject, else
600
706
  * its kind of site), every other site by its business type. One reading for
601
707
  * every slot of every source — hero, background, gallery, card, product,
602
- * post — so no slot searches by words another slot is held against.
708
+ * post — so no slot searches by words another slot is held against. A site for
709
+ * adults alone ({@link aiStockAdultsOnly}) is told so, whatever its world.
603
710
  */
604
711
  export declare function aiStockSourceTerms(input: Pick<AiLayoutStockPhotoSourceInput, 'business' | 'language' | 'photoWords' | 'kindWords' | 'name' | 'audience' | 'kind'>): AiStockSiteTerms;
605
712
  /**
@@ -611,6 +718,32 @@ export declare function aiStockIsAbbreviation(businessType: string): boolean;
611
718
  export declare function aiStockNamedKind(text: string): string;
612
719
  /** What a kind of site's pictures are searched and judged by ({@link KIND_SUBJECTS}); `null` for a kind not listed. */
613
720
  export declare function aiStockKindTerms(kind: string): AiStockSiteTerms | null;
721
+ /**
722
+ * Whether a site's world is only its own words (AGL-3923): no craft this
723
+ * module lists and no kind of site named it, so its broad searches are its
724
+ * business and its craft read back ("freelencing"), which a library may not
725
+ * know at all.
726
+ */
727
+ export declare function aiStockWorldIsUnlisted(terms: Pick<AiStockSiteTerms, 'business' | 'craft' | 'broad'>): boolean;
728
+ /**
729
+ * What a picture is searched by once nothing narrower found it a photo
730
+ * (AGL-3923), widest last: the kind of site the person picked, the kind its
731
+ * starter is the shape of, and the starter's own common photos
732
+ * ({@link STARTER_GENERIC}). Only a site whose world is its own words alone
733
+ * ({@link aiStockWorldIsUnlisted}) widens: a craft this module lists, or a
734
+ * world read from the kind of site, keeps its slots to that world, and a slot
735
+ * nothing in it fits keeps no photo rather than an office (AGL-3831). A rung
736
+ * that would search what an earlier one did is left out.
737
+ *
738
+ * The beta.265 Kasvora Marketing Solutions start (job BK3r4I8bF1) typed its
739
+ * business as "Freelencing site offer services": its world was the one word
740
+ * "freelencing", which no library tags, so its cover hero searched it, found
741
+ * nothing, and shipped a flat dark band with no photo.
742
+ */
743
+ export declare function aiStockWiderTerms(terms: Pick<AiStockSiteTerms, 'business' | 'craft' | 'broad'>, kind: string): Array<{
744
+ rung: 'kind' | 'starter' | 'generic';
745
+ terms: AiStockSiteTerms;
746
+ }>;
614
747
  /**
615
748
  * The first word of a text that names a craft {@link CRAFT_KIN} lists, as
616
749
  * its table writes it: "gym" of "Synchronicity Gym", "law" of "Hartwell