@cloudhal/cli 0.0.0-stage → 0.1.0
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/LICENSE +202 -0
- package/README.md +191 -2
- package/dist/assets/skills/comment-triage/SKILL.md +34 -0
- package/dist/assets/skills/comment-triage/evals/nightly-queue.json +13 -0
- package/dist/assets/skills/publish-article/SKILL.md +44 -0
- package/dist/assets/skills/publish-article/evals/file-under-category.json +10 -0
- package/dist/assets/skills/publish-article/evals/publish-draft.json +8 -0
- package/dist/assets/skills/publish-article/evals/schedule-draft.json +10 -0
- package/dist/assets/skills/publish-article/references/editorial-checklist.md +9 -0
- package/dist/assets/skills/rollback/SKILL.md +23 -0
- package/dist/assets/skills/rollback/evals/revert-last.json +4 -0
- package/dist/assets/skills/safe-edit/SKILL.md +29 -0
- package/dist/assets/skills/safe-edit/evals/retitle.json +4 -0
- package/dist/assets/skills/safe-edit/references/retagging.md +8 -0
- package/dist/assets/skills/site-bootstrap/SKILL.md +29 -0
- package/dist/assets/skills/site-bootstrap/evals/empty-site.json +9 -0
- package/dist/assets/skills/site-bootstrap/references/content-guidelines.md +6 -0
- package/dist/assets/skills/site-design/SKILL.md +31 -0
- package/dist/assets/skills/site-design/evals/landing-page.json +12 -0
- package/dist/assets/skills/site-design/references/checklist.md +10 -0
- package/dist/assets/skills/site-design/references/guidance.md +13 -0
- package/dist/assets/skills/site-design/references/page-recipes.md +34 -0
- package/dist/assets/skills/site-design/references/tokens.md +40 -0
- package/dist/assets/skills/stale-review/SKILL.md +40 -0
- package/dist/assets/skills/stale-review/evals/weekly-review.json +13 -0
- package/dist/assets/starters/blog/.yarnrc.yml +2 -0
- package/dist/assets/starters/blog/README.md +46 -0
- package/dist/assets/starters/blog/_gitignore +5 -0
- package/dist/assets/starters/blog/astro.config.mjs +40 -0
- package/dist/assets/starters/blog/package.json +35 -0
- package/dist/assets/starters/blog/public/favicon.ico +0 -0
- package/dist/assets/starters/blog/public/favicon.svg +1 -0
- package/dist/assets/starters/blog/public/fonts/fraunces-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/fraunces-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/fraunces-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/inter-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/inter-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/inter-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/jetbrains-mono-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/jetbrains-mono-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/source-sans-3-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/source-sans-3-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/source-sans-3-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/source-serif-4-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/source-serif-4-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/source-serif-4-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/space-grotesk-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/space-grotesk-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/space-grotesk-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/src/DESIGN.md +42 -0
- package/dist/assets/starters/blog/src/blocks.ts +45 -0
- package/dist/assets/starters/blog/src/components/Archive.astro +108 -0
- package/dist/assets/starters/blog/src/components/Article.astro +105 -0
- package/dist/assets/starters/blog/src/components/Breadcrumbs.astro +25 -0
- package/dist/assets/starters/blog/src/components/EntryList.astro +54 -0
- package/dist/assets/starters/blog/src/components/LatestPosts.astro +30 -0
- package/dist/assets/starters/blog/src/components/MenuPanel.astro +46 -0
- package/dist/assets/starters/blog/src/components/NavLink.astro +27 -0
- package/dist/assets/starters/blog/src/components/NavMenu.astro +95 -0
- package/dist/assets/starters/blog/src/components/NotFound.astro +27 -0
- package/dist/assets/starters/blog/src/components/PostTerms.astro +33 -0
- package/dist/assets/starters/blog/src/components/RelatedPosts.astro +20 -0
- package/dist/assets/starters/blog/src/components/Search.astro +57 -0
- package/dist/assets/starters/blog/src/components/SearchDialog.astro +46 -0
- package/dist/assets/starters/blog/src/components/blocks/Testimonial.astro +18 -0
- package/dist/assets/starters/blog/src/env.d.ts +5 -0
- package/dist/assets/starters/blog/src/fonts.ts +15 -0
- package/dist/assets/starters/blog/src/icons.ts +12 -0
- package/dist/assets/starters/blog/src/layouts/Base.astro +426 -0
- package/dist/assets/starters/blog/src/middleware.ts +2 -0
- package/dist/assets/starters/blog/src/pages/[...path]/llms.txt.ts +40 -0
- package/dist/assets/starters/blog/src/pages/[...path]/rss.xml.ts +93 -0
- package/dist/assets/starters/blog/src/pages/[...path]/search.json.ts +23 -0
- package/dist/assets/starters/blog/src/pages/[...path].astro +449 -0
- package/dist/assets/starters/blog/src/pages/llms.txt.ts +21 -0
- package/dist/assets/starters/blog/src/pages/robots.txt.ts +13 -0
- package/dist/assets/starters/blog/src/pages/rss.xml.ts +25 -0
- package/dist/assets/starters/blog/src/pages/search.json.ts +21 -0
- package/dist/assets/starters/blog/src/pages/sitemap.xml.ts +23 -0
- package/dist/assets/starters/blog/src/settings.ts +312 -0
- package/dist/assets/starters/blog/src/strings.ts +269 -0
- package/dist/assets/starters/blog/src/styles/features/ambient.css +185 -0
- package/dist/assets/starters/blog/src/styles/features/article.css +215 -0
- package/dist/assets/starters/blog/src/styles/features/blocks.css +93 -0
- package/dist/assets/starters/blog/src/styles/features/carousel.css +266 -0
- package/dist/assets/starters/blog/src/styles/features/chrome-menus.css +264 -0
- package/dist/assets/starters/blog/src/styles/features/chrome.css +193 -0
- package/dist/assets/starters/blog/src/styles/features/comments.css +75 -0
- package/dist/assets/starters/blog/src/styles/features/icons.css +70 -0
- package/dist/assets/starters/blog/src/styles/features/languages.css +34 -0
- package/dist/assets/starters/blog/src/styles/features/live-surfaces.css +235 -0
- package/dist/assets/starters/blog/src/styles/features/motion-effects.css +217 -0
- package/dist/assets/starters/blog/src/styles/features/motion-scroll.css +309 -0
- package/dist/assets/starters/blog/src/styles/features/motion.css +254 -0
- package/dist/assets/starters/blog/src/styles/features/overlays.css +324 -0
- package/dist/assets/starters/blog/src/styles/features/prose.css +140 -0
- package/dist/assets/starters/blog/src/styles/features/search-dialog.css +144 -0
- package/dist/assets/starters/blog/src/styles/features/search.css +59 -0
- package/dist/assets/starters/blog/src/styles/features/surface-media.css +123 -0
- package/dist/assets/starters/blog/src/styles/features/surfaces.css +309 -0
- package/dist/assets/starters/blog/src/styles/features/tokens.css +100 -0
- package/dist/assets/starters/blog/src/styles/fonts.css +113 -0
- package/dist/assets/starters/blog/src/styles/global.css +30 -0
- package/dist/assets/starters/blog/src/theme.ts +48 -0
- package/dist/assets/starters/blog/tsconfig.json +5 -0
- package/dist/assets/studio/.assetsignore +2 -0
- package/dist/assets/studio/_headers +14 -0
- package/dist/assets/studio/assets/AccountPage-Dzr5d8sk.js +2 -0
- package/dist/assets/studio/assets/ActivityPage-C0HlgSI5.js +2 -0
- package/dist/assets/studio/assets/AgentModes-B81a2nUo.js +2 -0
- package/dist/assets/studio/assets/AgentsPage-BzCOyX4g.js +2 -0
- package/dist/assets/studio/assets/AnalyticsPage-7yb7DBOH.js +3 -0
- package/dist/assets/studio/assets/ApprovalsPage-_tqc02mk.js +3 -0
- package/dist/assets/studio/assets/Archive.es-C0uhxndN.js +2 -0
- package/dist/assets/studio/assets/ArrowClockwise.es-BA0pzb0Y.js +2 -0
- package/dist/assets/studio/assets/ArrowCounterClockwise.es-Bn2jikgp.js +2 -0
- package/dist/assets/studio/assets/ArrowSquareOut.es-BWeH9CSw.js +2 -0
- package/dist/assets/studio/assets/ArrowUp.es-Bh0pVk-S.js +2 -0
- package/dist/assets/studio/assets/ArrowsMerge.es-gfKOrxGd.js +2 -0
- package/dist/assets/studio/assets/ArticleEditorPage-Bcb81dXC.js +2 -0
- package/dist/assets/studio/assets/ArticlesPage-152INxny.js +2 -0
- package/dist/assets/studio/assets/AssetPage-ddWJt0hs.js +2 -0
- package/dist/assets/studio/assets/Audit-BCzf5vBq.js +2 -0
- package/dist/assets/studio/assets/AuditBadges-C4sNtzf9.js +2 -0
- package/dist/assets/studio/assets/AuthLayout-Cidy_2Lu.js +2 -0
- package/dist/assets/studio/assets/AutocompleteItem-drxau0wm3735nihq-C-iAptWL.js +2 -0
- package/dist/assets/studio/assets/AutomationsPage-Dc6g5v_v.js +2 -0
- package/dist/assets/studio/assets/BlockPropsForm-fj5gMAa0.js +2 -0
- package/dist/assets/studio/assets/BlockSection-CnUXl5Sg.js +2 -0
- package/dist/assets/studio/assets/BodyChanges-M0zcsivC.js +4 -0
- package/dist/assets/studio/assets/BookOpenText.es-BfXzf_Vn.js +2 -0
- package/dist/assets/studio/assets/BuildPage-C1Nwy4dt.js +2 -0
- package/dist/assets/studio/assets/CSPContext-ctyrgg64girv38ls-2UvfJ5m0.js +2 -0
- package/dist/assets/studio/assets/CalendarCheck.es-DWymuVqi.js +2 -0
- package/dist/assets/studio/assets/CalendarPlus.es-YGFiosIm.js +2 -0
- package/dist/assets/studio/assets/CaretLeft.es-BUnHcaxq.js +2 -0
- package/dist/assets/studio/assets/CaretRight.es-D_coqYai.js +2 -0
- package/dist/assets/studio/assets/CaretUp.es-DBg3pdpL.js +2 -0
- package/dist/assets/studio/assets/CheckCircle.es-XJ9Tr9Tu.js +2 -0
- package/dist/assets/studio/assets/ClockClockwise.es-1egHMnBk.js +2 -0
- package/dist/assets/studio/assets/ClockCountdown.es-BR_zz6vi.js +2 -0
- package/dist/assets/studio/assets/Columns-DGrju-Ia.js +2 -0
- package/dist/assets/studio/assets/ComboboxEmpty-o0q20j2l2syar9kx-Bf-42bzQ.js +2 -0
- package/dist/assets/studio/assets/CommandMenu-CH5CJ8Kg.js +2 -0
- package/dist/assets/studio/assets/CommentThreadControls-D04pICZT.js +2 -0
- package/dist/assets/studio/assets/CommentThreadPage-BP0N9T4z.js +2 -0
- package/dist/assets/studio/assets/CommenterPage-CeFR4pn4.js +2 -0
- package/dist/assets/studio/assets/Comments-CnfKPS2z.js +2 -0
- package/dist/assets/studio/assets/CommentsPage-BlP_knlf.js +2 -0
- package/dist/assets/studio/assets/CompositeItem-hzuk5x3e5zsfgnyj-XaSr50DG.js +2 -0
- package/dist/assets/studio/assets/CompositeRoot-g72lchaerolf5dc9-B2BokDIY.js +2 -0
- package/dist/assets/studio/assets/ConfirmDialog-DEHkMoTj.js +2 -0
- package/dist/assets/studio/assets/Crumbs-Ci_RdgHU.js +2 -0
- package/dist/assets/studio/assets/DeviceMobile.es-B4PwJ85Q.js +2 -0
- package/dist/assets/studio/assets/DeviceTablet.es-BpxIF5z6.js +2 -0
- package/dist/assets/studio/assets/DialogRoot-hl3genvzl9h8ridm-BRUDLjaw.js +2 -0
- package/dist/assets/studio/assets/DialogTrigger-g44cuem7n4wez533-B5K8lQD3.js +2 -0
- package/dist/assets/studio/assets/DirectionalIcon-BKKMj3KT.js +2 -0
- package/dist/assets/studio/assets/DotsThree.es-C-pT5SgE.js +2 -0
- package/dist/assets/studio/assets/DownloadSimple.es-Cq4-UK-k.js +2 -0
- package/dist/assets/studio/assets/EditorLayout-DVegYcZT.js +2 -0
- package/dist/assets/studio/assets/EditorPreview-DsZG4-oJ.js +2 -0
- package/dist/assets/studio/assets/Elevation-Ca3Q8sk-.js +2 -0
- package/dist/assets/studio/assets/ElevationRequest-B0_Q_gVT.js +2 -0
- package/dist/assets/studio/assets/EnvelopeSimple.es-g-hlqV74.js +2 -0
- package/dist/assets/studio/assets/Eye.es-DqovdtPt.js +2 -0
- package/dist/assets/studio/assets/EyeSlash.es-YoqigHIr.js +2 -0
- package/dist/assets/studio/assets/File.es-VYp_u8mn.js +2 -0
- package/dist/assets/studio/assets/FolderSimple.es-CbGWmBJc.js +2 -0
- package/dist/assets/studio/assets/FolderSimplePlus.es-C9Fl6ewY.js +2 -0
- package/dist/assets/studio/assets/ForgotPasswordPage-LNtBXfC8.js +2 -0
- package/dist/assets/studio/assets/Funnel.es-L1Sdi8-A.js +2 -0
- package/dist/assets/studio/assets/Gating-BdY3KxOv.js +2 -0
- package/dist/assets/studio/assets/Gauge.es-D0Pz39Z0.js +2 -0
- package/dist/assets/studio/assets/GitDiff.es-fB1csyEF.js +2 -0
- package/dist/assets/studio/assets/GlobeHemisphereWest.es-C34XiLRk.js +2 -0
- package/dist/assets/studio/assets/GovernanceDialog-DR0m4Bhp.js +2 -0
- package/dist/assets/studio/assets/HandPalm.es-CB5OlkOg.js +2 -0
- package/dist/assets/studio/assets/Heartbeat.es-DZziz772.js +2 -0
- package/dist/assets/studio/assets/Hourglass.es-aqS22q0y.js +2 -0
- package/dist/assets/studio/assets/House.es-BQyZgbwu.js +2 -0
- package/dist/assets/studio/assets/IconBase.es-BZDpYMnj.js +2 -0
- package/dist/assets/studio/assets/Image.es-BcOUS77O.js +2 -0
- package/dist/assets/studio/assets/InsetPanel-CHSg953_.js +2 -0
- package/dist/assets/studio/assets/InvitePage-CZ-4Clg6.js +2 -0
- package/dist/assets/studio/assets/Key.es-DE551dL3.js +2 -0
- package/dist/assets/studio/assets/Lightning.es-D0IF-5OW.js +2 -0
- package/dist/assets/studio/assets/LinkBreak.es-BvGThatb.js +2 -0
- package/dist/assets/studio/assets/LinkSimple.es-BB_3GfFO.js +2 -0
- package/dist/assets/studio/assets/ListBullets.es-DzSyoNA1.js +2 -0
- package/dist/assets/studio/assets/ListToolbar-CE70usqf.js +2 -0
- package/dist/assets/studio/assets/LockSimple.es-D3HQqnoN.js +2 -0
- package/dist/assets/studio/assets/LoginPage-BfUjD7n3.js +2 -0
- package/dist/assets/studio/assets/MediaPage-D7h4RBbB.js +2 -0
- package/dist/assets/studio/assets/MediaPicker-DlJLkaGR.js +2 -0
- package/dist/assets/studio/assets/MediaUpload-BpTyBTHG.js +2 -0
- package/dist/assets/studio/assets/MembersPage-BNu1FOBL.js +2 -0
- package/dist/assets/studio/assets/Menus-ChmyHrPc.js +2 -0
- package/dist/assets/studio/assets/Monitor.es-CeaPWdET.js +2 -0
- package/dist/assets/studio/assets/NavigationPage-C10U827y.js +2 -0
- package/dist/assets/studio/assets/NewSiteDialog-D7SUMMY3.js +2 -0
- package/dist/assets/studio/assets/PageEditorPage-DBJUAqjk.js +5 -0
- package/dist/assets/studio/assets/PagesPage-Bwm8b58m.js +2 -0
- package/dist/assets/studio/assets/PasswordField-Cn0g88_l.js +2 -0
- package/dist/assets/studio/assets/PencilSimple.es-CsZ-k9wK.js +2 -0
- package/dist/assets/studio/assets/Plus.es-XNm1OB5Q.js +2 -0
- package/dist/assets/studio/assets/PreviewPanel-ChFoJD1H.js +2 -0
- package/dist/assets/studio/assets/Prohibit.es-CAvPLn3v.js +2 -0
- package/dist/assets/studio/assets/ProhibitInset.es-DsnL02EX.js +2 -0
- package/dist/assets/studio/assets/ProjectPage-e5BSkkda.js +2 -0
- package/dist/assets/studio/assets/Question.es-BqQtQle2.js +2 -0
- package/dist/assets/studio/assets/Readers-CvhU7wCy.js +3 -0
- package/dist/assets/studio/assets/RedirectDialog-DCNKLV43.js +2 -0
- package/dist/assets/studio/assets/RedirectsPage-CR1Di-T6.js +2 -0
- package/dist/assets/studio/assets/ReleaseApproval-gkciKrWx.js +2 -0
- package/dist/assets/studio/assets/ReleasePage-BRa167d9.js +2 -0
- package/dist/assets/studio/assets/ReleaseParts-BEMf510p.js +2 -0
- package/dist/assets/studio/assets/ResetPasswordPage-DLpZlh7i.js +2 -0
- package/dist/assets/studio/assets/RowMenu-BTHdea9k.js +2 -0
- package/dist/assets/studio/assets/ScheduleCard-BQWUIwPX.js +2 -0
- package/dist/assets/studio/assets/ScheduleDialog-B-QQ_Z3F.js +2 -0
- package/dist/assets/studio/assets/ScheduleHistoryPage-wv3pKfaZ.js +2 -0
- package/dist/assets/studio/assets/ScheduleStatusBadge-DHGmEyDv.js +2 -0
- package/dist/assets/studio/assets/SchedulerStalled-DUmZxbV4.js +2 -0
- package/dist/assets/studio/assets/Schedules-R6HfROIM.js +3 -0
- package/dist/assets/studio/assets/SchedulesPage-CIbzmMag.js +2 -0
- package/dist/assets/studio/assets/ScopeBadge-DM2PO5Xk.js +2 -0
- package/dist/assets/studio/assets/SectionCard-SzT8t6oM.js +2 -0
- package/dist/assets/studio/assets/Seo-CYyFHl3G.js +2 -0
- package/dist/assets/studio/assets/SeoPreview-tarmyT2Y.js +2 -0
- package/dist/assets/studio/assets/Settings-C407Vxml.js +2 -0
- package/dist/assets/studio/assets/ShieldCheck.es-BOXTHH7h.js +2 -0
- package/dist/assets/studio/assets/ShieldWarning.es-DPxoDMpT.js +2 -0
- package/dist/assets/studio/assets/SignIn.es-jAzHZG6b.js +2 -0
- package/dist/assets/studio/assets/SiteAccessField-D34vIaAo.js +2 -0
- package/dist/assets/studio/assets/SiteOverviewPage-Bm0-f1bp.js +4 -0
- package/dist/assets/studio/assets/SiteSettingsPage-tq4SzyMQ.js +3 -0
- package/dist/assets/studio/assets/SitesPage-B2QS2zaq.js +4 -0
- package/dist/assets/studio/assets/SkillsPage-BtFk0bBw.js +3 -0
- package/dist/assets/studio/assets/SlidersHorizontal.es-Bg-14CTG.js +2 -0
- package/dist/assets/studio/assets/SnapshotsPage-cltqpJLv.js +2 -0
- package/dist/assets/studio/assets/SourceEditor-UA14mu6Q.js +16 -0
- package/dist/assets/studio/assets/Sparkle.es-OfyfGCDe.js +2 -0
- package/dist/assets/studio/assets/Star.es-DhrrAurR.js +2 -0
- package/dist/assets/studio/assets/StatTile-DyU32i8V.js +2 -0
- package/dist/assets/studio/assets/Status-BgB2wP8j.js +2 -0
- package/dist/assets/studio/assets/StatusActions-tY-DY4Wa.js +3 -0
- package/dist/assets/studio/assets/StopCircle.es-a6tRK2fc.js +2 -0
- package/dist/assets/studio/assets/Table.es-6S52tmK7.js +2 -0
- package/dist/assets/studio/assets/TableSkeleton-CbqPrk-p.js +2 -0
- package/dist/assets/studio/assets/TagsMigration-BggsWH7A.js +2 -0
- package/dist/assets/studio/assets/Taxonomy-CeQUBEeZ.js +2 -0
- package/dist/assets/studio/assets/TaxonomyPage-hm0h5Ug5.js +2 -0
- package/dist/assets/studio/assets/TermEditorPage-tRUgbC0f.js +2 -0
- package/dist/assets/studio/assets/TermPickers-cZIwRG5t.js +2 -0
- package/dist/assets/studio/assets/TerminalWindow.es-DRFBT_Ie.js +2 -0
- package/dist/assets/studio/assets/TextAa.es-CuNv62rI.js +2 -0
- package/dist/assets/studio/assets/Toast-BHyBhGXI.js +2 -0
- package/dist/assets/studio/assets/ToolbarRootContext-eqk40r8uh4h6r211-DBIMpkd1.js +2 -0
- package/dist/assets/studio/assets/TranslationList-Cc4K8uy_.js +2 -0
- package/dist/assets/studio/assets/TranslationsPage-MFJsWMgX.js +2 -0
- package/dist/assets/studio/assets/Trash.es-CxKLVMOQ.js +2 -0
- package/dist/assets/studio/assets/User.es-BLqDj7XT.js +2 -0
- package/dist/assets/studio/assets/UserCircle.es-D4ZFhshn.js +2 -0
- package/dist/assets/studio/assets/Warning.es-LZXqwHRF.js +2 -0
- package/dist/assets/studio/assets/XCircle.es-3fJHkmwA.js +2 -0
- package/dist/assets/studio/assets/account-BXWuYNDB.js +2 -0
- package/dist/assets/studio/assets/activity-C0we9-m8.js +2 -0
- package/dist/assets/studio/assets/agents-BBsojpg9.js +4 -0
- package/dist/assets/studio/assets/aiSettings.ar-BhZdR6qG.js +2 -0
- package/dist/assets/studio/assets/aiSettings.de-CXaCGWio.js +2 -0
- package/dist/assets/studio/assets/aiSettings.en-C8dj9xkg.js +2 -0
- package/dist/assets/studio/assets/aiSettings.es-avCBqU5-.js +2 -0
- package/dist/assets/studio/assets/aiSettings.fa-CKFnDB0Q.js +2 -0
- package/dist/assets/studio/assets/aiSettings.fr-35_A52Su.js +2 -0
- package/dist/assets/studio/assets/aiSettings.he-CbsdxPL1.js +2 -0
- package/dist/assets/studio/assets/aiSettings.hi-y4QpRZgC.js +2 -0
- package/dist/assets/studio/assets/aiSettings.id-CO4I-Nr1.js +2 -0
- package/dist/assets/studio/assets/aiSettings.it-B-OytWUY.js +2 -0
- package/dist/assets/studio/assets/aiSettings.ja-ClLGRpLX.js +2 -0
- package/dist/assets/studio/assets/aiSettings.ko-CedNf6wA.js +2 -0
- package/dist/assets/studio/assets/aiSettings.nl-DuEVpMb_.js +2 -0
- package/dist/assets/studio/assets/aiSettings.pl-wXUoviqN.js +2 -0
- package/dist/assets/studio/assets/aiSettings.pt-BR-Dm3HTskY.js +2 -0
- package/dist/assets/studio/assets/aiSettings.ru-DOWh4XHX.js +2 -0
- package/dist/assets/studio/assets/aiSettings.tr-xC2kyYK8.js +2 -0
- package/dist/assets/studio/assets/aiSettings.uk-DrE0ioQJ.js +2 -0
- package/dist/assets/studio/assets/aiSettings.zh-Hans-CBZ7ePsr.js +2 -0
- package/dist/assets/studio/assets/analytics-range-BqKm9TTo.js +2 -0
- package/dist/assets/studio/assets/analytics.ar-DFKPNZOf.js +2 -0
- package/dist/assets/studio/assets/analytics.de-CE2_NGRB.js +2 -0
- package/dist/assets/studio/assets/analytics.en-BjRe9VE9.js +2 -0
- package/dist/assets/studio/assets/analytics.es-DmWAl1lg.js +2 -0
- package/dist/assets/studio/assets/analytics.fa-YJ3Xk-rc.js +2 -0
- package/dist/assets/studio/assets/analytics.fr-BDyCguOG.js +2 -0
- package/dist/assets/studio/assets/analytics.he-BJ5kfLvV.js +2 -0
- package/dist/assets/studio/assets/analytics.hi-Cc9ZxzNg.js +2 -0
- package/dist/assets/studio/assets/analytics.id-CyUlDO82.js +2 -0
- package/dist/assets/studio/assets/analytics.it-NlLzAH3s.js +2 -0
- package/dist/assets/studio/assets/analytics.ja-DWrGTLXw.js +2 -0
- package/dist/assets/studio/assets/analytics.ko-BtZwKyZk.js +2 -0
- package/dist/assets/studio/assets/analytics.nl-CAny5E3q.js +2 -0
- package/dist/assets/studio/assets/analytics.pl-CpcS7l9b.js +2 -0
- package/dist/assets/studio/assets/analytics.pt-BR-BAK_LNqi.js +2 -0
- package/dist/assets/studio/assets/analytics.ru-BhvbWlC_.js +2 -0
- package/dist/assets/studio/assets/analytics.tr-aCP2FxF6.js +2 -0
- package/dist/assets/studio/assets/analytics.uk-CAGnu8AX.js +2 -0
- package/dist/assets/studio/assets/analytics.zh-Hans-NF-Le9KQ.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.ar-C5r58XUn.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.de-DVXtSeKl.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.en-Dn_QYKbo.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.es-BdkgtxLM.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.fa-CPuBleHO.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.fr-BSq7kZAb.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.he-Bt4A9H0D.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.hi-ii2QSWPw.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.id-CIZyEXYS.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.it-Sevpe-t4.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.ja-C_52hTsO.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.ko-Bpr2STd6.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.nl-DYfP6Uld.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.pl-BuJZVVIi.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.pt-BR-C4BNIRKw.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.ru-CiMbwjeg.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.tr-Csuqe5q9.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.uk-DVRqhoqA.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.zh-Hans-Y3Ei4xGe.js +2 -0
- package/dist/assets/studio/assets/api-Sbz4Rbu7.js +4 -0
- package/dist/assets/studio/assets/api-errors-FBnZYqCy.js +2 -0
- package/dist/assets/studio/assets/appearance.ar-CjHmVq1_.js +2 -0
- package/dist/assets/studio/assets/appearance.de-RD44SQgd.js +2 -0
- package/dist/assets/studio/assets/appearance.en-mFJuOtIH.js +2 -0
- package/dist/assets/studio/assets/appearance.es-Dn1vcVTZ.js +2 -0
- package/dist/assets/studio/assets/appearance.fa-DclMXXrQ.js +2 -0
- package/dist/assets/studio/assets/appearance.fr-CRqH6-pt.js +2 -0
- package/dist/assets/studio/assets/appearance.he-COP1zzas.js +2 -0
- package/dist/assets/studio/assets/appearance.hi-CnnlhSEx.js +2 -0
- package/dist/assets/studio/assets/appearance.id-aSp7eOOW.js +2 -0
- package/dist/assets/studio/assets/appearance.it-D4AXypSF.js +2 -0
- package/dist/assets/studio/assets/appearance.ja-BoMHIaWB.js +2 -0
- package/dist/assets/studio/assets/appearance.ko-BqysekcN.js +2 -0
- package/dist/assets/studio/assets/appearance.nl-DkQd7NMN.js +2 -0
- package/dist/assets/studio/assets/appearance.pl-YvYqfbPP.js +2 -0
- package/dist/assets/studio/assets/appearance.pt-BR-8R80D9mc.js +2 -0
- package/dist/assets/studio/assets/appearance.ru-CLiGYIyF.js +2 -0
- package/dist/assets/studio/assets/appearance.tr-T9TtsGiz.js +2 -0
- package/dist/assets/studio/assets/appearance.uk-C-AHWC43.js +2 -0
- package/dist/assets/studio/assets/appearance.zh-Hans-0HyzAidT.js +2 -0
- package/dist/assets/studio/assets/approvals-BB74ogKx.js +2 -0
- package/dist/assets/studio/assets/ar-6o5tS7uI.js +6 -0
- package/dist/assets/studio/assets/ar-CS6h3U7d.js +2 -0
- package/dist/assets/studio/assets/areArraysEqual-bcx201k1x9ziizym-DpJhDMgE.js +2 -0
- package/dist/assets/studio/assets/auth-BXDbnIpO.js +4 -0
- package/dist/assets/studio/assets/badge-dq8bx752b9dp7dst-D1xrG37q.js +2 -0
- package/dist/assets/studio/assets/banner-msnmqm7of2lck01x-DRzQHuca.js +2 -0
- package/dist/assets/studio/assets/bash-jpzh6zbf5237424t-bmc95DGl.js +1 -0
- package/dist/assets/studio/assets/blockIcon-DmMm6cQr.js +2 -0
- package/dist/assets/studio/assets/blocks-CvH3xqPj.js +3 -0
- package/dist/assets/studio/assets/body-blocks-D3YZCH_O.js +6 -0
- package/dist/assets/studio/assets/bodyEditor.ar-DIDA9Sn4.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.de-qfipY5HQ.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.en-B8FW4NF8.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.es-t2G9FCJv.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.fa-C4B5tIHm.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.fr-B93u2T8B.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.he-AjBYzDbH.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.hi-BL4B8EIK.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.id-DaiRImPk.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.it-COSRU27e.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.ja-4ELaS2Vi.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.ko-DzXpHAYj.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.nl-7a_XD53a.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.pl-o2L5fJfH.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.pt-BR-CRnn6BFL.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.ru-BS2txhVI.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.tr-DXm3ACCU.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.uk-D32F3Hv3.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.zh-Hans-DzWUdSMX.js +2 -0
- package/dist/assets/studio/assets/build.ar-CvCBBGmP.js +2 -0
- package/dist/assets/studio/assets/build.de-Dh25xQiI.js +2 -0
- package/dist/assets/studio/assets/build.en-Byn4-h2I.js +2 -0
- package/dist/assets/studio/assets/build.es-ClTjZJkv.js +2 -0
- package/dist/assets/studio/assets/build.fa-BKTGFm97.js +2 -0
- package/dist/assets/studio/assets/build.fr-DWmKJ0b2.js +2 -0
- package/dist/assets/studio/assets/build.he-CMkIxK5A.js +2 -0
- package/dist/assets/studio/assets/build.hi-bSlyuwEN.js +2 -0
- package/dist/assets/studio/assets/build.id-DYXKpcM4.js +2 -0
- package/dist/assets/studio/assets/build.it-DshuVK4I.js +2 -0
- package/dist/assets/studio/assets/build.ja-DUQGeTAB.js +2 -0
- package/dist/assets/studio/assets/build.ko-BgOecD0b.js +2 -0
- package/dist/assets/studio/assets/build.nl-CqcFxeNS.js +2 -0
- package/dist/assets/studio/assets/build.pl-DOh2FAZL.js +2 -0
- package/dist/assets/studio/assets/build.pt-BR-DIS1WMA1.js +2 -0
- package/dist/assets/studio/assets/build.ru-CT93GG0h.js +2 -0
- package/dist/assets/studio/assets/build.tr-BJ066yTf.js +2 -0
- package/dist/assets/studio/assets/build.uk-foNFYsBE.js +2 -0
- package/dist/assets/studio/assets/build.zh-Hans-D0aEdiJR.js +2 -0
- package/dist/assets/studio/assets/button-pa1bq9b85hawg41a-BcGpLLER.js +2 -0
- package/dist/assets/studio/assets/calendar-locale-D4aJYygH.js +2 -0
- package/dist/assets/studio/assets/charts-DL9SbRU8.js +39 -0
- package/dist/assets/studio/assets/checkbox-lbo436duy7krxcsk-BmusNS83.js +6 -0
- package/dist/assets/studio/assets/clamp-jcjhzx71s6wt1rnc-D0kAXd-u.js +2 -0
- package/dist/assets/studio/assets/clipboard-text-gd6s3n1bqse9zgt8-DXnAaY6R.js +2 -0
- package/dist/assets/studio/assets/code-eu8kzwqnlhoyin24-_5wcX_Lj.js +2 -0
- package/dist/assets/studio/assets/collapsible-l8g94on4w7qfosmn-udgP1bfF.js +2 -0
- package/dist/assets/studio/assets/combobox-hdxtsm2gqcxxgfju-BzzDlvd3.js +2 -0
- package/dist/assets/studio/assets/comment-model-CArtcrfg.js +4 -0
- package/dist/assets/studio/assets/comment-settings-M6JXROM1.js +2 -0
- package/dist/assets/studio/assets/comments-B1PIozwq.js +2 -0
- package/dist/assets/studio/assets/comments.ar-7NPLRbXL.js +2 -0
- package/dist/assets/studio/assets/comments.de-BML9h-8i.js +2 -0
- package/dist/assets/studio/assets/comments.en-DXe1aP-J.js +2 -0
- package/dist/assets/studio/assets/comments.es-B9qnqc6H.js +2 -0
- package/dist/assets/studio/assets/comments.fa-q5l6LTXH.js +2 -0
- package/dist/assets/studio/assets/comments.fr-7tNmTLTd.js +2 -0
- package/dist/assets/studio/assets/comments.he-C6eZFBr_.js +2 -0
- package/dist/assets/studio/assets/comments.hi-BBW7jI8Z.js +2 -0
- package/dist/assets/studio/assets/comments.id-XxjsE0p0.js +2 -0
- package/dist/assets/studio/assets/comments.it-3QvytToA.js +2 -0
- package/dist/assets/studio/assets/comments.ja-SEFPl5By.js +2 -0
- package/dist/assets/studio/assets/comments.ko-B_laV8JW.js +2 -0
- package/dist/assets/studio/assets/comments.nl-sc5X58Ly.js +2 -0
- package/dist/assets/studio/assets/comments.pl-DF090zb0.js +2 -0
- package/dist/assets/studio/assets/comments.pt-BR-DItdiBpU.js +2 -0
- package/dist/assets/studio/assets/comments.ru-BQjNpLAH.js +2 -0
- package/dist/assets/studio/assets/comments.tr-B22wAK59.js +2 -0
- package/dist/assets/studio/assets/comments.uk-D7MXty4-.js +2 -0
- package/dist/assets/studio/assets/comments.zh-Hans-Cuxj9eiV.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.ar-CFEC5U3P.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.de-B7jRspXp.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.en-CjQdkMZH.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.es-hozx4ts0.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.fa-Idlvxfyt.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.fr-CUYc20e7.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.he-DXrfjejv.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.hi-Bc2QmPb_.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.id-BlqU87IM.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.it-BxURj-49.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.ja--0JkaZKL.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.ko-Bc51E0cW.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.nl-BAfV9gzf.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.pl-CqCY2bHr.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.pt-BR-C1W1xEAM.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.ru-BNldyy_U.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.tr-DoM2JLr_.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.uk-B07IS9-u.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.zh-Hans-iQA7XsFn.js +2 -0
- package/dist/assets/studio/assets/composite-ab8dmdfoj6tmhcn1-DBTnwEaq.js +2 -0
- package/dist/assets/studio/assets/core-n0de50o00ej2ecfe-gtt67pEc.js +13 -0
- package/dist/assets/studio/assets/countries-110m-CmKPZPcB.json +1 -0
- package/dist/assets/studio/assets/createToastManager-onmoqrmr8zo02rif-DtEv4lxV.js +2 -0
- package/dist/assets/studio/assets/css-j501gxq1am2gnikh-BsVw1vtW.js +2 -0
- package/dist/assets/studio/assets/date-picker-BSgojKR2.js +1 -0
- package/dist/assets/studio/assets/date-picker-cotkexrpqu5tjikv-C9Knj8LQ.js +2 -0
- package/dist/assets/studio/assets/de-BN-GS_nX.js +6 -0
- package/dist/assets/studio/assets/de-COZWf0tz.js +2 -0
- package/dist/assets/studio/assets/deleteLabels-DwQes2_M.js +2 -0
- package/dist/assets/studio/assets/dialog-glpnivujociqs9lh-BefDeRGC.js +2 -0
- package/dist/assets/studio/assets/diff-g2re0kj6fh27rgg5-woXpYk--.js +2 -0
- package/dist/assets/studio/assets/editor-C9MhZu7g.js +218 -0
- package/dist/assets/studio/assets/empty-hkvg3is3uc6dj1at-BGNUzomN.js +2 -0
- package/dist/assets/studio/assets/engine-javascript-e9xj8hhz9xfqhpnu-CaOb2Rd2.js +142 -0
- package/dist/assets/studio/assets/engine-oniguruma-ias56ildu01gf939-BO8SA_1o.js +2 -0
- package/dist/assets/studio/assets/errors-svQ83Q62.js +2 -0
- package/dist/assets/studio/assets/es-C1E3agwU.js +6 -0
- package/dist/assets/studio/assets/es-Cpr7u5Cz.js +2 -0
- package/dist/assets/studio/assets/fa-8y3tvKw6.js +2 -0
- package/dist/assets/studio/assets/fa-VZyv0VcS.js +6 -0
- package/dist/assets/studio/assets/format-DGE2c-4V.js +2 -0
- package/dist/assets/studio/assets/fr-IaaUvy1z.js +6 -0
- package/dist/assets/studio/assets/fr-IvKa5dhW.js +2 -0
- package/dist/assets/studio/assets/getElementTransform-cuiqmjglkrz4db6c-CjP1vzKy.js +2 -0
- package/dist/assets/studio/assets/github-light-hir7yctc38258pwt-EUqPIrTm.js +2 -0
- package/dist/assets/studio/assets/graphql-n9vlzkvcp2j19p7a-qc8EicCw.js +2 -0
- package/dist/assets/studio/assets/hcl-ohpfnrffs96hzyj5-Dh228itO.js +2 -0
- package/dist/assets/studio/assets/he-Ca3dnXtb.js +6 -0
- package/dist/assets/studio/assets/he-DG-oJz8N.js +2 -0
- package/dist/assets/studio/assets/hi-BXkaH5dy.js +6 -0
- package/dist/assets/studio/assets/hi-CngsNxV4.js +2 -0
- package/dist/assets/studio/assets/html-nimj6ljkkifnc9ni-_gDbiBIU.js +2 -0
- package/dist/assets/studio/assets/i18n-Cjiv6Esx.js +7 -0
- package/dist/assets/studio/assets/id-BuNEmn7g.js +6 -0
- package/dist/assets/studio/assets/id-CrWAlC6J.js +2 -0
- package/dist/assets/studio/assets/index-Boved2Nz.js +4 -0
- package/dist/assets/studio/assets/index-DaI1wvdp.css +2 -0
- package/dist/assets/studio/assets/inertValue-e0o6qvuef83v78fk-DAETOorM.js +2 -0
- package/dist/assets/studio/assets/inline-copy-text-gbd7jhwpor27l4rq-PUCnUeNZ.js +2 -0
- package/dist/assets/studio/assets/input-c8lv9ulv0kortliq-Cum0c7P1.js +5 -0
- package/dist/assets/studio/assets/input-group-fjr4r5ax0x78ppax-e-s-YUWj.js +2 -0
- package/dist/assets/studio/assets/input-h5ox92gf13ge04hp-jfy1uD8s.js +2 -0
- package/dist/assets/studio/assets/intl-C22KAx_l.js +2 -0
- package/dist/assets/studio/assets/it-BbkGji4q.js +2 -0
- package/dist/assets/studio/assets/it-DEB0m7yM.js +6 -0
- package/dist/assets/studio/assets/ja-BJv09PXI.js +6 -0
- package/dist/assets/studio/assets/ja-CLpIeite.js +2 -0
- package/dist/assets/studio/assets/javascript-b6fq9bl50fdj6813-BgS3c2Ky.js +2 -0
- package/dist/assets/studio/assets/json-h2g0z143t3cs13d7-qhed-kSA.js +2 -0
- package/dist/assets/studio/assets/jsonc-jxlzvingck161eej-CYpm1nAK.js +2 -0
- package/dist/assets/studio/assets/jsx-jp7a33937sef92sn-Bz0zcwM4.js +2 -0
- package/dist/assets/studio/assets/ko-Cikp2ojH.js +6 -0
- package/dist/assets/studio/assets/ko-u0y0T6iL.js +2 -0
- package/dist/assets/studio/assets/languages-CbQ722uB.js +2 -0
- package/dist/assets/studio/assets/layer-dialog-j5ywmzs46ccg6oqy-DyWF5y24.js +2 -0
- package/dist/assets/studio/assets/link-cqyfjezntvr53rh7-CwZJ95XT.js +10 -0
- package/dist/assets/studio/assets/markdown-eybeqjr58vfygtz1-BYOwaDjH.js +2 -0
- package/dist/assets/studio/assets/marked.esm-DCShygCS.js +68 -0
- package/dist/assets/studio/assets/media-DqHiLqTz.js +21 -0
- package/dist/assets/studio/assets/media.ar-Dx9z7Ceu.js +2 -0
- package/dist/assets/studio/assets/media.de-D6vlydhW.js +2 -0
- package/dist/assets/studio/assets/media.en-BT47PRGz.js +2 -0
- package/dist/assets/studio/assets/media.es-CDRleryS.js +2 -0
- package/dist/assets/studio/assets/media.fa-DXam9tY_.js +2 -0
- package/dist/assets/studio/assets/media.fr-DKfkWH0D.js +2 -0
- package/dist/assets/studio/assets/media.he-COj2GX3h.js +2 -0
- package/dist/assets/studio/assets/media.hi-1a0-Fk6b.js +2 -0
- package/dist/assets/studio/assets/media.id-CAgR7je9.js +2 -0
- package/dist/assets/studio/assets/media.it-huMn4qfV.js +2 -0
- package/dist/assets/studio/assets/media.ja-DIiDhxEt.js +2 -0
- package/dist/assets/studio/assets/media.ko-CEzTT9w2.js +2 -0
- package/dist/assets/studio/assets/media.nl-DAcAkgwj.js +2 -0
- package/dist/assets/studio/assets/media.pl-BIZYXHQa.js +2 -0
- package/dist/assets/studio/assets/media.pt-BR-C1Xda0__.js +2 -0
- package/dist/assets/studio/assets/media.ru-DQzNvBXO.js +2 -0
- package/dist/assets/studio/assets/media.tr-BaqtqqOw.js +2 -0
- package/dist/assets/studio/assets/media.uk-DGk-oYWc.js +2 -0
- package/dist/assets/studio/assets/media.zh-Hans-CrLAn2xd.js +2 -0
- package/dist/assets/studio/assets/menus.ar-BABqU-We.js +2 -0
- package/dist/assets/studio/assets/menus.de-Ba8EWf-g.js +2 -0
- package/dist/assets/studio/assets/menus.en-CJ5d7ms0.js +2 -0
- package/dist/assets/studio/assets/menus.es-CA6YLxuk.js +2 -0
- package/dist/assets/studio/assets/menus.fa-C7O8Jr5Z.js +2 -0
- package/dist/assets/studio/assets/menus.fr-Bq5ukcBM.js +2 -0
- package/dist/assets/studio/assets/menus.he-BiYUZo7X.js +2 -0
- package/dist/assets/studio/assets/menus.hi-CPYsx5YL.js +2 -0
- package/dist/assets/studio/assets/menus.id-B5JAh3Kk.js +2 -0
- package/dist/assets/studio/assets/menus.it-DpdTqaL4.js +2 -0
- package/dist/assets/studio/assets/menus.ja-NH9k2gC3.js +2 -0
- package/dist/assets/studio/assets/menus.ko-C_MCO4Mp.js +2 -0
- package/dist/assets/studio/assets/menus.nl-CLflbcbY.js +2 -0
- package/dist/assets/studio/assets/menus.pl-DLXN0-US.js +2 -0
- package/dist/assets/studio/assets/menus.pt-BR-Djh61S7r.js +2 -0
- package/dist/assets/studio/assets/menus.ru-Dn7rmQ8H.js +2 -0
- package/dist/assets/studio/assets/menus.tr-BOeLMbHv.js +2 -0
- package/dist/assets/studio/assets/menus.uk-BVwLEGId.js +2 -0
- package/dist/assets/studio/assets/menus.zh-Hans-X7QVgirl.js +2 -0
- package/dist/assets/studio/assets/meter-majprsslwmpbmkzg-DBo7nISC.js +2 -0
- package/dist/assets/studio/assets/names-R-Dypr9Y.js +2 -0
- package/dist/assets/studio/assets/nl-BiYEXj4B.js +6 -0
- package/dist/assets/studio/assets/nl-CraQgOQ0.js +2 -0
- package/dist/assets/studio/assets/pagination-oaenm9t7ou3lmcgw-DjC4Zsp5.js +2 -0
- package/dist/assets/studio/assets/pl-Iaem81Jv.js +6 -0
- package/dist/assets/studio/assets/pl-Z99ZIGWL.js +2 -0
- package/dist/assets/studio/assets/preload-helper-DjzSQ1t3.js +1 -0
- package/dist/assets/studio/assets/pt-BR-CM8N0OoK.js +6 -0
- package/dist/assets/studio/assets/pt-BR-CjvH9SeS.js +2 -0
- package/dist/assets/studio/assets/python-nrpnmxq4r6yp6fcd-gzcpVVnB.js +2 -0
- package/dist/assets/studio/assets/radio-35dx7y6rjrezbjsp-DY9M1ouC.js +2 -0
- package/dist/assets/studio/assets/react-CDCuUAOg.js +10 -0
- package/dist/assets/studio/assets/readers.ar-YaMfL_Lj.js +2 -0
- package/dist/assets/studio/assets/readers.de-wAkjNmXo.js +2 -0
- package/dist/assets/studio/assets/readers.en-CbmwKSip.js +2 -0
- package/dist/assets/studio/assets/readers.es-Clx8q_tO.js +2 -0
- package/dist/assets/studio/assets/readers.fa-8cssg4YZ.js +2 -0
- package/dist/assets/studio/assets/readers.fr-JJ3OFBav.js +2 -0
- package/dist/assets/studio/assets/readers.he-B0yqdtyq.js +2 -0
- package/dist/assets/studio/assets/readers.hi-i7cAeleO.js +2 -0
- package/dist/assets/studio/assets/readers.id-BdaxiKFf.js +2 -0
- package/dist/assets/studio/assets/readers.it-DXf3Um9S.js +2 -0
- package/dist/assets/studio/assets/readers.ja-B2eb6ZUO.js +2 -0
- package/dist/assets/studio/assets/readers.ko-BX4g0Q7l.js +2 -0
- package/dist/assets/studio/assets/readers.nl-cWSL2Ylr.js +2 -0
- package/dist/assets/studio/assets/readers.pl-C4WdmkML.js +2 -0
- package/dist/assets/studio/assets/readers.pt-BR-x4dMCgC9.js +2 -0
- package/dist/assets/studio/assets/readers.ru-BukUgT1q.js +2 -0
- package/dist/assets/studio/assets/readers.tr-nYS49xYR.js +2 -0
- package/dist/assets/studio/assets/readers.uk-DbcRoxdR.js +2 -0
- package/dist/assets/studio/assets/readers.zh-Hans-DcGU8fSg.js +2 -0
- package/dist/assets/studio/assets/reading-keys-CBjq-Jc-.js +2 -0
- package/dist/assets/studio/assets/resolveAriaLabelledBy-nc8mdie5shy87nsb-asx42i8W.js +2 -0
- package/dist/assets/studio/assets/resolveValueLabel-hpmsash3ektitvnb-X_gYut6U.js +2 -0
- package/dist/assets/studio/assets/roles-B7USahqW.js +2 -0
- package/dist/assets/studio/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/assets/studio/assets/rolldown-runtime-hi7ti5xiuxsegr96-DK3Fl9T5.js +2 -0
- package/dist/assets/studio/assets/ru-2qsjd_Gm.js +6 -0
- package/dist/assets/studio/assets/ru-CwyHst7f.js +2 -0
- package/dist/assets/studio/assets/schedule-notices-DSgNUP07.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.ar-DjCN-gPq.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.de-CkLy189g.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.en-Ke9GgFqw.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.es-DMlXyS4t.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.fa-B8pDw0e4.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.fr-D93CiYDm.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.he-Ce8vr2xp.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.hi-ClQTAEIx.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.id-TZ0m_tpl.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.it-v63UBHwg.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.ja-DjNw2QpF.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.ko-D-tIgkq1.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.nl-CQM8NRDu.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.pl-CUY8YZhH.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.pt-BR-2YkyZTua.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.ru-D-XI8CtL.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.tr-ChWn742p.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.uk-Czj_lfWV.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.zh-Hans-B1hytO83.js +2 -0
- package/dist/assets/studio/assets/schedules-BHug03zB.js +2 -0
- package/dist/assets/studio/assets/schedules-api-B7c4AXSw.js +2 -0
- package/dist/assets/studio/assets/schedules-search-B-7SpriY.js +2 -0
- package/dist/assets/studio/assets/schedules.ar-fkzR2RAY.js +2 -0
- package/dist/assets/studio/assets/schedules.de-DbgcJ6cl.js +2 -0
- package/dist/assets/studio/assets/schedules.en-D7O8u4iy.js +2 -0
- package/dist/assets/studio/assets/schedules.es-C3AvgW6g.js +2 -0
- package/dist/assets/studio/assets/schedules.fa-1UfcjmAY.js +2 -0
- package/dist/assets/studio/assets/schedules.fr-KDBHjGVO.js +2 -0
- package/dist/assets/studio/assets/schedules.he-D8Pds1dL.js +2 -0
- package/dist/assets/studio/assets/schedules.hi-DNpu7GlX.js +2 -0
- package/dist/assets/studio/assets/schedules.id-FewyiLfv.js +2 -0
- package/dist/assets/studio/assets/schedules.it-CY96E2q3.js +2 -0
- package/dist/assets/studio/assets/schedules.ja-CN3N8MH6.js +2 -0
- package/dist/assets/studio/assets/schedules.ko-B9ah4ZVM.js +2 -0
- package/dist/assets/studio/assets/schedules.nl-u3tZ7Ckd.js +2 -0
- package/dist/assets/studio/assets/schedules.pl-Bofx1Ubo.js +2 -0
- package/dist/assets/studio/assets/schedules.pt-BR-BFxLBiyp.js +2 -0
- package/dist/assets/studio/assets/schedules.ru-C5ZnKmGt.js +2 -0
- package/dist/assets/studio/assets/schedules.tr-Bfi96rHj.js +2 -0
- package/dist/assets/studio/assets/schedules.uk-BU4Kj6Az.js +2 -0
- package/dist/assets/studio/assets/schedules.zh-Hans-DDsu_SeS.js +2 -0
- package/dist/assets/studio/assets/scrollable-b6m9ze1u7ps0q1qn-BDQyLiel.js +2 -0
- package/dist/assets/studio/assets/select-futox5zqr3r80y9a-5U5PtwHa.js +2 -0
- package/dist/assets/studio/assets/seo-C-YSZ4mD.js +2 -0
- package/dist/assets/studio/assets/serializeValue-ipcakiw32jb7kany-B_EucO5O.js +2 -0
- package/dist/assets/studio/assets/shellscript-i4m7lo8wi0f5bl8b-CLZ0U2zV.js +2 -0
- package/dist/assets/studio/assets/site-settings-Cmq0DkaT.js +2 -0
- package/dist/assets/studio/assets/skeleton-line-m9dyh126t9k07jvg-CHsT8Hs3.js +4 -0
- package/dist/assets/studio/assets/sql-hqp2eekl7qhmxe92-BsFa4tDR.js +2 -0
- package/dist/assets/studio/assets/stringifyLocale-bxsgxdnzaef2vcar-CkHjdQTJ.js +2 -0
- package/dist/assets/studio/assets/styles-kl02oyrlnld7arja-BX5Ypy0Y.js +2 -0
- package/dist/assets/studio/assets/switch-cqsvolm7h69z7vgg-sFG02Szv.js +2 -0
- package/dist/assets/studio/assets/table-yf8ul2e5nbemioi1-DNq9jhfh.js +2 -0
- package/dist/assets/studio/assets/tabs-gf57qqf1wcclaejq-Cay-6qhK.js +2 -0
- package/dist/assets/studio/assets/tag-input-ohfybx5dbxy3houy-DhZt3VBi.js +2 -0
- package/dist/assets/studio/assets/tanstack-BiJ_7SEB.js +3 -0
- package/dist/assets/studio/assets/taxonomy-S-y5xbUa.js +2 -0
- package/dist/assets/studio/assets/toml-oyqrgosuct25x413-CcmNWLt0.js +2 -0
- package/dist/assets/studio/assets/toolbar-h213d8e22yjh5cwq-CipG_KSA.js +2 -0
- package/dist/assets/studio/assets/tr-BK-gVqHj.js +6 -0
- package/dist/assets/studio/assets/tr-DOAJHdbH.js +2 -0
- package/dist/assets/studio/assets/tsx-pem8x69upvmibv6l-udAQXfEw.js +2 -0
- package/dist/assets/studio/assets/typescript-pe5y016phdwbgws7-bsJCZSQ-.js +2 -0
- package/dist/assets/studio/assets/uk-9ZV1-TPI.js +2 -0
- package/dist/assets/studio/assets/uk-PoqqfkaM.js +6 -0
- package/dist/assets/studio/assets/useAnalyticsCard-MXajmsui.js +2 -0
- package/dist/assets/studio/assets/useAriaLabelledBy-ox8dum59shmgypq1-gkARNgzh.js +2 -0
- package/dist/assets/studio/assets/useBaseUiId-lg1teubxudgin0w2-CrAc3DRu.js +3 -0
- package/dist/assets/studio/assets/useButton-h7s9aq1sfw6arawe-BbWTOEat.js +4 -0
- package/dist/assets/studio/assets/useChartPalette-DXG2lo2x.js +2 -0
- package/dist/assets/studio/assets/useClick-l0p0endoxrlp0ae5-Bbq8u-IC.js +2 -0
- package/dist/assets/studio/assets/useCompositeItem-p7090ga00dpqcg5j-CiGYXm-8.js +2 -0
- package/dist/assets/studio/assets/useDebounced-DmPVYKCM.js +2 -0
- package/dist/assets/studio/assets/useListNavigation-3nyjs362qcau34in-DAKhz5rq.js +2 -0
- package/dist/assets/studio/assets/useMe-z-wff5FW.js +2 -0
- package/dist/assets/studio/assets/usePaging-BiNrjkE2.js +2 -0
- package/dist/assets/studio/assets/usePendingApprovals-BRHKM3-1.js +2 -0
- package/dist/assets/studio/assets/useRender-onwjigxa00uch2ip-DueSv9wh.js +2 -0
- package/dist/assets/studio/assets/useRenderDialogRoot-lddunc01twftravv-CpXvIQfS.js +2 -0
- package/dist/assets/studio/assets/useSettled-C0sKy_Gd.js +2 -0
- package/dist/assets/studio/assets/useTriggerFocusGuards-lz7wt484xltizro4-Dd4azd_G.js +2 -0
- package/dist/assets/studio/assets/util-B4GkKYcU.js +2 -0
- package/dist/assets/studio/assets/vesper-g839e590k3dxnwh3-DdrHHSXu.js +2 -0
- package/dist/assets/studio/assets/w3c-keyname-BOAvb0qz.js +2 -0
- package/dist/assets/studio/assets/wasm-cpasy0o9lsjrm39j-BnjxR4X6.js +2 -0
- package/dist/assets/studio/assets/workflow-D1TOv5ea.js +2 -0
- package/dist/assets/studio/assets/yaml-kzk5ddyekbyha04v-rwi0_p6S.js +2 -0
- package/dist/assets/studio/assets/zh-Hans-BYiQm8Cr.js +6 -0
- package/dist/assets/studio/assets/zh-Hans-D57DCm9K.js +2 -0
- package/dist/assets/studio/index.html +111 -0
- package/dist/bin/cloudhal.d.ts +2 -0
- package/dist/bin/cloudhal.js +10 -0
- package/dist/src/assets.d.ts +37 -0
- package/dist/src/assets.js +189 -0
- package/dist/src/blocks.d.ts +26 -0
- package/dist/src/blocks.js +102 -0
- package/dist/src/cli/commands-content.d.ts +7 -0
- package/dist/src/cli/commands-content.js +145 -0
- package/dist/src/cli/commands-local.d.ts +13 -0
- package/dist/src/cli/commands-local.js +167 -0
- package/dist/src/cli/commands-ops.d.ts +6 -0
- package/dist/src/cli/commands-ops.js +175 -0
- package/dist/src/cli/commands-remote.d.ts +8 -0
- package/dist/src/cli/commands-remote.js +131 -0
- package/dist/src/cli/commands-site.d.ts +4 -0
- package/dist/src/cli/commands-site.js +52 -0
- package/dist/src/cli/help.d.ts +2 -0
- package/dist/src/cli/help.js +83 -0
- package/dist/src/cli/prompts.d.ts +7 -0
- package/dist/src/cli/prompts.js +35 -0
- package/dist/src/cli/types.d.ts +26 -0
- package/dist/src/cli/types.js +42 -0
- package/dist/src/cli.d.ts +174 -0
- package/dist/src/cli.js +95 -0
- package/dist/src/cloudflare/admin.d.ts +54 -0
- package/dist/src/cloudflare/admin.js +156 -0
- package/dist/src/cloudflare/build.d.ts +5 -0
- package/dist/src/cloudflare/build.js +36 -0
- package/dist/src/cloudflare/config.d.ts +1082 -0
- package/dist/src/cloudflare/config.js +458 -0
- package/dist/src/cloudflare/search.d.ts +37 -0
- package/dist/src/cloudflare/search.js +47 -0
- package/dist/src/cloudflare/wrangler.d.ts +27 -0
- package/dist/src/cloudflare/wrangler.js +133 -0
- package/dist/src/commands/ai.d.ts +39 -0
- package/dist/src/commands/ai.js +264 -0
- package/dist/src/commands/analytics.d.ts +94 -0
- package/dist/src/commands/analytics.js +347 -0
- package/dist/src/commands/astro.d.ts +22 -0
- package/dist/src/commands/astro.js +87 -0
- package/dist/src/commands/chrome.d.ts +22 -0
- package/dist/src/commands/chrome.js +90 -0
- package/dist/src/commands/comments-local.d.ts +40 -0
- package/dist/src/commands/comments-local.js +114 -0
- package/dist/src/commands/comments.d.ts +45 -0
- package/dist/src/commands/comments.js +285 -0
- package/dist/src/commands/deploy/attach.d.ts +2 -0
- package/dist/src/commands/deploy/attach.js +190 -0
- package/dist/src/commands/deploy/context.d.ts +21 -0
- package/dist/src/commands/deploy/context.js +22 -0
- package/dist/src/commands/deploy/options.d.ts +98 -0
- package/dist/src/commands/deploy/options.js +106 -0
- package/dist/src/commands/deploy/prepare.d.ts +55 -0
- package/dist/src/commands/deploy/prepare.js +298 -0
- package/dist/src/commands/deploy/resources.d.ts +26 -0
- package/dist/src/commands/deploy/resources.js +157 -0
- package/dist/src/commands/deploy/schedules-guard.d.ts +24 -0
- package/dist/src/commands/deploy/schedules-guard.js +95 -0
- package/dist/src/commands/deploy/served-sites.d.ts +28 -0
- package/dist/src/commands/deploy/served-sites.js +86 -0
- package/dist/src/commands/deploy/settings.d.ts +24 -0
- package/dist/src/commands/deploy/settings.js +115 -0
- package/dist/src/commands/deploy/ship.d.ts +46 -0
- package/dist/src/commands/deploy/ship.js +174 -0
- package/dist/src/commands/deploy/state.d.ts +30 -0
- package/dist/src/commands/deploy/state.js +102 -0
- package/dist/src/commands/deploy.d.ts +52 -0
- package/dist/src/commands/deploy.js +223 -0
- package/dist/src/commands/domain.d.ts +15 -0
- package/dist/src/commands/domain.js +44 -0
- package/dist/src/commands/init.d.ts +18 -0
- package/dist/src/commands/init.js +142 -0
- package/dist/src/commands/mail-local.d.ts +7 -0
- package/dist/src/commands/mail-local.js +30 -0
- package/dist/src/commands/mcp.d.ts +22 -0
- package/dist/src/commands/mcp.js +113 -0
- package/dist/src/commands/media-placeholders.d.ts +29 -0
- package/dist/src/commands/media-placeholders.js +239 -0
- package/dist/src/commands/media.d.ts +32 -0
- package/dist/src/commands/media.js +182 -0
- package/dist/src/commands/migrate.d.ts +16 -0
- package/dist/src/commands/migrate.js +63 -0
- package/dist/src/commands/motion.d.ts +29 -0
- package/dist/src/commands/motion.js +118 -0
- package/dist/src/commands/owner.d.ts +18 -0
- package/dist/src/commands/owner.js +39 -0
- package/dist/src/commands/render.d.ts +26 -0
- package/dist/src/commands/render.js +94 -0
- package/dist/src/commands/scheduler-local.d.ts +55 -0
- package/dist/src/commands/scheduler-local.js +237 -0
- package/dist/src/commands/schedules.d.ts +32 -0
- package/dist/src/commands/schedules.js +170 -0
- package/dist/src/commands/search.d.ts +14 -0
- package/dist/src/commands/search.js +53 -0
- package/dist/src/commands/site.d.ts +46 -0
- package/dist/src/commands/site.js +151 -0
- package/dist/src/commands/snapshot.d.ts +10 -0
- package/dist/src/commands/snapshot.js +50 -0
- package/dist/src/commands/studio.d.ts +29 -0
- package/dist/src/commands/studio.js +172 -0
- package/dist/src/commands/sync.d.ts +42 -0
- package/dist/src/commands/sync.js +211 -0
- package/dist/src/commands/tokens.d.ts +12 -0
- package/dist/src/commands/tokens.js +45 -0
- package/dist/src/config-search.d.ts +24 -0
- package/dist/src/config-search.js +41 -0
- package/dist/src/config.d.ts +168 -0
- package/dist/src/config.js +348 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.js +82 -0
- package/dist/src/project-setup.d.ts +21 -0
- package/dist/src/project-setup.js +50 -0
- package/dist/src/render-chrome.d.ts +9 -0
- package/dist/src/render-chrome.js +140 -0
- package/dist/src/starter-files.d.ts +4 -0
- package/dist/src/starter-files.js +51 -0
- package/dist/src/studio-build.d.ts +43 -0
- package/dist/src/studio-build.js +138 -0
- package/package.json +63 -3
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cloudhal site list | create | delete` (RFC-0034 §2–3): the sites of one installation — on the
|
|
3
|
+
* project's SQLite, or with `--remote` on the deployment (deployment token: `/api/admin/sites`).
|
|
4
|
+
* The project's own site (`cloudhal.json` `siteId`) is never deleted from here: its site Worker
|
|
5
|
+
* serves it.
|
|
6
|
+
*/
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { createEdition, deleteSiteData, listHosts, seedStarterSite } from "@cloudhal/core-ts";
|
|
9
|
+
import { openLocalStore } from "@cloudhal/core-ts/local";
|
|
10
|
+
import { readProjectConfig } from "../config.js";
|
|
11
|
+
import { brief, deployment, } from "./sync.js";
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
/** What an edition copied and what it left out. */
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
async function remote (options , p , init = {}) {
|
|
47
|
+
const { adminUrl, token, fetch: f } = await deployment(options);
|
|
48
|
+
const res = await f(new URL(p, adminUrl), {
|
|
49
|
+
...init,
|
|
50
|
+
headers: {
|
|
51
|
+
authorization: `Bearer ${token}`,
|
|
52
|
+
"content-type": "application/json",
|
|
53
|
+
...(init.headers ?? {}),
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
const text = await res.text();
|
|
57
|
+
if (res.status === 404 && p === "/api/admin/sites")
|
|
58
|
+
throw new Error("the deployment has no site management yet (deploy this version first)");
|
|
59
|
+
if (!res.ok) throw new Error(`the deployment answered ${res.status}: ${brief(text)}`);
|
|
60
|
+
return JSON.parse(text) ;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function withLocal (
|
|
64
|
+
projectDir ,
|
|
65
|
+
fn ,
|
|
66
|
+
) {
|
|
67
|
+
const cfg = await readProjectConfig(projectDir);
|
|
68
|
+
const local = await openLocalStore(path.join(projectDir, cfg.dataDir));
|
|
69
|
+
try {
|
|
70
|
+
return await fn(local);
|
|
71
|
+
} finally {
|
|
72
|
+
await local.close();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** `cloudhal site list`. */
|
|
77
|
+
export async function listSites(options ) {
|
|
78
|
+
if (options.remote)
|
|
79
|
+
return (await remote (options, "/api/admin/sites")).sites;
|
|
80
|
+
return withLocal(options.projectDir, async (l) => {
|
|
81
|
+
const hosts = await listHosts(l.sql);
|
|
82
|
+
return (await l.store.listSites()).map((s) => {
|
|
83
|
+
const held = hosts.filter((h) => h.siteId === s.id).map((h) => h.host);
|
|
84
|
+
return {
|
|
85
|
+
id: s.id,
|
|
86
|
+
name: s.name,
|
|
87
|
+
slug: s.slug,
|
|
88
|
+
projectId: s.projectId,
|
|
89
|
+
defaultLocale: s.defaultLocale,
|
|
90
|
+
theme: s.theme.name,
|
|
91
|
+
hosts: held,
|
|
92
|
+
conflicts: s.domains.map((d) => d.hostname).filter((h) => !held.includes(h)),
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** `cloudhal site create`: a new site in this installation, seeded like `cloudhal init`. */
|
|
99
|
+
export async function createSite(
|
|
100
|
+
options ,
|
|
101
|
+
input ,
|
|
102
|
+
) {
|
|
103
|
+
if (options.remote) {
|
|
104
|
+
const r = await remote (
|
|
105
|
+
options,
|
|
106
|
+
"/api/admin/sites",
|
|
107
|
+
{ method: "POST", body: JSON.stringify(input) },
|
|
108
|
+
);
|
|
109
|
+
return { ...r.site, ...(r.edition ? { edition: r.edition } : {}) };
|
|
110
|
+
}
|
|
111
|
+
return withLocal(options.projectDir, async (l) => {
|
|
112
|
+
if ((await l.store.listSites()).some((s) => s.slug === input.slug))
|
|
113
|
+
throw new Error(`a site with the slug ${input.slug} exists`);
|
|
114
|
+
if (input.from) {
|
|
115
|
+
const r = await createEdition(l.store, {
|
|
116
|
+
fromSiteId: input.from,
|
|
117
|
+
name: input.name,
|
|
118
|
+
slug: input.slug,
|
|
119
|
+
locale: input.locale ?? "en",
|
|
120
|
+
});
|
|
121
|
+
return { id: r.site.id, projectId: r.site.projectId, edition: r };
|
|
122
|
+
}
|
|
123
|
+
const site = await seedStarterSite(l.store, input);
|
|
124
|
+
return { id: site.id, projectId: site.projectId };
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** `cloudhal site delete <siteId> --confirm <slug>`. */
|
|
129
|
+
export async function deleteSite(
|
|
130
|
+
options ,
|
|
131
|
+
siteId ,
|
|
132
|
+
confirm ,
|
|
133
|
+
) {
|
|
134
|
+
const cfg = await readProjectConfig(options.projectDir);
|
|
135
|
+
if (siteId === cfg.siteId)
|
|
136
|
+
throw new Error(
|
|
137
|
+
`${siteId} is this project's site (cloudhal.json); its site Worker serves it, so it is not deleted from here`,
|
|
138
|
+
);
|
|
139
|
+
if (options.remote)
|
|
140
|
+
return remote(options, `/api/admin/sites/${encodeURIComponent(siteId)}`, {
|
|
141
|
+
method: "DELETE",
|
|
142
|
+
body: JSON.stringify({ confirm }),
|
|
143
|
+
});
|
|
144
|
+
return withLocal(options.projectDir, async (l) => {
|
|
145
|
+
const site = await l.store.getSite(siteId);
|
|
146
|
+
if (!site) throw new Error(`no site ${siteId}`);
|
|
147
|
+
if (confirm !== site.slug)
|
|
148
|
+
throw new Error(`confirm with the site's slug (${site.slug}) to delete it`);
|
|
149
|
+
return deleteSiteData(l, siteId);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Snapshot } from "@cloudhal/core-contracts";
|
|
2
|
+
export interface SnapshotOptions {
|
|
3
|
+
readonly projectDir: string;
|
|
4
|
+
readonly label?: string;
|
|
5
|
+
readonly publish?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** Creates a snapshot of the live site (and optionally publishes it). */
|
|
8
|
+
export declare function snapshot(options: SnapshotOptions): Promise<Snapshot>;
|
|
9
|
+
/** The snapshot `cloudhal build` renders: the published one, else the latest, else a fresh one. */
|
|
10
|
+
export declare function resolveBuildSnapshot(projectDir: string): Promise<Snapshot>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
|
|
3
|
+
import { openLocalStore } from "@cloudhal/core-ts/local";
|
|
4
|
+
import { readProjectConfig } from "../config.js";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
/** Creates a snapshot of the live site (and optionally publishes it). */
|
|
13
|
+
export async function snapshot(options ) {
|
|
14
|
+
const cfg = await readProjectConfig(options.projectDir);
|
|
15
|
+
const local = await openLocalStore(path.join(options.projectDir, cfg.dataDir));
|
|
16
|
+
try {
|
|
17
|
+
const snap = await local.store.createSnapshot(cfg.siteId, {
|
|
18
|
+
actor: { kind: "human", id: "user_localcli0001", name: "cloudhal CLI" },
|
|
19
|
+
reason: options.publish ? "publish" : "manual",
|
|
20
|
+
...(options.label ? { label: options.label } : {}),
|
|
21
|
+
});
|
|
22
|
+
if (options.publish) {
|
|
23
|
+
const site = await local.store.getSite(cfg.siteId);
|
|
24
|
+
if (!site) throw new Error(`site ${cfg.siteId} not found`);
|
|
25
|
+
await local.store.publish(site, snap.id);
|
|
26
|
+
}
|
|
27
|
+
return snap;
|
|
28
|
+
} finally {
|
|
29
|
+
await local.close();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** The snapshot `cloudhal build` renders: the published one, else the latest, else a fresh one. */
|
|
34
|
+
export async function resolveBuildSnapshot(projectDir ) {
|
|
35
|
+
const cfg = await readProjectConfig(projectDir);
|
|
36
|
+
const local = await openLocalStore(path.join(projectDir, cfg.dataDir));
|
|
37
|
+
try {
|
|
38
|
+
const site = await local.store.getSite(cfg.siteId);
|
|
39
|
+
if (!site) throw new Error(`site ${cfg.siteId} not found`);
|
|
40
|
+
if (site.publishedSnapshotId) {
|
|
41
|
+
const s = await local.store.getSnapshot(site.publishedSnapshotId);
|
|
42
|
+
if (s) return s;
|
|
43
|
+
}
|
|
44
|
+
const latest = await local.store.latestSnapshot(cfg.siteId);
|
|
45
|
+
if (latest) return latest;
|
|
46
|
+
} finally {
|
|
47
|
+
await local.close();
|
|
48
|
+
}
|
|
49
|
+
return snapshot({ projectDir, label: "build" });
|
|
50
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { restTransport } from "@cloudhal/api";
|
|
2
|
+
export interface StudioOptions {
|
|
3
|
+
readonly projectDir: string;
|
|
4
|
+
readonly port?: number;
|
|
5
|
+
/** Directory of a built Studio (`apps/studio/dist`). Defaults to the monorepo build when present. */
|
|
6
|
+
readonly studioDist?: string;
|
|
7
|
+
/** Skip authentication (local scripts only). */
|
|
8
|
+
readonly noAuth?: boolean;
|
|
9
|
+
/** Where printed mail goes (tests); default stdout (RFC-0011). */
|
|
10
|
+
readonly mailOut?: (text: string) => void;
|
|
11
|
+
/** `false` skips the scheduler's Node ticker (tests). */
|
|
12
|
+
readonly scheduler?: boolean;
|
|
13
|
+
/** @deprecated the comments job runs on the scheduler's tick; `false` skips the ticker. */
|
|
14
|
+
readonly commentsJob?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Paths the API owns; never answered with the Studio SPA. */
|
|
17
|
+
export declare function isApiPath(pathname: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Runs the Cloudhal API (and, when built, the Studio UI) for the project on Node.
|
|
20
|
+
* Authentication is wired by `createAuthFor()` from `@cloudhal/api/auth` when available.
|
|
21
|
+
*/
|
|
22
|
+
export declare function studio(options: StudioOptions): Promise<{
|
|
23
|
+
url: string;
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
}>;
|
|
26
|
+
/** Workers AI over REST from `CLOUDFLARE_ACCOUNT_ID` and `CLOUDHAL_AI_TOKEN` (RFC-0016 §1). */
|
|
27
|
+
export declare function localAiTransport(env?: Record<string, string | undefined>): {
|
|
28
|
+
transport?: ReturnType<typeof restTransport>;
|
|
29
|
+
};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ApprovalStore, AuditLog, loadSkills } from "@cloudhal/agent-runtime";
|
|
4
|
+
import { AiStore, createApi, restTransport } from "@cloudhal/api";
|
|
5
|
+
import { serveNode } from "@cloudhal/api/node";
|
|
6
|
+
import { openLocalStore } from "@cloudhal/core-ts/local";
|
|
7
|
+
import { nodeTransport } from "@cloudhal/core-ts/media-node";
|
|
8
|
+
import { SqlScheduleStore } from "@cloudhal/schedules/sql";
|
|
9
|
+
import { assetDir } from "../assets.js";
|
|
10
|
+
import { loadBlockRegistry, loadThemeDesign, loadThemeSettings } from "../blocks.js";
|
|
11
|
+
import { readProjectConfig } from "../config.js";
|
|
12
|
+
import { localRender } from "../render-chrome.js";
|
|
13
|
+
import { localAnalytics, startLocalRollups } from "./analytics.js";
|
|
14
|
+
import { localComments } from "./comments-local.js";
|
|
15
|
+
import { terminalMailSender } from "./mail-local.js";
|
|
16
|
+
import { resolveSkillsDir } from "./mcp.js";
|
|
17
|
+
import { automationsEnabled, startLocalScheduler } from "./scheduler-local.js";
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
async function exists(p ) {
|
|
35
|
+
try {
|
|
36
|
+
await access(p);
|
|
37
|
+
return true;
|
|
38
|
+
} catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Paths the API owns; never answered with the Studio SPA. */
|
|
44
|
+
export function isApiPath(pathname ) {
|
|
45
|
+
return pathname === "/api" || pathname.startsWith("/api/");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Runs the Cloudhal API (and, when built, the Studio UI) for the project on Node.
|
|
50
|
+
* Authentication is wired by `createAuthFor()` from `@cloudhal/api/auth` when available.
|
|
51
|
+
*/
|
|
52
|
+
export async function studio(
|
|
53
|
+
options ,
|
|
54
|
+
) {
|
|
55
|
+
const cfg = await readProjectConfig(options.projectDir);
|
|
56
|
+
// The theme's block types (RFC-0015 §6) join the built-ins, and its design settings
|
|
57
|
+
// (RFC-0017 §1) check `Site.theme.config`: validated, offered, listed.
|
|
58
|
+
const local = await openLocalStore(path.join(options.projectDir, cfg.dataDir), {
|
|
59
|
+
blocks: await loadBlockRegistry(options.projectDir),
|
|
60
|
+
themeSettings: await loadThemeSettings(options.projectDir),
|
|
61
|
+
themeDesign: await loadThemeDesign(options.projectDir),
|
|
62
|
+
});
|
|
63
|
+
const studioDist = options.studioDist ?? (await assetDir("studio")) ?? "";
|
|
64
|
+
const serveStudio = await exists(path.join(studioDist, "index.html"));
|
|
65
|
+
|
|
66
|
+
const skillsDir = await resolveSkillsDir(options.projectDir);
|
|
67
|
+
// Site analytics on the project's SQLite (RFC-0006 L3): read through SqlAnalytics, daily totals
|
|
68
|
+
// rolled up hourly (and raw events pruned) while Studio runs.
|
|
69
|
+
const analytics = localAnalytics(local.sql, cfg);
|
|
70
|
+
const stopRollups = analytics.feature().enabled
|
|
71
|
+
? startLocalRollups(analytics, local, cfg.analytics)
|
|
72
|
+
: () => {};
|
|
73
|
+
// RFC-0007 §12: the comment routes on the project's SQLite.
|
|
74
|
+
const comments = await localComments(local.sql, local.dataDir);
|
|
75
|
+
// RFC-0008 §8.4: the scheduler's Node ticker (releases, automations, and the hourly comments
|
|
76
|
+
// job behind its watermark) while Studio runs, with a catch-up tick now.
|
|
77
|
+
const ticker =
|
|
78
|
+
options.scheduler === false || options.commentsJob === false
|
|
79
|
+
? undefined
|
|
80
|
+
: startLocalScheduler({
|
|
81
|
+
sql: local.sql,
|
|
82
|
+
blobs: local.blobs,
|
|
83
|
+
graph: local.store,
|
|
84
|
+
// RFC-0008 §11.1: the broken-link sweep's 404 rows
|
|
85
|
+
...(analytics.feature().enabled ? { analytics } : {}),
|
|
86
|
+
});
|
|
87
|
+
let deps = {
|
|
88
|
+
store: local.store,
|
|
89
|
+
analytics,
|
|
90
|
+
comments,
|
|
91
|
+
...(ticker ? { scheduler: ticker } : {}),
|
|
92
|
+
// RFC-0008 §13: the schedule routes, tools and notifications on the project's SQLite.
|
|
93
|
+
schedules: {
|
|
94
|
+
store: new SqlScheduleStore(local.sql),
|
|
95
|
+
maxNewBodies: Number.POSITIVE_INFINITY,
|
|
96
|
+
// §11.6: `CLOUDHAL_AUTOMATIONS=off` refuses automation keys and stops occurrences.
|
|
97
|
+
automationsEnabled: automationsEnabled(),
|
|
98
|
+
},
|
|
99
|
+
requireAuth: !options.noAuth,
|
|
100
|
+
// RFC-0011: invites and reset links are printed here instead of sent.
|
|
101
|
+
...(cfg.mail ? { mail: terminalMailSender(cfg.mail, options.mailOut) } : {}),
|
|
102
|
+
// RFC-0016: Workers AI over REST when the environment has an account id and a token (never
|
|
103
|
+
// stored); the settings are kept either way.
|
|
104
|
+
ai: { store: new AiStore(local.sql), ...localAiTransport() },
|
|
105
|
+
// The Studio dev server (vite, :5173) proxies /api here during Studio development.
|
|
106
|
+
trustedOrigins: [
|
|
107
|
+
"http://localhost:5173",
|
|
108
|
+
...(process.env.CLOUDHAL_TRUSTED_ORIGINS?.split(",") ?? []),
|
|
109
|
+
],
|
|
110
|
+
// Without auth anyone who can reach the port could write; answer localhost names only.
|
|
111
|
+
...(options.noAuth ? { allowedHosts: ["localhost", "127.0.0.1", "[::1]"] } : {}),
|
|
112
|
+
mcp: {
|
|
113
|
+
stateKey: crypto.getRandomValues(new Uint8Array(32)),
|
|
114
|
+
audit: new AuditLog(local.sql),
|
|
115
|
+
approvals: new ApprovalStore(local.sql),
|
|
116
|
+
skills: skillsDir ? await loadSkills(skillsDir) : [],
|
|
117
|
+
media: { fetchTransport: nodeTransport() },
|
|
118
|
+
// RFC-0021 §4: render_page with the local Chrome, when there is one.
|
|
119
|
+
render: localRender(),
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
if (!options.noAuth) {
|
|
123
|
+
const { createAuthFor } = await import("@cloudhal/api/auth/node");
|
|
124
|
+
const auth = await createAuthFor({
|
|
125
|
+
dataDir: local.dataDir,
|
|
126
|
+
baseURL: `http://localhost:${options.port ?? 8787}`,
|
|
127
|
+
// Better Auth checks Origin on browser POSTs itself; the Studio dev server must pass too.
|
|
128
|
+
trustedOrigins: deps.trustedOrigins ?? [],
|
|
129
|
+
});
|
|
130
|
+
deps = {
|
|
131
|
+
...deps,
|
|
132
|
+
resolveActor: auth.resolveActor,
|
|
133
|
+
resolvePrincipal: auth.resolvePrincipal,
|
|
134
|
+
authHandler: auth.handler,
|
|
135
|
+
agentKeys: auth.agentKeys,
|
|
136
|
+
staff: auth.staff,
|
|
137
|
+
signUp: auth.signUp,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const app = createApi(deps);
|
|
141
|
+
|
|
142
|
+
if (serveStudio) {
|
|
143
|
+
const { serveStatic } = await import("@hono/node-server/serve-static");
|
|
144
|
+
const root = path.relative(process.cwd(), studioDist) || ".";
|
|
145
|
+
app.use("/assets/*", serveStatic({ root }));
|
|
146
|
+
// The SPA fallback is for Studio's own routes only: an /api path the API did not answer (a
|
|
147
|
+
// route that is not mounted, e.g. agent keys without auth) falls through to the API's JSON 404
|
|
148
|
+
// rather than receiving index.html with a 200.
|
|
149
|
+
const spa = serveStatic({ root, path: "index.html" });
|
|
150
|
+
app.get("*", (c, next) => (isApiPath(c.req.path) ? next() : spa(c, next)));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const { server, port } = await serveNode(app, { port: options.port ?? 8787 });
|
|
154
|
+
return {
|
|
155
|
+
url: `http://localhost:${port}/`,
|
|
156
|
+
stop: async () => {
|
|
157
|
+
stopRollups();
|
|
158
|
+
ticker?.stop();
|
|
159
|
+
await new Promise ((resolve) => server.close(() => resolve()));
|
|
160
|
+
await local.close();
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Workers AI over REST from `CLOUDFLARE_ACCOUNT_ID` and `CLOUDHAL_AI_TOKEN` (RFC-0016 §1). */
|
|
166
|
+
export function localAiTransport(env = process.env)
|
|
167
|
+
|
|
168
|
+
{
|
|
169
|
+
const accountId = env.CLOUDFLARE_ACCOUNT_ID?.trim();
|
|
170
|
+
const token = env.CLOUDHAL_AI_TOKEN?.trim();
|
|
171
|
+
return accountId && token ? { transport: restTransport({ accountId, token }) } : {};
|
|
172
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface SyncOptions {
|
|
2
|
+
readonly projectDir: string;
|
|
3
|
+
/** Overwrite diverged content on the receiving side. */
|
|
4
|
+
readonly replace?: boolean;
|
|
5
|
+
/**
|
|
6
|
+
* `cloudhal push --cancel-schedules` (RFC-0008 §16): cancel the deployment's open releases
|
|
7
|
+
* before replacing the graph their pins point into. Without it a push refuses while any exist.
|
|
8
|
+
*/
|
|
9
|
+
readonly cancelSchedules?: boolean;
|
|
10
|
+
/** Admin Worker URL; default from `<dataDir>/deploy/state.json`. */
|
|
11
|
+
readonly adminUrl?: string;
|
|
12
|
+
readonly log?: (line: string) => void;
|
|
13
|
+
/** Injected in tests. */
|
|
14
|
+
readonly fetch?: typeof fetch;
|
|
15
|
+
}
|
|
16
|
+
/** Error bodies may be HTML pages (e.g. a not-yet-live workers.dev host); keep messages short. */
|
|
17
|
+
export declare function brief(body: string): string;
|
|
18
|
+
/** The deployment's admin Worker and its operator token (from `cloudhal deploy`'s state). */
|
|
19
|
+
export declare function deployment(options: SyncOptions): Promise<{
|
|
20
|
+
cfg: import("../config.js").ProjectConfig;
|
|
21
|
+
adminUrl: string;
|
|
22
|
+
token: string;
|
|
23
|
+
fetch: typeof fetch;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function pushSite(options: SyncOptions & {
|
|
26
|
+
ifAbsent?: boolean;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
pushed: boolean;
|
|
29
|
+
message: string;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Makes `hostname` the deployed site's primary domain (preview links, canonical URLs) and mirrors
|
|
33
|
+
* it in the local store. Used by `cloudhal deploy` once a custom domain is routed.
|
|
34
|
+
*/
|
|
35
|
+
export declare function setPrimaryDomain(options: SyncOptions & {
|
|
36
|
+
hostname: string;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
changed: boolean;
|
|
39
|
+
}>;
|
|
40
|
+
export declare function pullSite(options: SyncOptions): Promise<{
|
|
41
|
+
message: string;
|
|
42
|
+
}>;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cloudhal push` / `cloudhal pull`: move the site between the local project and its Cloudflare
|
|
3
|
+
* deployment through the admin Worker (`/api/admin/sites/:id/bundle`, deployment token).
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import {
|
|
8
|
+
exportSite,
|
|
9
|
+
importSite,
|
|
10
|
+
mediaBlobKey,
|
|
11
|
+
|
|
12
|
+
withPrimaryDomain,
|
|
13
|
+
} from "@cloudhal/core-ts";
|
|
14
|
+
import { openLocalStore } from "@cloudhal/core-ts/local";
|
|
15
|
+
import { readProjectConfig } from "../config.js";
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/** Error bodies may be HTML pages (e.g. a not-yet-live workers.dev host); keep messages short. */
|
|
34
|
+
export function brief(body ) {
|
|
35
|
+
const text = body
|
|
36
|
+
.replace(/<style[\s\S]*?<\/style>|<svg[\s\S]*?<\/svg>|<[^>]+>/g, " ")
|
|
37
|
+
.replace(/\s+/g, " ")
|
|
38
|
+
.trim();
|
|
39
|
+
return text.length > 300 ? `${text.slice(0, 300)}…` : text;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The deployment's admin Worker and its operator token (from `cloudhal deploy`'s state). */
|
|
43
|
+
export async function deployment(options ) {
|
|
44
|
+
const cfg = await readProjectConfig(options.projectDir);
|
|
45
|
+
const dir = path.join(options.projectDir, cfg.dataDir, "deploy");
|
|
46
|
+
let adminUrl = options.adminUrl;
|
|
47
|
+
if (!adminUrl) {
|
|
48
|
+
try {
|
|
49
|
+
adminUrl = (
|
|
50
|
+
JSON.parse(await readFile(path.join(dir, "state.json"), "utf8"))
|
|
51
|
+
).adminUrl;
|
|
52
|
+
} catch {
|
|
53
|
+
// not deployed
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!adminUrl)
|
|
57
|
+
throw new Error("no deployment found: run `cloudhal deploy` first (or pass --admin-url)");
|
|
58
|
+
const secrets = JSON.parse(await readFile(path.join(dir, "secrets.json"), "utf8"))
|
|
59
|
+
|
|
60
|
+
;
|
|
61
|
+
if (!secrets.CLOUDHAL_DEPLOY_TOKEN)
|
|
62
|
+
throw new Error("deployment token missing in .cloudhal/deploy/secrets.json");
|
|
63
|
+
return { cfg, adminUrl, token: secrets.CLOUDHAL_DEPLOY_TOKEN, fetch: options.fetch ?? fetch };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function target(options ) {
|
|
67
|
+
const { cfg, adminUrl, token, fetch: f } = await deployment(options);
|
|
68
|
+
const url = new URL(`/api/admin/sites/${cfg.siteId}/bundle`, adminUrl);
|
|
69
|
+
return { cfg, url, token, fetch: f };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export async function pushSite(
|
|
73
|
+
options ,
|
|
74
|
+
) {
|
|
75
|
+
const log = options.log ?? (() => {});
|
|
76
|
+
const { cfg, url, token, fetch: f } = await target(options);
|
|
77
|
+
const auth = { authorization: `Bearer ${token}` };
|
|
78
|
+
if (options.ifAbsent) {
|
|
79
|
+
const probe = await f(url, { headers: auth });
|
|
80
|
+
if (probe.status === 200) {
|
|
81
|
+
log(
|
|
82
|
+
"the deployment already has this site; leaving it as the source of truth (use `cloudhal pull`)",
|
|
83
|
+
);
|
|
84
|
+
return { pushed: false, message: "already deployed" };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const local = await openLocalStore(path.join(options.projectDir, cfg.dataDir));
|
|
88
|
+
let bundle ;
|
|
89
|
+
try {
|
|
90
|
+
bundle = await exportSite(local, cfg.siteId);
|
|
91
|
+
// Media bytes first (RFC-0004 §4.7): the deployment refuses a bundle whose media it lacks.
|
|
92
|
+
let uploaded = 0;
|
|
93
|
+
for (const m of bundle.media ?? []) {
|
|
94
|
+
const mediaUrl = new URL(`/api/admin/sites/${cfg.siteId}/media/${m.sha256}`, url);
|
|
95
|
+
const head = await f(mediaUrl, { method: "HEAD", headers: auth });
|
|
96
|
+
if (head.status === 200) continue;
|
|
97
|
+
const bytes = await local.blobs.get(mediaBlobKey(cfg.siteId, m.sha256));
|
|
98
|
+
if (!bytes)
|
|
99
|
+
throw new Error(`local media ${m.sha256} is missing; run \`cloudhal media verify\``);
|
|
100
|
+
const put = await f(mediaUrl, {
|
|
101
|
+
method: "PUT",
|
|
102
|
+
headers: { ...auth, "content-type": "application/octet-stream" },
|
|
103
|
+
body: bytes,
|
|
104
|
+
});
|
|
105
|
+
if (!put.ok)
|
|
106
|
+
throw new Error(`uploading media failed (${put.status}): ${brief(await put.text())}`);
|
|
107
|
+
uploaded++;
|
|
108
|
+
}
|
|
109
|
+
if (uploaded) log(`media: ${uploaded} file(s) uploaded`);
|
|
110
|
+
} finally {
|
|
111
|
+
await local.close();
|
|
112
|
+
}
|
|
113
|
+
url.searchParams.set("mode", options.replace ? "replace" : "bootstrap");
|
|
114
|
+
if (options.cancelSchedules) url.searchParams.set("cancelSchedules", "1");
|
|
115
|
+
const res = await f(url, {
|
|
116
|
+
method: "PUT",
|
|
117
|
+
headers: { ...auth, "content-type": "application/json" },
|
|
118
|
+
body: JSON.stringify(bundle),
|
|
119
|
+
});
|
|
120
|
+
const body = await res.text();
|
|
121
|
+
if (res.status === 409 && /"error":"schedules_(pending|running)"/.test(body)) {
|
|
122
|
+
const parsed = JSON.parse(body)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
;
|
|
127
|
+
const list = (parsed.details?.releases ?? [])
|
|
128
|
+
.map(
|
|
129
|
+
(r) =>
|
|
130
|
+
` ${r.id} ${r.state}${r.executeAt ? ` at ${r.executeAt}` : ""}${r.title ? ` — ${r.title}` : ""}`,
|
|
131
|
+
)
|
|
132
|
+
.join("\n");
|
|
133
|
+
throw new Error(
|
|
134
|
+
parsed.error === "schedules_running"
|
|
135
|
+
? `${parsed.message}`
|
|
136
|
+
: `the deployment has open releases; a push replaces the graph their pinned versions point into:\n${list}\nCancel them in Studio, or push with --cancel-schedules.`,
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
if (res.status === 409)
|
|
140
|
+
throw new Error(
|
|
141
|
+
`the deployment has diverged from your local copy: ${brief(body)}\nRun \`cloudhal pull\` first, or \`cloudhal push --replace\` to overwrite.`,
|
|
142
|
+
);
|
|
143
|
+
if (!res.ok) throw new Error(`push failed (${res.status}): ${brief(body)}`);
|
|
144
|
+
log(`pushed: ${body}`);
|
|
145
|
+
return { pushed: true, message: body };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Makes `hostname` the deployed site's primary domain (preview links, canonical URLs) and mirrors
|
|
150
|
+
* it in the local store. Used by `cloudhal deploy` once a custom domain is routed.
|
|
151
|
+
*/
|
|
152
|
+
export async function setPrimaryDomain(
|
|
153
|
+
options ,
|
|
154
|
+
) {
|
|
155
|
+
const { cfg, url, token, fetch: f } = await target(options);
|
|
156
|
+
const res = await f(new URL(`/api/admin/sites/${cfg.siteId}/domains`, url), {
|
|
157
|
+
method: "PUT",
|
|
158
|
+
headers: { authorization: `Bearer ${token}`, "content-type": "application/json" },
|
|
159
|
+
body: JSON.stringify({ primary: options.hostname }),
|
|
160
|
+
});
|
|
161
|
+
const body = await res.text();
|
|
162
|
+
if (!res.ok) throw new Error(`setting the site's domain failed (${res.status}): ${brief(body)}`);
|
|
163
|
+
const local = await openLocalStore(path.join(options.projectDir, cfg.dataDir));
|
|
164
|
+
try {
|
|
165
|
+
const site = await local.store.getSite(cfg.siteId);
|
|
166
|
+
if (site && site.domains.find((d) => d.primary)?.hostname !== options.hostname)
|
|
167
|
+
await local.store.updateSite({
|
|
168
|
+
...site,
|
|
169
|
+
domains: withPrimaryDomain(site.domains, options.hostname),
|
|
170
|
+
});
|
|
171
|
+
} finally {
|
|
172
|
+
await local.close();
|
|
173
|
+
}
|
|
174
|
+
return { changed: (JSON.parse(body) ).changed === true };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export async function pullSite(options ) {
|
|
178
|
+
const log = options.log ?? (() => {});
|
|
179
|
+
const { cfg, url, token, fetch: f } = await target(options);
|
|
180
|
+
const res = await f(url, { headers: { authorization: `Bearer ${token}` } });
|
|
181
|
+
if (!res.ok) throw new Error(`pull failed (${res.status}): ${brief(await res.text())}`);
|
|
182
|
+
const bundle = (await res.json()) ;
|
|
183
|
+
const local = await openLocalStore(path.join(options.projectDir, cfg.dataDir));
|
|
184
|
+
try {
|
|
185
|
+
// Media bytes first (RFC-0004 §4.7), verified by SHA-256 as they land.
|
|
186
|
+
let downloaded = 0;
|
|
187
|
+
for (const m of bundle.media ?? []) {
|
|
188
|
+
const key = mediaBlobKey(cfg.siteId, m.sha256);
|
|
189
|
+
if (await local.blobs.head(key)) continue;
|
|
190
|
+
const got = await f(new URL(`/api/admin/sites/${cfg.siteId}/media/${m.sha256}`, url), {
|
|
191
|
+
headers: { authorization: `Bearer ${token}` },
|
|
192
|
+
});
|
|
193
|
+
if (!got.ok) throw new Error(`downloading media failed (${got.status})`);
|
|
194
|
+
await local.blobs.put(key, new Uint8Array(await got.arrayBuffer()), {
|
|
195
|
+
sha256: m.sha256,
|
|
196
|
+
contentType: m.mediaType,
|
|
197
|
+
});
|
|
198
|
+
downloaded++;
|
|
199
|
+
}
|
|
200
|
+
if (downloaded) log(`media: ${downloaded} file(s) downloaded`);
|
|
201
|
+
const result = await importSite(local, bundle, {
|
|
202
|
+
mode: options.replace ? "replace" : "bootstrap",
|
|
203
|
+
log,
|
|
204
|
+
});
|
|
205
|
+
const message = JSON.stringify(result);
|
|
206
|
+
log(`pulled: ${message}`);
|
|
207
|
+
return { message };
|
|
208
|
+
} finally {
|
|
209
|
+
await local.close();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface TokensExportOptions {
|
|
2
|
+
readonly projectDir: string;
|
|
3
|
+
readonly format?: string;
|
|
4
|
+
/** A file to write; stdout otherwise. */
|
|
5
|
+
readonly out?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* `cloudhal tokens export` (RFC-0023 §5): the site's design tokens, as the renderer expands them,
|
|
9
|
+
* in the W3C Design Tokens format (DTCG 2025.10), for Figma (Tokens Studio) and Style Dictionary.
|
|
10
|
+
* Returns the JSON written.
|
|
11
|
+
*/
|
|
12
|
+
export declare function tokensExport(options: TokensExportOptions): Promise<string>;
|