@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.
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/sdk-types/src/capabilities.generated.d.ts +2 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/theme/src/index.d.ts +21 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/webview-page/src/capabilities.generated.d.ts +2 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/brand-color-math.d.ts +98 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +9 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/audio-record.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calendar.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calls.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/contacts.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core/brand-color-math.mjs +183 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/location.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/motion.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/photos.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdk-types.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/tasks.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/theme.mjs +189 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/package.json +8 -0
- package/dist/cli.mjs +574 -404
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/app-config.md +1 -1
- package/guides/capabilities.md +17 -0
- package/guides/designing-himi-screens.md +2 -0
- package/guides/importable-sdks.md +1 -0
- package/guides/qa-builds.md +34 -8
- package/guides/sdk-reference.json +39 -2
- package/guides/web-page-sdk-reference.md +1 -0
- package/package.json +2 -2
- package/templates/beauty-salon-owner/config.ts +1 -1
- package/templates/beauty-salon-owner/dev/index.ts +125 -24
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/brandy/README.md +5 -3
- package/templates/community-club-owner/config.ts +1 -1
- package/templates/community-club-owner/dev/index.ts +125 -24
- package/templates/community-club-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/community-club-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/events-meetups-owner/config.ts +1 -1
- package/templates/events-meetups-owner/dev/index.ts +125 -24
- package/templates/events-meetups-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/gym-fitness-owner/config.ts +1 -1
- package/templates/gym-fitness-owner/dev/index.ts +125 -24
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/nonprofit-cause-owner/config.ts +1 -1
- package/templates/nonprofit-cause-owner/dev/index.ts +125 -24
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/owner-lite/config.ts +1 -1
- package/templates/owner-lite/dev/index.ts +125 -24
- package/templates/owner-lite/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/owner-lite/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/podcast-creator-owner/config.ts +1 -1
- package/templates/podcast-creator-owner/dev/index.ts +125 -24
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/portfolio-creative-owner/config.ts +1 -1
- package/templates/portfolio-creative-owner/dev/index.ts +125 -24
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/restaurant-owner/config.ts +1 -1
- package/templates/restaurant-owner/dev/index.ts +125 -24
- package/templates/restaurant-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/retail-store-owner/config.ts +1 -1
- package/templates/retail-store-owner/dev/index.ts +125 -24
- package/templates/retail-store-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/yoga-studio-owner/config.ts +1 -1
- package/templates/yoga-studio-owner/dev/index.ts +125 -24
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
|
Binary file
|
package/guides/app-config.md
CHANGED
|
@@ -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
|
|
package/guides/capabilities.md
CHANGED
|
@@ -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).
|
package/guides/qa-builds.md
CHANGED
|
@@ -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
|
-
> **
|
|
12
|
-
>
|
|
13
|
-
>
|
|
14
|
-
>
|
|
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
|
-
|
|
36
|
-
|
|
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
|
|
151
|
-
and ad-hoc 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.
|
|
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": "
|
|
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": "
|
|
62072
|
+
"type": "Button",
|
|
62013
62073
|
"props": {
|
|
62014
|
-
"
|
|
62015
|
-
"
|
|
62016
|
-
|
|
62017
|
-
|
|
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
|
-
"
|
|
62022
|
-
|
|
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": "
|
|
62095
|
+
"type": "Button",
|
|
62035
62096
|
"props": {
|
|
62036
|
-
"
|
|
62037
|
-
"
|
|
62038
|
-
|
|
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
|
-
"
|
|
62043
|
-
|
|
62044
|
-
|
|
62045
|
-
|
|
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":
|
|
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":
|
|
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",
|