@wix/himalaya-cli 0.1318.0 → 0.1320.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 (84) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/sdk-types/src/capabilities.generated.d.ts +2 -1
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/theme/src/index.d.ts +21 -0
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/webview-page/src/capabilities.generated.d.ts +2 -0
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/brand-color-math.d.ts +98 -0
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts +1 -1
  6. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +9 -0
  7. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/audio-record.mjs +1 -0
  8. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calendar.mjs +1 -0
  9. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calls.mjs +1 -0
  10. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/contacts.mjs +1 -0
  11. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core/brand-color-math.mjs +183 -0
  12. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/location.mjs +1 -0
  13. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/motion.mjs +1 -0
  14. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/photos.mjs +1 -0
  15. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdk-types.mjs +1 -0
  16. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/tasks.mjs +1 -0
  17. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/theme.mjs +189 -0
  18. package/dist/authoring-runtime/node_modules/@wix/himalaya/package.json +8 -0
  19. package/dist/cli.mjs +574 -404
  20. package/dist/preview-assets.generated.bin +0 -0
  21. package/guides/app-config.md +1 -1
  22. package/guides/capabilities.md +17 -0
  23. package/guides/designing-himi-screens.md +2 -0
  24. package/guides/importable-sdks.md +1 -0
  25. package/guides/qa-builds.md +34 -8
  26. package/guides/sdk-reference.json +39 -2
  27. package/guides/web-page-sdk-reference.md +1 -0
  28. package/package.json +2 -2
  29. package/templates/beauty-salon-owner/config.ts +1 -1
  30. package/templates/beauty-salon-owner/dev/index.ts +125 -24
  31. package/templates/beauty-salon-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  32. package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +59 -31
  33. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  34. package/templates/brandy/README.md +5 -3
  35. package/templates/community-club-owner/config.ts +1 -1
  36. package/templates/community-club-owner/dev/index.ts +125 -24
  37. package/templates/community-club-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  38. package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +59 -31
  39. package/templates/community-club-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  40. package/templates/events-meetups-owner/config.ts +1 -1
  41. package/templates/events-meetups-owner/dev/index.ts +125 -24
  42. package/templates/events-meetups-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  43. package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +59 -31
  44. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  45. package/templates/gym-fitness-owner/config.ts +1 -1
  46. package/templates/gym-fitness-owner/dev/index.ts +125 -24
  47. package/templates/gym-fitness-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  48. package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +59 -31
  49. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  50. package/templates/nonprofit-cause-owner/config.ts +1 -1
  51. package/templates/nonprofit-cause-owner/dev/index.ts +125 -24
  52. package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  53. package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +59 -31
  54. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  55. package/templates/owner-lite/config.ts +1 -1
  56. package/templates/owner-lite/dev/index.ts +125 -24
  57. package/templates/owner-lite/tier5-src/_shared/aria-attachments.ts +41 -2
  58. package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +59 -31
  59. package/templates/owner-lite/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  60. package/templates/podcast-creator-owner/config.ts +1 -1
  61. package/templates/podcast-creator-owner/dev/index.ts +125 -24
  62. package/templates/podcast-creator-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  63. package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +59 -31
  64. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  65. package/templates/portfolio-creative-owner/config.ts +1 -1
  66. package/templates/portfolio-creative-owner/dev/index.ts +125 -24
  67. package/templates/portfolio-creative-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  68. package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +59 -31
  69. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  70. package/templates/restaurant-owner/config.ts +1 -1
  71. package/templates/restaurant-owner/dev/index.ts +125 -24
  72. package/templates/restaurant-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  73. package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +59 -31
  74. package/templates/restaurant-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  75. package/templates/retail-store-owner/config.ts +1 -1
  76. package/templates/retail-store-owner/dev/index.ts +125 -24
  77. package/templates/retail-store-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  78. package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +59 -31
  79. package/templates/retail-store-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
  80. package/templates/yoga-studio-owner/config.ts +1 -1
  81. package/templates/yoga-studio-owner/dev/index.ts +125 -24
  82. package/templates/yoga-studio-owner/tier5-src/_shared/aria-attachments.ts +41 -2
  83. package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +59 -31
  84. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
Binary file
@@ -115,7 +115,7 @@ with a native footprint only arrives with a new binary. `himi docs capabilities`
115
115
  loop — discover, declare, validate, ship — and `himi capabilities <id>` shows the import and which
116
116
  shells' binaries serve it.
117
117
 
118
- App-level capability vocabulary: `camera`, `barcode_scanner`, `biometrics`, `secure_storage`, `share`, `push`, `file_picker`, `files`, `open_url`, `pdf`, `clipboard`, `photos`, `presigned_upload`, `ui`, `calendar`, `contacts`, `tasks`, `audio_record`, `audio_record_background`, `calls`, `location`, `location_background`, `motion`, `health`, `media_playback`, `webview`, `browser_auth`, `haptic`, `himi_apps`, `iap`, `keyboard`, `wix_cashier`, `live_activity`, `local_database`, `speech`, `speaker_diarization`, `system_intents`, `on_device_ai`, `app_info`, `release_control`, `godot`, `base44`, `animation`.
118
+ App-level capability vocabulary: `camera`, `barcode_scanner`, `biometrics`, `secure_storage`, `share`, `push`, `file_picker`, `files`, `open_url`, `pdf`, `clipboard`, `theme`, `photos`, `presigned_upload`, `ui`, `calendar`, `contacts`, `tasks`, `audio_record`, `audio_record_background`, `calls`, `location`, `location_background`, `motion`, `health`, `media_playback`, `webview`, `browser_auth`, `haptic`, `himi_apps`, `iap`, `keyboard`, `wix_cashier`, `live_activity`, `local_database`, `speech`, `speaker_diarization`, `system_intents`, `on_device_ai`, `app_info`, `release_control`, `godot`, `base44`, `animation`.
119
119
 
120
120
  ## What `himi validate` checks (7 passes)
121
121
 
@@ -59,6 +59,23 @@ The screen list is enforced at runtime: a call the screen did not declare is **d
59
59
  so it must name every capability the app uses. A background variant (`location_background`,
60
60
  `audio_record_background`) is declared instead of — and grants — its foreground capability.
61
61
 
62
+ ### Local database and tenant switches
63
+
64
+ On native hosts `local_database` is also scoped by the host's active tenant. On a multi-tenant host such as Himi Player, a worker is stamped with the tenant that was active when its boot started. The
65
+ stamp travels with each dispatch; if the host switches tenants while a dispatch is in flight,
66
+ the native handler refuses it at store or write-queue resolution instead of retargeting the
67
+ request to the new tenant.
68
+
69
+ The tenant's `dataSchema` is the allowlist for local entities and must be applied for the
70
+ tenant whose config supplied it. A missing schema is applied as `{}` and clears the previous
71
+ allowlist and encrypted backing configuration. Himi Player applies cached package config
72
+ before an imported-package fetch and reapplies the fetched schema after foreground/reload
73
+ refreshes only when the refresh still belongs to the current release and tenant; snapshot
74
+ packages and stale or overtaken refreshes are not overwritten.
75
+
76
+ The web host does not have this scoping yet: its IndexedDB `EntityStore` keys rows by
77
+ `entity:<name>` only, so on the web Player two apps that use the same entity name share rows.
78
+
62
79
  ## 3. Check
63
80
 
64
81
  ```bash
@@ -408,6 +408,8 @@ nicety. Don't animate everything: if every element moves, nothing reads as impor
408
408
  - **`accessibility_label` on every non-text control, icon, and image.** This is **distinct from `id`** —
409
409
  `id` targets a node for Argus/test automation; `accessibility_label` is what a screen reader announces.
410
410
  A screen full of `id`s and no `accessibility_label`s is testable but unusable with VoiceOver/TalkBack.
411
+ It may be bound to worker state with `$service:<service>.<path>`; the web renderer keeps the
412
+ resulting `aria-label` current as that state changes.
411
413
  - **Tap targets** stay comfortably large (don't shrink `button`/`icon` hit areas below ~44pt).
412
414
  - **Contrast** comes from the token roles — pair `textPrimary`/`textSecondary` with the right surface,
413
415
  and provide the `highContrast` scheme value for load-bearing colors.
@@ -56,6 +56,7 @@ package in one greppable file) or `GET /v1/sdk/<name>` over HTTP; in the CLI,
56
56
  - `@himalaya/speech` — Tier-5 typed binding to the platform's speech capability.
57
57
  - `@himalaya/system-intents` — Tier-5 typed binding to the platform's system-intents capability.
58
58
  - `@himalaya/tasks` — Tier-5 typed binding for reminders / to-dos.
59
+ - `@himalaya/theme` — Tier-5 typed binding for the runtime brand overlay.
59
60
  - `@himalaya/time` — Tier-5 temporal helpers.
60
61
  - `@himalaya/ui` — Tier-5 typed binding to the platform's imperative popup capability.
61
62
  - `@himalaya/webview` — Tier-5 typed binding for the page ↔ worker message channel of a worker-backed webview screen (Part 2 / RFC 0025 composition).
@@ -8,10 +8,12 @@ A **QA build** is a real, installable app you hand to QA — an enterprise/ad-ho
8
8
  distinct from the CI gates (`test:*`, `argus:*`), which only prove the code builds
9
9
  and passes flows; nothing installable comes out of those.
10
10
 
11
- > **QA only — not TestFlight.** `himi dist` returns an installable QA artifact and
12
- > install link. It never submits to App Store Connect or Google Play. In particular,
13
- > it is separate from Himi Player's Wix Mobile Release TestFlight route and its
14
- > output is not an MRE-approved upload artifact.
11
+ > **The default is QA; customer TestFlight is an explicit BYO path.** The ordinary
12
+ > `himi dist` request returns an installable QA artifact and install link. A customer
13
+ > iOS request may instead use `--signing byo --destination testflight --site <id>
14
+ > --version <x.y.z>`; the build validates the App Store IPA, and an authorized
15
+ > `himi dist status <jobId>` read uploads it to the customer's App Store Connect account.
16
+ > The customer path is not Himi Player's Wix Mobile Release route and does not use MRE.
15
17
 
16
18
  > **Customer request gate.** Do not dispatch `himi dist` merely because a draft preview is ready.
17
19
  > First confirm that the customer explicitly asked to download the app, identify the approved
@@ -32,8 +34,31 @@ This submits `destination: testflight`. The pool produces an IPA in the MRE-appr
32
34
  `wix-ios-app-builds` bucket; deployed serve then invokes MRE using its POCO service
33
35
  identity and persists the MRE request ID/status on the same Job Service record. It
34
36
  accepts only the `himi-player` app, `player` shell, iOS, and its own bundle identity.
35
- `himi dist` keeps `destination: link`, does not call MRE, and remains the QA path for
36
- Himi distribution apps.
37
+ The customer BYO path below also uses `destination: testflight`, but it uploads through
38
+ an authorized `himi dist status` read rather than MRE. The ordinary `himi dist` path
39
+ keeps `destination: link` and remains the QA path for Himi distribution apps.
40
+
41
+ ### Customer App Store / TestFlight handoff
42
+
43
+ For an owned app, the customer must authorize the selected site and provide the existing
44
+ customer distribution certificate plus an **App Store** provisioning profile (not the ad-hoc
45
+ profile the QA `--signing byo` path below selects) and an App Store Connect API key (key id,
46
+ issuer id and private key) in the site's customer signing binding. Without that key the
47
+ request fails with `customer_app_store_validation_key_missing`. The request is iOS-only:
48
+
49
+ ```bash
50
+ himi dist --app <app> --release <published-release-id> --site <owned-site-id> \
51
+ --platform ios --signing byo --destination testflight \
52
+ --version <marketing-version> --no-wait --target wix
53
+ himi dist status <jobId> --target wix
54
+ ```
55
+
56
+ The pool records `READY_FOR_UPLOAD` after validating the IPA. The status read proves site
57
+ ownership with the Wix credential, then claims and uploads the IPA once; repeat reads are
58
+ safe. Without that authorization, status reports the waiting state and does not upload.
59
+ The upload also requires customer App Store upload to be enabled on the Himi backend
60
+ (`HIMI_DIST_CUSTOMER_APP_STORE_UPLOAD=1`); where that switch is off, the job stays at `READY_FOR_UPLOAD` with a validated IPA that is
61
+ never uploaded.
37
62
 
38
63
  ### iOS bundle identities are channel-specific
39
64
 
@@ -147,8 +172,9 @@ The chosen policy is written to the job record (`signing`), so `himi dist status
147
172
  answer "whose certificate is on this binary" without re-deriving it from serve config that may
148
173
  have changed since.
149
174
 
150
- **`--signing byo`** uses an owned Wix site and its existing personal Apple distribution certificate
151
- and ad-hoc profile. Himi checks site ownership, the app's recorded native ID, profile
175
+ **`--signing byo`** (QA, `destination: link`) uses an owned Wix site and its existing personal
176
+ Apple distribution certificate and ad-hoc profile. The TestFlight handoff above uses the App Store
177
+ profile and ASC key instead; an ad-hoc setup does not satisfy it. Himi checks site ownership, the app's recorded native ID, profile
152
178
  type, certificate match, expiry, registered devices and production APNs entitlement before dispatch.
153
179
  It selects an existing compatible ad-hoc profile; the build does not create or revoke Apple assets.
154
180
  The runner fetches the certificate and profile using both its job token and a short-lived Buildkite
@@ -986,7 +986,7 @@
986
986
  "name": "NavTabItem",
987
987
  "kind": "interface",
988
988
  "jsdoc": "/** A single bottom-nav tab. */",
989
- "decl": "export interface NavTabItem {\n id: string;\n screenId?: string;\n label?: string;\n icon?: IconRef; // design-system icon name\n selectedIcon?: IconRef; // optional filled/active variant\n imageUrl?: string; // optional custom asset (overrides icon)\n imageAsset?: string;\n badge?: NavBadge;\n /** Live bindings resolved\n * against `NavigationConfig.navLogicBundle`. Each is a `$service:` sentinel,\n * the SAME representation `NavBadge.valuePath` and `hiddenPath`\n * already use — not a new binding vehicle. Unset / unresolvable / no nav\n * worker ⇒ the sibling literal wins, so chrome degrades to static config\n * rather than to blank.\n *\n * `hiddenPath` FILTERS the tab out (zero width, not dimmed) while KEEPING its\n * router stack, so unhiding restores it intact. Truthiness follows the RFC\n * 0024 coercers exactly, so a value hides identically on every surface. */\n hiddenPath?: string;\n labelPath?: string;\n iconPath?: string;\n}"
989
+ "decl": "export interface NavTabItem {\n id: string;\n screenId?: string;\n label?: string;\n icon?: IconRef; // design-system icon name\n selectedIcon?: IconRef; // optional filled/active variant\n imageUrl?: string; // optional custom asset (overrides icon)\n imageAsset?: string;\n badge?: NavBadge;\n /** Live bindings resolved\n * against `NavigationConfig.navLogicBundle`. Each is a `$service:` sentinel,\n * the SAME representation `NavBadge.valuePath` and `hiddenPath`\n * already use — not a new binding vehicle. Unset / unresolvable / no nav\n * worker ⇒ the sibling literal wins, so chrome degrades to static config\n * rather than to blank.\n *\n * `hiddenPath` FILTERS the tab out (zero width, not dimmed) while KEEPING its\n * router stack, so unhiding restores it intact. Truthiness follows the RFC\n * 0024 coercers exactly, so a value hides identically on every surface. */\n hiddenPath?: string;\n labelPath?: string;\n iconPath?: string;\n /** With `hiddenPath`, hidden until the path resolves (fail-closed). */\n hiddenUntilResolved?: boolean;\n}"
990
990
  },
991
991
  {
992
992
  "name": "DrawerConfig",
@@ -998,7 +998,7 @@
998
998
  "name": "DrawerItem",
999
999
  "kind": "interface",
1000
1000
  "jsdoc": "/** A single drawer destination (mirrors NavTabItem). */",
1001
- "decl": "export interface DrawerItem {\n id: string;\n screenId?: string;\n label?: string;\n icon?: IconRef; // design-system icon name\n badge?: NavBadge;\n /** Non-navigable decorative rows: \"section\" → a muted section header (e.g.\n * \"Workspaces\"); \"note\" → a muted body line (e.g. \"No workspaces yet\"). */\n role?: \"section\" | \"note\";\n /** Only meaningful on a `role:\"section\"` header. When set, that header becomes a\n * COLLAPSIBLE FOLDER: the nav rows following it (until the next section header)\n * hide/show when the header is tapped, and `collapsed` is the initial state\n * (`true` → folded away by default). Absent → the header is a static,\n * non-tappable label (back-compat: existing section headers are unaffected). */\n collapsed?: boolean;\n /** Live bindings against `NavigationConfig.navLogicBundle` — see `NavTabItem`.\n * A hidden row is filtered out, taking its section-folder membership with it. */\n hiddenPath?: string;\n labelPath?: string;\n iconPath?: string;\n}"
1001
+ "decl": "export interface DrawerItem {\n id: string;\n screenId?: string;\n label?: string;\n icon?: IconRef; // design-system icon name\n badge?: NavBadge;\n /** Non-navigable decorative rows: \"section\" → a muted section header (e.g.\n * \"Workspaces\"); \"note\" → a muted body line (e.g. \"No workspaces yet\"). */\n role?: \"section\" | \"note\";\n /** Only meaningful on a `role:\"section\"` header. When set, that header becomes a\n * COLLAPSIBLE FOLDER: the nav rows following it (until the next section header)\n * hide/show when the header is tapped, and `collapsed` is the initial state\n * (`true` → folded away by default). Absent → the header is a static,\n * non-tappable label (back-compat: existing section headers are unaffected). */\n collapsed?: boolean;\n /** Live bindings against `NavigationConfig.navLogicBundle` — see `NavTabItem`.\n * A hidden row is filtered out, taking its section-folder membership with it. */\n hiddenPath?: string;\n labelPath?: string;\n iconPath?: string;\n /** With `hiddenPath`, hidden until the path resolves (fail-closed). */\n hiddenUntilResolved?: boolean;\n}"
1002
1002
  },
1003
1003
  {
1004
1004
  "name": "SidebarConfig",
@@ -3886,6 +3886,43 @@
3886
3886
  }
3887
3887
  ]
3888
3888
  },
3889
+ {
3890
+ "name": "@himalaya/theme",
3891
+ "source": "core/sdk/theme/src/index.ts",
3892
+ "description": "Tier-5 typed binding for the runtime brand overlay.",
3893
+ "api": [
3894
+ {
3895
+ "name": "RuntimeBrand",
3896
+ "kind": "interface",
3897
+ "jsdoc": "",
3898
+ "decl": "export interface RuntimeBrand {\n /** #RRGGBB */\n primaryColor: string;\n /** #RRGGBB; absent ⇒ derived, as at build time. */\n secondaryColor?: string;\n}"
3899
+ },
3900
+ {
3901
+ "name": "ApplyBrandResult",
3902
+ "kind": "interface",
3903
+ "jsdoc": "",
3904
+ "decl": "export interface ApplyBrandResult {\n applied: boolean;\n /** Why it was not applied: `invalid_color`, `stale_scope`, a native rejection reason. */\n reason?: string;\n}"
3905
+ },
3906
+ {
3907
+ "name": "applyBrand",
3908
+ "kind": "function",
3909
+ "jsdoc": "/**\n * Brand the shell with [brand]: the five accent tokens on every scheme, and the accent glow when\n * the app's tokens have one. Idempotent; the last call wins. Rejects nothing by throwing: a bad\n * colour or a refused write answers `{ applied: false, reason }`.\n */",
3910
+ "decl": "export async function applyBrand(brand: RuntimeBrand): Promise<ApplyBrandResult>;"
3911
+ },
3912
+ {
3913
+ "name": "clearBrand",
3914
+ "kind": "function",
3915
+ "jsdoc": "/** Drop the runtime brand: the app's registered tokens paint again. */",
3916
+ "decl": "export async function clearBrand(): Promise<void>;"
3917
+ },
3918
+ {
3919
+ "name": "version",
3920
+ "kind": "const",
3921
+ "jsdoc": "/** Capability version, for bundles that gate on min binary version. */",
3922
+ "decl": "export const version = 1;"
3923
+ }
3924
+ ]
3925
+ },
3889
3926
  {
3890
3927
  "name": "@himalaya/time",
3891
3928
  "source": "core/sdk/time/src/index.ts",
@@ -50,6 +50,7 @@ the SDK sources, so it matches the shipped SDKs.
50
50
  - [`speech`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fspeech?format=md) — Speech capability. 8 methods.
51
51
  - [`system_intents`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fsystem_intents?format=md) — System-intents capability. 2 methods · not in Brandy.
52
52
  - [`tasks`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Ftasks?format=md) — Reminders / to-dos. 7 methods.
53
+ - [`theme`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Ftheme?format=md) — Runtime brand overlay. 2 methods.
53
54
  - [`ui`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fui?format=md) — Imperative popup capability. 2 methods · not in Brandy.
54
55
  - [`wix_cashier`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fwix_cashier?format=md) — Native cashier. 2 methods.
55
56
  - [`wix_platform`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fwix_platform?format=md) — Wix Platform SDK, worker-facing bindings. 30 methods · not in Brandy.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1318.0",
3
+ "version": "0.1320.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": [
@@ -71,5 +71,5 @@
71
71
  "artifactId": "himalaya-cli"
72
72
  }
73
73
  },
74
- "falconPackageHash": "dfd3f0fd8aa48b52c1b817a8496d8d6db5a934ad7ca0aaf6b203615f"
74
+ "falconPackageHash": "551309f221b2f15b7f02099f9470e8021a0e0de81fba7b30dea7434b"
75
75
  }
@@ -37,7 +37,7 @@ export default defineApp({
37
37
  actions: "http://localhost:8190/v1/actions",
38
38
  sync: "http://localhost:8190/v1/sync",
39
39
  },
40
- capabilities: ["live_activity","push","share","secure_storage","open_url","local_database","clipboard","ui","speech","camera","presigned_upload","app_info","biometrics"],
40
+ capabilities: ["live_activity","push","share","secure_storage","open_url","local_database","clipboard","ui","speech","camera","presigned_upload","app_info","biometrics","wix_platform"],
41
41
  designTokensPath: "./tokens.json",
42
42
  navigation: {
43
43
  "navKind": "responsive",
@@ -61983,6 +61983,65 @@ const SCREENS = runtimeSetting({
61983
61983
  },
61984
61984
  {
61985
61985
  "id": "",
61986
+ "body": {
61987
+ "package": "himalaya",
61988
+ "type": "VStack",
61989
+ "props": {
61990
+ "spacing": 4,
61991
+ "children": [
61992
+ {
61993
+ "id": "",
61994
+ "body": {
61995
+ "package": "himalaya",
61996
+ "type": "Icon",
61997
+ "props": {
61998
+ "name": "doc",
61999
+ "size": 24,
62000
+ "tint": "textSecondary"
62001
+ }
62002
+ },
62003
+ "modifiers": {
62004
+ "accessibilityRole": "decorative"
62005
+ }
62006
+ },
62007
+ {
62008
+ "id": "",
62009
+ "body": {
62010
+ "package": "himalaya",
62011
+ "type": "Text",
62012
+ "props": {
62013
+ "text": "$item.name",
62014
+ "style": "caption",
62015
+ "color": "textPrimary",
62016
+ "maxLines": 2
62017
+ }
62018
+ },
62019
+ "modifiers": {
62020
+ "height": 44
62021
+ }
62022
+ },
62023
+ {
62024
+ "id": "",
62025
+ "body": {
62026
+ "package": "himalaya",
62027
+ "type": "Text",
62028
+ "props": {
62029
+ "text": "$item.typeLabel",
62030
+ "style": "caption",
62031
+ "color": "textSecondary",
62032
+ "maxLines": 1
62033
+ }
62034
+ }
62035
+ }
62036
+ ]
62037
+ }
62038
+ },
62039
+ "modifiers": {
62040
+ "hiddenPath": "$item.documentHidden"
62041
+ }
62042
+ },
62043
+ {
62044
+ "id": "himi_owner_lite_aria.attachment_status_$item.id",
61986
62045
  "body": {
61987
62046
  "package": "himalaya",
61988
62047
  "type": "Text",
@@ -61994,6 +62053,7 @@ const SCREENS = runtimeSetting({
61994
62053
  }
61995
62054
  },
61996
62055
  "modifiers": {
62056
+ "height": 44,
61997
62057
  "hiddenPath": "$item.statusHidden"
61998
62058
  }
61999
62059
  },
@@ -62009,21 +62069,22 @@ const SCREENS = runtimeSetting({
62009
62069
  "id": "himi_owner_lite_aria.attachment_retry_$item.id",
62010
62070
  "body": {
62011
62071
  "package": "himalaya",
62012
- "type": "Text",
62072
+ "type": "Button",
62013
62073
  "props": {
62014
- "text": "Retry",
62015
- "style": "caption",
62016
- "color": "accentPrimary",
62017
- "maxLines": 1
62074
+ "title": "Retry",
62075
+ "action": {
62076
+ "actionId": "tier5.himiOwnerLiteAria.retryAttachment",
62077
+ "params": {
62078
+ "id": "$item.id"
62079
+ }
62080
+ },
62081
+ "style": "tertiary",
62082
+ "size": "sm"
62018
62083
  }
62019
62084
  },
62020
62085
  "modifiers": {
62021
- "onTap": {
62022
- "actionId": "tier5.himiOwnerLiteAria.retryAttachment",
62023
- "params": {
62024
- "id": "$item.id"
62025
- }
62026
- },
62086
+ "width": 92,
62087
+ "height": 48,
62027
62088
  "hiddenPath": "$item.retryHidden"
62028
62089
  }
62029
62090
  },
@@ -62031,32 +62092,51 @@ const SCREENS = runtimeSetting({
62031
62092
  "id": "himi_owner_lite_aria.attachment_remove_$item.id",
62032
62093
  "body": {
62033
62094
  "package": "himalaya",
62034
- "type": "Icon",
62095
+ "type": "Button",
62035
62096
  "props": {
62036
- "name": "close",
62037
- "size": 14,
62038
- "tint": "textSecondary"
62097
+ "title": "Remove attachment",
62098
+ "action": {
62099
+ "actionId": "tier5.himiOwnerLiteAria.removeAttachment",
62100
+ "params": {
62101
+ "id": "$item.id"
62102
+ }
62103
+ },
62104
+ "style": "tertiary",
62105
+ "iconOnly": true,
62106
+ "leadingIcon": "close",
62107
+ "cornerRadius": 24,
62108
+ "minHeight": 48
62039
62109
  }
62040
62110
  },
62041
62111
  "modifiers": {
62042
- "onTap": {
62043
- "actionId": "tier5.himiOwnerLiteAria.removeAttachment",
62044
- "params": {
62045
- "id": "$item.id"
62046
- }
62047
- },
62048
- "accessibilityLabel": "Remove photo"
62112
+ "width": 48,
62113
+ "height": 48,
62114
+ "accessibilityLabel": "Remove attachment",
62115
+ "accessibilityRole": "button"
62049
62116
  }
62050
62117
  }
62051
62118
  ]
62052
62119
  }
62120
+ },
62121
+ "modifiers": {
62122
+ "height": 48
62053
62123
  }
62054
62124
  }
62055
62125
  ]
62056
62126
  }
62057
62127
  },
62058
62128
  "modifiers": {
62059
- "width": 72
62129
+ "width": 160,
62130
+ "padding": {
62131
+ "top": 8,
62132
+ "bottom": 8,
62133
+ "leading": 8,
62134
+ "trailing": 8
62135
+ },
62136
+ "background": {
62137
+ "token": "surfaceSecondary"
62138
+ },
62139
+ "cornerRadius": 12
62060
62140
  }
62061
62141
  }
62062
62142
  ]
@@ -62068,7 +62148,7 @@ const SCREENS = runtimeSetting({
62068
62148
  "leading": 0,
62069
62149
  "trailing": 0,
62070
62150
  "top": 8,
62071
- "bottom": 0
62151
+ "bottom": 8
62072
62152
  }
62073
62153
  }
62074
62154
  },
@@ -62121,6 +62201,27 @@ const SCREENS = runtimeSetting({
62121
62201
  },
62122
62202
  "accessibilityLabel": "Take a photo"
62123
62203
  }
62204
+ },
62205
+ {
62206
+ "id": "himi_owner_lite_aria.attach.document",
62207
+ "body": {
62208
+ "package": "himalaya",
62209
+ "type": "Icon",
62210
+ "props": {
62211
+ "name": "document",
62212
+ "size": 22,
62213
+ "tint": "accentPrimary"
62214
+ }
62215
+ },
62216
+ "modifiers": {
62217
+ "onTap": {
62218
+ "actionId": "tier5.himiOwnerLiteAria.attach",
62219
+ "params": {
62220
+ "source": "document"
62221
+ }
62222
+ },
62223
+ "accessibilityLabel": "Add files"
62224
+ }
62124
62225
  }
62125
62226
  ]
62126
62227
  }
@@ -27,6 +27,14 @@ export const ARIA_IMAGE_TYPES: readonly string[] = [
27
27
  "image/heic",
28
28
  ];
29
29
 
30
+ /** Document MIME types supported by the native Aria reference. */
31
+ export const ARIA_DOCUMENT_TYPES: readonly string[] = [
32
+ "text/csv", "text/plain", "application/pdf", "application/msword",
33
+ "application/vnd.ms-excel", "application/vnd.ms-powerpoint",
34
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
35
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
36
+ ];
37
+
30
38
  /** At most this many attachments ride one message. The native Aria app caps at
31
39
  * 10; nothing on the wire says otherwise. */
32
40
  export const ARIA_MAX_ATTACHMENTS = 10;
@@ -40,6 +48,9 @@ export const ARIA_MAX_ATTACHMENTS = 10;
40
48
  * Checking it HERE is what turns that refusal into a sentence the owner can act
41
49
  * on, instead of a chip that fails for no stated reason. */
42
50
  export const ARIA_MAX_IMAGE_BYTES = 8 * 1024 * 1024;
51
+ // Inline documents include base64 and JSON overhead under the 4 MiB frame bridge.
52
+ // Larger documents use the file-backed attachment follow-up.
53
+ export const ARIA_MAX_DOCUMENT_BYTES = 2 * 1024 * 1024;
43
54
 
44
55
  /** A chip in the composer. Every field is always present — a `$item.` path that
45
56
  * is missing on some rows does not substitute — and each `…Hidden` flag
@@ -58,6 +69,9 @@ export interface AriaAttachmentChip {
58
69
  * runtime's frame limit. */
59
70
  thumbUrl: string;
60
71
  thumbHidden: boolean;
72
+ /** Filename/type card for documents (images keep the 72pt preview). */
73
+ documentHidden: boolean;
74
+ typeLabel: string;
61
75
  /** "Uploading…" / "Couldn't upload" / "" — collapses when empty. */
62
76
  statusText: string;
63
77
  statusHidden: boolean;
@@ -113,6 +127,21 @@ export function normalizeMime(mime: string): string {
113
127
  }
114
128
  }
115
129
 
130
+ /** Native providers sometimes report a generic MIME; match the reference's
131
+ * extension fallback only for those values, not a conflicting explicit type. */
132
+ export function attachmentMime(mime: string, name = ""): string {
133
+ const normalized = normalizeMime(mime);
134
+ if (normalized === "text/comma-separated-values") return "text/csv";
135
+ if (normalized && normalized !== "application/octet-stream") return normalized;
136
+ const extension = name.split(".").pop()?.toLowerCase() ?? "";
137
+ const types: Record<string, string> = {
138
+ png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg", webp: "image/webp", gif: "image/gif", heic: "image/heic", heif: "image/heif",
139
+ csv: "text/csv", txt: "text/plain", pdf: "application/pdf", doc: "application/msword", xls: "application/vnd.ms-excel", ppt: "application/vnd.ms-powerpoint",
140
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
141
+ };
142
+ return types[extension] ?? normalized;
143
+ }
144
+
116
145
  /** A file name for an image the picker did not name, by type. The service
117
146
  * requires one (1–255 characters), and it is what the transcript shows. */
118
147
  export function imageFileName(mimeType: string, n: number, given?: string): string {
@@ -131,8 +160,8 @@ export type AttachRefusal = "" | "type" | "size" | "count";
131
160
 
132
161
  export function refusalFor(parsed: ParsedDataUri | null, mimeType: string, attached: number): AttachRefusal {
133
162
  if (attached >= ARIA_MAX_ATTACHMENTS) return "count";
134
- if (!parsed || !ARIA_IMAGE_TYPES.includes(mimeType)) return "type";
135
- if (parsed.bytes > ARIA_MAX_IMAGE_BYTES) return "size";
163
+ if (!parsed || ![...ARIA_IMAGE_TYPES, ...ARIA_DOCUMENT_TYPES].includes(mimeType)) return "type";
164
+ if (parsed.bytes > (mimeType.startsWith("image/") ? ARIA_MAX_IMAGE_BYTES : ARIA_MAX_DOCUMENT_BYTES)) return "size";
136
165
  return "";
137
166
  }
138
167
 
@@ -146,10 +175,20 @@ export function chipIn(
146
175
  ref = "",
147
176
  ): AriaAttachmentChip {
148
177
  const statusText = state === "uploading" ? labels.uploading : state === "failed" ? labels.failed : "";
178
+ const dot = base.name.lastIndexOf(".");
179
+ const extension = dot > 0 && dot < base.name.length - 1 ? base.name.slice(dot + 1).toUpperCase() : "";
180
+ const mimeLabels: Record<string, string> = {
181
+ "application/pdf": "PDF", "text/csv": "CSV", "text/plain": "TXT", "application/msword": "DOC",
182
+ "application/vnd.ms-excel": "XLS", "application/vnd.ms-powerpoint": "PPT",
183
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "XLSX",
184
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "DOCX",
185
+ };
149
186
  return {
150
187
  ...base,
151
188
  state,
152
189
  thumbHidden: !base.thumbUrl,
190
+ documentHidden: base.mimeType.startsWith("image/"),
191
+ typeLabel: extension || mimeLabels[base.mimeType] || base.mimeType,
153
192
  statusText,
154
193
  statusHidden: !statusText,
155
194
  retryHidden: state !== "failed",