@wix/himalaya-cli 0.1577.0 → 0.1578.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 (23) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/clipboard/src/index.d.ts +32 -1
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/haptic/src/index.d.ts +69 -5
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/sdk-types/src/capabilities.generated.d.ts +2 -2
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/ui/src/index.d.ts +19 -2
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts +6 -0
  6. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/audio-record.mjs +2 -2
  7. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calendar.mjs +2 -2
  8. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calls.mjs +2 -2
  9. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/clipboard.mjs +58 -1
  10. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/contacts.mjs +2 -2
  11. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/haptic.mjs +73 -4
  12. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/location.mjs +2 -2
  13. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/motion.mjs +2 -2
  14. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/photos.mjs +2 -2
  15. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdk-types.mjs +2 -2
  16. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/tasks.mjs +2 -2
  17. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/ui.mjs +5 -0
  18. package/dist/cli.mjs +1053 -915
  19. package/dist/preview-assets.generated.bin +0 -0
  20. package/guides/qa-builds.md +14 -6
  21. package/guides/sdk-reference.json +116 -8
  22. package/guides/web-page-sdk-reference.md +2 -2
  23. package/package.json +2 -2
Binary file
@@ -1210,12 +1210,20 @@ himi dist --app <app> --platform android --aab --wait --target bo
1210
1210
  a bundle id saved in between is refused and stays changeable). The owner must already have the app
1211
1211
  in App Store Connect under that bundle id. The files
1212
1212
  and the key are never stored: the pool and the upload each fetch them again, the job keeps only
1213
- their hashes. The upload runs on the first status read after the pool validated the IPA; any read
1214
- the caller may make of the app moves it on, since the owner was proven when the build started (the
1215
- Containers server's reads carry a project token, not the owner's Wix login). So a caller keeps
1216
- reading the job until `customerAppStore.status` is `UPLOADED` or `FAILED`, not only until the job
1217
- is `SUCCESS`: a read that stops early, or gives up mid-upload, leaves the IPA waiting (a claimed
1218
- upload is retried by a read 15 minutes later).
1213
+ their hashes. The upload starts on its own once the pool reports the validated IPA: the pool's
1214
+ callback starts it in the background, and so does every list read of the app's builds (the owner
1215
+ card's poll) while it can be claimed, which also picks up one a stopped serve pod left. A status
1216
+ read still uploads too; any read the caller may make of the app moves it on, since the owner was
1217
+ proven when the build started (the Containers server's reads carry a project token, not the
1218
+ owner's Wix login). A caller reads the job until `customerAppStore.status` is `UPLOADED` or
1219
+ `FAILED` to learn how it ended; it no longer has to read for the upload to happen. An attempt that
1220
+ fails on a passing error (a 429 or 5xx from mobile-apps-containers-builder or Apple, a timeout, a
1221
+ download that broke off) goes back to `READY_FOR_UPLOAD` with `failedAttempts`, `retryAt` and
1222
+ `lastError`, and is tried again 1, 5 and 15 minutes later. The 4th failed attempt (an attempt
1223
+ whose 15-minute lease ran out counts as one) and any error the owner must fix (no app in App Store
1224
+ Connect, a refused key, a closed version) end `FAILED`, with `error`. When the IPA's 7-day link is
1225
+ within an hour of lapsing, the upload signs a fresh one from the stored bucket and key (the plane's
1226
+ `DIST_ARTIFACT_AWS_*` key pair; without it, the recorded link).
1219
1227
  Refusals, each with `code` equal to `error`: `store_build_ios_only`, `store_build_version_invalid`
1220
1228
  and `store_build_shell_unsupported` 400, `store_build_site_forbidden` 403, `store_id_missing`,
1221
1229
  `store_app_site_taken`, `release_predates_store_builds`, `apple_credentials_missing`,
@@ -1017,6 +1017,12 @@
1017
1017
  "source": "core/sdk/clipboard/src/index.ts",
1018
1018
  "description": "Tier-5 typed binding for the system clipboard.",
1019
1019
  "api": [
1020
+ {
1021
+ "name": "\"@himalaya/sdk-types\"",
1022
+ "kind": "reexport",
1023
+ "jsdoc": "",
1024
+ "decl": "export type { FileHandle } from \"@himalaya/sdk-types\";"
1025
+ },
1020
1026
  {
1021
1027
  "name": "writeText",
1022
1028
  "kind": "function",
@@ -1035,11 +1041,59 @@
1035
1041
  "jsdoc": "/** Whether the clipboard holds text — no content access, no iOS paste banner. On\n * web this can't be known without reading, so it returns true pessimistically;\n * treat it as a hint, not a guarantee. */",
1036
1042
  "decl": "export async function hasText(): Promise<boolean>;"
1037
1043
  },
1044
+ {
1045
+ "name": "MAX_IMAGE_BYTES",
1046
+ "kind": "const",
1047
+ "jsdoc": "/** Largest image writeImage accepts (20 MB). Hosts enforce it too. */",
1048
+ "decl": "export const MAX_IMAGE_BYTES = 20 * 1024 * 1024;"
1049
+ },
1050
+ {
1051
+ "name": "IMAGE_MIME_TYPES",
1052
+ "kind": "const",
1053
+ "jsdoc": "/** Image MIME types writeImage copies. HEIC is iOS/macOS only (Android and web\n * reject it `unsupported_type`); web accepts PNG only. The host sniffs the file's\n * bytes, so a handle is judged by its content, not its `mimeType` — the binding only\n * refuses up front a handle whose type is plainly not an image (e.g. application/pdf). */",
1054
+ "decl": "export const IMAGE_MIME_TYPES: readonly string[] = [\"image/png\", \"image/jpeg\", \"image/webp\", \"image/heic\"];"
1055
+ },
1056
+ {
1057
+ "name": "ClipboardImageErrorCode",
1058
+ "kind": "type",
1059
+ "jsdoc": "/** Why writeImage rejected. */",
1060
+ "decl": "export type ClipboardImageErrorCode = \"unsupported_type\" | \"too_large\" | \"not_allowed\" | \"not_found\" | \"unavailable\";"
1061
+ },
1062
+ {
1063
+ "name": "ClipboardImageError",
1064
+ "kind": "interface",
1065
+ "jsdoc": "/** A writeImage rejection: an `Error` named \"ClipboardImageError\" carrying a stable\n * `code`. (A plain Error, not a subclass — Tier-5 bundles target an engine without\n * class syntax.) Branch on `isClipboardImageError(e) && e.code === \"too_large\"`. */",
1066
+ "decl": "export interface ClipboardImageError extends Error {\n name: \"ClipboardImageError\";\n code: ClipboardImageErrorCode;\n}"
1067
+ },
1068
+ {
1069
+ "name": "clipboardImageError",
1070
+ "kind": "function",
1071
+ "jsdoc": "/** Build a coded writeImage rejection. */",
1072
+ "decl": "export function clipboardImageError(code: ClipboardImageErrorCode, message?: string): ClipboardImageError;"
1073
+ },
1074
+ {
1075
+ "name": "isClipboardImageError",
1076
+ "kind": "function",
1077
+ "jsdoc": "/** Whether `e` is a coded writeImage rejection. */",
1078
+ "decl": "export function isClipboardImageError(e: unknown): e is ClipboardImageError;"
1079
+ },
1080
+ {
1081
+ "name": "writeImage",
1082
+ "kind": "function",
1083
+ "jsdoc": "/** Copy an image file the worker already holds to the clipboard. Accepts a\n * `FileHandle` (from files / camera / photos) or its substrate `uri`. Rejects with a\n * `ClipboardImageError` (see `isClipboardImageError`) whose `code` is `unsupported_type` (not PNG/JPEG/WebP/HEIC, or\n * not supported on this host), `too_large` (over 20 MB), `not_allowed` (outside the\n * app's files substrate), `not_found`, or `unavailable` (no image clipboard here). */",
1084
+ "decl": "export async function writeImage(file: FileHandle | string): Promise<void>;"
1085
+ },
1086
+ {
1087
+ "name": "hasImage",
1088
+ "kind": "function",
1089
+ "jsdoc": "/** Whether the clipboard currently holds an image — without reading it (no iOS paste\n * banner). Web cannot know without a permission-gated read, so it answers false. */",
1090
+ "decl": "export async function hasImage(): Promise<boolean>;"
1091
+ },
1038
1092
  {
1039
1093
  "name": "version",
1040
1094
  "kind": "const",
1041
1095
  "jsdoc": "/** Capability version, for bundles that gate on min binary version. */",
1042
- "decl": "export const version = 1;"
1096
+ "decl": "export const version = 2;"
1043
1097
  }
1044
1098
  ]
1045
1099
  },
@@ -1550,20 +1604,68 @@
1550
1604
  {
1551
1605
  "name": "HapticPattern",
1552
1606
  "kind": "type",
1553
- "jsdoc": "/** Maps to a native impact/notification/selection generator. */",
1554
- "decl": "export type HapticPattern =\n | \"selection\"\n | \"light\"\n | \"medium\"\n | \"heavy\"\n | \"success\"\n | \"warning\"\n | \"error\";"
1607
+ "jsdoc": "/**\n * Maps to a native impact/notification/selection generator.\n *\n * - `rigid` / `soft` — iOS `UIImpactFeedbackGenerator.FeedbackStyle.rigid` / `.soft`.\n * Android: `rigid` is a short full-amplitude click (`VibrationEffect.EFFECT_CLICK`-like),\n * `soft` a longer low-amplitude tick (`PRIMITIVE_LOW_TICK`-like); on a device without\n * amplitude control both are plain one-shots of different length.\n */",
1608
+ "decl": "export type HapticPattern =\n | \"selection\"\n | \"light\"\n | \"medium\"\n | \"heavy\"\n | \"rigid\"\n | \"soft\"\n | \"success\"\n | \"warning\"\n | \"error\";"
1609
+ },
1610
+ {
1611
+ "name": "PlayOptions",
1612
+ "kind": "interface",
1613
+ "jsdoc": "",
1614
+ "decl": "export interface PlayOptions {\n /**\n * 0..1, clamped. Scales the strength of an IMPACT style (`light`, `medium`, `heavy`,\n * `rigid`, `soft`): iOS `impactOccurred(intensity:)`, Android amplitude where the\n * vibrator has amplitude control. Ignored for `selection` and the notification styles\n * (`success`, `warning`, `error`) — those have a fixed system strength — and on web.\n */\n intensity?: number;\n}"
1615
+ },
1616
+ {
1617
+ "name": "HapticStep",
1618
+ "kind": "interface",
1619
+ "jsdoc": "",
1620
+ "decl": "export interface HapticStep {\n pattern: HapticPattern;\n /** Milliseconds to wait BEFORE this step plays (≥ 0). */\n delayMs: number;\n /** Same meaning as {@link PlayOptions.intensity}. */\n intensity?: number;\n}"
1621
+ },
1622
+ {
1623
+ "name": "HapticResult",
1624
+ "kind": "type",
1625
+ "jsdoc": "/**\n * What a verb reports. `ok: false` is honest: `unavailable` (this surface has no haptic\n * hardware/API — web without `navigator.vibrate`, macOS) or `unsupported_binary` (the\n * native app predates the verb; nothing played, nothing broke).\n */",
1626
+ "decl": "export type HapticResult = { ok: true } | { ok: false; reason: \"unavailable\" | \"unsupported_binary\" };"
1627
+ },
1628
+ {
1629
+ "name": "MAX_SEQUENCE_STEPS",
1630
+ "kind": "const",
1631
+ "jsdoc": "/** Most steps one {@link sequence} may carry. */",
1632
+ "decl": "export const MAX_SEQUENCE_STEPS = 32;"
1633
+ },
1634
+ {
1635
+ "name": "MAX_DURATION_MS",
1636
+ "kind": "const",
1637
+ "jsdoc": "/** Longest a {@link sequence} or {@link vibrate} pattern may run, in milliseconds. */",
1638
+ "decl": "export const MAX_DURATION_MS = 10_000;"
1639
+ },
1640
+ {
1641
+ "name": "clampIntensity",
1642
+ "kind": "function",
1643
+ "jsdoc": "/** Clamp an intensity into 0..1; `undefined` / non-finite → `undefined` (system default). */",
1644
+ "decl": "export function clampIntensity(intensity: number | undefined): number | undefined;"
1555
1645
  },
1556
1646
  {
1557
1647
  "name": "play",
1558
1648
  "kind": "function",
1559
- "jsdoc": "/**\n * Play a haptic feedback pattern. Fire-and-forget; resolves once handed to the\n * platform. A no-op on web and for unknown patterns.\n */",
1560
- "decl": "export async function play(pattern: HapticPattern = \"light\"): Promise<void>;"
1649
+ "jsdoc": "/**\n * Play a haptic feedback pattern. Fire-and-forget; resolves once handed to the\n * platform. Unknown pattern names keep their historical behaviour (the platform's\n * default tap). `intensity` applies to impact styles only — see {@link PlayOptions}.\n */",
1650
+ "decl": "export async function play(pattern: HapticPattern = \"light\", options: PlayOptions = {}): Promise<HapticResult>;"
1651
+ },
1652
+ {
1653
+ "name": "sequence",
1654
+ "kind": "function",
1655
+ "jsdoc": "/**\n * Play `steps` in order, waiting each step's `delayMs` before it plays. Runs natively\n * as ONE bridge call (the timing does not depend on the worker), so a drum roll or a\n * countdown keeps its rhythm. A new `sequence` cancels one still running. Resolves once\n * the sequence has been scheduled.\n *\n * Rejects (`RangeError`) with more than {@link MAX_SEQUENCE_STEPS} steps, a negative or\n * non-finite delay, or delays totalling over {@link MAX_DURATION_MS}. An empty list just\n * cancels a running sequence.\n */",
1656
+ "decl": "export async function sequence(steps: HapticStep[]): Promise<HapticResult>;"
1657
+ },
1658
+ {
1659
+ "name": "vibrate",
1660
+ "kind": "function",
1661
+ "jsdoc": "/**\n * Raw vibration: `patternMs` alternates OFF / ON durations in milliseconds, starting\n * with an off gap (`[0, 200, 100, 400]` = buzz 200, pause 100, buzz 400).\n *\n * Android plays it as `VibrationEffect.createWaveform`. iOS approximates: with Core\n * Haptics each ON span is a continuous event (a transient one under 30 ms); without it,\n * each ON span becomes one `heavy` impact at its start. Web uses `navigator.vibrate`.\n *\n * Rejects (`RangeError`) on an empty list, a negative or non-finite duration, or a\n * pattern totalling over {@link MAX_DURATION_MS}.\n */",
1662
+ "decl": "export async function vibrate(patternMs: number[]): Promise<HapticResult>;"
1561
1663
  },
1562
1664
  {
1563
1665
  "name": "version",
1564
1666
  "kind": "const",
1565
1667
  "jsdoc": "/** Capability version, for bundles that gate on a min binary version. */",
1566
- "decl": "export const version = 1;"
1668
+ "decl": "export const version = 2;"
1567
1669
  }
1568
1670
  ]
1569
1671
  },
@@ -4867,7 +4969,13 @@
4867
4969
  "name": "AlertOptions",
4868
4970
  "kind": "interface",
4869
4971
  "jsdoc": "",
4870
- "decl": "export interface AlertOptions {\n /** Required — the native presenters drop alerts with an empty title. */\n title: string;\n message?: string;\n /** Confirm button label. Default \"Confirm\". */\n confirmLabel?: string;\n /** Cancel button label. OMIT for a single-button alert (no cancel button). */\n cancelLabel?: string;\n /** Style the confirm button with the `danger` token. */\n destructive?: boolean;\n}"
4972
+ "decl": "export interface AlertOptions {\n /** Required — the native presenters drop alerts with an empty title. */\n title: string;\n message?: string;\n /** Confirm button label. Default \"Confirm\". */\n confirmLabel?: string;\n /** Cancel button label. OMIT for a single-button alert (no cancel button). */\n cancelLabel?: string;\n /** Style the confirm button with the `danger` token. A destructive confirm is not the\n * affirmative button: its `confirm.actionId` still runs, but without gesture credit. */\n destructive?: boolean;\n /** The affirmative button's ACTION. Pressing it runs `actionId` as a NEW invocation\n * with user-gesture origin (so an app service's `app.<svc>.<action>` may return `_nav` and\n * navigate — the \"Ready — View\" alert). `label` replaces `confirmLabel`. The id is checked when\n * you set it, against this worker: a `capability.<id>.*` needs `<id>` allowed, an `app.*` from a\n * screen worker needs `app_services` and an exported action, a `tier5.*` must be this worker's\n * own; anything else rejects (`action_not_allowed`). Cancel and dismissal run nothing. */\n confirm?: AlertConfirm;\n}"
4973
+ },
4974
+ {
4975
+ "name": "AlertConfirm",
4976
+ "kind": "interface",
4977
+ "jsdoc": "/** The affirmative button of an `alert()`: its label and the action its press runs. */",
4978
+ "decl": "export interface AlertConfirm {\n label: string;\n actionId: string;\n /** Passed to the action (JSON types kept). */\n args?: Record<string, unknown>;\n}"
4871
4979
  },
4872
4980
  {
4873
4981
  "name": "AlertResult",
@@ -4878,7 +4986,7 @@
4878
4986
  {
4879
4987
  "name": "alert",
4880
4988
  "kind": "function",
4881
- "jsdoc": "/** Present a modal alert on the current screen. Resolves when the user picks a\n * button. Rejects with `ui_busy` while another alert() is pending, and with\n * `no_ui_host` if the app has no presenter attached. */",
4989
+ "jsdoc": "/** Present a modal alert on the current screen. Resolves when the user picks a\n * button. Rejects with `ui_busy` while another alert() is pending, and with\n * `no_ui_host` if the app has no presenter attached — or, from an APP SERVICE, when no\n * shell is in the foreground (re-show it from `onForeground`). An app service's alert shows on\n * whatever screen is open. */",
4882
4990
  "decl": "export async function alert(options: AlertOptions): Promise<AlertResult>;"
4883
4991
  },
4884
4992
  {
@@ -22,12 +22,12 @@ the SDK sources, so it matches the shipped SDKs.
22
22
  - [`calendar`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fcalendar?format=md) — Device calendar. 6 methods.
23
23
  - [`calls`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fcalls?format=md) — Real-time 1:1 audio calls (Stage 1). 16 methods.
24
24
  - [`camera`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fcamera?format=md) — Camera capability. 4 methods · returns FileHandles.
25
- - [`clipboard`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fclipboard?format=md) — System clipboard. 3 methods.
25
+ - [`clipboard`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fclipboard?format=md) — System clipboard. 5 methods.
26
26
  - [`contacts`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fcontacts?format=md) — Device address book. 4 methods.
27
27
  - [`file_picker`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Ffile_picker?format=md) — User-mediated document access OUTSIDE the app sandbox. 3 methods · returns FileHandles.
28
28
  - [`files`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Ffiles?format=md) — App-scoped document storage. 6 methods · returns FileHandles.
29
29
  - [`godot`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fgodot?format=md) — A Godot game surface. 3 methods · not in Brandy.
30
- - [`haptic`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fhaptic?format=md) — Haptic capability. 1 method.
30
+ - [`haptic`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fhaptic?format=md) — Haptic capability. 3 methods.
31
31
  - [`health`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fhealth?format=md) — Platform HEALTH store. 5 methods.
32
32
  - [`himi_apps`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fhimi_apps?format=md) — Cross-app open / host queries. 4 methods · not in Brandy.
33
33
  - [`iap`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fiap?format=md) — In-app-purchase capability. 9 methods.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1577.0",
3
+ "version": "0.1578.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": "9902ef55d169da2c82868b986ceafb0c54b8102e501f513b72e4c8c0"
74
+ "falconPackageHash": "0a206d4a3d13e9f1302334dcaeb9d70a507f8c916a8ac190fe8bfd8e"
75
75
  }