@wix/himalaya-cli 0.1634.0 → 0.1636.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.
Files changed (54) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/app-config.d.ts +1 -0
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/app-module.d.ts +2 -0
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/wix-payments-contract.d.ts +22 -10
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/wix-payments-wire.d.ts +16 -6
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/wix-payments.d.ts +11 -4
  6. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +6 -0
  7. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/iap-checkout/src/apple-iap-contract.d.ts +10 -4
  8. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/iap-checkout.mjs +84 -16
  9. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/iap.mjs +67 -10
  10. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/screens.mjs +83 -15
  11. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdui.mjs +1 -0
  12. package/dist/browser-plane/assets.json +5 -5
  13. package/dist/browser-plane/preview-deferred/{c3457ce58c96b65f303fec0ddf5f06733004eaf9e21e62302b155ec63a7765f7.bin → 67feb362281a3040ee05592769227c58a98ec3c8073dac95ecb5629141c67061.bin} +1 -1
  14. package/dist/browser-plane/sw.js +7 -7
  15. package/dist/cli.mjs +241 -57
  16. package/dist/preview-assets.generated.bin +0 -0
  17. package/fixtures/wix-canned.json +3 -0
  18. package/guides/designing-himi-screens.md +5 -1
  19. package/guides/himi-json-output.md +14 -1
  20. package/guides/himi-mcp.md +5 -3
  21. package/guides/iap-products.md +8 -0
  22. package/guides/sdk-reference.json +22 -8
  23. package/guides/skill.md +1 -0
  24. package/package.json +2 -2
  25. package/templates/beauty-salon/tier5-src/_shared/collection-contract.ts +0 -1
  26. package/templates/beauty-salon-owner/tier5-src/_shared/collection-contract.ts +0 -1
  27. package/templates/branded-lite/dev/index.ts +226 -2060
  28. package/templates/branded-lite/l10n/en.json +3 -5
  29. package/templates/branded-lite/tier5-src/_shared/collection-contract.ts +0 -1
  30. package/templates/branded-lite/tier5-src/_shared/himi-cms.ts +2 -1
  31. package/templates/branded-lite/tier5-src/himi-branded-lite-cms/index.ts +160 -39
  32. package/templates/community-club/dev/index.ts +210 -2044
  33. package/templates/community-club/tier5-src/_shared/collection-contract.ts +0 -1
  34. package/templates/community-club/tier5-src/_shared/himi-cms.ts +2 -1
  35. package/templates/community-club/tier5-src/himi-branded-lite-cms/index.ts +160 -39
  36. package/templates/community-club-owner/tier5-src/_shared/collection-contract.ts +0 -1
  37. package/templates/events-meetups/tier5-src/_shared/collection-contract.ts +0 -1
  38. package/templates/events-meetups-owner/tier5-src/_shared/collection-contract.ts +0 -1
  39. package/templates/gym-fitness/tier5-src/_shared/collection-contract.ts +0 -1
  40. package/templates/gym-fitness-owner/tier5-src/_shared/collection-contract.ts +0 -1
  41. package/templates/nonprofit-cause/tier5-src/_shared/collection-contract.ts +0 -1
  42. package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-contract.ts +0 -1
  43. package/templates/owner-lite/tier5-src/_shared/collection-contract.ts +0 -1
  44. package/templates/podcast-creator/tier5-src/_shared/collection-contract.ts +0 -1
  45. package/templates/podcast-creator-owner/tier5-src/_shared/collection-contract.ts +0 -1
  46. package/templates/portfolio-creative/tier5-src/_shared/collection-contract.ts +0 -1
  47. package/templates/portfolio-creative-owner/tier5-src/_shared/collection-contract.ts +0 -1
  48. package/templates/restaurant/tier5-src/_shared/collection-contract.ts +0 -1
  49. package/templates/restaurant-owner/tier5-src/_shared/collection-contract.ts +0 -1
  50. package/templates/retail-store/tier5-src/_shared/collection-contract.ts +0 -1
  51. package/templates/retail-store-owner/tier5-src/_shared/collection-contract.ts +0 -1
  52. package/templates/salon-spa/tier5-src/_shared/collection-contract.ts +0 -1
  53. package/templates/yoga-studio/tier5-src/_shared/collection-contract.ts +0 -1
  54. package/templates/yoga-studio-owner/tier5-src/_shared/collection-contract.ts +0 -1
Binary file
@@ -2079,6 +2079,9 @@
2079
2079
  }
2080
2080
  ]
2081
2081
  },
2082
+ "POST /wix-data/v2/items/count": {
2083
+ "totalCount": 12
2084
+ },
2082
2085
  "POST /wix-data/v2/items/query": {
2083
2086
  "dataItems": [
2084
2087
  {
@@ -334,7 +334,11 @@ scroll. *Reach for `SegmentedControl` for 2–4 in-content modes; `Tabs`/tab-bar
334
334
  **Feedback & overlays** — `Banner` for a persistent inline message (with a retry action when a refresh fails over content you kept; a screen with nothing to show uses an `ErrorState`, see §5);
335
335
  `Snackbar` for a transient confirmation; `AlertDialog` for a blocking decision (up to three `buttons`
336
336
  — "Save / Discard / Cancel" — with roles `default` / `cancel` / `destructive`; a worker's
337
- `ui.alert({ buttons })` resolves `{ buttonId }`); `BottomSheet` for
337
+ `ui.alert({ buttons })` resolves `{ buttonId }`). Alerts share one slot: a second one replaces what
338
+ is up, and a second worker `ui.alert` rejects `ui_busy`. If your app can raise alerts from several places at
339
+ once (an error from a refresh while a first-run dialog is open), set `navigation: { presentationQueue: true }`
340
+ in `config.ts`: then they show one at a time in order, each worker call waiting for its own answer
341
+ (at most 5 wait — a 6th rejects `ui_queue_full` — and identical back-to-back alerts show once). `BottomSheet` for
338
342
  contextual actions/detail; `Tooltip`/`Popover` for a small anchored hint. *Reach for `Snackbar`, not
339
343
  `AlertDialog`, to confirm a completed action — don't block on success.* The `Snackbar` COMPONENT draws
340
344
  inline where you place it; for a transient toast that floats at the bottom of the screen — an app
@@ -6,7 +6,7 @@ repurposed when human wording changes. New codes may be added; consumers must
6
6
  handle an unknown code as a failure, without parsing prose.
7
7
 
8
8
  **Rollout:** this contract is enforced for **`himi push`**, including `--only`,
9
- first, for **`himi publish-size`**, for **`himi store iap connect`**, for **`himi site member-app`**, for **`himi fidelity`**, for the **`himi base44`** entity and function verbs, and for **`himi l10n import`**. Other subcommands still have legacy failures without codes and are a
9
+ first, for **`himi publish-size`**, for **`himi store iap connect`**, for **`himi site member-app`**, for **`himi fidelity`**, for the **`himi base44`** entity and function verbs, for **`himi l10n import`**, and for **`himi login --device`**. Other subcommands still have legacy failures without codes and are a
10
10
  follow-up migration. This is an additive change: existing `error`, `errors`,
11
11
  `message`, `hint`, status, body, and gate-specific fields stay as they were.
12
12
  Some legacy envelopes have no singular `error` or `hint`; consumers must not
@@ -14,6 +14,19 @@ require those fields. Existing error-only push refusals now also carry `ok: fals
14
14
  Output channels and process exit codes are unchanged. Read JSON failures on both
15
15
  stdout and stderr; progress/warnings are not failure envelopes.
16
16
 
17
+ ## `himi login --device` codes
18
+
19
+ | Code | Meaning |
20
+ | --- | --- |
21
+ | `device_issuer_unreachable` | The owner issuer could not be reached to start the device login. Exit 1. |
22
+ | `device_start_failed` | The issuer answered the start request without a usable device grant (a closed or older plane, a rate limit, a store outage). `status`, `error` and `hint` say which. Exit 1. |
23
+ | `device_timed_out` | Nobody approved within the code's lifetime (at most 10 minutes). Run `himi login --device` again. Exit 1. |
24
+ | `device_access_denied` | The owner pressed Deny on the approve page. Exit 1. |
25
+ | `device_code_expired` | The issuer reported the code expired before approval. Exit 1. |
26
+ | `device_login_failed` | Any other poll failure; `status` and `error` carry the issuer's answer. Exit 1. |
27
+
28
+ A `429` while polling is not a failure: the CLI backs off by the plane's `retryAfterSec` and keeps waiting.
29
+
17
30
  ## `himi sdk unverified` codes
18
31
 
19
32
  | Code | Meaning |
@@ -146,9 +146,11 @@ see, so they stay commands a person runs. Publishing needs a sign-in first: `him
146
146
  browser sign-in for the user, or run `himi login --browser` in a terminal. Either way the server
147
147
  never asks for or sees a credential — the browser hands a scoped token to a separate `himi login`
148
148
  process, which stores it on this machine. On a server with no browser, `himi login --wix` is the
149
- exception to that guarantee: the CLI reads a Wix account API key from `WIX_API_KEY` in its own
150
- environment and sends it to the owner plane to mint the token, so keep that key a secret of the
151
- job, not of the MCP client. A tool input that starts with `-` is refused, so nothing
149
+ exception to that guarantee: the CLI reads the owner's held Wix token from `WIX_TOKEN`, or a Wix
150
+ account API key from `WIX_API_KEY`, in its own environment and sends it to the owner plane to mint
151
+ the token, so keep it a secret of the job, not of the MCP client. Started with `WIX_TOKEN` set,
152
+ `himi_login` runs that `himi login --wix` itself instead of opening a browser; the token still
153
+ never passes through a tool input or result. A tool input that starts with `-` is refused, so nothing
152
154
  can be passed through to a flag no tool offers.
153
155
 
154
156
  ## See the app inside your IDE
@@ -207,6 +207,14 @@ himi store iap draft --site <msid> --purchases-app <registration-id> --catalog-r
207
207
  --bundle com.example.fitclub --base-territory USA --territories USA,CAN --out ./iap-products.json
208
208
  ```
209
209
 
210
+ Leave `--territories` out to sell each product in every country the app itself is sold in.
211
+ A product that is not sold in a country where the app is on sale shows "price unavailable"
212
+ there. With `--profile`, `draft` reads the app's countries from App Store Connect. A note
213
+ names every product that would still miss one of them, whether it got an explicit
214
+ `--territories` or was kept by `--merge` with its own countries. If the countries can't be
215
+ read (through `--purchases-app`, a failed read, or an app that is not on sale yet),
216
+ products are sold in the base territory only, and the note says so.
217
+
210
218
  | Wix item | Drafted as |
211
219
  |---|---|
212
220
  | Digital store product, paid online program, one-time "unlimited" pricing plan | a non-consumable |
@@ -1471,7 +1471,7 @@
1471
1471
  "name": "NavigationConfig",
1472
1472
  "kind": "interface",
1473
1473
  "jsdoc": "/** Per-app navigation/deep-link config, served OTA at GET /v1/app-config/:appName. */",
1474
- "decl": "export interface NavigationConfig {\n /** Tab-bar structure (which tabs; their icons/labels/badges). */\n tabBar?: TabBarConfig;\n /** Slide-in drawer / hamburger-menu destinations. */\n drawer?: DrawerConfig;\n /** Navigation chrome the shell draws.\n * Omitted ⇒ \"bottomTabs\". The shell (not the descriptor) reads this. */\n navKind?: NavKind;\n /** Destinations for \"sidebar\" mode.\n * Absent ⇒ the shell derives the rail from `tabBar.items`. */\n sidebar?: SidebarConfig;\n /** App-level default top bar; a per-screen\n * `ScreenDescriptor.topBar` fully replaces it (override, not merge). */\n topBarDefault?: TopBarConfig;\n /** The post-OS-splash brand surface (see `SplashConfig`). Absent / not enabled\n * ⇒ today's behavior. Operational per (live-flippable). */\n splash?: SplashConfig;\n /** App-level default locale. Operational per so a Hebrew (or Spanish)\n * branded app can pin RTL/l10n OTA without a launch flag. `default` is a\n * BCP-47 primary subtag; clients coerce unknown tags rather than failing the\n * envelope. `pin: true` skips the device/browser language; in-app `locale.set`\n * still wins. Absent ⇒ today's device-then-en behavior. */\n locale?: LocaleConfig;\n /** Effective orientations, resolved INSIDE\n * the binary's build-time envelope (config.ts `orientationEnvelope`). The\n * envelope is the ceiling and can never be OTA (iOS reads the plist before\n * any app code runs); this narrows within it. Always intersected with the\n * envelope — it can never widen it. Absent/empty ⇒ the envelope itself. */\n orientation?: OrientationConfig;\n /** Per-surface nav projection, keyed by catalog\n * surface id (`phone` | `tablet` | `desktop` | `mac` | `watch` | `wear` | `rn`).\n * Keyed the way `orientation` is keyed by device family and narrowed the same\n * way: a key outside the app's `platforms.json` envelope is DROPPED, never\n * honored (see `resolveSurfaceNav`). Absent key ⇒ that surface uses the default\n * projection, so an app that never thinks about surfaces is unaffected. */\n surfaces?: Record<string, SurfaceNavConfig>;\n /** The APP-LEVEL nav worker\n * that feeds every `*Path` binding on `NavTabItem` / `DrawerItem` /\n * `TopBarAction`. App-level, not a screen's worker, because chrome outlives\n * every screen: a cart badge must survive leaving the cart, and a flag-hidden\n * tab must stay hidden three pushes deep in another stack. Absent ⇒ paths stay\n * unresolved and the literals render — the worker enriches, it never gates. */\n navLogicBundle?: LogicBundleRef;\n /** Which nav badges ALSO drive the OS app-icon\n * badge. Each entry is `\"<kind>:<id>\"` (`tab` | `drawer` | `topBarAction`, the\n * spelling `navKey` uses); the icon shows the SUM of those slots' resolved counts.\n * Empty/absent ⇒ no mirroring. An entry naming a slot this build does not have is\n * ignored, never a blanked badge. Requires the `push` capability — `defineApp`\n * rejects the combination, because the badge would be set and never shown. */\n appIconBadgeSources?: string[];\n /** Signed release allowlist for contained browser Tier-5 `_stream` requests. */\n streamPolicy?: StreamPolicy;\n /** A site shell's URL space. A push tap, app link or\n * custom-scheme link whose URL is an https page on one of `site.origins` opens the\n * screen owning its path, and that screen's WebView loads the full URL. Absent ⇒\n * links resolve as before. Build it with `siteNavConfig()` from\n * `@himalaya/core/site-shell`; resolution is `resolveSiteLink()`. */\n site?: SiteNavConfig;\n /** amendment \"top-bar gap items\" — app-wide logo for tab-stack roots. */\n topBarLogo?: TopBarLogo;\n scheme: string;\n deepLinkPatterns: DeepLinkPattern[];\n linkableScreens: LinkableScreen[];\n}",
1474
+ "decl": "export interface NavigationConfig {\n /** Tab-bar structure (which tabs; their icons/labels/badges). */\n tabBar?: TabBarConfig;\n /** Slide-in drawer / hamburger-menu destinations. */\n drawer?: DrawerConfig;\n /** Navigation chrome the shell draws.\n * Omitted ⇒ \"bottomTabs\". The shell (not the descriptor) reads this. */\n navKind?: NavKind;\n /** Destinations for \"sidebar\" mode.\n * Absent ⇒ the shell derives the rail from `tabBar.items`. */\n sidebar?: SidebarConfig;\n /** App-level default top bar; a per-screen\n * `ScreenDescriptor.topBar` fully replaces it (override, not merge). */\n topBarDefault?: TopBarConfig;\n /** The post-OS-splash brand surface (see `SplashConfig`). Absent / not enabled\n * ⇒ today's behavior. Operational per (live-flippable). */\n splash?: SplashConfig;\n /** App-level default locale. Operational per so a Hebrew (or Spanish)\n * branded app can pin RTL/l10n OTA without a launch flag. `default` is a\n * BCP-47 primary subtag; clients coerce unknown tags rather than failing the\n * envelope. `pin: true` skips the device/browser language; in-app `locale.set`\n * still wins. Absent ⇒ today's device-then-en behavior. */\n locale?: LocaleConfig;\n /** Effective orientations, resolved INSIDE\n * the binary's build-time envelope (config.ts `orientationEnvelope`). The\n * envelope is the ceiling and can never be OTA (iOS reads the plist before\n * any app code runs); this narrows within it. Always intersected with the\n * envelope — it can never widen it. Absent/empty ⇒ the envelope itself. */\n orientation?: OrientationConfig;\n /** Per-surface nav projection, keyed by catalog\n * surface id (`phone` | `tablet` | `desktop` | `mac` | `watch` | `wear` | `rn`).\n * Keyed the way `orientation` is keyed by device family and narrowed the same\n * way: a key outside the app's `platforms.json` envelope is DROPPED, never\n * honored (see `resolveSurfaceNav`). Absent key ⇒ that surface uses the default\n * projection, so an app that never thinks about surfaces is unaffected. */\n surfaces?: Record<string, SurfaceNavConfig>;\n /** The APP-LEVEL nav worker\n * that feeds every `*Path` binding on `NavTabItem` / `DrawerItem` /\n * `TopBarAction`. App-level, not a screen's worker, because chrome outlives\n * every screen: a cart badge must survive leaving the cart, and a flag-hidden\n * tab must stay hidden three pushes deep in another stack. Absent ⇒ paths stay\n * unresolved and the literals render — the worker enriches, it never gates. */\n navLogicBundle?: LogicBundleRef;\n /** Which nav badges ALSO drive the OS app-icon\n * badge. Each entry is `\"<kind>:<id>\"` (`tab` | `drawer` | `topBarAction`, the\n * spelling `navKey` uses); the icon shows the SUM of those slots' resolved counts.\n * Empty/absent ⇒ no mirroring. An entry naming a slot this build does not have is\n * ignored, never a blanked badge. Requires the `push` capability — `defineApp`\n * rejects the combination, because the badge would be set and never shown. */\n appIconBadgeSources?: string[];\n /** Signed release allowlist for contained browser Tier-5 `_stream` requests. */\n streamPolicy?: StreamPolicy;\n /** A site shell's URL space. A push tap, app link or\n * custom-scheme link whose URL is an https page on one of `site.origins` opens the\n * screen owning its path, and that screen's WebView loads the full URL. Absent ⇒\n * links resolve as before. Build it with `siteNavConfig()` from\n * `@himalaya/core/site-shell`; resolution is `resolveSiteLink()`. */\n site?: SiteNavConfig;\n /** amendment \"top-bar gap items\" — app-wide logo for tab-stack roots. */\n topBarLogo?: TopBarLogo;\n /** Opt-in alert queue. `true` ⇒ every presented alert (worker `ui.alert`, the descriptor nav\n * `alert` verb, app services) shows one at a time in FIFO order per shell, instead of replacing\n * each other or rejecting `ui_busy`. At most 5 wait (a 6th worker call rejects `ui_queue_full`);\n * identical consecutive alerts show once. An inline `AlertDialog` component never enters the\n * queue. Absent ⇒ today's behaviour. */\n presentationQueue?: boolean;\n scheme: string;\n deepLinkPatterns: DeepLinkPattern[];\n linkableScreens: LinkableScreen[];\n}",
1475
1475
  "verificationChecked": true
1476
1476
  },
1477
1477
  {
@@ -2913,7 +2913,7 @@
2913
2913
  "name": "WixIapOperation",
2914
2914
  "kind": "type",
2915
2915
  "jsdoc": "",
2916
- "decl": "export type WixIapOperation = \"startPayment\" | \"startItemPayment\" | \"completePayment\" | \"getPayment\";",
2916
+ "decl": "export type WixIapOperation = \"startPayment\" | \"startItemPayment\" | \"completePayment\" | \"cancelPayment\" | \"getPayment\";",
2917
2917
  "verificationChecked": true
2918
2918
  },
2919
2919
  {
@@ -2927,7 +2927,7 @@
2927
2927
  "name": "StartItemPaymentErrorCode",
2928
2928
  "kind": "type",
2929
2929
  "jsdoc": "",
2930
- "decl": "export type StartItemPaymentErrorCode = \"PRODUCT_NOT_AVAILABLE\" | \"ALREADY_OWNED\" | \"ITEM_NOT_AVAILABLE\"\n | \"SITE_NOT_ACCEPTING_PAYMENTS\" | \"UNSUPPORTED_ORDER\";",
2930
+ "decl": "export type StartItemPaymentErrorCode = \"PRODUCT_NOT_AVAILABLE\" | \"ALREADY_OWNED\" | \"ITEM_NOT_AVAILABLE\"\n | \"SITE_NOT_ACCEPTING_PAYMENTS\" | \"UNSUPPORTED_ORDER\" | \"CATALOG_NOT_SUPPORTED\" | \"VERTICAL_ACCESS_DENIED\"\n | \"EVENT_CHECKOUT_NOT_ECOM\" | \"ALREADY_SUBSCRIBED\" | \"SUBSCRIPTION_NOT_IN_APP\" | \"BILLING_COUNTRY_REQUIRED\"\n | \"APP_NOT_CONFIGURED\" | \"NOT_BOOKING_OWNER\" | \"BOOKING_PAYMENT_PENDING\";",
2931
2931
  "verificationChecked": true
2932
2932
  },
2933
2933
  {
@@ -2944,6 +2944,13 @@
2944
2944
  "decl": "export type GetPaymentErrorCode = \"NOT_FOUND\";",
2945
2945
  "verificationChecked": true
2946
2946
  },
2947
+ {
2948
+ "name": "CancelPaymentErrorCode",
2949
+ "kind": "type",
2950
+ "jsdoc": "",
2951
+ "decl": "export type CancelPaymentErrorCode = \"NOT_PENDING\" | \"APP_NOT_CONFIGURED\" | \"NOT_FOUND\";",
2952
+ "verificationChecked": true
2953
+ },
2947
2954
  {
2948
2955
  "name": "WixIapFailureKind",
2949
2956
  "kind": "type",
@@ -2968,8 +2975,8 @@
2968
2975
  {
2969
2976
  "name": "EcomCatalogReference",
2970
2977
  "kind": "interface",
2971
- "jsdoc": "/** One item a Wix catalog sells through eCom, as eCom's `catalogReference` names it: for Wix Stores,\n * the product id and the Stores app id. The purchases catalog sells it under `catalogItemId` as its\n * `appProductId`. Variants and options are not supported, and the quantity is always 1. */",
2972
- "decl": "export interface EcomCatalogReference {\n catalogItemId: string;\n catalogAppId: string;\n}",
2978
+ "jsdoc": "/** One item a Wix catalog sells, as eCom's `catalogReference` names it: the item id and its catalog\n * app. The purchases catalog sells it under `catalogItemId` as its `appProductId`. `options` go to\n * eCom unchanged and are each vertical's own: a plan's `{type: \"PLAN\", planOptions: {pricingVariantId}}`,\n * a booking's `{bookingId}`, a ticket's `{eventId}`, a Stores variant's `{variantId}`. Plain JSON only.\n * The quantity is always 1. */",
2979
+ "decl": "export interface EcomCatalogReference {\n catalogItemId: string;\n catalogAppId: string;\n options?: Record<string, unknown>;\n}",
2973
2980
  "verificationChecked": true
2974
2981
  },
2975
2982
  {
@@ -2982,8 +2989,8 @@
2982
2989
  {
2983
2990
  "name": "StartItemPaymentResult",
2984
2991
  "kind": "type",
2985
- "jsdoc": "/** StartItemPayment places the member's eCom order for one catalog item, charges it with\n * `appleIAP` and starts its Payment, all server-side. Four different ids come back: the eCom\n * order (`ecomOrderId`), the Wix Payments charge (`payment.wixTransactionId`), the wix-iap\n * Payment (`payment.paymentId`) and the StoreKit `appAccountToken`. Keep them out of screen state. */",
2986
- "decl": "export type StartItemPaymentResult =\n | { status: \"started\"; payment: WixIapPayment; storeProductId: string; appAccountToken: string; ecomOrderId: string }\n | WixIapFailure<StartItemPaymentErrorCode>\n | StartItemPaymentOutcomeUnknown;",
2992
+ "jsdoc": "/** StartItemPayment places the member's order for one catalog item, charges it with `appleIAP` and\n * starts its Payment, all server-side. Four different ids come back: the vertical's record (the eCom\n * order, `ecomOrderId`; for Online Programs the join application, `joinApplicationId`, and no eCom\n * order), the Wix Payments charge (`payment.wixTransactionId`), the wix-iap Payment\n * (`payment.paymentId`) and the StoreKit `appAccountToken`. Keep them out of screen state. */",
2993
+ "decl": "export type StartItemPaymentResult =\n | { status: \"started\"; payment: WixIapPayment; storeProductId: string; appAccountToken: string; ecomOrderId?: string; joinApplicationId?: string }\n | WixIapFailure<StartItemPaymentErrorCode>\n | StartItemPaymentOutcomeUnknown;",
2987
2994
  "verificationChecked": true
2988
2995
  },
2989
2996
  {
@@ -3000,6 +3007,13 @@
3000
3007
  "decl": "export type GetPaymentResult = { status: \"found\"; payment: WixIapPayment } | WixIapFailure<GetPaymentErrorCode>;",
3001
3008
  "verificationChecked": true
3002
3009
  },
3010
+ {
3011
+ "name": "CancelPaymentResult",
3012
+ "kind": "type",
3013
+ "jsdoc": "/** `answered`: the Payment as CancelPayment left it, `canceling`, `canceled`, or `approved` when a\n * purchase the store already reported paid it instead. Only `canceled` means nothing was paid. */",
3014
+ "decl": "export type CancelPaymentResult = { status: \"answered\"; payment: WixIapPayment } | WixIapFailure<CancelPaymentErrorCode>;",
3015
+ "verificationChecked": true
3016
+ },
3003
3017
  {
3004
3018
  "name": "WixIapClientDependencies",
3005
3019
  "kind": "interface",
@@ -3012,7 +3026,7 @@
3012
3026
  "name": "WixIapClient",
3013
3027
  "kind": "interface",
3014
3028
  "jsdoc": "",
3015
- "decl": "export interface WixIapClient {\n /** StartPayment for a pending `appleIAP` Wix Payments transaction the member placed. Returns the\n * store product to sell and this payment's `appAccountToken` to pass to StoreKit. */\n startPayment(input: { wixTransactionId: string }): Promise<StartPaymentResult>;\n /** StartItemPayment for one catalog item: the service places the member's eCom order, charges it\n * and starts its Payment. Every call places a new order, so `outcomeUnknown` must never be\n * resent as if nothing happened. Returns the store product, the token and the eCom order. */\n startItemPayment(input: { item: EcomCatalogReference }): Promise<StartItemPaymentResult>;\n /** CompletePayment with held Apple proof, sent unchanged: the service pays the payment whose\n * token the transaction carries. Success can still be `approving`. */\n completePayment(transaction: AppleTransaction): Promise<CompletePaymentResult>;\n /** GetPayment: one of the member's own Payments. */\n getPayment(input: { paymentId: string }): Promise<GetPaymentResult>;\n}",
3029
+ "decl": "export interface WixIapClient {\n /** StartPayment for a pending `appleIAP` Wix Payments transaction the member placed. Returns the\n * store product to sell and this payment's `appAccountToken` to pass to StoreKit. */\n startPayment(input: { wixTransactionId: string }): Promise<StartPaymentResult>;\n /** StartItemPayment for one catalog item: the service places the member's order, charges it and\n * starts its Payment. Every call places a new order, so `outcomeUnknown` must never be resent as\n * if nothing happened. `storeCountryCode` is StoreKit's storefront country (alpha-3), sent when\n * known. Returns the store product, the token and the eCom order or join application. */\n startItemPayment(input: { item: EcomCatalogReference; storeCountryCode?: string }): Promise<StartItemPaymentResult>;\n /** CompletePayment with held Apple proof, sent unchanged: the service pays the payment whose\n * token the transaction carries. Success can still be `approving`. */\n completePayment(transaction: AppleTransaction): Promise<CompletePaymentResult>;\n /** GetPayment: one of the member's own Payments. */\n getPayment(input: { paymentId: string }): Promise<GetPaymentResult>;\n /** CancelPayment: the member dismissed the store sheet. The service cancels the pending Payment and\n * releases what its vertical held, unless a purchase the store already reported paid it. */\n cancelPayment(input: { paymentId: string }): Promise<CancelPaymentResult>;\n}",
3016
3030
  "verificationChecked": true,
3017
3031
  "verified": false
3018
3032
  },
package/guides/skill.md CHANGED
@@ -184,6 +184,7 @@ and is also served at the public URL above. No repository access is required.
184
184
 
185
185
  - **Your platform already holds the owner's Wix session or token** (they connected their Wix account to it): that token **is** the owner. Any valid Wix token can manage that account's apps, publishing included. Pipe it in — `printf '%s' "$TOKEN" | himi login --wix --wix-token-stdin --target wix` — or set `WIX_TOKEN` and run `himi login --wix --target wix`. Never put a token on the command line (argv shows in `ps` and transcripts) or in a file you commit, and never print it.
186
186
  - **A server or CI job** with an account API key: `WIX_API_KEY` + `himi login --wix --target wix`.
187
+ - **You hold no token at all:** run `himi login --device --target wix`. It prints a link and a short code. Show the owner both, ask them to open the link on any device where they are signed in to wix.com, check the code matches and approve, then wait: the command returns once they approve (up to 10 minutes).
187
188
  - **None of these:** stop and say exactly what is missing. Do not improvise another route to a himi token.
188
189
 
189
190
  This replaces only the sign-in. The approval gates above still apply to every side effect.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1634.0",
3
+ "version": "0.1636.0",
4
4
  "type": "module",
5
5
  "description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
6
6
  "keywords": [
@@ -72,5 +72,5 @@
72
72
  "artifactId": "himalaya-cli"
73
73
  }
74
74
  },
75
- "falconPackageHash": "7e33d424d99d05998b91ee4390198d50459ab4ce4a5aec4d4c999ae1"
75
+ "falconPackageHash": "d6d901ed70b37adf6921bdd9925f1f9318912a9268e2a25230e73f95"
76
76
  }
@@ -92,7 +92,6 @@ export const COLLECTIONS: Record<string, CollectionConfig> = {
92
92
  searchPlaceholder: 'Customer name, email or order #', sortLabels: { default: 'Newest', az: 'Customer A–Z', za: 'Customer Z–A' },
93
93
  filterValues: ['Recent 7 days', 'Paid', 'Unpaid', 'Partially paid', 'Pending', 'Refunded', 'Partly refunded'] },
94
94
  himiBrandedGroups: { rows: 'rows', title: 'name', subtitle: 'description', image: 'image', view: 'grid' },
95
- himiBrandedCms: { rows: 'rows', title: 'name', subtitle: 'subtitle', view: 'grid' },
96
95
  himiBrandedCmsCollection: { instanceInput: 'collection', rows: 'rows', title: 'title', subtitle: 'subtitle', view: 'list' },
97
96
  himiBrandedOrders: { rows: 'rows', title: 'title', subtitle: 'subtitle', image: 'image', metadata: ['status', 'meta'], rowStyle: 'flat', view: 'list', backendQuery: true,
98
97
  searchPlaceholder: 'Search by order number', countNoun: ['order', 'orders'], filterValues: ['Not fulfilled', 'Partially fulfilled', 'Fulfilled'],
@@ -92,7 +92,6 @@ export const COLLECTIONS: Record<string, CollectionConfig> = {
92
92
  searchPlaceholder: 'Customer name, email or order #', sortLabels: { default: 'Newest', az: 'Customer A–Z', za: 'Customer Z–A' },
93
93
  filterValues: ['Recent 7 days', 'Paid', 'Unpaid', 'Partially paid', 'Pending', 'Refunded', 'Partly refunded'] },
94
94
  himiBrandedGroups: { rows: 'rows', title: 'name', subtitle: 'description', image: 'image', view: 'grid' },
95
- himiBrandedCms: { rows: 'rows', title: 'name', subtitle: 'subtitle', view: 'grid' },
96
95
  himiBrandedCmsCollection: { instanceInput: 'collection', rows: 'rows', title: 'title', subtitle: 'subtitle', view: 'list' },
97
96
  himiBrandedOrders: { rows: 'rows', title: 'title', subtitle: 'subtitle', image: 'image', metadata: ['status', 'meta'], rowStyle: 'flat', view: 'list', backendQuery: true,
98
97
  searchPlaceholder: 'Search by order number', countNoun: ['order', 'orders'], filterValues: ['Not fulfilled', 'Partially fulfilled', 'Fulfilled'],