@aglyn/plugins-ai 1.0.0-beta.260 → 1.0.0-beta.261

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 (28) hide show
  1. package/package.json +17 -17
  2. package/src/lib/components/ai-site-start-card.component.js +43 -34
  3. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  4. package/src/lib/jobs/ai-job-admission.d.ts +6 -0
  5. package/src/lib/jobs/ai-job-admission.js.map +1 -1
  6. package/src/lib/jobs/ai-job-site-step.js +10 -6
  7. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  8. package/src/lib/jobs/ai-layout-stock-photos.d.ts +43 -11
  9. package/src/lib/jobs/ai-layout-stock-photos.js +319 -32
  10. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  11. package/src/lib/jobs/ai-stock-photo-picker.js +13 -7
  12. package/src/lib/jobs/ai-stock-photo-picker.js.map +1 -1
  13. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-recordings.d.ts +35 -0
  14. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-recordings.js +404 -0
  15. package/src/lib/jobs/fixtures/ai-stock-photo-agl3856-recordings.js.map +1 -0
  16. package/src/lib/layout-language/ai-layout-motion.d.ts +9 -3
  17. package/src/lib/layout-language/ai-layout-motion.js +9 -3
  18. package/src/lib/layout-language/ai-layout-motion.js.map +1 -1
  19. package/src/lib/layout-language/ai-layout-pictures.d.ts +10 -1
  20. package/src/lib/layout-language/ai-layout-pictures.js +12 -6
  21. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  22. package/src/lib/runtime/ai-doctrine-validators.d.ts +40 -0
  23. package/src/lib/runtime/ai-doctrine-validators.js +132 -1
  24. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  25. package/src/lib/runtime/ai-doctrine.js +6 -2
  26. package/src/lib/runtime/ai-doctrine.js.map +1 -1
  27. package/src/lib/server/ai-jobs-route.js +19 -0
  28. package/src/lib/server/ai-jobs-route.js.map +1 -1
@@ -43,24 +43,28 @@ import { aiLayoutStockPhotoSource } from "./ai-layout-stock-photos.js";
43
43
  function line(value) {
44
44
  return typeof value === 'string' ? value.replace(RegExp("[\\u0000-\\u001F\\u007F-\\u009F\\s]+", "gu"), ' ').trim() : '';
45
45
  }
46
- function pickOf(photo, origin, hostId) {
46
+ /** The pick of a placed photo, described by its own words where it brings them, else by the slot's (AGL-3856). */ function pickOf(photo, origin, hostId, alt) {
47
+ var _photo_alt;
47
48
  const url = origin === 'library' ? siteRelativeMediaSrc(photo.src, {
48
49
  hostId
49
50
  }) : photo.src;
50
- return url ? {
51
+ const said = ((_photo_alt = photo.alt) == null ? void 0 : _photo_alt.trim()) || alt;
52
+ return url ? _extends({
51
53
  src: photo.src,
52
54
  url,
53
55
  width: photo.width,
54
56
  height: photo.height,
55
57
  origin
56
- } : null;
58
+ }, said ? {
59
+ alt: said
60
+ } : {}) : null;
57
61
  }
58
62
  /** A photo for the request's subject: from the site's library or the stock library, else a starter. */ export async function aiStockPhotoPick(request, deps = {}) {
59
63
  var _request_orientation, _request_scope;
60
64
  const subject = line(request.subject);
61
65
  if (!subject || !request.hostId) return null;
62
66
  const alt = (line(request.alt) || subject).slice(0, ALT_MAX);
63
- const slot = {
67
+ const slot = _extends({
64
68
  imageId: 'pick',
65
69
  frameId: null,
66
70
  iconId: null,
@@ -68,7 +72,9 @@ function pickOf(photo, origin, hostId) {
68
72
  aspect: ASPECTS[(_request_orientation = request.orientation) != null ? _request_orientation : 'horizontal'],
69
73
  sectionIndex: 0,
70
74
  role: 'gallery'
71
- };
75
+ }, line(request.alt) ? {} : {
76
+ standIn: true
77
+ });
72
78
  const seed = line(request.seed) || `${(_request_scope = request.scope) != null ? _request_scope : request.hostId}:${subject}`;
73
79
  try {
74
80
  var _deps_source;
@@ -92,7 +98,7 @@ function pickOf(photo, origin, hostId) {
92
98
  const [found] = source ? await source([
93
99
  slot
94
100
  ]) : [];
95
- const picked = (found == null ? void 0 : found.src) ? pickOf(found, 'library', request.hostId) : null;
101
+ const picked = (found == null ? void 0 : found.src) ? pickOf(found, 'library', request.hostId, alt) : null;
96
102
  if (picked) return picked;
97
103
  } catch (error) {
98
104
  console.warn('ai stock photo pick: the stock library failed; a starter stands in', {
@@ -102,7 +108,7 @@ function pickOf(photo, origin, hostId) {
102
108
  const [starter] = aiLayoutStarterPhotos([
103
109
  slot
104
110
  ], seed);
105
- return starter ? pickOf(starter, 'starter', request.hostId) : null;
111
+ return starter ? pickOf(starter, 'starter', request.hostId, alt) : null;
106
112
  }
107
113
 
108
114
  //# sourceMappingURL=ai-stock-photo-picker.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/jobs/ai-stock-photo-picker.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { siteRelativeMediaSrc } from '@aglyn/aglyn/app-utils/media-ref'\nimport type {\n StockPhotoOrientation,\n StockPhotoPick,\n StockPhotoPickRequest,\n} from '@aglyn/aglyn/plugin-manager/stock-photo-provider'\nimport {\n aiLayoutStarterPhotos,\n type AiLayoutPicturePhoto,\n type AiLayoutPictureSlot,\n} from '../layout-language/ai-layout-pictures'\nimport { aiLayoutStockPhotoSource } from './ai-layout-stock-photos'\n\n/**\n * THE STOCK PHOTO PICKER ANOTHER PLUGIN ASKS FOR (AGL-3755).\n *\n * The AI plugin's answer on `core.stock-photo-picker`: one photo for one\n * subject, chosen exactly as a language page's picture is\n * ({@link aiLayoutStockPhotoSource}) — the subject's nouns searched and\n * qualified by the business's craft, hits scored by tag overlap and held to\n * the business's world, sensitive and off-topic hits refused, nothing placed\n * twice in one act (`scope`, the job), the business's broad searches when\n * the subject finds nothing — and copied into the site's library once: a\n * photo the library already holds is reused. Where the library is down,\n * unconfigured or answers nothing acceptable, a starter photo stands in,\n * since a starter reads better than no picture at all.\n *\n * The answer is servable as it stands: a library photo's `url` is its\n * site-relative CDN path (`siteRelativeMediaSrc`), a starter's is its\n * `/_static/starter/` path. Never throws, and no AI model runs.\n */\n\n/** A slot's shape for each orientation: a card's, a portrait's, a square's. */\nconst ASPECTS: Readonly<Record<StockPhotoOrientation, number>> = {\n horizontal: 3 / 2,\n vertical: 4 / 5,\n any: 1,\n}\n\n/** The longest description the picker stores with a photo. */\nconst ALT_MAX = 300\n\nexport interface AiStockPhotoPickDeps {\n /** The page's source; specs hand in one over recorded hits. */\n source?: typeof aiLayoutStockPhotoSource\n}\n\nfunction line(value: unknown): string {\n return typeof value === 'string' ? value.replace(/[\\p{Cc}\\s]+/gu, ' ').trim() : ''\n}\n\nfunction pickOf(\n photo: AiLayoutPicturePhoto,\n origin: StockPhotoPick['origin'],\n hostId: string,\n): StockPhotoPick | null {\n const url = origin === 'library' ? siteRelativeMediaSrc(photo.src, { hostId }) : photo.src\n return url ? { src: photo.src, url, width: photo.width, height: photo.height, origin } : null\n}\n\n/** A photo for the request's subject: from the site's library or the stock library, else a starter. */\nexport async function aiStockPhotoPick(\n request: StockPhotoPickRequest,\n deps: AiStockPhotoPickDeps = {},\n): Promise<StockPhotoPick | null> {\n const subject = line(request.subject)\n if (!subject || !request.hostId) return null\n const alt = (line(request.alt) || subject).slice(0, ALT_MAX)\n const slot: AiLayoutPictureSlot = {\n imageId: 'pick',\n frameId: null,\n iconId: null,\n alt,\n aspect: ASPECTS[request.orientation ?? 'horizontal'],\n sectionIndex: 0,\n role: 'gallery',\n }\n const seed = line(request.seed) || `${request.scope ?? request.hostId}:${subject}`\n try {\n const source = (deps.source ?? aiLayoutStockPhotoSource)({\n hostId: request.hostId,\n uid: request.uid,\n seed,\n // The business holds the photo to its world; with none, the subject is the world.\n business: line(request.business) || subject,\n sectionNames: [subject],\n ...(request.scope ? { jobId: request.scope } : {}),\n ...(request.avoid?.length ? { avoid: request.avoid } : {}),\n ...(request.signal ? { signal: request.signal } : {}),\n })\n const [found] = source ? await source([slot]) : []\n const picked = found?.src ? pickOf(found, 'library', request.hostId) : null\n if (picked) return picked\n } catch (error) {\n console.warn('ai stock photo pick: the stock library failed; a starter stands in', {\n error: String(error),\n })\n }\n const [starter] = aiLayoutStarterPhotos([slot], seed)\n return starter ? pickOf(starter, 'starter', request.hostId) : null\n}\n"],"names":["siteRelativeMediaSrc","aiLayoutStarterPhotos","aiLayoutStockPhotoSource","ASPECTS","horizontal","vertical","any","ALT_MAX","line","value","replace","trim","pickOf","photo","origin","hostId","url","src","width","height","aiStockPhotoPick","request","deps","subject","alt","slice","slot","imageId","frameId","iconId","aspect","orientation","sectionIndex","role","seed","scope","source","uid","business","sectionNames","jobId","avoid","length","signal","found","picked","error","console","warn","String","starter"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,oBAAoB,QAAQ,mCAAkC;AAMvE,SACEC,qBAAqB,QAGhB,2CAAuC;AAC9C,SAASC,wBAAwB,QAAQ,8BAA0B;AAEnE;;;;;;;;;;;;;;;;;CAiBC,GAED,6EAA6E,GAC7E,MAAMC,UAA2D;IAC/DC,YAAY,IAAI;IAChBC,UAAU,IAAI;IACdC,KAAK;AACP;AAEA,4DAA4D,GAC5D,MAAMC,UAAU;AAOhB,SAASC,KAAKC,KAAc;IAC1B,OAAO,OAAOA,UAAU,WAAWA,MAAMC,OAAO,CAAC,sDAAiB,KAAKC,IAAI,KAAK;AAClF;AAEA,SAASC,OACPC,KAA2B,EAC3BC,MAAgC,EAChCC,MAAc;IAEd,MAAMC,MAAMF,WAAW,YAAYd,qBAAqBa,MAAMI,GAAG,EAAE;QAAEF;IAAO,KAAKF,MAAMI,GAAG;IAC1F,OAAOD,MAAM;QAAEC,KAAKJ,MAAMI,GAAG;QAAED;QAAKE,OAAOL,MAAMK,KAAK;QAAEC,QAAQN,MAAMM,MAAM;QAAEL;IAAO,IAAI;AAC3F;AAEA,qGAAqG,GACrG,OAAO,eAAeM,iBACpBC,OAA8B,EAC9BC,OAA6B,CAAC,CAAC;QAUbD,sBAIoBA;IAZtC,MAAME,UAAUf,KAAKa,QAAQE,OAAO;IACpC,IAAI,CAACA,WAAW,CAACF,QAAQN,MAAM,EAAE,OAAO;IACxC,MAAMS,MAAM,AAAChB,CAAAA,KAAKa,QAAQG,GAAG,KAAKD,OAAM,EAAGE,KAAK,CAAC,GAAGlB;IACpD,MAAMmB,OAA4B;QAChCC,SAAS;QACTC,SAAS;QACTC,QAAQ;QACRL;QACAM,QAAQ3B,OAAO,EAACkB,uBAAAA,QAAQU,WAAW,YAAnBV,uBAAuB,aAAa;QACpDW,cAAc;QACdC,MAAM;IACR;IACA,MAAMC,OAAO1B,KAAKa,QAAQa,IAAI,KAAK,IAAGb,iBAAAA,QAAQc,KAAK,YAAbd,iBAAiBA,QAAQN,MAAM,CAAC,CAAC,EAAEQ,SAAS;IAClF,IAAI;YACcD;YAQVD;QARN,MAAMe,SAAS,EAACd,eAAAA,KAAKc,MAAM,YAAXd,eAAepB,0BAA0B;YACvDa,QAAQM,QAAQN,MAAM;YACtBsB,KAAKhB,QAAQgB,GAAG;YAChBH;YACA,kFAAkF;YAClFI,UAAU9B,KAAKa,QAAQiB,QAAQ,KAAKf;YACpCgB,cAAc;gBAAChB;aAAQ;WACnBF,QAAQc,KAAK,GAAG;YAAEK,OAAOnB,QAAQc,KAAK;QAAC,IAAI,CAAC,GAC5Cd,EAAAA,iBAAAA,QAAQoB,KAAK,qBAAbpB,eAAeqB,MAAM,IAAG;YAAED,OAAOpB,QAAQoB,KAAK;QAAC,IAAI,CAAC,GACpDpB,QAAQsB,MAAM,GAAG;YAAEA,QAAQtB,QAAQsB,MAAM;QAAC,IAAI,CAAC;QAErD,MAAM,CAACC,MAAM,GAAGR,SAAS,MAAMA,OAAO;YAACV;SAAK,IAAI,EAAE;QAClD,MAAMmB,SAASD,CAAAA,yBAAAA,MAAO3B,GAAG,IAAGL,OAAOgC,OAAO,WAAWvB,QAAQN,MAAM,IAAI;QACvE,IAAI8B,QAAQ,OAAOA;IACrB,EAAE,OAAOC,OAAO;QACdC,QAAQC,IAAI,CAAC,sEAAsE;YACjFF,OAAOG,OAAOH;QAChB;IACF;IACA,MAAM,CAACI,QAAQ,GAAGjD,sBAAsB;QAACyB;KAAK,EAAEQ;IAChD,OAAOgB,UAAUtC,OAAOsC,SAAS,WAAW7B,QAAQN,MAAM,IAAI;AAChE"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/ai/src/lib/jobs/ai-stock-photo-picker.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { siteRelativeMediaSrc } from '@aglyn/aglyn/app-utils/media-ref'\nimport type {\n StockPhotoOrientation,\n StockPhotoPick,\n StockPhotoPickRequest,\n} from '@aglyn/aglyn/plugin-manager/stock-photo-provider'\nimport {\n aiLayoutStarterPhotos,\n type AiLayoutPicturePhoto,\n type AiLayoutPictureSlot,\n} from '../layout-language/ai-layout-pictures'\nimport { aiLayoutStockPhotoSource } from './ai-layout-stock-photos'\n\n/**\n * THE STOCK PHOTO PICKER ANOTHER PLUGIN ASKS FOR (AGL-3755).\n *\n * The AI plugin's answer on `core.stock-photo-picker`: one photo for one\n * subject, chosen exactly as a language page's picture is\n * ({@link aiLayoutStockPhotoSource}) — the subject's nouns searched and\n * qualified by the business's craft, hits scored by tag overlap and held to\n * the business's world, sensitive and off-topic hits refused, nothing placed\n * twice in one act (`scope`, the job), the business's broad searches when\n * the subject finds nothing — and copied into the site's library once: a\n * photo the library already holds is reused. Where the library is down,\n * unconfigured or answers nothing acceptable, a starter photo stands in,\n * since a starter reads better than no picture at all.\n *\n * The answer is servable as it stands: a library photo's `url` is its\n * site-relative CDN path (`siteRelativeMediaSrc`), a starter's is its\n * `/_static/starter/` path. Never throws, and no AI model runs.\n */\n\n/** A slot's shape for each orientation: a card's, a portrait's, a square's. */\nconst ASPECTS: Readonly<Record<StockPhotoOrientation, number>> = {\n horizontal: 3 / 2,\n vertical: 4 / 5,\n any: 1,\n}\n\n/** The longest description the picker stores with a photo. */\nconst ALT_MAX = 300\n\nexport interface AiStockPhotoPickDeps {\n /** The page's source; specs hand in one over recorded hits. */\n source?: typeof aiLayoutStockPhotoSource\n}\n\nfunction line(value: unknown): string {\n return typeof value === 'string' ? value.replace(/[\\p{Cc}\\s]+/gu, ' ').trim() : ''\n}\n\n/** The pick of a placed photo, described by its own words where it brings them, else by the slot's (AGL-3856). */\nfunction pickOf(\n photo: AiLayoutPicturePhoto,\n origin: StockPhotoPick['origin'],\n hostId: string,\n alt: string,\n): StockPhotoPick | null {\n const url = origin === 'library' ? siteRelativeMediaSrc(photo.src, { hostId }) : photo.src\n const said = photo.alt?.trim() || alt\n return url ? { src: photo.src, url, width: photo.width, height: photo.height, origin, ...(said ? { alt: said } : {}) } : null\n}\n\n/** A photo for the request's subject: from the site's library or the stock library, else a starter. */\nexport async function aiStockPhotoPick(\n request: StockPhotoPickRequest,\n deps: AiStockPhotoPickDeps = {},\n): Promise<StockPhotoPick | null> {\n const subject = line(request.subject)\n if (!subject || !request.hostId) return null\n const alt = (line(request.alt) || subject).slice(0, ALT_MAX)\n const slot: AiLayoutPictureSlot = {\n imageId: 'pick',\n frameId: null,\n iconId: null,\n alt,\n aspect: ASPECTS[request.orientation ?? 'horizontal'],\n sectionIndex: 0,\n role: 'gallery',\n // A subject alone is a search's words, never a description: an event's\n // title is not what its cover shows (AGL-3856).\n ...(line(request.alt) ? {} : { standIn: true }),\n }\n const seed = line(request.seed) || `${request.scope ?? request.hostId}:${subject}`\n try {\n const source = (deps.source ?? aiLayoutStockPhotoSource)({\n hostId: request.hostId,\n uid: request.uid,\n seed,\n // The business holds the photo to its world; with none, the subject is the world.\n business: line(request.business) || subject,\n sectionNames: [subject],\n ...(request.scope ? { jobId: request.scope } : {}),\n ...(request.avoid?.length ? { avoid: request.avoid } : {}),\n ...(request.signal ? { signal: request.signal } : {}),\n })\n const [found] = source ? await source([slot]) : []\n const picked = found?.src ? pickOf(found, 'library', request.hostId, alt) : null\n if (picked) return picked\n } catch (error) {\n console.warn('ai stock photo pick: the stock library failed; a starter stands in', {\n error: String(error),\n })\n }\n const [starter] = aiLayoutStarterPhotos([slot], seed)\n return starter ? pickOf(starter, 'starter', request.hostId, alt) : null\n}\n"],"names":["siteRelativeMediaSrc","aiLayoutStarterPhotos","aiLayoutStockPhotoSource","ASPECTS","horizontal","vertical","any","ALT_MAX","line","value","replace","trim","pickOf","photo","origin","hostId","alt","url","src","said","width","height","aiStockPhotoPick","request","deps","subject","slice","slot","imageId","frameId","iconId","aspect","orientation","sectionIndex","role","standIn","seed","scope","source","uid","business","sectionNames","jobId","avoid","length","signal","found","picked","error","console","warn","String","starter"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import type { StockPhoto } from '@aglyn/aglyn/plugin-manager/stock-photo-provider';
18
+ /** `two-attorney law firm` (vertical, min_width 1600), for the Hartwell Reyes home hero (a 4 / 5 frame); answered 2026-10-16T06:25:29.795Z. */
19
+ export declare const TWO_ATTORNEY_LAW_FIRM_TALL: StockPhoto[];
20
+ /** `two-attorney law firm` (any, min_width 1600), for a square Hartwell Reyes hero on another page; answered 2026-10-16T06:29:20.290Z. */
21
+ export declare const TWO_ATTORNEY_LAW_FIRM_SQUARE: StockPhoto[];
22
+ /** `gym strength session` (horizontal, min_width 900), for the Ironline event "Open gym strength session"; answered 2026-10-16T06:28:22.096Z. */
23
+ export declare const GYM_STRENGTH_SESSION: StockPhoto[];
24
+ /** `strength` (horizontal, min_width 900), for the Ironline site's broad search; answered 2026-10-16T06:27:31.966Z. */
25
+ export declare const STRENGTH: StockPhoto[];
26
+ /** `intro barbell basics` (horizontal, min_width 900), for the Ironline event "Intro to barbell basics"; answered 2026-10-16T06:28:28.474Z. */
27
+ export declare const INTRO_BARBELL_BASICS: StockPhoto[];
28
+ /** `basic` (horizontal, min_width 900), for the same event's object, read as "basic"; answered 2026-10-16T06:28:28.685Z. */
29
+ export declare const BASIC: StockPhoto[];
30
+ /** `small-group strength class` (horizontal, min_width 900), for the Ironline event "Small-group strength class"; answered 2026-10-16T06:28:34.281Z. */
31
+ export declare const SMALL_GROUP_STRENGTH_CLASS: StockPhoto[];
32
+ /** `film` (vertical, min_height 900), for the Juniper and Rye home "Film" card; answered 2026-10-16T06:32:36.651Z. */
33
+ export declare const FILM: StockPhoto[];
34
+ /** `wedding` (horizontal, min_width 1600), for the Juniper and Rye home hero; answered 2026-10-16T06:32:36.101Z. */
35
+ export declare const WEDDING_WIDE: StockPhoto[];