dineway 0.1.34 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +18 -4
  2. package/dist/api/route-utils.d.mts +1 -1
  3. package/dist/api/schemas/index.d.mts +1 -1
  4. package/dist/{api-BaFOFZnE.mjs → api-Ow6RbraA.mjs} +1 -1
  5. package/dist/astro/index.d.mts +1 -1
  6. package/dist/astro/index.mjs +1 -1
  7. package/dist/astro/middleware/auth.d.mts +1 -1
  8. package/dist/astro/middleware.mjs +2 -2
  9. package/dist/astro/routes/api/admin/plugins/_id_/disable.mjs +1 -1
  10. package/dist/astro/routes/api/admin/plugins/_id_/enable.mjs +1 -1
  11. package/dist/astro/routes/api/admin/plugins/_id_/index.mjs +1 -1
  12. package/dist/astro/routes/api/admin/plugins/_id_/uninstall.mjs +1 -1
  13. package/dist/astro/routes/api/admin/plugins/_id_/update.mjs +1 -1
  14. package/dist/astro/routes/api/admin/plugins/index.mjs +1 -1
  15. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/index.mjs +1 -1
  16. package/dist/astro/routes/api/admin/plugins/marketplace/_id_/install.mjs +1 -1
  17. package/dist/astro/routes/api/admin/plugins/marketplace/index.mjs +1 -1
  18. package/dist/astro/routes/api/admin/plugins/updates.mjs +1 -1
  19. package/dist/astro/routes/api/admin/themes/marketplace/_id_/index.mjs +1 -1
  20. package/dist/astro/routes/api/admin/themes/marketplace/index.mjs +1 -1
  21. package/dist/astro/routes/api/health.mjs +1 -1
  22. package/dist/astro/routes/api/manifest.mjs +1 -1
  23. package/dist/astro/routes/api/mcp.mjs +1 -1
  24. package/dist/astro/routes/api/openapi.json.mjs +1 -1
  25. package/dist/astro/routes/api/schema/collections/_slug_/fields/_fieldSlug_.mjs +1 -1
  26. package/dist/astro/routes/api/schema/collections/_slug_/fields/index.mjs +1 -1
  27. package/dist/astro/routes/api/schema/collections/_slug_/fields/reorder.mjs +1 -1
  28. package/dist/astro/routes/api/schema/collections/_slug_/index.mjs +1 -1
  29. package/dist/astro/routes/api/schema/collections/index.mjs +1 -1
  30. package/dist/astro/routes/api/schema/orphans/_slug_.mjs +1 -1
  31. package/dist/astro/routes/api/schema/orphans/index.mjs +1 -1
  32. package/dist/astro/routes/api/well-known/auth.mjs +1 -1
  33. package/dist/astro/types.d.mts +1 -1
  34. package/dist/{bylines-CeNpt_vk.d.mts → bylines-CtD_p_1z.d.mts} +20 -20
  35. package/dist/cli/index.mjs +316 -87
  36. package/dist/index.d.mts +1 -1
  37. package/dist/index.mjs +1 -1
  38. package/dist/media/local-runtime.d.mts +1 -1
  39. package/dist/plugins/adapt-sandbox-entry.d.mts +1 -1
  40. package/dist/runtime.d.mts +1 -1
  41. package/dist/version-q9Wd8cwL.mjs +6 -0
  42. package/package.json +1 -1
  43. package/dist/version-HcqOJZFv.mjs +0 -6
package/README.md CHANGED
@@ -239,10 +239,24 @@ npx dineway deploy
239
239
  ```
240
240
 
241
241
  What happens:
242
- 1. You verify your email address (Dineway account).
243
- 2. The site is built, global CDN is configured, and database is provisioned.
244
- 3. You receive a **one-time setup link** to register your admin passkey on the live site.
245
- 4. `DINEWAY_SITE_URL` and `DINEWAY_TOKEN` are saved to your project `.env` automatically so remote CLI commands work out of the box.
242
+ 1. The CLI resolves the restaurant `placeId`. On first publish you can provide only restaurant name and city; the CLI creates a quota-protected anonymous shadow session, searches for the place, and binds the selected place before asking for email verification.
243
+ 2. You verify your email address (Dineway account). The first verified email to publish a `placeId` claims that restaurant site.
244
+ 3. The CLI recovers an existing site by `placeId` for the same owner, or creates the one allowed site for that restaurant.
245
+ 4. The site is built, global CDN is configured, and database is provisioned.
246
+ 5. You receive a **one-time setup link** to register your admin passkey on the live site.
247
+ 6. `DINEWAY_SITE_URL` and `DINEWAY_TOKEN` are saved to your project `.env` automatically so remote CLI commands work out of the box.
248
+
249
+ Examples:
250
+
251
+ ```bash
252
+ # First publish; place search is handled by the CLI.
253
+ npx dineway deploy --restaurant-name "Cafe Star" --city "Seattle" --email chef@example.com
254
+
255
+ # Authoritative place id; skips place search.
256
+ npx dineway deploy --place-id ChIJ... --restaurant-name "Cafe Star" --city "Seattle" --email chef@example.com
257
+ ```
258
+
259
+ The same verified email can republish the same restaurant from a fresh local checkout or a new shadow session. A different verified email is stopped by the restaurant claim check.
246
260
 
247
261
  > **Important:** Open the setup link in your browser immediately. It lets you register your secure passkey for the live admin panel. If you lose or expire the link, regenerate it with `npx dineway auth setup-link`.
248
262
 
@@ -5,7 +5,7 @@ import "../types-BgE6gMFI.mjs";
5
5
  import "../runner-pAnQS6iI.mjs";
6
6
  import "../index-2tBfB_8X.mjs";
7
7
  import "../index-CpbixmRL.mjs";
8
- import "../bylines-CeNpt_vk.mjs";
8
+ import "../bylines-CtD_p_1z.mjs";
9
9
  import "../types-BBETcziA.mjs";
10
10
  import "../validate-BzUCAU2a.mjs";
11
11
  import { Kysely } from "kysely";
@@ -1,3 +1,3 @@
1
- import { $ as updateSectionBody, $n as cursorPaginationQuery, $t as createCommentBody, A as userDetailSchema, An as mediaUploadUrlBody, At as passkeyRegisterVerifyBody, B as wpRewriteUrlsBody, Bn as contentScheduleBody, Bt as contextEntryCreateBody, C as updateWidgetBody, Cn as mediaExistingResponseSchema, Ct as authMeActionBody, D as widgetSchema, Dn as mediaProviderListQuery, Dt as magicLinkSendBody, E as widgetAreaWithWidgetsSchema, En as mediaListResponseSchema, Et as inviteRegisterOptionsBody, F as importProbeBody, Fn as contentListQuery, Ft as reviewRequestListQuery, G as searchResultSchema, Gn as contentTranslationsResponseSchema, Gt as contextEntrySupersedeBody, H as searchQuery, Hn as contentSeoSchema, Ht as contextEntryListQuery, I as wpMediaImportBody, In as contentListResponseSchema, It as reviewRequestResolveBody, J as siteSettingsSchema, Jn as trashedContentItemSchema, Jt as commentBulkResponseSchema, K as searchSuggestQuery, Kn as contentTrashQuery, Kt as adminCommentListResponseSchema, L as wpPluginAnalyzeBody, Ln as contentPreviewUrlBody, Lt as hitlRequestListQuery, M as userSchema, Mn as contentCompareResponseSchema, Mt as passkeyVerifyBody, N as userUpdateBody, Nn as contentCreateBody, Nt as signupCompleteBody, O as allowedDomainCreateBody, On as mediaResponseSchema, Ot as passkeyOptionsBody, P as usersListQuery, Pn as contentItemSchema, Pt as signupRequestBody, Q as sectionsListQuery, Qn as countResponseSchema, Qt as commentStatusBody, R as wpPluginExecuteBody, Rn as contentPublishBody, Rt as hitlRequestResolveBody, S as reorderWidgetsBody, Sn as mediaConfirmResponseSchema, St as updateMenuItemBody, T as widgetAreaWithWidgetsAndCountSchema, Tn as mediaListQuery, Tt as inviteCreateBody, U as searchRebuildBody, Un as contentTermsBody, Ut as contextEntryReviewBody, V as searchEnableBody, Vn as contentSeoInput, Vt as contextEntryDiffQuery, W as searchResponseSchema, Wn as contentTranslationSchema, Wt as contextEntryStaleQuery, X as sectionListResponseSchema, Xn as VALID_ROLE_LEVELS, Xt as commentListQuery, Y as createSectionBody, Yn as trashedContentListResponseSchema, Yt as commentCountsResponseSchema, Z as sectionSchema, Zn as apiErrorSchema, Zt as commentSchema, _ as redirectSchema, _n as updateCollectionBody, _t as menuSchema, a as bylineUpdateBody, an as collectionSchema, ar as roleLevel, at as termGetResponseSchema, b as createWidgetAreaBody, bn as formatFileSize, bt as reorderMenuItemsBody, c as createRedirectBody, cn as createFieldBody, ct as termSchema, d as notFoundListResponseSchema, dn as fieldResponseSchema, dt as updateTermBody, en as publicCommentListResponseSchema, er as deleteResponseSchema, et as createTaxonomyDefBody, f as notFoundPruneBody, fn as fieldSchema, ft as createMenuBody, g as redirectListResponseSchema, gn as schemaExportQuery, gt as menuListItemSchema, h as notFoundSummarySchema, hn as orphanedTableSchema, ht as menuItemTypeEnum, i as bylineSummarySchema, in as collectionResponseSchema, ir as offsetPaginationQuery, it as taxonomyListResponseSchema, j as userListResponseSchema, jn as mediaUploadUrlResponseSchema, jt as passkeyRenameBody, k as allowedDomainUpdateBody, kn as mediaUpdateBody, kt as passkeyRegisterOptionsBody, l as notFoundEntrySchema, ln as fieldListResponseSchema, lt as termTranslationsSchema, m as notFoundSummaryResponseSchema, mn as orphanedTableListResponseSchema, mt as menuItemSchema, n as bylineCreditSchema, nn as collectionGetQuery, nr as localeCode, nt as taxonomyDefSchema, o as bylinesListQuery, on as collectionWithFieldsResponseSchema, or as slugPattern, ot as termListResponseSchema, p as notFoundSummaryQuery, pn as orphanRegisterBody, pt as createMenuItemBody, q as settingsUpdateBody, qn as contentUpdateBody, qt as commentBulkBody, r as bylineListResponseSchema, rn as collectionListResponseSchema, rr as localeFilterQuery, rt as taxonomyDefTranslationsSchema, s as contentBylineInputSchema, sn as createCollectionBody, sr as successEnvelope, st as termResponseSchema, t as bylineCreateBody, tn as publicCommentSchema, tr as httpUrl, tt as createTermBody, u as notFoundListQuery, un as fieldReorderBody, ut as termWithCountSchema, v as redirectsListQuery, vn as updateFieldBody, vt as menuTranslationsSchema, w as widgetAreaSchema, wn as mediaItemSchema, wt as inviteCompleteBody, x as createWidgetBody, xn as mediaConfirmBody, xt as updateMenuBody, y as updateRedirectBody, yn as DEFAULT_MAX_UPLOAD_SIZE, yt as menuWithItemsSchema, z as wpPrepareBody, zn as contentResponseSchema, zt as siteBriefingQuery } from "../../bylines-CeNpt_vk.mjs";
1
+ import { $ as updateSectionBody, $n as cursorPaginationQuery, $t as createCommentBody, A as userDetailSchema, An as mediaUploadUrlBody, At as passkeyRegisterVerifyBody, B as wpRewriteUrlsBody, Bn as contentScheduleBody, Bt as contextEntryCreateBody, C as updateWidgetBody, Cn as mediaExistingResponseSchema, Ct as authMeActionBody, D as widgetSchema, Dn as mediaProviderListQuery, Dt as magicLinkSendBody, E as widgetAreaWithWidgetsSchema, En as mediaListResponseSchema, Et as inviteRegisterOptionsBody, F as importProbeBody, Fn as contentListQuery, Ft as reviewRequestListQuery, G as searchResultSchema, Gn as contentTranslationsResponseSchema, Gt as contextEntrySupersedeBody, H as searchQuery, Hn as contentSeoSchema, Ht as contextEntryListQuery, I as wpMediaImportBody, In as contentListResponseSchema, It as reviewRequestResolveBody, J as siteSettingsSchema, Jn as trashedContentItemSchema, Jt as commentBulkResponseSchema, K as searchSuggestQuery, Kn as contentTrashQuery, Kt as adminCommentListResponseSchema, L as wpPluginAnalyzeBody, Ln as contentPreviewUrlBody, Lt as hitlRequestListQuery, M as userSchema, Mn as contentCompareResponseSchema, Mt as passkeyVerifyBody, N as userUpdateBody, Nn as contentCreateBody, Nt as signupCompleteBody, O as allowedDomainCreateBody, On as mediaResponseSchema, Ot as passkeyOptionsBody, P as usersListQuery, Pn as contentItemSchema, Pt as signupRequestBody, Q as sectionsListQuery, Qn as countResponseSchema, Qt as commentStatusBody, R as wpPluginExecuteBody, Rn as contentPublishBody, Rt as hitlRequestResolveBody, S as reorderWidgetsBody, Sn as mediaConfirmResponseSchema, St as updateMenuItemBody, T as widgetAreaWithWidgetsAndCountSchema, Tn as mediaListQuery, Tt as inviteCreateBody, U as searchRebuildBody, Un as contentTermsBody, Ut as contextEntryReviewBody, V as searchEnableBody, Vn as contentSeoInput, Vt as contextEntryDiffQuery, W as searchResponseSchema, Wn as contentTranslationSchema, Wt as contextEntryStaleQuery, X as sectionListResponseSchema, Xn as VALID_ROLE_LEVELS, Xt as commentListQuery, Y as createSectionBody, Yn as trashedContentListResponseSchema, Yt as commentCountsResponseSchema, Z as sectionSchema, Zn as apiErrorSchema, Zt as commentSchema, _ as redirectSchema, _n as updateCollectionBody, _t as menuSchema, a as bylineUpdateBody, an as collectionSchema, ar as roleLevel, at as termGetResponseSchema, b as createWidgetAreaBody, bn as formatFileSize, bt as reorderMenuItemsBody, c as createRedirectBody, cn as createFieldBody, ct as termSchema, d as notFoundListResponseSchema, dn as fieldResponseSchema, dt as updateTermBody, en as publicCommentListResponseSchema, er as deleteResponseSchema, et as createTaxonomyDefBody, f as notFoundPruneBody, fn as fieldSchema, ft as createMenuBody, g as redirectListResponseSchema, gn as schemaExportQuery, gt as menuListItemSchema, h as notFoundSummarySchema, hn as orphanedTableSchema, ht as menuItemTypeEnum, i as bylineSummarySchema, in as collectionResponseSchema, ir as offsetPaginationQuery, it as taxonomyListResponseSchema, j as userListResponseSchema, jn as mediaUploadUrlResponseSchema, jt as passkeyRenameBody, k as allowedDomainUpdateBody, kn as mediaUpdateBody, kt as passkeyRegisterOptionsBody, l as notFoundEntrySchema, ln as fieldListResponseSchema, lt as termTranslationsSchema, m as notFoundSummaryResponseSchema, mn as orphanedTableListResponseSchema, mt as menuItemSchema, n as bylineCreditSchema, nn as collectionGetQuery, nr as localeCode, nt as taxonomyDefSchema, o as bylinesListQuery, on as collectionWithFieldsResponseSchema, or as slugPattern, ot as termListResponseSchema, p as notFoundSummaryQuery, pn as orphanRegisterBody, pt as createMenuItemBody, q as settingsUpdateBody, qn as contentUpdateBody, qt as commentBulkBody, r as bylineListResponseSchema, rn as collectionListResponseSchema, rr as localeFilterQuery, rt as taxonomyDefTranslationsSchema, s as contentBylineInputSchema, sn as createCollectionBody, sr as successEnvelope, st as termResponseSchema, t as bylineCreateBody, tn as publicCommentSchema, tr as httpUrl, tt as createTermBody, u as notFoundListQuery, un as fieldReorderBody, ut as termWithCountSchema, v as redirectsListQuery, vn as updateFieldBody, vt as menuTranslationsSchema, w as widgetAreaSchema, wn as mediaItemSchema, wt as inviteCompleteBody, x as createWidgetBody, xn as mediaConfirmBody, xt as updateMenuBody, y as updateRedirectBody, yn as DEFAULT_MAX_UPLOAD_SIZE, yt as menuWithItemsSchema, z as wpPrepareBody, zn as contentResponseSchema, zt as siteBriefingQuery } from "../../bylines-CtD_p_1z.mjs";
2
2
  import { atprotoLoginBody, setupAdminBody, setupAdminVerifyBody, setupAtprotoAdminBody, setupBody } from "./setup.mjs";
3
3
  export { DEFAULT_MAX_UPLOAD_SIZE, VALID_ROLE_LEVELS, adminCommentListResponseSchema, allowedDomainCreateBody, allowedDomainUpdateBody, apiErrorSchema, atprotoLoginBody, authMeActionBody, bylineCreateBody, bylineCreditSchema, bylineListResponseSchema, bylineSummarySchema, bylineUpdateBody, bylinesListQuery, collectionGetQuery, collectionListResponseSchema, collectionResponseSchema, collectionSchema, collectionWithFieldsResponseSchema, commentBulkBody, commentBulkResponseSchema, commentCountsResponseSchema, commentListQuery, commentSchema, commentStatusBody, contentBylineInputSchema, contentCompareResponseSchema, contentCreateBody, contentItemSchema, contentListQuery, contentListResponseSchema, contentPreviewUrlBody, contentPublishBody, contentResponseSchema, contentScheduleBody, contentSeoInput, contentSeoSchema, contentTermsBody, contentTranslationSchema, contentTranslationsResponseSchema, contentTrashQuery, contentUpdateBody, contextEntryCreateBody, contextEntryDiffQuery, contextEntryListQuery, contextEntryReviewBody, contextEntryStaleQuery, contextEntrySupersedeBody, countResponseSchema, createCollectionBody, createCommentBody, createFieldBody, createMenuBody, createMenuItemBody, createRedirectBody, createSectionBody, createTaxonomyDefBody, createTermBody, createWidgetAreaBody, createWidgetBody, cursorPaginationQuery, deleteResponseSchema, fieldListResponseSchema, fieldReorderBody, fieldResponseSchema, fieldSchema, formatFileSize, hitlRequestListQuery, hitlRequestResolveBody, httpUrl, importProbeBody, inviteCompleteBody, inviteCreateBody, inviteRegisterOptionsBody, localeCode, localeFilterQuery, magicLinkSendBody, mediaConfirmBody, mediaConfirmResponseSchema, mediaExistingResponseSchema, mediaItemSchema, mediaListQuery, mediaListResponseSchema, mediaProviderListQuery, mediaResponseSchema, mediaUpdateBody, mediaUploadUrlBody, mediaUploadUrlResponseSchema, menuItemSchema, menuItemTypeEnum, menuListItemSchema, menuSchema, menuTranslationsSchema, menuWithItemsSchema, notFoundEntrySchema, notFoundListQuery, notFoundListResponseSchema, notFoundPruneBody, notFoundSummaryQuery, notFoundSummaryResponseSchema, notFoundSummarySchema, offsetPaginationQuery, orphanRegisterBody, orphanedTableListResponseSchema, orphanedTableSchema, passkeyOptionsBody, passkeyRegisterOptionsBody, passkeyRegisterVerifyBody, passkeyRenameBody, passkeyVerifyBody, publicCommentListResponseSchema, publicCommentSchema, redirectListResponseSchema, redirectSchema, redirectsListQuery, reorderMenuItemsBody, reorderWidgetsBody, reviewRequestListQuery, reviewRequestResolveBody, roleLevel, schemaExportQuery, searchEnableBody, searchQuery, searchRebuildBody, searchResponseSchema, searchResultSchema, searchSuggestQuery, sectionListResponseSchema, sectionSchema, sectionsListQuery, settingsUpdateBody, setupAdminBody, setupAdminVerifyBody, setupAtprotoAdminBody, setupBody, signupCompleteBody, signupRequestBody, siteBriefingQuery, siteSettingsSchema, slugPattern, successEnvelope, taxonomyDefSchema, taxonomyDefTranslationsSchema, taxonomyListResponseSchema, termGetResponseSchema, termListResponseSchema, termResponseSchema, termSchema, termTranslationsSchema, termWithCountSchema, trashedContentItemSchema, trashedContentListResponseSchema, updateCollectionBody, updateFieldBody, updateMenuBody, updateMenuItemBody, updateRedirectBody, updateSectionBody, updateTermBody, updateWidgetBody, userDetailSchema, userListResponseSchema, userSchema, userUpdateBody, usersListQuery, widgetAreaSchema, widgetAreaWithWidgetsAndCountSchema, widgetAreaWithWidgetsSchema, widgetSchema, wpMediaImportBody, wpPluginAnalyzeBody, wpPluginExecuteBody, wpPrepareBody, wpRewriteUrlsBody };
@@ -16,7 +16,7 @@ import { n as requestCached } from "./request-cache-BpwuE2ix.mjs";
16
16
  import { u as PluginStateRepository } from "./briefing-Jsxs587i.mjs";
17
17
  import { n as SchemaRegistry, t as SchemaError } from "./registry-i__XP2WV.mjs";
18
18
  import { n as hashString } from "./hash-DFFrkivP.mjs";
19
- import { n as VERSION, t as COMMIT } from "./version-HcqOJZFv.mjs";
19
+ import { n as VERSION, t as COMMIT } from "./version-q9Wd8cwL.mjs";
20
20
  import { i as pluginManifestSchema, r as normalizeManifestRoute } from "./manifest-schema-C6fzQoWn.mjs";
21
21
  import { t as DinewayStorageError } from "./types-CNNQ8l0v.mjs";
22
22
  import { sql } from "kysely";
@@ -6,7 +6,7 @@ import "../types-BgE6gMFI.mjs";
6
6
  import "../runner-pAnQS6iI.mjs";
7
7
  import "../index-2tBfB_8X.mjs";
8
8
  import "../index-CpbixmRL.mjs";
9
- import "../bylines-CeNpt_vk.mjs";
9
+ import "../bylines-CtD_p_1z.mjs";
10
10
  import "../types-BBETcziA.mjs";
11
11
  import "../validate-BzUCAU2a.mjs";
12
12
  import { DinewayHandlers, DinewayManifest, ManifestCollection } from "./types.mjs";
@@ -1,4 +1,4 @@
1
- import { n as VERSION, t as COMMIT } from "../version-HcqOJZFv.mjs";
1
+ import { n as VERSION, t as COMMIT } from "../version-q9Wd8cwL.mjs";
2
2
  import { t as defaultSeed } from "../default-5A3XVR7L.mjs";
3
3
  import { n as validateAllowedOrigins, r as validateOriginShape } from "../allowed-origins-3RuuoFjC.mjs";
4
4
  import { createRequire } from "node:module";
@@ -5,7 +5,7 @@ import "../../types-BgE6gMFI.mjs";
5
5
  import "../../runner-pAnQS6iI.mjs";
6
6
  import "../../index-2tBfB_8X.mjs";
7
7
  import "../../index-CpbixmRL.mjs";
8
- import "../../bylines-CeNpt_vk.mjs";
8
+ import "../../bylines-CtD_p_1z.mjs";
9
9
  import "../../types-BBETcziA.mjs";
10
10
  import "../../validate-BzUCAU2a.mjs";
11
11
  import { DinewayHandlers } from "../types.mjs";
@@ -25,7 +25,7 @@ import "../byline-DpNNSjET.mjs";
25
25
  import { t as normalizeMediaValue } from "../normalize-BY_EJnd9.mjs";
26
26
  import "../placeholder-b0Ufu0La.mjs";
27
27
  import "../seo-BPb_reaG.mjs";
28
- import { $ as validateRev, A as handleRevisionGet, B as handleContentDuplicate, D as handleMediaGet, E as handleMediaDelete, F as handleContentCountScheduled, G as handleContentPermanentDelete, H as handleContentGetIncludingTrashed, I as handleContentCountTrashed, J as handleContentSchedule, K as handleContentPublish, L as handleContentCreate, M as handleRevisionRestore, O as handleMediaList, P as handleContentCompare, Q as handleContentUpdate, R as handleContentDelete, T as handleMediaCreate, U as handleContentList, V as handleContentGet, W as handleContentListTrashed, X as handleContentUnpublish, Y as handleContentTranslations, Z as handleContentUnschedule, d as createPluginBundleStore, j as handleRevisionList, k as handleMediaUpdate, q as handleContentRestore, z as handleContentDiscardDraft } from "../api-BaFOFZnE.mjs";
28
+ import { $ as validateRev, A as handleRevisionGet, B as handleContentDuplicate, D as handleMediaGet, E as handleMediaDelete, F as handleContentCountScheduled, G as handleContentPermanentDelete, H as handleContentGetIncludingTrashed, I as handleContentCountTrashed, J as handleContentSchedule, K as handleContentPublish, L as handleContentCreate, M as handleRevisionRestore, O as handleMediaList, P as handleContentCompare, Q as handleContentUpdate, R as handleContentDelete, T as handleMediaCreate, U as handleContentList, V as handleContentGet, W as handleContentListTrashed, X as handleContentUnpublish, Y as handleContentTranslations, Z as handleContentUnschedule, d as createPluginBundleStore, j as handleRevisionList, k as handleMediaUpdate, q as handleContentRestore, z as handleContentDiscardDraft } from "../api-Ow6RbraA.mjs";
29
29
  import { n as requestCached } from "../request-cache-BpwuE2ix.mjs";
30
30
  import "../dashboard-BC9bgPOH.mjs";
31
31
  import { u as PluginStateRepository } from "../briefing-Jsxs587i.mjs";
@@ -37,7 +37,7 @@ import { c as createPublicMediaUrlResolver } from "../settings-DORe02PC.mjs";
37
37
  import "../briefing-DD82WaEy.mjs";
38
38
  import "../review-requests-DuIxM4YM.mjs";
39
39
  import { n as hashString } from "../hash-DFFrkivP.mjs";
40
- import { n as VERSION, t as COMMIT } from "../version-HcqOJZFv.mjs";
40
+ import { n as VERSION, t as COMMIT } from "../version-q9Wd8cwL.mjs";
41
41
  import "../query-BnRpB09I.mjs";
42
42
  import "../zod-generator-C4BgFBZV.mjs";
43
43
  import "../schema-U-SeFWwn.mjs";
@@ -14,7 +14,7 @@ import "../../../../../../menus-DOaL6NaF.mjs";
14
14
  import "../../../../../../redirect-BaVvo2te.mjs";
15
15
  import "../../../../../../byline-DpNNSjET.mjs";
16
16
  import "../../../../../../seo-BPb_reaG.mjs";
17
- import "../../../../../../api-BaFOFZnE.mjs";
17
+ import "../../../../../../api-Ow6RbraA.mjs";
18
18
  import "../../../../../../request-cache-BpwuE2ix.mjs";
19
19
  import "../../../../../../dashboard-BC9bgPOH.mjs";
20
20
  import { c as handlePluginGet, o as handlePluginDisable } from "../../../../../../briefing-Jsxs587i.mjs";
@@ -14,7 +14,7 @@ import "../../../../../../menus-DOaL6NaF.mjs";
14
14
  import "../../../../../../redirect-BaVvo2te.mjs";
15
15
  import "../../../../../../byline-DpNNSjET.mjs";
16
16
  import "../../../../../../seo-BPb_reaG.mjs";
17
- import "../../../../../../api-BaFOFZnE.mjs";
17
+ import "../../../../../../api-Ow6RbraA.mjs";
18
18
  import "../../../../../../request-cache-BpwuE2ix.mjs";
19
19
  import "../../../../../../dashboard-BC9bgPOH.mjs";
20
20
  import { c as handlePluginGet, s as handlePluginEnable } from "../../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../../seo-BPb_reaG.mjs";
16
- import "../../../../../../api-BaFOFZnE.mjs";
16
+ import "../../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import { c as handlePluginGet } from "../../../../../../briefing-Jsxs587i.mjs";
@@ -14,7 +14,7 @@ import "../../../../../../menus-DOaL6NaF.mjs";
14
14
  import "../../../../../../redirect-BaVvo2te.mjs";
15
15
  import "../../../../../../byline-DpNNSjET.mjs";
16
16
  import "../../../../../../seo-BPb_reaG.mjs";
17
- import { a as handleMarketplaceUninstall } from "../../../../../../api-BaFOFZnE.mjs";
17
+ import { a as handleMarketplaceUninstall } from "../../../../../../api-Ow6RbraA.mjs";
18
18
  import "../../../../../../request-cache-BpwuE2ix.mjs";
19
19
  import "../../../../../../dashboard-BC9bgPOH.mjs";
20
20
  import { l as handlePluginList } from "../../../../../../briefing-Jsxs587i.mjs";
@@ -14,7 +14,7 @@ import "../../../../../../menus-DOaL6NaF.mjs";
14
14
  import "../../../../../../redirect-BaVvo2te.mjs";
15
15
  import "../../../../../../byline-DpNNSjET.mjs";
16
16
  import "../../../../../../seo-BPb_reaG.mjs";
17
- import { c as handleMarketplaceUpdatePreview, o as handleMarketplaceUpdate } from "../../../../../../api-BaFOFZnE.mjs";
17
+ import { c as handleMarketplaceUpdatePreview, o as handleMarketplaceUpdate } from "../../../../../../api-Ow6RbraA.mjs";
18
18
  import "../../../../../../request-cache-BpwuE2ix.mjs";
19
19
  import "../../../../../../dashboard-BC9bgPOH.mjs";
20
20
  import "../../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../seo-BPb_reaG.mjs";
16
- import "../../../../../api-BaFOFZnE.mjs";
16
+ import "../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import { l as handlePluginList } from "../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../../../seo-BPb_reaG.mjs";
16
- import { t as handleMarketplaceGetPlugin } from "../../../../../../../api-BaFOFZnE.mjs";
16
+ import { t as handleMarketplaceGetPlugin } from "../../../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../../../briefing-Jsxs587i.mjs";
@@ -14,7 +14,7 @@ import "../../../../../../../menus-DOaL6NaF.mjs";
14
14
  import "../../../../../../../redirect-BaVvo2te.mjs";
15
15
  import "../../../../../../../byline-DpNNSjET.mjs";
16
16
  import "../../../../../../../seo-BPb_reaG.mjs";
17
- import { n as handleMarketplaceInstall, r as handleMarketplaceInstallPreview } from "../../../../../../../api-BaFOFZnE.mjs";
17
+ import { n as handleMarketplaceInstall, r as handleMarketplaceInstallPreview } from "../../../../../../../api-Ow6RbraA.mjs";
18
18
  import "../../../../../../../request-cache-BpwuE2ix.mjs";
19
19
  import "../../../../../../../dashboard-BC9bgPOH.mjs";
20
20
  import "../../../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../../seo-BPb_reaG.mjs";
16
- import { i as handleMarketplaceSearch } from "../../../../../../api-BaFOFZnE.mjs";
16
+ import { i as handleMarketplaceSearch } from "../../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../seo-BPb_reaG.mjs";
16
- import { s as handleMarketplaceUpdateCheck } from "../../../../../api-BaFOFZnE.mjs";
16
+ import { s as handleMarketplaceUpdateCheck } from "../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../../../seo-BPb_reaG.mjs";
16
- import { l as handleThemeGetDetail } from "../../../../../../../api-BaFOFZnE.mjs";
16
+ import { l as handleThemeGetDetail } from "../../../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../../seo-BPb_reaG.mjs";
16
- import { u as handleThemeSearch } from "../../../../../../api-BaFOFZnE.mjs";
16
+ import { u as handleThemeSearch } from "../../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../../briefing-Jsxs587i.mjs";
@@ -1,4 +1,4 @@
1
- import { n as VERSION } from "../../../version-HcqOJZFv.mjs";
1
+ import { n as VERSION } from "../../../version-q9Wd8cwL.mjs";
2
2
  import { sql } from "kysely";
3
3
 
4
4
  //#region src/astro/routes/api/health.ts
@@ -1,4 +1,4 @@
1
- import { n as VERSION, t as COMMIT } from "../../../version-HcqOJZFv.mjs";
1
+ import { n as VERSION, t as COMMIT } from "../../../version-q9Wd8cwL.mjs";
2
2
  import { r as handleError } from "../../../error-DLkgOP5m.mjs";
3
3
  import { t as getAuthMode } from "../../../mode-Bd55iLcP.mjs";
4
4
  import { i as experimentalSiteContextWorkflowsEnabled } from "../../../experimental-workflows-BbZbIEZp.mjs";
@@ -14,7 +14,7 @@ import "../../../fts-manager-DnfOsF4s.mjs";
14
14
  import "../../../registry-i__XP2WV.mjs";
15
15
  import "../../../loader-p2imNN98.mjs";
16
16
  import "../../../settings-DORe02PC.mjs";
17
- import { n as VERSION } from "../../../version-HcqOJZFv.mjs";
17
+ import { n as VERSION } from "../../../version-q9Wd8cwL.mjs";
18
18
  import "../../../query-BnRpB09I.mjs";
19
19
  import "../../../zod-generator-C4BgFBZV.mjs";
20
20
  import "../../../schema-U-SeFWwn.mjs";
@@ -1,4 +1,4 @@
1
- import { n as VERSION } from "../../../version-HcqOJZFv.mjs";
1
+ import { n as VERSION } from "../../../version-q9Wd8cwL.mjs";
2
2
  import { r as handleError } from "../../../error-DLkgOP5m.mjs";
3
3
  import { $ as createMenuBody, $t as contentListQuery, A as searchRebuildBody, B as updateSectionBody, Bt as mediaConfirmResponseSchema, C as userDetailSchema, D as usersListQuery, Dt as fieldListResponseSchema, E as userUpdateBody, Et as createFieldBody, F as siteSettingsSchema, Ft as updateCollectionBody, G as taxonomyListResponseSchema, H as createTermBody, I as createSectionBody, It as updateFieldBody, J as termResponseSchema, Jt as mediaUploadUrlBody, K as termGetResponseSchema, Kt as mediaResponseSchema, L as sectionListResponseSchema, Lt as DEFAULT_MAX_UPLOAD_SIZE, Mn as successEnvelope, Mt as orphanedTableListResponseSchema, N as searchSuggestQuery, O as searchEnableBody, Ot as fieldReorderBody, P as settingsUpdateBody, Q as updateTermBody, Qt as contentItemSchema, R as sectionSchema, S as allowedDomainUpdateBody, Sn as apiErrorSchema, St as collectionResponseSchema, T as userSchema, Tn as deleteResponseSchema, Tt as createCollectionBody, Ut as mediaListQuery, Vt as mediaExistingResponseSchema, Wt as mediaListResponseSchema, Xt as contentCompareResponseSchema, Yt as mediaUploadUrlResponseSchema, Zt as contentCreateBody, _ as widgetAreaSchema, _t as createCommentBody, a as notFoundPruneBody, b as widgetSchema, bt as collectionGetQuery, ct as updateMenuBody, d as redirectsListQuery, dn as contentUpdateBody, dt as commentBulkBody, en as contentListResponseSchema, et as createMenuItemBody, f as updateRedirectBody, ft as commentBulkResponseSchema, g as updateWidgetBody, gt as commentStatusBody, h as reorderWidgetsBody, ht as commentSchema, i as notFoundListResponseSchema, in as contentScheduleBody, j as searchResponseSchema, jt as orphanRegisterBody, k as searchQuery, kt as fieldResponseSchema, l as redirectListResponseSchema, ln as contentTranslationsResponseSchema, lt as updateMenuItemBody, m as createWidgetBody, mt as commentListQuery, nn as contentPublishBody, ot as menuWithItemsSchema, p as createWidgetAreaBody, pn as trashedContentListResponseSchema, pt as commentCountsResponseSchema, q as termListResponseSchema, qt as mediaUpdateBody, r as notFoundListQuery, rn as contentResponseSchema, rt as menuListItemSchema, s as notFoundSummaryResponseSchema, sn as contentTermsBody, st as reorderMenuItemsBody, t as createRedirectBody, tt as menuItemSchema, u as redirectSchema, un as contentTrashQuery, ut as adminCommentListResponseSchema, v as widgetAreaWithWidgetsAndCountSchema, vt as publicCommentListResponseSchema, w as userListResponseSchema, wt as collectionWithFieldsResponseSchema, x as allowedDomainCreateBody, xt as collectionListResponseSchema, y as widgetAreaWithWidgetsSchema, z as sectionsListQuery, zt as mediaConfirmBody } from "../../../redirects-x5ol_Qj9.mjs";
4
4
  import { z } from "zod";
@@ -13,7 +13,7 @@ import "../../../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../../../seo-BPb_reaG.mjs";
16
- import { b as handleSchemaFieldDelete, w as handleSchemaFieldUpdate, x as handleSchemaFieldGet } from "../../../../../../../api-BaFOFZnE.mjs";
16
+ import { b as handleSchemaFieldDelete, w as handleSchemaFieldUpdate, x as handleSchemaFieldGet } from "../../../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../../../seo-BPb_reaG.mjs";
16
- import { S as handleSchemaFieldList, y as handleSchemaFieldCreate } from "../../../../../../../api-BaFOFZnE.mjs";
16
+ import { S as handleSchemaFieldList, y as handleSchemaFieldCreate } from "../../../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../../../seo-BPb_reaG.mjs";
16
- import { C as handleSchemaFieldReorder } from "../../../../../../../api-BaFOFZnE.mjs";
16
+ import { C as handleSchemaFieldReorder } from "../../../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../../seo-BPb_reaG.mjs";
16
- import { g as handleSchemaCollectionGet, h as handleSchemaCollectionDelete, v as handleSchemaCollectionUpdate } from "../../../../../../api-BaFOFZnE.mjs";
16
+ import { g as handleSchemaCollectionGet, h as handleSchemaCollectionDelete, v as handleSchemaCollectionUpdate } from "../../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../seo-BPb_reaG.mjs";
16
- import { _ as handleSchemaCollectionList, m as handleSchemaCollectionCreate } from "../../../../../api-BaFOFZnE.mjs";
16
+ import { _ as handleSchemaCollectionList, m as handleSchemaCollectionCreate } from "../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../seo-BPb_reaG.mjs";
16
- import { p as handleOrphanedTableRegister } from "../../../../../api-BaFOFZnE.mjs";
16
+ import { p as handleOrphanedTableRegister } from "../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../briefing-Jsxs587i.mjs";
@@ -13,7 +13,7 @@ import "../../../../../menus-DOaL6NaF.mjs";
13
13
  import "../../../../../redirect-BaVvo2te.mjs";
14
14
  import "../../../../../byline-DpNNSjET.mjs";
15
15
  import "../../../../../seo-BPb_reaG.mjs";
16
- import { f as handleOrphanedTableList } from "../../../../../api-BaFOFZnE.mjs";
16
+ import { f as handleOrphanedTableList } from "../../../../../api-Ow6RbraA.mjs";
17
17
  import "../../../../../request-cache-BpwuE2ix.mjs";
18
18
  import "../../../../../dashboard-BC9bgPOH.mjs";
19
19
  import "../../../../../briefing-Jsxs587i.mjs";
@@ -1,5 +1,5 @@
1
1
  import { t as OptionsRepository } from "../../../../options-BF11H_FD.mjs";
2
- import { n as VERSION } from "../../../../version-HcqOJZFv.mjs";
2
+ import { n as VERSION } from "../../../../version-q9Wd8cwL.mjs";
3
3
  import { t as getAuthMode } from "../../../../mode-Bd55iLcP.mjs";
4
4
 
5
5
  //#region src/astro/routes/api/well-known/auth.ts
@@ -8,7 +8,7 @@ import "../runner-pAnQS6iI.mjs";
8
8
  import "../index-2tBfB_8X.mjs";
9
9
  import "../index-CpbixmRL.mjs";
10
10
  import { d as Storage } from "../types-BYjPylrZ.mjs";
11
- import "../bylines-CeNpt_vk.mjs";
11
+ import "../bylines-CtD_p_1z.mjs";
12
12
  import "../types-BBETcziA.mjs";
13
13
  import "../validate-BzUCAU2a.mjs";
14
14
  import "../index.mjs";
@@ -4,7 +4,7 @@ import { z } from "zod";
4
4
  /** Valid role level values */
5
5
  declare const VALID_ROLE_LEVELS: Set<number>;
6
6
  /** Role level — coerces string/number to valid RoleLevel (10|20|30|40|50) */
7
- declare const roleLevel: z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>;
7
+ declare const roleLevel: z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>;
8
8
  /** Pagination query params — cursor-based */
9
9
  declare const cursorPaginationQuery: z.ZodObject<{
10
10
  cursor: z.ZodOptional<z.ZodString>;
@@ -558,9 +558,9 @@ declare const createFieldBody: z.ZodObject<{
558
558
  number: "number";
559
559
  boolean: "boolean";
560
560
  file: "file";
561
- url: "url";
562
561
  slug: "slug";
563
562
  text: "text";
563
+ url: "url";
564
564
  integer: "integer";
565
565
  datetime: "datetime";
566
566
  select: "select";
@@ -588,8 +588,8 @@ declare const createFieldBody: z.ZodObject<{
588
588
  string: "string";
589
589
  number: "number";
590
590
  boolean: "boolean";
591
- url: "url";
592
591
  text: "text";
592
+ url: "url";
593
593
  integer: "integer";
594
594
  datetime: "datetime";
595
595
  select: "select";
@@ -627,8 +627,8 @@ declare const updateFieldBody: z.ZodObject<{
627
627
  string: "string";
628
628
  number: "number";
629
629
  boolean: "boolean";
630
- url: "url";
631
630
  text: "text";
631
+ url: "url";
632
632
  integer: "integer";
633
633
  datetime: "datetime";
634
634
  select: "select";
@@ -685,9 +685,9 @@ declare const fieldSchema: z.ZodObject<{
685
685
  number: "number";
686
686
  boolean: "boolean";
687
687
  file: "file";
688
- url: "url";
689
688
  slug: "slug";
690
689
  text: "text";
690
+ url: "url";
691
691
  integer: "integer";
692
692
  datetime: "datetime";
693
693
  select: "select";
@@ -750,9 +750,9 @@ declare const collectionWithFieldsResponseSchema: z.ZodObject<{
750
750
  number: "number";
751
751
  boolean: "boolean";
752
752
  file: "file";
753
- url: "url";
754
753
  slug: "slug";
755
754
  text: "text";
755
+ url: "url";
756
756
  integer: "integer";
757
757
  datetime: "datetime";
758
758
  select: "select";
@@ -804,9 +804,9 @@ declare const fieldResponseSchema: z.ZodObject<{
804
804
  number: "number";
805
805
  boolean: "boolean";
806
806
  file: "file";
807
- url: "url";
808
807
  slug: "slug";
809
808
  text: "text";
809
+ url: "url";
810
810
  integer: "integer";
811
811
  datetime: "datetime";
812
812
  select: "select";
@@ -841,9 +841,9 @@ declare const fieldListResponseSchema: z.ZodObject<{
841
841
  number: "number";
842
842
  boolean: "boolean";
843
843
  file: "file";
844
- url: "url";
845
844
  slug: "slug";
846
845
  text: "text";
846
+ url: "url";
847
847
  integer: "integer";
848
848
  datetime: "datetime";
849
849
  select: "select";
@@ -890,8 +890,8 @@ declare const createCommentBody: z.ZodObject<{
890
890
  }, z.core.$strip>;
891
891
  declare const commentStatusBody: z.ZodObject<{
892
892
  status: z.ZodEnum<{
893
- approved: "approved";
894
893
  pending: "pending";
894
+ approved: "approved";
895
895
  spam: "spam";
896
896
  trash: "trash";
897
897
  }>;
@@ -907,8 +907,8 @@ declare const commentBulkBody: z.ZodObject<{
907
907
  }, z.core.$strip>;
908
908
  declare const commentListQuery: z.ZodObject<{
909
909
  status: z.ZodOptional<z.ZodEnum<{
910
- approved: "approved";
911
910
  pending: "pending";
911
+ approved: "approved";
912
912
  spam: "spam";
913
913
  trash: "trash";
914
914
  }>>;
@@ -942,8 +942,8 @@ declare const commentSchema: z.ZodObject<{
942
942
  authorEmail: z.ZodString;
943
943
  body: z.ZodString;
944
944
  status: z.ZodEnum<{
945
- approved: "approved";
946
945
  pending: "pending";
946
+ approved: "approved";
947
947
  spam: "spam";
948
948
  trash: "trash";
949
949
  }>;
@@ -974,8 +974,8 @@ declare const adminCommentListResponseSchema: z.ZodObject<{
974
974
  authorEmail: z.ZodString;
975
975
  body: z.ZodString;
976
976
  status: z.ZodEnum<{
977
- approved: "approved";
978
977
  pending: "pending";
978
+ approved: "approved";
979
979
  spam: "spam";
980
980
  trash: "trash";
981
981
  }>;
@@ -1020,6 +1020,8 @@ declare const contextEntryListQuery: z.ZodObject<{
1020
1020
  cursor: z.ZodOptional<z.ZodString>;
1021
1021
  }, z.core.$strip>;
1022
1022
  declare const contextEntryStaleQuery: z.ZodObject<{
1023
+ cursor: z.ZodOptional<z.ZodString>;
1024
+ limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
1023
1025
  includeInherited: z.ZodPipe<z.ZodOptional<z.ZodEnum<{
1024
1026
  true: "true";
1025
1027
  false: "false";
@@ -1033,8 +1035,6 @@ declare const contextEntryStaleQuery: z.ZodObject<{
1033
1035
  system: "system";
1034
1036
  }>>;
1035
1037
  createdByActorId: z.ZodOptional<z.ZodString>;
1036
- limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
1037
- cursor: z.ZodOptional<z.ZodString>;
1038
1038
  now: z.ZodOptional<z.ZodString>;
1039
1039
  }, z.core.$strip>;
1040
1040
  declare const contextEntryDiffQuery: z.ZodObject<{
@@ -1115,8 +1115,8 @@ declare const siteBriefingQuery: z.ZodObject<{
1115
1115
  //#region src/api/schemas/hitl-requests.d.ts
1116
1116
  declare const hitlRequestListQuery: z.ZodObject<{
1117
1117
  status: z.ZodOptional<z.ZodEnum<{
1118
- approved: "approved";
1119
1118
  pending: "pending";
1119
+ approved: "approved";
1120
1120
  rejected: "rejected";
1121
1121
  }>>;
1122
1122
  priority: z.ZodOptional<z.ZodEnum<{
@@ -1143,8 +1143,8 @@ declare const hitlRequestResolveBody: z.ZodObject<{
1143
1143
  //#region src/api/schemas/review-requests.d.ts
1144
1144
  declare const reviewRequestListQuery: z.ZodObject<{
1145
1145
  status: z.ZodOptional<z.ZodEnum<{
1146
- approved: "approved";
1147
1146
  pending: "pending";
1147
+ approved: "approved";
1148
1148
  rejected: "rejected";
1149
1149
  }>>;
1150
1150
  collection: z.ZodOptional<z.ZodString>;
@@ -1192,7 +1192,7 @@ declare const signupCompleteBody: z.ZodObject<{
1192
1192
  }, z.core.$strip>;
1193
1193
  declare const inviteCreateBody: z.ZodObject<{
1194
1194
  email: z.ZodString;
1195
- role: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>>;
1195
+ role: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>>;
1196
1196
  }, z.core.$strip>;
1197
1197
  declare const inviteCompleteBody: z.ZodObject<{
1198
1198
  token: z.ZodString;
@@ -1744,15 +1744,15 @@ declare const usersListQuery: z.ZodObject<{
1744
1744
  declare const userUpdateBody: z.ZodObject<{
1745
1745
  name: z.ZodOptional<z.ZodString>;
1746
1746
  email: z.ZodOptional<z.ZodString>;
1747
- role: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>>;
1747
+ role: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>>;
1748
1748
  }, z.core.$strip>;
1749
1749
  declare const allowedDomainCreateBody: z.ZodObject<{
1750
1750
  domain: z.ZodString;
1751
- defaultRole: z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>;
1751
+ defaultRole: z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>;
1752
1752
  }, z.core.$strip>;
1753
1753
  declare const allowedDomainUpdateBody: z.ZodObject<{
1754
1754
  enabled: z.ZodOptional<z.ZodBoolean>;
1755
- defaultRole: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<50 | 10 | 20 | 30 | 40, unknown, z.core.$ZodTypeInternals<50 | 10 | 20 | 30 | 40, unknown>>>;
1755
+ defaultRole: z.ZodOptional<z.ZodCoercedNumber<unknown> & z.ZodType<10 | 20 | 30 | 40 | 50, unknown, z.core.$ZodTypeInternals<10 | 20 | 30 | 40 | 50, unknown>>>;
1756
1756
  }, z.core.$strip>;
1757
1757
  declare const userSchema: z.ZodObject<{
1758
1758
  id: z.ZodString;
@@ -1637,7 +1637,7 @@ async function writeForgewayCredentials(credentials, cwd) {
1637
1637
  await writeStore(store, cwd);
1638
1638
  }
1639
1639
  function shadowGrantKey(platformApiUrl, placeId) {
1640
- return `${platformApiUrl.replace(TRAILING_SLASH_PATTERN$1, "")}#${placeId}`;
1640
+ return `${platformApiUrl.replace(TRAILING_SLASH_PATTERN$1, "")}#${placeId ?? "__unbound__"}`;
1641
1641
  }
1642
1642
  async function readForgewayShadowGrant(platformApiUrl, placeId, cwd) {
1643
1643
  const store = await readStore(cwd);
@@ -1665,19 +1665,26 @@ const DATABASE_ENV_VAR_NAMES = ["DINEWAY_DATABASE_URL", "DINEWAY_DATABASE_AUTH_T
1665
1665
  const POLL_INTERVAL_MS$1 = 5e3;
1666
1666
  const POLL_TIMEOUT_MS$1 = 3e5;
1667
1667
  const DIRECT_UPLOAD_CONCURRENCY = 8;
1668
- const DEFAULT_BOOTSTRAP_PLACE_ID = "ChIJs5ydyTiuEmsR0fRSlU0C7k0";
1669
1668
  const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
1670
1669
  const PLACE_ID_PATTERN = /^[A-Za-z0-9_-]{10,}$/;
1671
1670
  const SLUG_SEPARATOR_PATTERN = /[^a-z0-9]+/g;
1672
1671
  const LEADING_TRAILING_HYPHEN_PATTERN = /^-+|-+$/g;
1672
+ const DIACRITICS_PATTERN = /[\u0300-\u036f]/g;
1673
+ const NON_COMPARE_PATTERN = /[^\p{Letter}\p{Number}]+/gu;
1674
+ const LOCATION_PARTS_PATTERN = /[,;|/]+|\s+-\s+/u;
1673
1675
  const JWT_PATTERN = /[A-Za-z0-9_-]{32,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}/g;
1674
1676
  const TOKEN_ASSIGNMENT_PATTERN = /(DINEWAY_DATABASE_AUTH_TOKEN|DATABASE_AUTH_TOKEN|AUTH_TOKEN)=\S+/gi;
1675
1677
  const TRAILING_SLASH_PATTERN = /\/$/;
1676
1678
  const BACKSLASH_PATTERN = /\\/g;
1677
- const DIACRITICS_PATTERN = /[\u0300-\u036f]/g;
1678
- const NON_COMPARE_PATTERN = /[^\p{Letter}\p{Number}]+/gu;
1679
- const LOCATION_PARTS_PATTERN = /[,;|/]+|\s+-\s+/u;
1680
1679
  const SHADOW_EMAIL_PATTERN = /^shadow_[a-f0-9]{16}@dineway\.ai$/i;
1680
+ const FOOD_TYPES = new Set([
1681
+ "restaurant",
1682
+ "cafe",
1683
+ "food",
1684
+ "meal_takeaway",
1685
+ "meal_delivery",
1686
+ "bakery"
1687
+ ]);
1681
1688
  const EXCLUDE_PATTERNS = [
1682
1689
  "node_modules",
1683
1690
  ".git",
@@ -1792,7 +1799,7 @@ async function refreshFormalAccessToken(context, deps) {
1792
1799
  return payload.accessToken;
1793
1800
  }
1794
1801
  async function refreshShadowAccessToken(context, deps) {
1795
- if (!context.refreshToken || !context.placeId) throw new Error("Dineway shadow deploy grant is missing its refresh token.");
1802
+ if (!context.refreshToken) throw new Error("Dineway shadow deploy grant is missing its refresh token.");
1796
1803
  const response = await forgewayRequest(`${context.platformApiUrl}/api/auth/refresh?client_type=server`, {
1797
1804
  method: "POST",
1798
1805
  headers: { "Content-Type": "application/json" },
@@ -1849,7 +1856,6 @@ function isStoredFormalCredentialForGrant(stored, grant, email) {
1849
1856
  if (normalizeEmail(stored.user.email) !== email) return false;
1850
1857
  if (stored.user.emailVerified !== true) return false;
1851
1858
  if (isShadowEmail(stored.user.email)) return false;
1852
- if (grant.user?.id && stored.user.id !== grant.user.id) return false;
1853
1859
  return true;
1854
1860
  }
1855
1861
  function assertVerifiedFormalAccountUser(user, expectedEmail) {
@@ -1917,7 +1923,7 @@ async function resolveShadowProjectContext(cwd, options, deps) {
1917
1923
  const pkg = await readDeployPackageJson(cwd).catch(() => null);
1918
1924
  const saved = pkg ? getSavedForgewayMetadata(pkg) : {};
1919
1925
  const platformApiUrl = normalizePlatformApiUrl(getEnv("DINEWAY_API_BASE_URL") ?? getEnv("FORGEWAY_API_URL") ?? (typeof saved.platformApiUrl === "string" ? saved.platformApiUrl : void 0));
1920
- const savedPlaceId = getEnv("DINEWAY_PLACE_ID") ?? (typeof saved.placeId === "string" ? saved.placeId : void 0);
1926
+ const savedPlaceId = options.placeId ?? getEnv("DINEWAY_PLACE_ID") ?? (typeof saved.placeId === "string" ? saved.placeId : void 0);
1921
1927
  let grant = await (deps.readShadowGrant ?? readForgewayShadowGrant)(platformApiUrl, savedPlaceId, cwd);
1922
1928
  let restaurant;
1923
1929
  if (!grant) {
@@ -1936,6 +1942,28 @@ async function resolveShadowProjectContext(cwd, options, deps) {
1936
1942
  name: options.restaurantName ?? grant.restaurantName,
1937
1943
  city: options.city ?? grant.city
1938
1944
  };
1945
+ if (!grant.placeId) {
1946
+ const shadowRestaurant = restaurant?.name && restaurant.city ? {
1947
+ name: restaurant.name,
1948
+ city: restaurant.city
1949
+ } : await resolveShadowRestaurantInfo(options, deps);
1950
+ restaurant = shadowRestaurant;
1951
+ grant = savedPlaceId ? await bindShadowGrantPlace({
1952
+ platformApiUrl,
1953
+ grant,
1954
+ placeId: savedPlaceId,
1955
+ restaurant: shadowRestaurant,
1956
+ cwd,
1957
+ deps
1958
+ }) : await resolvePlaceIdWithShadowSearch({
1959
+ platformApiUrl,
1960
+ grant,
1961
+ restaurant: shadowRestaurant,
1962
+ cwd,
1963
+ deps
1964
+ });
1965
+ }
1966
+ if (!grant.placeId) throw new Error("Could not resolve a Dineway place id for Forgeway deploy.");
1939
1967
  const shadowContext = {
1940
1968
  projectDir: cwd,
1941
1969
  platformApiUrl,
@@ -1965,107 +1993,280 @@ async function resolveShadowProjectContext(cwd, options, deps) {
1965
1993
  async function resolveProjectContext(cwd, options, deps) {
1966
1994
  return await resolveShadowProjectContext(cwd, options, deps);
1967
1995
  }
1996
+ async function createShadowUser(platformApiUrl, placeId, deps) {
1997
+ const response = await forgewayRequest(`${platformApiUrl}/api/auth/users/shadow`, {
1998
+ method: "POST",
1999
+ headers: { "Content-Type": "application/json" },
2000
+ body: JSON.stringify({
2001
+ ...placeId ? { placeId } : {},
2002
+ language: "en"
2003
+ })
2004
+ }, deps);
2005
+ if (!response.ok) throw new Error(await parseErrorResponse(response));
2006
+ const payload = await response.json();
2007
+ if (!payload.accessToken || !payload.refreshToken) throw new Error("Dineway shadow user response was missing tokens.");
2008
+ return payload;
2009
+ }
1968
2010
  function isRecord(value) {
1969
- return typeof value === "object" && value !== null;
2011
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2012
+ }
2013
+ function uniqueStrings(values) {
2014
+ return [...new Set(values.map((value) => String(value || "").trim()).filter(Boolean))];
1970
2015
  }
1971
- function getText(value) {
2016
+ function displayText(value) {
1972
2017
  if (typeof value === "string" || typeof value === "number") return String(value);
1973
- if (Array.isArray(value)) return value.map(getText).filter(Boolean).join(" ");
1974
- if (isRecord(value)) return getText(value.text) || getText(value.name) || getText(value.displayName) || getText(value.longText) || getText(value.shortText) || getText(value.value);
2018
+ if (Array.isArray(value)) return value.map(displayText).filter(Boolean).join(" ");
2019
+ if (isRecord(value)) return displayText(value.text) || displayText(value.name) || displayText(value.displayName) || displayText(value.longText) || displayText(value.shortText) || displayText(value.long_name) || displayText(value.short_name) || displayText(value.value);
1975
2020
  return "";
1976
2021
  }
1977
- function compareText(value) {
1978
- return value.toLowerCase().normalize("NFKD").replace(DIACRITICS_PATTERN, "").replace(NON_COMPARE_PATTERN, "");
2022
+ function normalizeCompare(value) {
2023
+ return String(value || "").toLowerCase().normalize("NFKD").replace(DIACRITICS_PATTERN, "").replace(NON_COMPARE_PATTERN, "");
1979
2024
  }
1980
2025
  function candidatePlaceId(candidate) {
1981
2026
  return String(candidate.placeId || candidate.id || "").trim();
1982
2027
  }
1983
- function candidateNames(candidate) {
1984
- return [
1985
- getText(candidate.displayName),
1986
- getText(candidate.name),
1987
- getText(candidate.businessName),
1988
- getText(candidate.title)
1989
- ].filter(Boolean);
2028
+ function candidateNameTexts(candidate) {
2029
+ return uniqueStrings([
2030
+ displayText(candidate.displayName),
2031
+ displayText(candidate.name),
2032
+ displayText(candidate.businessName),
2033
+ displayText(candidate.title)
2034
+ ]);
2035
+ }
2036
+ function candidateAddressTexts(candidate) {
2037
+ const addressComponents = Array.isArray(candidate.addressComponents) ? candidate.addressComponents.flatMap((component) => isRecord(component) ? [
2038
+ displayText(component.longText),
2039
+ displayText(component.shortText),
2040
+ displayText(component.long_name),
2041
+ displayText(component.short_name),
2042
+ displayText(component.name)
2043
+ ] : []) : [];
2044
+ return uniqueStrings([
2045
+ displayText(candidate.formattedAddress),
2046
+ displayText(candidate.shortFormattedAddress),
2047
+ displayText(candidate.address),
2048
+ displayText(candidate.vicinity),
2049
+ displayText(candidate.plusCode?.compoundCode),
2050
+ displayText(candidate.plus_code?.compound_code),
2051
+ ...addressComponents
2052
+ ]);
2053
+ }
2054
+ function candidateTypes(candidate) {
2055
+ return uniqueStrings([
2056
+ ...Array.isArray(candidate.types) ? candidate.types : [],
2057
+ candidate.primaryType,
2058
+ candidate.primary_type
2059
+ ]).map((type) => type.toLowerCase());
2060
+ }
2061
+ function locationParts(value) {
2062
+ return uniqueStrings(value.split(LOCATION_PARTS_PATTERN).map((part) => normalizeCompare(part)).filter(Boolean));
2063
+ }
2064
+ function scoreNameMatch(queryName, candidateNames) {
2065
+ let bestScore = 0;
2066
+ let bestReason = "";
2067
+ for (const name of candidateNames) {
2068
+ const currentName = normalizeCompare(name);
2069
+ if (!queryName || !currentName) continue;
2070
+ let score = 0;
2071
+ let reason = "";
2072
+ if (currentName === queryName) {
2073
+ score = 120;
2074
+ reason = "exact_name";
2075
+ } else if (currentName.includes(queryName)) {
2076
+ score = 80;
2077
+ reason = "candidate_contains_name";
2078
+ } else if (queryName.includes(currentName) && currentName.length >= Math.min(4, queryName.length)) {
2079
+ score = 45;
2080
+ reason = "query_contains_candidate_name";
2081
+ }
2082
+ if (score > bestScore) {
2083
+ bestScore = score;
2084
+ bestReason = reason;
2085
+ }
2086
+ }
2087
+ return {
2088
+ score: bestScore,
2089
+ reason: bestReason
2090
+ };
1990
2091
  }
1991
- function candidateLocationText(candidate) {
1992
- return [
1993
- getText(candidate.formattedAddress),
1994
- getText(candidate.shortFormattedAddress),
1995
- getText(candidate.address),
1996
- getText(candidate.vicinity),
1997
- getText(candidate.plusCode),
1998
- getText(candidate.addressComponents)
1999
- ].filter(Boolean).join(" ");
2000
- }
2001
- function selectPlaceCandidate(candidates, restaurantName, city) {
2002
- const targetName = compareText(restaurantName);
2003
- const cityParts = city.split(LOCATION_PARTS_PATTERN).map((part) => compareText(part)).filter(Boolean);
2092
+ function scoreLocationMatch(city, candidate) {
2093
+ const queryLocation = normalizeCompare(city);
2094
+ const parts = locationParts(city);
2095
+ const candidateLocation = normalizeCompare(candidateAddressTexts(candidate).join(" "));
2096
+ let score = 0;
2097
+ const reasons = [];
2098
+ if (!candidateLocation) return {
2099
+ score,
2100
+ reasons
2101
+ };
2102
+ if (queryLocation && candidateLocation.includes(queryLocation)) return {
2103
+ score: 55,
2104
+ reasons: ["location_full_match"]
2105
+ };
2106
+ const [primaryPart, ...secondaryParts] = parts;
2107
+ if (primaryPart && candidateLocation.includes(primaryPart)) {
2108
+ score += 38;
2109
+ reasons.push("location_primary_match");
2110
+ }
2111
+ for (const part of secondaryParts) if (part.length >= 3 && candidateLocation.includes(part)) {
2112
+ score += 10;
2113
+ reasons.push("location_secondary_match");
2114
+ }
2115
+ return {
2116
+ score,
2117
+ reasons
2118
+ };
2119
+ }
2120
+ function scorePlaceCandidate(candidate, context) {
2121
+ const queryName = normalizeCompare(context.name);
2122
+ const currentPlaceId = candidatePlaceId(candidate);
2123
+ let score = 0;
2124
+ const reasons = [];
2125
+ if (context.providedPlaceId && currentPlaceId === context.providedPlaceId) {
2126
+ score += 1e4;
2127
+ reasons.push("provided_place_id");
2128
+ }
2129
+ const nameMatch = scoreNameMatch(queryName, candidateNameTexts(candidate));
2130
+ if (nameMatch.score) {
2131
+ score += nameMatch.score;
2132
+ reasons.push(nameMatch.reason);
2133
+ }
2134
+ const locationMatch = scoreLocationMatch(context.city, candidate);
2135
+ if (locationMatch.score) {
2136
+ score += locationMatch.score;
2137
+ reasons.push(...locationMatch.reasons);
2138
+ }
2139
+ if (candidateTypes(candidate).some((type) => FOOD_TYPES.has(type))) {
2140
+ score += 10;
2141
+ reasons.push("food_type");
2142
+ }
2143
+ const businessStatus = String(candidate.businessStatus ?? candidate.business_status ?? "").toUpperCase();
2144
+ if (businessStatus === "OPERATIONAL") {
2145
+ score += 4;
2146
+ reasons.push("operational");
2147
+ } else if (businessStatus === "CLOSED_PERMANENTLY") {
2148
+ score -= 60;
2149
+ reasons.push("closed_permanently");
2150
+ }
2151
+ const rating = Number(candidate.rating);
2152
+ if (Number.isFinite(rating)) score += Math.min(Math.max(rating, 0), 5);
2153
+ const reviewCount = Number(candidate.userRatingCount ?? candidate.user_ratings_total);
2154
+ if (Number.isFinite(reviewCount)) score += Math.min(Math.max(reviewCount, 0), 500) / 100;
2155
+ return {
2156
+ score,
2157
+ reason: reasons.join("+") || "fallback"
2158
+ };
2159
+ }
2160
+ function selectPlaceCandidate(candidates, context) {
2004
2161
  let best = null;
2162
+ let bestScore = Number.NEGATIVE_INFINITY;
2163
+ let bestReason = "fallback";
2005
2164
  for (const candidate of candidates) {
2006
- if (!candidatePlaceId(candidate)) continue;
2007
- const names = candidateNames(candidate).map(compareText);
2008
- const location = compareText(candidateLocationText(candidate));
2009
- let score = 0;
2010
- if (names.some((name) => name === targetName)) score += 80;
2011
- else if (names.some((name) => name.includes(targetName) || targetName.includes(name))) score += 55;
2012
- score += cityParts.filter((part) => location.includes(part)).length * 20;
2013
- const rating = typeof candidate.rating === "number" ? candidate.rating : Number(candidate.rating ?? 0);
2014
- if (rating > 0) score += Math.min(rating, 5);
2015
- const reviewCount = typeof candidate.userRatingCount === "number" ? candidate.userRatingCount : Number(candidate.userRatingCount ?? 0);
2016
- if (reviewCount > 0) score += Math.min(Math.log10(reviewCount + 1), 4);
2017
- if (!best || score > best.score) best = {
2018
- candidate,
2019
- score
2020
- };
2021
- }
2022
- if (!best) throw new Error(`Could not find a deployable place for "${restaurantName}" in "${city}".`);
2023
- return best.candidate;
2165
+ const { score, reason } = scorePlaceCandidate(candidate, context);
2166
+ if (score > bestScore) {
2167
+ best = candidate;
2168
+ bestScore = score;
2169
+ bestReason = reason;
2170
+ }
2171
+ }
2172
+ return best ? {
2173
+ candidate: best,
2174
+ score: bestScore,
2175
+ reason: bestReason
2176
+ } : null;
2177
+ }
2178
+ function extractPlaceCandidates(payload) {
2179
+ const root = isRecord(payload) ? payload : {};
2180
+ const nestedData = isRecord(root.data) ? root.data : {};
2181
+ const places = root.places ?? root.results ?? nestedData.places ?? nestedData.results;
2182
+ if (!Array.isArray(places)) throw new Error("Dineway place search response did not include places/results.");
2183
+ return places.filter(isRecord);
2184
+ }
2185
+ function shadowContextFromGrant(cwd, platformApiUrl, grant, restaurant) {
2186
+ return {
2187
+ projectDir: cwd,
2188
+ platformApiUrl,
2189
+ authKind: "shadow-grant",
2190
+ accessToken: grant.accessToken,
2191
+ refreshToken: grant.refreshToken,
2192
+ user: grant.user,
2193
+ ossHost: platformApiUrl,
2194
+ placeId: grant.placeId,
2195
+ restaurantName: restaurant?.name ?? grant.restaurantName,
2196
+ city: restaurant?.city ?? grant.city
2197
+ };
2024
2198
  }
2025
- function extractPlaces(payload) {
2026
- return (isRecord(payload) ? Array.isArray(payload.places) ? payload.places : Array.isArray(payload.results) ? payload.results : isRecord(payload.data) && Array.isArray(payload.data.places) ? payload.data.places : isRecord(payload.data) && Array.isArray(payload.data.results) ? payload.data.results : [] : []).filter(isRecord);
2199
+ function grantFromShadowContext(context, grant, overrides = {}) {
2200
+ return {
2201
+ ...grant,
2202
+ platformApiUrl: context.platformApiUrl,
2203
+ accessToken: context.accessToken ?? grant.accessToken,
2204
+ refreshToken: context.refreshToken ?? grant.refreshToken,
2205
+ placeId: context.placeId ?? grant.placeId,
2206
+ restaurantName: context.restaurantName ?? grant.restaurantName,
2207
+ city: context.city ?? grant.city,
2208
+ user: context.user ?? grant.user,
2209
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
2210
+ ...overrides
2211
+ };
2027
2212
  }
2028
- async function createShadowUser(platformApiUrl, placeId, deps) {
2029
- const response = await forgewayRequest(`${platformApiUrl}/api/auth/users/shadow`, {
2213
+ async function searchPlacesWithShadowGrant(options) {
2214
+ const context = shadowContextFromGrant(options.cwd, options.platformApiUrl, options.grant, options.restaurant);
2215
+ const payload = await shadowUpgradeFetch(context, "/api/places/search", options.deps, {
2216
+ method: "POST",
2217
+ body: JSON.stringify({ textQuery: `${options.restaurant.name} in ${options.restaurant.city}` })
2218
+ });
2219
+ return {
2220
+ grant: grantFromShadowContext(context, options.grant),
2221
+ candidates: extractPlaceCandidates(payload)
2222
+ };
2223
+ }
2224
+ async function bindShadowGrantPlace(options) {
2225
+ const context = shadowContextFromGrant(options.cwd, options.platformApiUrl, options.grant, options.restaurant);
2226
+ const payload = await shadowUpgradeFetch(context, "/api/auth/users/shadow/place", options.deps, {
2030
2227
  method: "POST",
2031
- headers: { "Content-Type": "application/json" },
2032
2228
  body: JSON.stringify({
2033
- placeId,
2229
+ placeId: options.placeId,
2034
2230
  language: "en"
2035
2231
  })
2036
- }, deps);
2037
- if (!response.ok) throw new Error(await parseErrorResponse(response));
2038
- const payload = await response.json();
2039
- if (!payload.accessToken || !payload.refreshToken) throw new Error("Dineway shadow user response was missing tokens.");
2040
- return payload;
2232
+ });
2233
+ const grant = grantFromShadowContext(context, options.grant, {
2234
+ placeId: options.placeId,
2235
+ accessToken: payload.accessToken ?? context.accessToken ?? options.grant.accessToken,
2236
+ refreshToken: payload.refreshToken ?? context.refreshToken ?? options.grant.refreshToken,
2237
+ restaurantName: options.restaurant.name,
2238
+ city: options.restaurant.city,
2239
+ user: payload.user ? normalizeForgewayUser(payload.user) : context.user ?? options.grant.user
2240
+ });
2241
+ await (options.deps.writeShadowGrant ?? writeForgewayShadowGrant)(grant, options.cwd);
2242
+ return grant;
2041
2243
  }
2042
- async function searchPlaces(platformApiUrl, accessToken, restaurantName, city, deps) {
2043
- const response = await forgewayRequest(`${platformApiUrl}/api/places/search`, {
2044
- method: "POST",
2045
- headers: {
2046
- "Content-Type": "application/json",
2047
- Authorization: `Bearer ${accessToken}`
2048
- },
2049
- body: JSON.stringify({ textQuery: `${restaurantName} in ${city}` })
2050
- }, deps);
2051
- if (!response.ok) throw new Error(await parseErrorResponse(response));
2052
- return extractPlaces(await response.json());
2244
+ async function resolvePlaceIdWithShadowSearch(options) {
2245
+ const { grant, candidates } = await searchPlacesWithShadowGrant(options);
2246
+ if (candidates.length === 0) throw new Error(`Dineway place search returned no candidates for "${options.restaurant.name} in ${options.restaurant.city}".`);
2247
+ const selected = selectPlaceCandidate(candidates, {
2248
+ name: options.restaurant.name,
2249
+ city: options.restaurant.city
2250
+ });
2251
+ const finalPlaceId = selected ? candidatePlaceId(selected.candidate) : "";
2252
+ if (!PLACE_ID_PATTERN.test(finalPlaceId)) throw new Error("Could not resolve a valid Dineway place id for Forgeway deploy.");
2253
+ return await bindShadowGrantPlace({
2254
+ ...options,
2255
+ grant,
2256
+ placeId: finalPlaceId
2257
+ });
2053
2258
  }
2054
2259
  async function createShadowGrant(options) {
2055
- const initialPlaceId = options.placeId || DEFAULT_BOOTSTRAP_PLACE_ID;
2056
- const initialAuth = await createShadowUser(options.platformApiUrl, initialPlaceId, options.deps);
2057
- let finalPlaceId = options.placeId;
2058
- if (!finalPlaceId) finalPlaceId = candidatePlaceId(selectPlaceCandidate(await searchPlaces(options.platformApiUrl, initialAuth.accessToken, options.restaurantName, options.city, options.deps), options.restaurantName, options.city));
2059
- if (!PLACE_ID_PATTERN.test(finalPlaceId)) throw new Error("Could not resolve a valid Dineway place id for Forgeway deploy.");
2060
- const finalAuth = finalPlaceId === initialPlaceId ? initialAuth : await createShadowUser(options.platformApiUrl, finalPlaceId, options.deps);
2260
+ if (options.placeId && !PLACE_ID_PATTERN.test(options.placeId)) throw new Error("Could not resolve a valid Dineway place id for Forgeway deploy.");
2261
+ const auth = await createShadowUser(options.platformApiUrl, options.placeId, options.deps);
2061
2262
  const grant = {
2062
2263
  platformApiUrl: options.platformApiUrl,
2063
- placeId: finalPlaceId,
2064
- accessToken: finalAuth.accessToken,
2065
- refreshToken: finalAuth.refreshToken,
2264
+ ...options.placeId ? { placeId: options.placeId } : {},
2265
+ accessToken: auth.accessToken,
2266
+ refreshToken: auth.refreshToken,
2066
2267
  restaurantName: options.restaurantName,
2067
2268
  city: options.city,
2068
- user: finalAuth.user ? normalizeForgewayUser(finalAuth.user) : void 0,
2269
+ user: auth.user ? normalizeForgewayUser(auth.user) : void 0,
2069
2270
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
2070
2271
  };
2071
2272
  await (options.deps.writeShadowGrant ?? writeForgewayShadowGrant)(grant, options.cwd);
@@ -2158,6 +2359,25 @@ async function getDeploymentSite(context, site, deps) {
2158
2359
  throw error;
2159
2360
  }
2160
2361
  }
2362
+ async function getDeploymentSiteByPlaceId(context, placeId, deps) {
2363
+ try {
2364
+ return normalizeSiteDetail(await ossFetch(context, `/api/deployments/sites/by-place/${encodeURIComponent(placeId)}`, deps));
2365
+ } catch (error) {
2366
+ if (error instanceof ForgewayApiError && error.status === 404) return null;
2367
+ throw error;
2368
+ }
2369
+ }
2370
+ async function ensureRestaurantClaim(context, restaurant, deps) {
2371
+ if (!context.placeId) throw new Error("Forgeway restaurant deploy is missing a place ID for claim ownership.");
2372
+ await ossFetch(context, "/api/restaurant-claims/ensure", deps, {
2373
+ method: "POST",
2374
+ body: JSON.stringify({
2375
+ placeId: context.placeId,
2376
+ ...restaurant?.name ? { placeName: restaurant.name } : {},
2377
+ ...restaurant?.city ? { city: restaurant.city } : {}
2378
+ })
2379
+ });
2380
+ }
2161
2381
  async function createDeploymentSite(context, input, deps) {
2162
2382
  return await ossFetch(context, "/api/deployments/sites", deps, {
2163
2383
  method: "POST",
@@ -2175,10 +2395,12 @@ async function resolveDeploymentSite(cwd, context, options, seedPath, deps, preR
2175
2395
  const saved = pkg ? getSavedForgewayMetadata(pkg) : {};
2176
2396
  const explicitSite = options.site;
2177
2397
  const savedSite = typeof saved.siteId === "string" ? saved.siteId : saved.siteSlug;
2178
- const siteRef = explicitSite ?? savedSite;
2179
- const restaurant = preResolvedRestaurant?.name && preResolvedRestaurant.city ? preResolvedRestaurant : await resolveRestaurantInfo(options, seedPath, deps, !siteRef);
2398
+ const siteRef = context.placeId ? explicitSite : explicitSite ?? savedSite;
2399
+ const existingByPlace = context.placeId ? await getDeploymentSiteByPlaceId(context, context.placeId, deps) : null;
2400
+ const restaurant = preResolvedRestaurant?.name && preResolvedRestaurant.city ? preResolvedRestaurant : await resolveRestaurantInfo(options, seedPath, deps, !existingByPlace && !siteRef);
2180
2401
  const targetSlug = siteRef ?? deriveForgewaySiteSlug(restaurant.name || "", restaurant.city || "");
2181
- let site = await getDeploymentSite(context, targetSlug, deps);
2402
+ let site = existingByPlace;
2403
+ if (!site && siteRef) site = await getDeploymentSite(context, targetSlug, deps);
2182
2404
  if (!site) site = await createDeploymentSite(context, {
2183
2405
  slug: targetSlug,
2184
2406
  restaurant,
@@ -2425,6 +2647,7 @@ async function deployForgeway(cwd, options, deps = {}) {
2425
2647
  if (EXCLUDE_PATTERNS.includes(basename(sourceDir))) throw new Error(`"${basename(sourceDir)}" is an excluded directory and cannot be deployed.`);
2426
2648
  const seedPath = await resolveSeedPath$1(cwd, options.seed);
2427
2649
  const { context, restaurant } = await resolveProjectContext(cwd, options, deps);
2650
+ await ensureRestaurantClaim(context, restaurant, deps);
2428
2651
  const { site } = await resolveDeploymentSite(cwd, context, options, seedPath, deps, restaurant);
2429
2652
  const database = parseDatabaseMode(options.database);
2430
2653
  if (database !== "none") {
@@ -2994,6 +3217,11 @@ const deployCommand = defineCommand({
2994
3217
  description: "Forgeway deployment site ID or slug",
2995
3218
  required: false
2996
3219
  },
3220
+ "place-id": {
3221
+ type: "string",
3222
+ description: "Restaurant Google place ID for Forgeway claim and site recovery",
3223
+ required: false
3224
+ },
2997
3225
  email: {
2998
3226
  type: "string",
2999
3227
  description: "Dineway account email for deploy authorization",
@@ -3029,6 +3257,7 @@ const deployCommand = defineCommand({
3029
3257
  yes: args.yes,
3030
3258
  dryRun: args["dry-run"],
3031
3259
  site: args.site,
3260
+ placeId: args["place-id"],
3032
3261
  email: args.email,
3033
3262
  restaurantName: args["restaurant-name"],
3034
3263
  city: args.city,
package/dist/index.d.mts CHANGED
@@ -11,7 +11,7 @@ import { $ as TranslationSummary, A as MenuItem, B as getPluginSettings, C as Ta
11
11
  import { _ as WxrSite, a as getAllSources, b as parseWxrString, c as getUrlSources, d as importReusableBlocksAsSections, f as WxrAttachment, g as WxrPost, h as WxrData, i as clearSources, l as probeUrl, m as WxrCategory, n as parseWxrDate, o as getFileSources, p as WxrAuthor, r as wxrSource, s as getSource, t as wordpressRestSource, u as registerSource, v as WxrTag, x as decodeSlug, y as parseWxr } from "./index-CpbixmRL.mjs";
12
12
  import { n as generatePlaceholder, r as normalizeMediaValue, t as PlaceholderData } from "./placeholder-BZpCpid_.mjs";
13
13
  import { a as ListOptions, c as S3StorageConfig, d as Storage, f as StorageDescriptor, i as FileInfo, l as SignedUploadOptions, n as DinewayStorageError, o as ListResult, p as UploadResult, r as DownloadResult, s as LocalStorageConfig, t as CreateStorageFn, u as SignedUploadUrl } from "./types-BYjPylrZ.mjs";
14
- import "./bylines-CeNpt_vk.mjs";
14
+ import "./bylines-CtD_p_1z.mjs";
15
15
  import { DinewayRequestContext, getRequestContext, runWithContext } from "./request-context.mjs";
16
16
  import { adaptSandboxEntry } from "./plugins/adapt-sandbox-entry.mjs";
17
17
  import { S as UrlInput, _ as SourceAuth, a as FileInput, b as SourceProbeResult, c as ImportContext, d as ImportSource, f as NormalizedItem, g as ProbeResult, h as PostTypeMapping, i as FieldCompatibility, l as ImportFieldDef, m as PostTypeAnalysis, n as CollectionSchemaStatus, o as ImportAnalysis, p as OAuthInput, r as FetchOptions, s as ImportConfig, t as AttachmentInfo, u as ImportResult, v as SourceCapabilities, x as SuggestedAction, y as SourceInput } from "./types-BBETcziA.mjs";
package/dist/index.mjs CHANGED
@@ -24,7 +24,7 @@ import "./byline-DpNNSjET.mjs";
24
24
  import { t as normalizeMediaValue } from "./normalize-BY_EJnd9.mjs";
25
25
  import { t as generatePlaceholder } from "./placeholder-b0Ufu0La.mjs";
26
26
  import "./seo-BPb_reaG.mjs";
27
- import { A as handleRevisionGet, B as handleContentDuplicate, D as handleMediaGet, E as handleMediaDelete, F as handleContentCountScheduled, G as handleContentPermanentDelete, H as handleContentGetIncludingTrashed, I as handleContentCountTrashed, J as handleContentSchedule, K as handleContentPublish, L as handleContentCreate, M as handleRevisionRestore, N as generateManifest, O as handleMediaList, P as handleContentCompare, Q as handleContentUpdate, R as handleContentDelete, T as handleMediaCreate, U as handleContentList, V as handleContentGet, W as handleContentListTrashed, X as handleContentUnpublish, Y as handleContentTranslations, Z as handleContentUnschedule, j as handleRevisionList, k as handleMediaUpdate, q as handleContentRestore, z as handleContentDiscardDraft } from "./api-BaFOFZnE.mjs";
27
+ import { A as handleRevisionGet, B as handleContentDuplicate, D as handleMediaGet, E as handleMediaDelete, F as handleContentCountScheduled, G as handleContentPermanentDelete, H as handleContentGetIncludingTrashed, I as handleContentCountTrashed, J as handleContentSchedule, K as handleContentPublish, L as handleContentCreate, M as handleRevisionRestore, N as generateManifest, O as handleMediaList, P as handleContentCompare, Q as handleContentUpdate, R as handleContentDelete, T as handleMediaCreate, U as handleContentList, V as handleContentGet, W as handleContentListTrashed, X as handleContentUnpublish, Y as handleContentTranslations, Z as handleContentUnschedule, j as handleRevisionList, k as handleMediaUpdate, q as handleContentRestore, z as handleContentDiscardDraft } from "./api-Ow6RbraA.mjs";
28
28
  import "./request-cache-BpwuE2ix.mjs";
29
29
  import "./dashboard-BC9bgPOH.mjs";
30
30
  import "./briefing-Jsxs587i.mjs";
@@ -7,7 +7,7 @@ import "../runner-pAnQS6iI.mjs";
7
7
  import "../index-2tBfB_8X.mjs";
8
8
  import "../index-CpbixmRL.mjs";
9
9
  import { d as Storage } from "../types-BYjPylrZ.mjs";
10
- import "../bylines-CeNpt_vk.mjs";
10
+ import "../bylines-CtD_p_1z.mjs";
11
11
  import "../types-BBETcziA.mjs";
12
12
  import "../validate-BzUCAU2a.mjs";
13
13
  import "../index.mjs";
@@ -5,7 +5,7 @@ import "../types-BgE6gMFI.mjs";
5
5
  import "../runner-pAnQS6iI.mjs";
6
6
  import "../index-2tBfB_8X.mjs";
7
7
  import "../index-CpbixmRL.mjs";
8
- import "../bylines-CeNpt_vk.mjs";
8
+ import "../bylines-CtD_p_1z.mjs";
9
9
  import "../types-BBETcziA.mjs";
10
10
  import "../validate-BzUCAU2a.mjs";
11
11
 
@@ -5,7 +5,7 @@ import "./types-BgE6gMFI.mjs";
5
5
  import "./runner-pAnQS6iI.mjs";
6
6
  import "./index-2tBfB_8X.mjs";
7
7
  import "./index-CpbixmRL.mjs";
8
- import "./bylines-CeNpt_vk.mjs";
8
+ import "./bylines-CtD_p_1z.mjs";
9
9
  import "./types-BBETcziA.mjs";
10
10
  import "./validate-BzUCAU2a.mjs";
11
11
  import { t as getMediaProvider } from "./provider-loader-BaZhx7E3.mjs";
@@ -0,0 +1,6 @@
1
+ //#region src/version.ts
2
+ const VERSION = "0.1.35";
3
+ const COMMIT = "1fc3f0d1";
4
+
5
+ //#endregion
6
+ export { VERSION as n, COMMIT as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dineway",
3
- "version": "0.1.34",
3
+ "version": "0.1.35",
4
4
  "description": "Agentic Website builder for restaurants — structured content meets AI via the Model Context Protocol",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -1,6 +0,0 @@
1
- //#region src/version.ts
2
- const VERSION = "0.1.34";
3
- const COMMIT = "d4464de4";
4
-
5
- //#endregion
6
- export { VERSION as n, COMMIT as t };