@aglyn/plugins-ai 1.0.0-beta.270 → 1.0.0-beta.272
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.
- package/package.json +17 -17
- package/src/lib/activity/ai-activity-actions.d.ts +4 -3
- package/src/lib/activity/ai-activity-actions.js +4 -0
- package/src/lib/activity/ai-activity-actions.js.map +1 -1
- package/src/lib/assets/site-styles/beauty.webp +0 -0
- package/src/lib/assets/site-styles/blog.webp +0 -0
- package/src/lib/assets/site-styles/business.webp +0 -0
- package/src/lib/assets/site-styles/coming-soon.webp +0 -0
- package/src/lib/assets/site-styles/education.webp +0 -0
- package/src/lib/assets/site-styles/events.webp +0 -0
- package/src/lib/assets/site-styles/fitness.webp +0 -0
- package/src/lib/assets/site-styles/landing.webp +0 -0
- package/src/lib/assets/site-styles/music.webp +0 -0
- package/src/lib/assets/site-styles/nonprofit.webp +0 -0
- package/src/lib/assets/site-styles/personal.webp +0 -0
- package/src/lib/assets/site-styles/photography.webp +0 -0
- package/src/lib/assets/site-styles/portfolio.webp +0 -0
- package/src/lib/assets/site-styles/professional.webp +0 -0
- package/src/lib/assets/site-styles/realestate.webp +0 -0
- package/src/lib/assets/site-styles/restaurant.webp +0 -0
- package/src/lib/assets/site-styles/store.webp +0 -0
- package/src/lib/assets/site-styles/studio.webp +0 -0
- package/src/lib/assets/site-styles/trades.webp +0 -0
- package/src/lib/assets/site-styles/wellness.webp +0 -0
- package/src/lib/assets/site-styles/yoga.webp +0 -0
- package/src/lib/components/ai-credits-card.component.d.ts +4 -3
- package/src/lib/components/ai-credits-card.component.js +15 -15
- package/src/lib/components/ai-credits-card.component.js.map +1 -1
- package/src/lib/components/ai-job-input-form.component.d.ts +36 -0
- package/src/lib/components/ai-job-input-form.component.js +100 -0
- package/src/lib/components/ai-job-input-form.component.js.map +1 -0
- package/src/lib/components/ai-job-requests.d.ts +4 -0
- package/src/lib/components/ai-job-requests.js +4 -0
- package/src/lib/components/ai-job-requests.js.map +1 -1
- package/src/lib/components/ai-site-build-page.component.js +18 -0
- package/src/lib/components/ai-site-build-page.component.js.map +1 -1
- package/src/lib/components/ai-site-import-job.component.d.ts +41 -0
- package/src/lib/components/ai-site-import-job.component.js +707 -0
- package/src/lib/components/ai-site-import-job.component.js.map +1 -0
- package/src/lib/components/ai-site-import-start.component.d.ts +64 -0
- package/src/lib/components/ai-site-import-start.component.js +335 -0
- package/src/lib/components/ai-site-import-start.component.js.map +1 -0
- package/src/lib/components/ai-site-ownership-proof.component.d.ts +42 -0
- package/src/lib/components/ai-site-ownership-proof.component.js +353 -0
- package/src/lib/components/ai-site-ownership-proof.component.js.map +1 -0
- package/src/lib/components/ai-site-start-card.component.d.ts +1 -1
- package/src/lib/components/ai-site-start-card.component.js +261 -119
- package/src/lib/components/ai-site-start-card.component.js.map +1 -1
- package/src/lib/components/ai-site-start-steps.component.d.ts +43 -2
- package/src/lib/components/ai-site-start-steps.component.js +651 -15
- package/src/lib/components/ai-site-start-steps.component.js.map +1 -1
- package/src/lib/components/ai-site-start-tracking.d.ts +10 -0
- package/src/lib/components/ai-site-start-tracking.js +14 -0
- package/src/lib/components/ai-site-start-tracking.js.map +1 -1
- package/src/lib/components/ai-site-style-previews.js +26 -22
- package/src/lib/components/ai-site-style-previews.js.map +1 -1
- package/src/lib/components/ai-upsell-dialog.component.d.ts +7 -5
- package/src/lib/components/ai-upsell-dialog.component.js +8 -6
- package/src/lib/components/ai-upsell-dialog.component.js.map +1 -1
- package/src/lib/components/assist-build-card.component.js +11 -1
- package/src/lib/components/assist-build-card.component.js.map +1 -1
- package/src/lib/components/assist-jobs-drawer.component.js +9 -1
- package/src/lib/components/assist-jobs-drawer.component.js.map +1 -1
- package/src/lib/components/assist-panel.component.js +8 -4
- package/src/lib/components/assist-panel.component.js.map +1 -1
- package/src/lib/components/staff-org-ai-card.component.js +4 -7
- package/src/lib/components/staff-org-ai-card.component.js.map +1 -1
- package/src/lib/declarations.d.ts +2 -2
- package/src/lib/declarations.js +9 -5
- package/src/lib/declarations.js.map +1 -1
- package/src/lib/jobs/ai-build-capabilities.js +3 -1
- package/src/lib/jobs/ai-build-capabilities.js.map +1 -1
- package/src/lib/jobs/ai-business-profile-prefill.d.ts +1 -1
- package/src/lib/jobs/ai-business-profile-prefill.js +14 -3
- package/src/lib/jobs/ai-business-profile-prefill.js.map +1 -1
- package/src/lib/jobs/ai-job-build-step.js +5 -3
- package/src/lib/jobs/ai-job-build-step.js.map +1 -1
- package/src/lib/jobs/ai-job-drafts.d.ts +14 -0
- package/src/lib/jobs/ai-job-drafts.js +24 -0
- package/src/lib/jobs/ai-job-drafts.js.map +1 -1
- package/src/lib/jobs/ai-job-form-step.d.ts +15 -1
- package/src/lib/jobs/ai-job-form-step.js +75 -8
- package/src/lib/jobs/ai-job-form-step.js.map +1 -1
- package/src/lib/jobs/ai-job-import-step.d.ts +136 -0
- package/src/lib/jobs/ai-job-import-step.js +809 -0
- package/src/lib/jobs/ai-job-import-step.js.map +1 -0
- package/src/lib/jobs/ai-job-page-language.d.ts +52 -1
- package/src/lib/jobs/ai-job-page-language.js +99 -5
- package/src/lib/jobs/ai-job-page-language.js.map +1 -1
- package/src/lib/jobs/ai-job-page-step.d.ts +19 -2
- package/src/lib/jobs/ai-job-page-step.js +42 -18
- package/src/lib/jobs/ai-job-page-step.js.map +1 -1
- package/src/lib/jobs/ai-job-plan-step.d.ts +25 -2
- package/src/lib/jobs/ai-job-plan-step.js +103 -29
- package/src/lib/jobs/ai-job-plan-step.js.map +1 -1
- package/src/lib/jobs/ai-job-settings-step.js +4 -3
- package/src/lib/jobs/ai-job-settings-step.js.map +1 -1
- package/src/lib/jobs/ai-job-site-datasets.d.ts +27 -0
- package/src/lib/jobs/ai-job-site-datasets.js +140 -14
- package/src/lib/jobs/ai-job-site-datasets.js.map +1 -1
- package/src/lib/jobs/ai-job-site-look.js +18 -5
- package/src/lib/jobs/ai-job-site-look.js.map +1 -1
- package/src/lib/jobs/ai-job-site-step.d.ts +16 -1
- package/src/lib/jobs/ai-job-site-step.js +95 -22
- package/src/lib/jobs/ai-job-site-step.js.map +1 -1
- package/src/lib/jobs/ai-job-text-step.d.ts +15 -1
- package/src/lib/jobs/ai-job-text-step.js.map +1 -1
- package/src/lib/jobs/ai-job-tracking-step.d.ts +14 -3
- package/src/lib/jobs/ai-job-tracking-step.js +28 -5
- package/src/lib/jobs/ai-job-tracking-step.js.map +1 -1
- package/src/lib/jobs/ai-jobs.d.ts +13 -1
- package/src/lib/jobs/ai-jobs.js +77 -10
- package/src/lib/jobs/ai-jobs.js.map +1 -1
- package/src/lib/jobs/ai-layout-owner-photos.d.ts +16 -1
- package/src/lib/jobs/ai-layout-owner-photos.js +47 -0
- package/src/lib/jobs/ai-layout-owner-photos.js.map +1 -1
- package/src/lib/jobs/ai-layout-stock-photos.d.ts +27 -2
- package/src/lib/jobs/ai-layout-stock-photos.js +190 -19
- package/src/lib/jobs/ai-layout-stock-photos.js.map +1 -1
- package/src/lib/jobs/ai-site-inspiration-signals.d.ts +98 -0
- package/src/lib/jobs/ai-site-inspiration-signals.js +585 -0
- package/src/lib/jobs/ai-site-inspiration-signals.js.map +1 -0
- package/src/lib/jobs/ai-site-inspiration.d.ts +157 -0
- package/src/lib/jobs/ai-site-inspiration.js +346 -0
- package/src/lib/jobs/ai-site-inspiration.js.map +1 -0
- package/src/lib/jobs/ai-site-publish.d.ts +26 -1
- package/src/lib/jobs/ai-site-publish.js +162 -13
- package/src/lib/jobs/ai-site-publish.js.map +1 -1
- package/src/lib/jobs/ai-theme-brand-inputs.d.ts +77 -3
- package/src/lib/jobs/ai-theme-brand-inputs.js +135 -31
- package/src/lib/jobs/ai-theme-brand-inputs.js.map +1 -1
- package/src/lib/jobs/fixtures/ai-candle-shop-free-plan-recording.d.ts +97 -0
- package/src/lib/jobs/fixtures/ai-candle-shop-free-plan-recording.js +137 -0
- package/src/lib/jobs/fixtures/ai-candle-shop-free-plan-recording.js.map +1 -0
- package/src/lib/jobs/fixtures/ai-site-inspiration-pages.d.ts +38 -0
- package/src/lib/jobs/fixtures/ai-site-inspiration-pages.js +103 -0
- package/src/lib/jobs/fixtures/ai-site-inspiration-pages.js.map +1 -0
- package/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.d.ts +25 -0
- package/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.js +174 -0
- package/src/lib/jobs/fixtures/ai-stock-photo-agl3988-recordings.js.map +1 -0
- package/src/lib/layout-language/ai-layout-compiler.d.ts +1 -1
- package/src/lib/layout-language/ai-layout-compiler.js +438 -25
- package/src/lib/layout-language/ai-layout-compiler.js.map +1 -1
- package/src/lib/layout-language/ai-layout-contact.d.ts +57 -0
- package/src/lib/layout-language/ai-layout-contact.js +137 -0
- package/src/lib/layout-language/ai-layout-contact.js.map +1 -0
- package/src/lib/layout-language/ai-layout-copy.d.ts +12 -0
- package/src/lib/layout-language/ai-layout-copy.js +34 -2
- package/src/lib/layout-language/ai-layout-copy.js.map +1 -1
- package/src/lib/layout-language/ai-layout-design.d.ts +65 -8
- package/src/lib/layout-language/ai-layout-design.js +411 -97
- package/src/lib/layout-language/ai-layout-design.js.map +1 -1
- package/src/lib/layout-language/ai-layout-frame.js +23 -0
- package/src/lib/layout-language/ai-layout-frame.js.map +1 -1
- package/src/lib/layout-language/ai-layout-labels.d.ts +2 -0
- package/src/lib/layout-language/ai-layout-labels.js +12 -6
- package/src/lib/layout-language/ai-layout-labels.js.map +1 -1
- package/src/lib/layout-language/ai-layout-language.d.ts +3 -2
- package/src/lib/layout-language/ai-layout-language.js +4 -3
- package/src/lib/layout-language/ai-layout-language.js.map +1 -1
- package/src/lib/layout-language/ai-layout-links.d.ts +13 -0
- package/src/lib/layout-language/ai-layout-links.js +30 -0
- package/src/lib/layout-language/ai-layout-links.js.map +1 -1
- package/src/lib/layout-language/ai-layout-pictures.d.ts +49 -6
- package/src/lib/layout-language/ai-layout-pictures.js +145 -22
- package/src/lib/layout-language/ai-layout-pictures.js.map +1 -1
- package/src/lib/model/ai-build-job.d.ts +16 -1
- package/src/lib/model/ai-build-job.js +40 -0
- package/src/lib/model/ai-build-job.js.map +1 -1
- package/src/lib/model/ai-credit-estimate.d.ts +20 -0
- package/src/lib/model/ai-credit-estimate.js +13 -0
- package/src/lib/model/ai-credit-estimate.js.map +1 -1
- package/src/lib/model/ai-job-activity.d.ts +2 -2
- package/src/lib/model/ai-job-activity.js +6 -4
- package/src/lib/model/ai-job-activity.js.map +1 -1
- package/src/lib/model/ai-job-input.d.ts +33 -0
- package/src/lib/model/ai-job-input.js +59 -0
- package/src/lib/model/ai-job-input.js.map +1 -0
- package/src/lib/model/ai-job-notice.d.ts +4 -0
- package/src/lib/model/ai-job-notice.js +28 -4
- package/src/lib/model/ai-job-notice.js.map +1 -1
- package/src/lib/model/ai-jobs.types.d.ts +69 -3
- package/src/lib/model/ai-jobs.types.js +2 -1
- package/src/lib/model/ai-jobs.types.js.map +1 -1
- package/src/lib/model/ai-site-details.d.ts +122 -0
- package/src/lib/model/ai-site-details.js +300 -0
- package/src/lib/model/ai-site-details.js.map +1 -0
- package/src/lib/model/ai-site-entity.d.ts +181 -0
- package/src/lib/model/ai-site-entity.js +390 -0
- package/src/lib/model/ai-site-entity.js.map +1 -0
- package/src/lib/model/ai-site-import-view.d.ts +130 -0
- package/src/lib/model/ai-site-import-view.js +182 -0
- package/src/lib/model/ai-site-import-view.js.map +1 -0
- package/src/lib/model/ai-site-import.d.ts +302 -0
- package/src/lib/model/ai-site-import.js +526 -0
- package/src/lib/model/ai-site-import.js.map +1 -0
- package/src/lib/model/ai-site-inspiration.d.ts +72 -0
- package/src/lib/model/ai-site-inspiration.js +109 -0
- package/src/lib/model/ai-site-inspiration.js.map +1 -0
- package/src/lib/model/ai-site-job.d.ts +13 -1
- package/src/lib/model/ai-site-job.js +15 -2
- package/src/lib/model/ai-site-job.js.map +1 -1
- package/src/lib/model/ai-site-kinds.js +109 -21
- package/src/lib/model/ai-site-kinds.js.map +1 -1
- package/src/lib/model/ai-site-look.d.ts +10 -0
- package/src/lib/model/ai-site-look.js +24 -0
- package/src/lib/model/ai-site-look.js.map +1 -1
- package/src/lib/model/ai-site-start-seo.d.ts +19 -5
- package/src/lib/model/ai-site-start-seo.js +25 -7
- package/src/lib/model/ai-site-start-seo.js.map +1 -1
- package/src/lib/model/ai-site-start-steps.d.ts +9 -3
- package/src/lib/model/ai-site-start-steps.js +67 -5
- package/src/lib/model/ai-site-start-steps.js.map +1 -1
- package/src/lib/model/ai-site-start.d.ts +81 -4
- package/src/lib/model/ai-site-start.js +207 -13
- package/src/lib/model/ai-site-start.js.map +1 -1
- package/src/lib/model/ai-upsell-copy.js +4 -1
- package/src/lib/model/ai-upsell-copy.js.map +1 -1
- package/src/lib/plan-entitlements.d.ts +4 -3
- package/src/lib/plan-entitlements.js +3 -8
- package/src/lib/plan-entitlements.js.map +1 -1
- package/src/lib/runtime/ai-dataset-generation.d.ts +8 -1
- package/src/lib/runtime/ai-dataset-generation.js +12 -2
- package/src/lib/runtime/ai-dataset-generation.js.map +1 -1
- package/src/lib/runtime/ai-doctrine-validators.d.ts +26 -33
- package/src/lib/runtime/ai-doctrine-validators.js +54 -44
- package/src/lib/runtime/ai-doctrine-validators.js.map +1 -1
- package/src/lib/runtime/ai-doctrine.js +1 -1
- package/src/lib/runtime/ai-doctrine.js.map +1 -1
- package/src/lib/runtime/ai-node-tree.d.ts +7 -0
- package/src/lib/runtime/ai-node-tree.js +9 -1
- package/src/lib/runtime/ai-node-tree.js.map +1 -1
- package/src/lib/server/ai-create-route.d.ts +1 -1
- package/src/lib/server/ai-create-route.js +3 -4
- package/src/lib/server/ai-create-route.js.map +1 -1
- package/src/lib/server/ai-jobs-resume.js +27 -3
- package/src/lib/server/ai-jobs-resume.js.map +1 -1
- package/src/lib/server/ai-jobs-route.js +18 -0
- package/src/lib/server/ai-jobs-route.js.map +1 -1
- package/src/lib/server/ai-site-import-route.d.ts +89 -0
- package/src/lib/server/ai-site-import-route.js +356 -0
- package/src/lib/server/ai-site-import-route.js.map +1 -0
- package/src/lib/server.js +14 -0
- package/src/lib/server.js.map +1 -1
- package/src/lib/site-import/fixtures/site-import-crawl-recordings.d.ts +45 -0
- package/src/lib/site-import/fixtures/site-import-crawl-recordings.js +313 -0
- package/src/lib/site-import/fixtures/site-import-crawl-recordings.js.map +1 -0
- package/src/lib/site-import/fixtures/site-import-wave-recordings.d.ts +50 -0
- package/src/lib/site-import/fixtures/site-import-wave-recordings.js +217 -0
- package/src/lib/site-import/fixtures/site-import-wave-recordings.js.map +1 -0
- package/src/lib/site-import/site-import-crawl.d.ts +163 -0
- package/src/lib/site-import/site-import-crawl.js +467 -0
- package/src/lib/site-import/site-import-crawl.js.map +1 -0
- package/src/lib/site-import/site-import-flag.d.ts +23 -0
- package/src/lib/site-import/site-import-flag.js +23 -0
- package/src/lib/site-import/site-import-flag.js.map +1 -0
- package/src/lib/site-import/site-import-html.d.ts +94 -0
- package/src/lib/site-import/site-import-html.js +462 -0
- package/src/lib/site-import/site-import-html.js.map +1 -0
- package/src/lib/site-import/site-import-images.d.ts +54 -0
- package/src/lib/site-import/site-import-images.js +204 -0
- package/src/lib/site-import/site-import-images.js.map +1 -0
- package/src/lib/site-import/site-import-page.d.ts +48 -0
- package/src/lib/site-import/site-import-page.js +150 -0
- package/src/lib/site-import/site-import-page.js.map +1 -0
- package/src/lib/site-import/site-import-review.d.ts +40 -0
- package/src/lib/site-import/site-import-review.js +149 -0
- package/src/lib/site-import/site-import-review.js.map +1 -0
- package/src/lib/site-import/site-import-robots.d.ts +52 -0
- package/src/lib/site-import/site-import-robots.js +126 -0
- package/src/lib/site-import/site-import-robots.js.map +1 -0
- package/src/lib/usage/assist-credits.d.ts +4 -4
- package/src/lib/usage/assist-credits.js +4 -4
- package/src/lib/usage/assist-credits.js.map +1 -1
- package/src/lib/usage/staff-org-ai-view.js +6 -3
- package/src/lib/usage/staff-org-ai-view.js.map +1 -1
- package/src/lib/usage/staff-org-ai.d.ts +4 -2
- package/src/lib/usage/staff-org-ai.js +7 -7
- package/src/lib/usage/staff-org-ai.js.map +1 -1
- package/src/lib/usage/staff-org-usage-ai.js +2 -2
- package/src/lib/usage/staff-org-usage-ai.js.map +1 -1
package/src/lib/jobs/ai-jobs.js
CHANGED
|
@@ -24,6 +24,7 @@ import { createResourceUid } from "@aglyn/aglyn/app-utils/create-resource-uid";
|
|
|
24
24
|
import { checkEntitlement } from "@aglyn/aglyn/server";
|
|
25
25
|
import { assistCreditsFromUsd, assistFreeTasteRefusalText, assistHardCapRefusalText, assistRefusedByHardCap } from "../usage/assist-credits.js";
|
|
26
26
|
import { AI_JOB_PLAN_STEP, AI_JOB_TERMINAL_STATUSES } from "../model/ai-jobs.types.js";
|
|
27
|
+
import { aiJobInputProblems, aiPlanWithInput } from "../model/ai-job-input.js";
|
|
27
28
|
import { resolveEffectivePlan } from "@aglyn/aglyn/app-utils/plan-entitlements";
|
|
28
29
|
import { aiOverageReservationRefusal } from "../billing/ai-overage-gate.js";
|
|
29
30
|
import { aiAllotmentRefusalText } from "../model/ai-allotments.js";
|
|
@@ -45,6 +46,7 @@ import { freeAssistAccount } from "../usage/assist-free-taste.js";
|
|
|
45
46
|
import { aiJobAutoConfirms } from "./ai-job-auto-confirm.js";
|
|
46
47
|
import { AI_SITE_GUIDED_BUILD_FAILED_COPY, aiCustomerSafeCopy, aiCustomerSafeItem, aiCustomerSafeReview } from "../model/ai-job-failure-copy.js";
|
|
47
48
|
import { aiSiteStartInputsOf } from "../model/ai-site-start.js";
|
|
49
|
+
import { aiSiteImportWire } from "../model/ai-site-import.js";
|
|
48
50
|
import { addAdminAudit } from "@aglyn/tenant-data-admin/server/admin-audit-write";
|
|
49
51
|
import { AI_JOB_CANCELED_ITEM_NOTE, aiJobCancelPending, isAiJobCanceledError, watchAiJobCancel } from "./ai-job-cancel.js";
|
|
50
52
|
import { clearAiEmptySiteSweep, scheduleAiEmptySiteSweep } from "./ai-empty-site-sweep.js";
|
|
@@ -478,7 +480,7 @@ export async function getAiJob(firestore, orgId, jobId) {
|
|
|
478
480
|
}
|
|
479
481
|
/** The wire form. `running` is the lease, read against `now`. */ export function aiJobSummary(job, now = new Date()) {
|
|
480
482
|
var _job_hostId, _job_steps, _job_outputs, _job_creditsReserved, _job_creditsSpent, _job_refundedCredits, _toIso, _toIso1, _job_error, _job_plan_labels, _job_plan_confirmedBy, _job_applied_versions, _job_applied_staged;
|
|
481
|
-
var _job_lease, _job_inputs, _job_items, _job_inputs1;
|
|
483
|
+
var _job_lease, _job_inputs, _job_input_fields, _job_input, _job_items, _job_inputs1;
|
|
482
484
|
const leaseUntil = toMillis((_job_lease = job.lease) == null ? void 0 : _job_lease.until);
|
|
483
485
|
return _extends({
|
|
484
486
|
id: job.$id,
|
|
@@ -519,7 +521,10 @@ export async function getAiJob(firestore, orgId, jobId) {
|
|
|
519
521
|
}) : null,
|
|
520
522
|
review: job.review ? aiCustomerSafeReview(job.review, {
|
|
521
523
|
page: job.kind === 'page'
|
|
522
|
-
}) : null
|
|
524
|
+
}) : null
|
|
525
|
+
}, job.status === 'needs_input' && ((_job_input = job.input) == null ? void 0 : (_job_input_fields = _job_input.fields) == null ? void 0 : _job_input_fields.length) ? {
|
|
526
|
+
input: job.input
|
|
527
|
+
} : {}, {
|
|
523
528
|
applied: job.applied ? {
|
|
524
529
|
at: toIso(job.applied.at),
|
|
525
530
|
by: job.applied.by,
|
|
@@ -542,6 +547,8 @@ export async function getAiJob(firestore, orgId, jobId) {
|
|
|
542
547
|
cancelRequested: true
|
|
543
548
|
} : {}, job.siteRemoved ? {
|
|
544
549
|
siteRemoved: true
|
|
550
|
+
} : {}, job.siteImport ? {
|
|
551
|
+
siteImport: aiSiteImportWire(job.siteImport)
|
|
545
552
|
} : {});
|
|
546
553
|
}
|
|
547
554
|
function leaseIsLive(job, owner, nowMs) {
|
|
@@ -830,7 +837,7 @@ function nextStepIndex(job) {
|
|
|
830
837
|
*/ export async function recordStep(firestore, orgId, jobId, owner, stepIndex, input, now = new Date()) {
|
|
831
838
|
const ref = jobsCollection(firestore, orgId).doc(jobId);
|
|
832
839
|
const recorded = await firestore.runTransaction(async (tx)=>{
|
|
833
|
-
var _ref, _input_items, _job_outputs, _input_outputs, _job_creditsSpent, _job_creditsReserved, _job_creditsReserved1, _job_refundedCredits, _ref1;
|
|
840
|
+
var _ref, _input_items, _job_outputs, _input_outputs, _job_creditsSpent, _job_creditsReserved, _job_creditsReserved1, _job_refundedCredits, _input_input, _ref1;
|
|
834
841
|
var _job_lease, _input_item, _this;
|
|
835
842
|
const job = jobFrom(await tx.get(ref));
|
|
836
843
|
if (!job) throw new Error(`ai job ${orgId}/${jobId} vanished`);
|
|
@@ -858,7 +865,9 @@ function nextStepIndex(job) {
|
|
|
858
865
|
// write that records what the step cost and built: nothing after it runs.
|
|
859
866
|
const canceling = aiJobCancelPending(job);
|
|
860
867
|
const parksForReview = Boolean(input.review) && !isAiJobTerminal(job.status) && !canceling;
|
|
861
|
-
|
|
868
|
+
// A plan only the person can complete waits for their answer (AGL-3978).
|
|
869
|
+
const parkedAs = input.input ? 'needs_input' : 'needs_review';
|
|
870
|
+
const status = isAiJobTerminal(job.status) ? job.status : canceling ? 'canceled' : job.status === 'needs_input' ? job.status : parksForReview ? parkedAs : input.status === 'failed' ? 'running' : remaining > 0 ? 'queued' : 'running';
|
|
862
871
|
const patch = _extends({
|
|
863
872
|
status,
|
|
864
873
|
steps,
|
|
@@ -877,13 +886,18 @@ function nextStepIndex(job) {
|
|
|
877
886
|
plan: input.plan
|
|
878
887
|
} : {}, input.sitePublish ? {
|
|
879
888
|
sitePublish: input.sitePublish
|
|
889
|
+
} : {}, input.siteImport ? {
|
|
890
|
+
siteImport: input.siteImport
|
|
880
891
|
} : {}, items ? {
|
|
881
892
|
items
|
|
882
893
|
} : {}, ((_input_item = input.item) == null ? void 0 : _input_item.creditsRefunded) ? {
|
|
883
894
|
refundedCredits: ((_job_refundedCredits = job.refundedCredits) != null ? _job_refundedCredits : 0) + input.item.creditsRefunded
|
|
884
895
|
} : {}, parksForReview && input.review ? {
|
|
885
896
|
review: input.review,
|
|
886
|
-
|
|
897
|
+
// A plan to confirm and a site import's wave to review (AGL-3976)
|
|
898
|
+
// are decisions waiting, not errors.
|
|
899
|
+
error: input.input ? input.input.message : input.review.reason === 'plan' || input.review.reason === 'wave' ? null : input.review.message,
|
|
900
|
+
input: (_input_input = input.input) != null ? _input_input : null
|
|
887
901
|
} : {}, canceling ? _extends({
|
|
888
902
|
creditsReserved: 0,
|
|
889
903
|
lease: null,
|
|
@@ -900,8 +914,8 @@ function nextStepIndex(job) {
|
|
|
900
914
|
return {
|
|
901
915
|
job: _extends({}, job, patch),
|
|
902
916
|
remaining,
|
|
903
|
-
// Entered `needs_review` in this write, rather than parked again.
|
|
904
|
-
parked: parksForReview && job.status !==
|
|
917
|
+
// Entered `needs_review` (or `needs_input` for an answer) in this write, rather than parked again.
|
|
918
|
+
parked: parksForReview && job.status !== parkedAs,
|
|
905
919
|
// Ended `canceled` in this write (AGL-3936).
|
|
906
920
|
ended: canceling && !isAiJobTerminal(job.status)
|
|
907
921
|
};
|
|
@@ -1156,7 +1170,9 @@ async function transition(firestore, orgId, jobId, apply) {
|
|
|
1156
1170
|
* which is the build's preset. Their step writes an item ledger; a failed
|
|
1157
1171
|
* item gives back its own spend and the rest goes on.
|
|
1158
1172
|
*/ export function aiJobSettlesByItem(kind) {
|
|
1159
|
-
|
|
1173
|
+
// A site import's pages are its items too (AGL-3976): one that fails on
|
|
1174
|
+
// our side gives back its own spend, and its wave goes on.
|
|
1175
|
+
return kind === 'build' || kind === 'site' || kind === 'import';
|
|
1160
1176
|
}
|
|
1161
1177
|
/**
|
|
1162
1178
|
* Whether Try again may run a job's failed items: a finished build, done or
|
|
@@ -1167,6 +1183,7 @@ async function transition(firestore, orgId, jobId, apply) {
|
|
|
1167
1183
|
return job.kind === 'site' && job.status === 'done';
|
|
1168
1184
|
}
|
|
1169
1185
|
/** What a build that delivered nothing says; its planning was given back too. */ export const AI_BUILD_NOTHING_BUILT_COPY = 'Nothing in this request could be built. Try again, or ask for less at once.';
|
|
1186
|
+
/** What a site import that brought no page in says (AGL-3976); every page's spend was given back. */ export const AI_SITE_IMPORT_NOTHING_BUILT_COPY = 'No page of your site could be brought in. Nothing was charged for the pages that failed; try again later.';
|
|
1170
1187
|
/** What an item the build never reached says when the build stopped early. */ export const AI_BUILD_NOT_REACHED_COPY = 'Not built: the build stopped before it reached this.';
|
|
1171
1188
|
/**
|
|
1172
1189
|
* Gives back one build item's spend, or its planning's (`slot: 'plan'`),
|
|
@@ -1357,7 +1374,7 @@ async function transition(firestore, orgId, jobId, apply) {
|
|
|
1357
1374
|
updatedAt: now
|
|
1358
1375
|
});
|
|
1359
1376
|
});
|
|
1360
|
-
const nothing = job.kind === 'site' ? AI_SITE_GUIDED_BUILD_FAILED_COPY : AI_BUILD_NOTHING_BUILT_COPY;
|
|
1377
|
+
const nothing = job.kind === 'site' ? AI_SITE_GUIDED_BUILD_FAILED_COPY : job.kind === 'import' ? AI_SITE_IMPORT_NOTHING_BUILT_COPY : AI_BUILD_NOTHING_BUILT_COPY;
|
|
1361
1378
|
return failAiJob(firestore, orgId, jobId, (_ref1 = stopped == null ? void 0 : stopped.message) != null ? _ref1 : nothing, {
|
|
1362
1379
|
error: 'build delivered nothing',
|
|
1363
1380
|
// Ours unless every item that failed was the model declining (AGL-3616).
|
|
@@ -1426,11 +1443,27 @@ async function transition(firestore, orgId, jobId, apply) {
|
|
|
1426
1443
|
*/ export async function resumeAiJob(firestore, orgId, jobId, actor, now = new Date(), options = {}) {
|
|
1427
1444
|
const resumed = await transition(firestore, orgId, jobId, (current)=>{
|
|
1428
1445
|
var _options_reducePlan;
|
|
1429
|
-
var _current_review, _current_inputs;
|
|
1446
|
+
var _current_input_fields, _current_input, _current_review, _current_inputs;
|
|
1430
1447
|
// A job the meter paused (AGL-3660) carries on from the step it paused
|
|
1431
1448
|
// on: that step is already pending, so it is queued again with nothing
|
|
1432
1449
|
// else changed. Whether the credits are there now is the reservation's
|
|
1433
1450
|
// to say, at the door and again at the step.
|
|
1451
|
+
// A job waiting for a person's answer (AGL-3978) takes it only once every
|
|
1452
|
+
// field reads (`aiJobInputProblems`, which the door asks first): the
|
|
1453
|
+
// answer is written to the plan's item and the job returns to its plan
|
|
1454
|
+
// card, where Confirm builds it as any plan.
|
|
1455
|
+
if (current.status === 'needs_input' && ((_current_input = current.input) == null ? void 0 : (_current_input_fields = _current_input.fields) == null ? void 0 : _current_input_fields.length)) {
|
|
1456
|
+
const values = options.input;
|
|
1457
|
+
if (!values || !current.plan || Object.keys(aiJobInputProblems(current.input, values)).length) return null;
|
|
1458
|
+
return {
|
|
1459
|
+
status: 'needs_review',
|
|
1460
|
+
plan: aiPlanWithInput(current.plan, current.input, values),
|
|
1461
|
+
input: null,
|
|
1462
|
+
error: null,
|
|
1463
|
+
lease: null,
|
|
1464
|
+
updatedAt: now
|
|
1465
|
+
};
|
|
1466
|
+
}
|
|
1434
1467
|
if (current.status === 'needs_input') {
|
|
1435
1468
|
return {
|
|
1436
1469
|
status: 'queued',
|
|
@@ -2004,8 +2037,12 @@ async function transition(firestore, orgId, jobId, apply) {
|
|
|
2004
2037
|
plan: outcome.plan
|
|
2005
2038
|
} : {}, review ? {
|
|
2006
2039
|
review
|
|
2040
|
+
} : {}, review && outcome.input ? {
|
|
2041
|
+
input: outcome.input
|
|
2007
2042
|
} : {}, outcome.sitePublish ? {
|
|
2008
2043
|
sitePublish: outcome.sitePublish
|
|
2044
|
+
} : {}, job.kind === 'import' && outcome.siteImport ? {
|
|
2045
|
+
siteImport: outcome.siteImport
|
|
2009
2046
|
} : {}, aiJobSettlesByItem(job.kind) && outcome.items ? {
|
|
2010
2047
|
items: outcome.items
|
|
2011
2048
|
} : {}, itemRecord ? {
|
|
@@ -2072,6 +2109,22 @@ async function transition(firestore, orgId, jobId, apply) {
|
|
|
2072
2109
|
job: resumed.job
|
|
2073
2110
|
};
|
|
2074
2111
|
}
|
|
2112
|
+
// A plan waiting for an answer only the person can give (AGL-3978): kept,
|
|
2113
|
+
// charged as any plan is, and asked of them; nothing about it failed.
|
|
2114
|
+
if (review && outcome.input && recorded.job.status === 'needs_input') {
|
|
2115
|
+
await logAiJobNeedsInput(orgId, {
|
|
2116
|
+
uid: null
|
|
2117
|
+
}, {
|
|
2118
|
+
jobId,
|
|
2119
|
+
kind: job.kind,
|
|
2120
|
+
reason: 'input'
|
|
2121
|
+
});
|
|
2122
|
+
if (recorded.parked) await announceAiJobTransition(recorded.job, 'needs-review');
|
|
2123
|
+
return {
|
|
2124
|
+
outcome: 'needs_input',
|
|
2125
|
+
job: recorded.job
|
|
2126
|
+
};
|
|
2127
|
+
}
|
|
2075
2128
|
if (review && recorded.job.status === 'needs_review') {
|
|
2076
2129
|
var _reservation_free6;
|
|
2077
2130
|
// Nobody parked the job but its own step, so the row names no actor, as
|
|
@@ -2199,6 +2252,7 @@ async function transition(firestore, orgId, jobId, apply) {
|
|
|
2199
2252
|
const attempt = async (candidate, left, first)=>{
|
|
2200
2253
|
const { orgId, jobId } = candidate;
|
|
2201
2254
|
try {
|
|
2255
|
+
var _current_input_fields, _current_input;
|
|
2202
2256
|
const current = await getAiJob(options.firestore, orgId, jobId);
|
|
2203
2257
|
// A step that needs more time than is left is not started (AGL-2907): a
|
|
2204
2258
|
// provider call the abort cuts off is billed upstream and metered
|
|
@@ -2209,6 +2263,19 @@ async function transition(firestore, orgId, jobId, apply) {
|
|
|
2209
2263
|
if (first) result.remaining += 1;
|
|
2210
2264
|
return;
|
|
2211
2265
|
}
|
|
2266
|
+
// A job waiting for a person's answer (AGL-3978) is theirs to resume:
|
|
2267
|
+
// it rests again, at the back of the parked queue, so it never holds a
|
|
2268
|
+
// place a meter park could use.
|
|
2269
|
+
if ((current == null ? void 0 : current.status) === 'needs_input' && ((_current_input = current.input) == null ? void 0 : (_current_input_fields = _current_input.fields) == null ? void 0 : _current_input_fields.length)) {
|
|
2270
|
+
await transition(options.firestore, orgId, jobId, (job)=>{
|
|
2271
|
+
var _job_input_fields, _job_input;
|
|
2272
|
+
return job.status === 'needs_input' && ((_job_input = job.input) == null ? void 0 : (_job_input_fields = _job_input.fields) == null ? void 0 : _job_input_fields.length) ? {
|
|
2273
|
+
updatedAt: new Date(now())
|
|
2274
|
+
} : null;
|
|
2275
|
+
});
|
|
2276
|
+
if (first) result.skipped += 1;
|
|
2277
|
+
return;
|
|
2278
|
+
}
|
|
2212
2279
|
if ((current == null ? void 0 : current.status) === 'needs_input') {
|
|
2213
2280
|
await transition(options.firestore, orgId, jobId, (job)=>job.status === 'needs_input' ? {
|
|
2214
2281
|
status: 'queued',
|