@aglyn/plugins-ai 1.0.0-beta.271 → 1.0.0-beta.273

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 (132) hide show
  1. package/package.json +17 -17
  2. package/src/lib/activity/ai-activity-actions.d.ts +4 -3
  3. package/src/lib/activity/ai-activity-actions.js +3 -0
  4. package/src/lib/activity/ai-activity-actions.js.map +1 -1
  5. package/src/lib/components/ai-site-build-page.component.js +18 -0
  6. package/src/lib/components/ai-site-build-page.component.js.map +1 -1
  7. package/src/lib/components/ai-site-import-job.component.d.ts +41 -0
  8. package/src/lib/components/ai-site-import-job.component.js +707 -0
  9. package/src/lib/components/ai-site-import-job.component.js.map +1 -0
  10. package/src/lib/components/ai-site-import-start.component.d.ts +64 -0
  11. package/src/lib/components/ai-site-import-start.component.js +335 -0
  12. package/src/lib/components/ai-site-import-start.component.js.map +1 -0
  13. package/src/lib/components/ai-site-ownership-proof.component.d.ts +42 -0
  14. package/src/lib/components/ai-site-ownership-proof.component.js +353 -0
  15. package/src/lib/components/ai-site-ownership-proof.component.js.map +1 -0
  16. package/src/lib/components/ai-site-start-card.component.js +329 -252
  17. package/src/lib/components/ai-site-start-card.component.js.map +1 -1
  18. package/src/lib/jobs/ai-empty-site-sweep.d.ts +12 -1
  19. package/src/lib/jobs/ai-empty-site-sweep.js +15 -3
  20. package/src/lib/jobs/ai-empty-site-sweep.js.map +1 -1
  21. package/src/lib/jobs/ai-job-drafts.d.ts +14 -0
  22. package/src/lib/jobs/ai-job-drafts.js +24 -0
  23. package/src/lib/jobs/ai-job-drafts.js.map +1 -1
  24. package/src/lib/jobs/ai-job-import-step.d.ts +136 -0
  25. package/src/lib/jobs/ai-job-import-step.js +809 -0
  26. package/src/lib/jobs/ai-job-import-step.js.map +1 -0
  27. package/src/lib/jobs/ai-job-page-language.d.ts +39 -1
  28. package/src/lib/jobs/ai-job-page-language.js +62 -4
  29. package/src/lib/jobs/ai-job-page-language.js.map +1 -1
  30. package/src/lib/jobs/ai-job-page-step.d.ts +2 -2
  31. package/src/lib/jobs/ai-job-page-step.js +26 -4
  32. package/src/lib/jobs/ai-job-page-step.js.map +1 -1
  33. package/src/lib/jobs/ai-job-seo-step.js +8 -4
  34. package/src/lib/jobs/ai-job-seo-step.js.map +1 -1
  35. package/src/lib/jobs/ai-job-site-datasets.d.ts +39 -1
  36. package/src/lib/jobs/ai-job-site-datasets.js +111 -15
  37. package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
  38. package/src/lib/jobs/ai-job-site-step.d.ts +12 -3
  39. package/src/lib/jobs/ai-job-site-step.js +85 -11
  40. package/src/lib/jobs/ai-job-site-step.js.map +1 -1
  41. package/src/lib/jobs/ai-job-text-step.d.ts +15 -0
  42. package/src/lib/jobs/ai-job-text-step.js.map +1 -1
  43. package/src/lib/jobs/ai-jobs.d.ts +8 -0
  44. package/src/lib/jobs/ai-jobs.js +19 -3
  45. package/src/lib/jobs/ai-jobs.js.map +1 -1
  46. package/src/lib/jobs/ai-layout-owner-photos.d.ts +16 -1
  47. package/src/lib/jobs/ai-layout-owner-photos.js +49 -2
  48. package/src/lib/jobs/ai-layout-owner-photos.js.map +1 -1
  49. package/src/lib/jobs/ai-layout-stock-photos.d.ts +35 -0
  50. package/src/lib/jobs/ai-layout-stock-photos.js +114 -43
  51. package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
  52. package/src/lib/jobs/ai-site-late-photos.d.ts +143 -0
  53. package/src/lib/jobs/ai-site-late-photos.js +486 -0
  54. package/src/lib/jobs/ai-site-late-photos.js.map +1 -0
  55. package/src/lib/jobs/ai-site-publish.d.ts +18 -0
  56. package/src/lib/jobs/ai-site-publish.js +123 -5
  57. package/src/lib/jobs/ai-site-publish.js.map +1 -1
  58. package/src/lib/jobs/ai-theme-brand-inputs.d.ts +61 -3
  59. package/src/lib/jobs/ai-theme-brand-inputs.js +117 -27
  60. package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -1
  61. package/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.d.ts +83 -0
  62. package/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.js +1553 -0
  63. package/src/lib/jobs/fixtures/ai-site-late-photos-laurel-fork.js.map +1 -0
  64. package/src/lib/layout-language/ai-layout-pictures.d.ts +50 -13
  65. package/src/lib/layout-language/ai-layout-pictures.js +81 -19
  66. package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
  67. package/src/lib/model/ai-credit-estimate.d.ts +20 -0
  68. package/src/lib/model/ai-credit-estimate.js +13 -0
  69. package/src/lib/model/ai-credit-estimate.js.map +1 -1
  70. package/src/lib/model/ai-job-activity.d.ts +2 -2
  71. package/src/lib/model/ai-job-activity.js +6 -4
  72. package/src/lib/model/ai-job-activity.js.map +1 -1
  73. package/src/lib/model/ai-job-notice.js +18 -4
  74. package/src/lib/model/ai-job-notice.js.map +1 -1
  75. package/src/lib/model/ai-jobs.types.d.ts +39 -2
  76. package/src/lib/model/ai-jobs.types.js +2 -1
  77. package/src/lib/model/ai-jobs.types.js.map +1 -1
  78. package/src/lib/model/ai-site-import-view.d.ts +130 -0
  79. package/src/lib/model/ai-site-import-view.js +182 -0
  80. package/src/lib/model/ai-site-import-view.js.map +1 -0
  81. package/src/lib/model/ai-site-import.d.ts +302 -0
  82. package/src/lib/model/ai-site-import.js +526 -0
  83. package/src/lib/model/ai-site-import.js.map +1 -0
  84. package/src/lib/model/ai-site-photos.d.ts +119 -0
  85. package/src/lib/model/ai-site-photos.js +128 -0
  86. package/src/lib/model/ai-site-photos.js.map +1 -0
  87. package/src/lib/model/ai-site-start.d.ts +22 -9
  88. package/src/lib/model/ai-site-start.js +64 -23
  89. package/src/lib/model/ai-site-start.js.map +1 -1
  90. package/src/lib/runtime/ai-doctrine-validators.d.ts +3 -1
  91. package/src/lib/runtime/ai-doctrine-validators.js +3 -1
  92. package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
  93. package/src/lib/runtime/seo-fields.d.ts +29 -4
  94. package/src/lib/runtime/seo-fields.js +58 -11
  95. package/src/lib/runtime/seo-fields.js.map +1 -1
  96. package/src/lib/server/ai-jobs-route.js +11 -0
  97. package/src/lib/server/ai-jobs-route.js.map +1 -1
  98. package/src/lib/server/ai-site-import-route.d.ts +89 -0
  99. package/src/lib/server/ai-site-import-route.js +356 -0
  100. package/src/lib/server/ai-site-import-route.js.map +1 -0
  101. package/src/lib/server.js +14 -0
  102. package/src/lib/server.js.map +1 -1
  103. package/src/lib/site-import/fixtures/site-import-crawl-recordings.d.ts +45 -0
  104. package/src/lib/site-import/fixtures/site-import-crawl-recordings.js +313 -0
  105. package/src/lib/site-import/fixtures/site-import-crawl-recordings.js.map +1 -0
  106. package/src/lib/site-import/fixtures/site-import-wave-recordings.d.ts +50 -0
  107. package/src/lib/site-import/fixtures/site-import-wave-recordings.js +217 -0
  108. package/src/lib/site-import/fixtures/site-import-wave-recordings.js.map +1 -0
  109. package/src/lib/site-import/site-import-crawl.d.ts +163 -0
  110. package/src/lib/site-import/site-import-crawl.js +467 -0
  111. package/src/lib/site-import/site-import-crawl.js.map +1 -0
  112. package/src/lib/site-import/site-import-flag.d.ts +23 -0
  113. package/src/lib/site-import/site-import-flag.js +23 -0
  114. package/src/lib/site-import/site-import-flag.js.map +1 -0
  115. package/src/lib/site-import/site-import-html.d.ts +94 -0
  116. package/src/lib/site-import/site-import-html.js +462 -0
  117. package/src/lib/site-import/site-import-html.js.map +1 -0
  118. package/src/lib/site-import/site-import-images.d.ts +54 -0
  119. package/src/lib/site-import/site-import-images.js +204 -0
  120. package/src/lib/site-import/site-import-images.js.map +1 -0
  121. package/src/lib/site-import/site-import-page.d.ts +48 -0
  122. package/src/lib/site-import/site-import-page.js +150 -0
  123. package/src/lib/site-import/site-import-page.js.map +1 -0
  124. package/src/lib/site-import/site-import-review.d.ts +40 -0
  125. package/src/lib/site-import/site-import-review.js +149 -0
  126. package/src/lib/site-import/site-import-review.js.map +1 -0
  127. package/src/lib/site-import/site-import-robots.d.ts +52 -0
  128. package/src/lib/site-import/site-import-robots.js +126 -0
  129. package/src/lib/site-import/site-import-robots.js.map +1 -0
  130. package/src/lib/tools/ai-seo-tool.d.ts +25 -1
  131. package/src/lib/tools/ai-seo-tool.js +61 -0
  132. package/src/lib/tools/ai-seo-tool.js.map +1 -1
@@ -0,0 +1,136 @@
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 PluginMediaIngest } from '@aglyn/aglyn/plugin-manager/plugin-media-ingest';
18
+ import type { AiJob, AiJobItemLedger } from '../model/ai-jobs.types';
19
+ import { type AiSiteImportLeftOutReason, type AiSiteImportPage, type AiSiteImportPageRead, type AiSiteImportState, type AiSiteImportWave } from '../model/ai-site-import';
20
+ import { crawlSiteForImport, type SiteImportCrawlSeams, type SiteImportInventory } from '../site-import/site-import-crawl';
21
+ import { type SiteImportPhotosDeps } from '../site-import/site-import-images';
22
+ import { fileSiteImportReview } from '../site-import/site-import-review';
23
+ import { type AiJobAdmission } from './ai-job-admission';
24
+ import { readAiScreenRoom } from './ai-job-drafts';
25
+ import { type AiLayoutSitePage } from './ai-job-layout-site-pages';
26
+ import { aiSitePageWritten } from './ai-job-site-step';
27
+ import { type AiJobStepRunner } from './ai-job-text-step';
28
+ import { aiJobStepRunnerFor } from './ai-jobs';
29
+ /** Waves (the read included) one workspace may start in a day. */
30
+ export declare const SITE_IMPORT_WAVES_PER_ORG_PER_DAY = 12;
31
+ /** The rate-limit key a workspace's imports share. */
32
+ export declare function siteImportRateKey(orgId: string): string;
33
+ /** The crawl's clock when the import reads the whole site. */
34
+ export declare const AI_SITE_IMPORT_READ_MS = 150000;
35
+ /** The crawl's clock when a wave reads its own pages again. */
36
+ export declare const AI_SITE_IMPORT_WAVE_READ_MS = 90000;
37
+ /** The clock for one page's photos: each is fetched and stored through the library's door. */
38
+ export declare const AI_SITE_IMPORT_PHOTOS_MS = 90000;
39
+ /** The least time each pass that asks no model needs. */
40
+ export declare const AI_SITE_IMPORT_PASS_MINIMUM_MS: {
41
+ readonly read: number;
42
+ readonly wave: number;
43
+ readonly photos: number;
44
+ };
45
+ /**
46
+ * The passes one import may take: a read, then for every page its photos,
47
+ * its answer and its listing, every wave's start and the header and footer,
48
+ * with room for re-asks.
49
+ */
50
+ export declare const AI_SITE_IMPORT_MAX_PASSES: number;
51
+ /** Customer-safe sentences. */
52
+ export declare const AI_SITE_IMPORT_COPY: {
53
+ readonly noSite: "Open the site to bring your website into.";
54
+ readonly badDomain: "This website’s address cannot be brought in.";
55
+ readonly ownership: (domain: string) => string;
56
+ readonly limit: "This workspace has started as many site waves as it can today (12). Start this wave again tomorrow.";
57
+ readonly robots: (domain: string) => string;
58
+ readonly nothing: (domain: string) => string;
59
+ readonly unavailable: "Bringing a site in is not available on this workspace right now.";
60
+ readonly frameUnavailable: "The header and footer could not be built here; your pages use the site’s own layout.";
61
+ readonly pageUnavailable: "Pages cannot be built here right now.";
62
+ readonly pageNotWritten: "This page could not be written from its old page. Its spend is given back.";
63
+ readonly plan: "Bringing an existing site in is included on every paid plan.";
64
+ readonly role: "Only the workspace owner or an admin can bring a site in.";
65
+ };
66
+ export interface AiSiteImportOwnership {
67
+ current: boolean;
68
+ method: string | null;
69
+ provenAt: number | null;
70
+ detail: string | null;
71
+ }
72
+ export interface AiSiteImportStepDeps {
73
+ crawl?: typeof crawlSiteForImport;
74
+ crawlSeams?: SiteImportCrawlSeams;
75
+ runnerFor?: typeof aiJobStepRunnerFor;
76
+ ownership?: (orgId: string, domain: string) => Promise<AiSiteImportOwnership | null>;
77
+ rateLimit?: (key: string, options: {
78
+ limit: number;
79
+ windowMs: number;
80
+ }) => Promise<{
81
+ allowed: boolean;
82
+ }>;
83
+ releaseFlagOn?: (orgId: string) => Promise<boolean>;
84
+ ingest?: () => PluginMediaIngest | null;
85
+ fetchImage?: SiteImportPhotosDeps['fetch'];
86
+ readRoom?: typeof readAiScreenRoom;
87
+ readSiteName?: (firestore: FirebaseFirestore.Firestore, hostId: string) => Promise<string>;
88
+ fileReview?: typeof fileSiteImportReview;
89
+ pageWritten?: typeof aiSitePageWritten;
90
+ mintId?: () => string;
91
+ clock?: () => number;
92
+ }
93
+ /** The proved domain an import job is for, or `null`. */
94
+ export declare function aiSiteImportDomainOf(job: Pick<AiJob, 'inputs'>): string | null;
95
+ /**
96
+ * The pages the header and a page may link: the ones of this wave and those
97
+ * before it that are in or still coming, home first, at most the header's
98
+ * seven. A page of a later wave is not linked: it may never be brought in.
99
+ */
100
+ export declare function aiSiteImportLinkedPages(state: AiSiteImportState, items: readonly AiJobItemLedger[], wave: number): AiLayoutSitePage[];
101
+ /** The header and footer's job: a layout of the site's name, linking the wave's pages, in the layout language. */
102
+ export declare function aiSiteImportFrameJob(job: AiJob, state: AiSiteImportState, wave: AiSiteImportWave, items: readonly AiJobItemLedger[]): AiJob;
103
+ /** One page's job: a page job's plan of one screen, its sections from the old page's headings, its text fenced. */
104
+ export declare function aiSiteImportPageJob(job: AiJob, state: AiSiteImportState, page: AiSiteImportPage, items: readonly AiJobItemLedger[]): AiJob;
105
+ /** The least time the import's next pass needs: a read's, a photo pass's, or the time of the step its unit is handed to. */
106
+ export declare function aiSiteImportRunMinimumMs(job: AiJob, runnerFor?: typeof aiJobStepRunnerFor): number;
107
+ export declare function createAiJobImportStep(deps?: AiSiteImportStepDeps): AiJobStepRunner;
108
+ /** The home page's menu, as same-site paths in its order. */
109
+ export declare function siteImportMenu(crawled: Pick<SiteImportInventory, 'pages' | 'origins'>): string[];
110
+ /**
111
+ * What a wave's read came to for each page: the page read again, or why it
112
+ * is left out now. Matched by address; a page the site sent to another of its
113
+ * own addresses is matched in the order the wave asked for it.
114
+ */
115
+ export declare function siteImportWaveReads(asked: readonly AiSiteImportPage[], crawled: Pick<SiteImportInventory, 'pages' | 'skipped'>, at: string, options?: {
116
+ /** The read's clock ran out: a page it did not reach is left for the next pass, not left out. */
117
+ cutShort?: boolean;
118
+ }): Map<string, AiSiteImportPageRead | AiSiteImportLeftOutReason>;
119
+ export interface AiSiteImportAdmissionDeps {
120
+ releaseFlagOn?: (orgId: string) => Promise<boolean>;
121
+ ownership?: (orgId: string, domain: string) => Promise<AiSiteImportOwnership | null>;
122
+ memberRole?: (uid: string, orgId: string) => Promise<string | null>;
123
+ }
124
+ /**
125
+ * What an import asks before it exists and before each wave (AGL-3976): the
126
+ * release flag, a site to bring it into, a paid plan, the owner or an admin,
127
+ * and a CURRENT proof that the workspace owns the domain. Nothing is spent on
128
+ * a refusal, and the day's limit is the step's to count, once a wave runs.
129
+ */
130
+ export declare function createAiSiteImportAdmission(deps?: AiSiteImportAdmissionDeps): AiJobAdmission;
131
+ /**
132
+ * The import kind's registrations (AGL-3976), by a call from `server.ts`,
133
+ * never by an import: its runner with each pass's least time, its pass bound
134
+ * and its admission.
135
+ */
136
+ export declare function registerAiSiteImportJob(deps?: AiSiteImportStepDeps): void;