@wix/himalaya-cli 0.1579.0 → 0.1581.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/dev-server/src/app-config.d.ts +18 -3
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/builder.d.ts +3 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/motion/src/index.d.ts +51 -5
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/network/src/index.d.ts +39 -0
- 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/webview-page/src/capabilities.generated.d.ts +2 -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 +12 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/validator.d.ts +6 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/media/src/index.d.ts +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/media/src/rendition.d.ts +42 -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.mjs +1 -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 +23 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/network.mjs +45 -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/sdui.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/wix-media.mjs +78 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/package.json +4 -0
- package/dist/cli.mjs +9144 -7459
- package/dist/preview-assets.generated.bin +0 -0
- package/dist/quickjs-intl.js +462 -0
- package/dist/quickjs-web-globals.js +540 -0
- package/dist/quickjs-worker-entry.js +313 -0
- package/guides/app-config.md +1 -1
- package/guides/component-reference.json +5 -3
- package/guides/component-reference.md +10 -2
- package/guides/designing-himi-screens.md +24 -0
- package/guides/himi-json-output.md +30 -1
- package/guides/importable-sdks.md +1 -0
- package/guides/one-app-section-mappings.md +4 -5
- package/guides/one-app-to-himi-app.md +214 -6
- package/guides/one-app-viewer.md +2 -2
- package/guides/sdk-reference.json +74 -7
- package/guides/tier-5-add-a-screen.md +32 -0
- package/guides/web-page-sdk-reference.md +1 -0
- package/package.json +3 -2
- package/templates/beauty-salon/dev/index.ts +197 -304
- package/templates/beauty-salon/tier5-src/himi-store-product/index.ts +44 -13
- package/templates/branded-lite/dev/index.ts +197 -304
- package/templates/branded-lite/l10n/en.json +2 -2
- package/templates/branded-lite/tier5-src/himi-store-product/index.ts +49 -17
- package/templates/gym-fitness/dev/index.ts +197 -304
- package/templates/gym-fitness/tier5-src/himi-store-product/index.ts +44 -13
- package/templates/portfolio-creative/dev/index.ts +197 -304
- package/templates/portfolio-creative/tier5-src/himi-store-product/index.ts +44 -13
- package/templates/retail-store/dev/index.ts +197 -304
- package/templates/retail-store/tier5-src/himi-store-product/index.ts +49 -17
|
@@ -116,6 +116,15 @@ user request. Preserve the collected files as evidence. Read the [versioned
|
|
|
116
116
|
reference index](https://apps.wix.com/_api/himi-serve/docs/one-app-reference.md) and its five guides before interpreting
|
|
117
117
|
settings or claiming coverage.
|
|
118
118
|
|
|
119
|
+
When raw source placements reference `pages_section`, collection also saves
|
|
120
|
+
`pages-content.json`. It selects `settings.value.pageId`, reads only those unique
|
|
121
|
+
documents as the site's Visitor, and retains every original placement separately.
|
|
122
|
+
The evidence records capture time, source identity, a serialized response JSON SHA-256,
|
|
123
|
+
decoded content and an editable native RichContent component per placement.
|
|
124
|
+
The hash identifies that captured response, not an invented server revision.
|
|
125
|
+
Recollect to refresh editorial content; a changed response produces a changed hash.
|
|
126
|
+
Never import the evidence directory into runtime code.
|
|
127
|
+
|
|
119
128
|
An unavailable supporting runtime view is recorded as `runtime_context_unavailable`
|
|
120
129
|
with its platform and typed failure code; that enriched file is absent. Continue
|
|
121
130
|
from authored intent and mark the platform behavior as unverified in the report.
|
|
@@ -500,16 +509,69 @@ Apply these interpretation rules:
|
|
|
500
509
|
alone does not prove native navigation or control availability. Record any
|
|
501
510
|
unavailable device check as unverified.
|
|
502
511
|
- Business context contains `phoneNumber`, `website`, `services`, optional public
|
|
503
|
-
`contact`,
|
|
504
|
-
|
|
512
|
+
`contact`, an optional validated public `memberCount`, and optional `displayName`
|
|
513
|
+
from the same-site Business title, with their permitted nested values.
|
|
514
|
+
Use `displayName` for business identity; structure wins on authored screen titles,
|
|
515
|
+
phone/URL/design.
|
|
505
516
|
Installed services do not add features. Installation IDs are not record IDs.
|
|
506
|
-
Do not restore excluded Business
|
|
517
|
+
Do not restore other excluded Business colors, identity or member fields.
|
|
507
518
|
- Referenced editor-authored documents, such as Pages rich text, are presentation
|
|
508
519
|
evidence too. Fetch only the referenced documents through verified read-only
|
|
509
520
|
routes, record their IDs and versions, and reconstruct their authored content
|
|
510
521
|
as editable native components. Keep changing business records live; do not
|
|
511
522
|
substitute captured catalogs, memberships or transaction data for runtime reads.
|
|
512
523
|
|
|
524
|
+
### Referenced Pages content
|
|
525
|
+
|
|
526
|
+
`pages_section` is an editor-authored document selected by
|
|
527
|
+
`settings.value.pageId`. It is not a CMS collection, Blog post or placeholder.
|
|
528
|
+
Use `pages-content.json` to reconstruct each ready placement as editable app
|
|
529
|
+
source, in its original layout array order, interleaved with the other sections.
|
|
530
|
+
Repeated page IDs may share one captured document but retain separate placement
|
|
531
|
+
IDs. Preserve source visibility/access rules and every screen alias that uses
|
|
532
|
+
that layout; do not multiply canonical placements by navigation aliases.
|
|
533
|
+
|
|
534
|
+
The collector's fixed read is
|
|
535
|
+
`GET https://apps.wix.com/social-content/api/v1/pages/{pageId}` using the source
|
|
536
|
+
site's Visitor signed instance. The response contains
|
|
537
|
+
`{pageId, content: {title, body: {contentType, content}}}`. It verifies the returned
|
|
538
|
+
page ID. `RICH_CONTENT` and `DRAFTJS` contain serialized JSON; `PLAIN_TEXT` stays
|
|
539
|
+
literal. The pinned [original reader](https://github.com/wix-private/wix-one-app-pages/blob/5055bf29109c51c48f0009a403bb70976c54e8dc/packages/wix-one-app-pages/src/services/pages-api.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") documents this contract.
|
|
540
|
+
No page listing, source mutation or manager credential fallback is needed.
|
|
541
|
+
|
|
542
|
+
Use the emitted `placement.component`, or rebuild it with the screens SDK's
|
|
543
|
+
`decodeOneAppPage(response, pageId)` and `oneAppPageSection(page, {id})`.
|
|
544
|
+
Copy the resulting component into an editable app source file, then insert it
|
|
545
|
+
into the actual generated screen's payload. Keep it outside collection-bound
|
|
546
|
+
rows that a worker replaces on load. Rendering a separate unused sample or merely
|
|
547
|
+
changing the catalog classification does not restore a migrated placement.
|
|
548
|
+
The component uses literal `RichContent.documentJson`; no source prose is a
|
|
549
|
+
service binding. The existing viewer preserves text, supported formatting, media
|
|
550
|
+
and safe http(s)/mailto/tel links. Legacy bare website domains gain HTTPS before
|
|
551
|
+
encoding; `normalizedWebsiteLinks` records the count. Relative paths, credentials
|
|
552
|
+
and unsafe schemes do not gain an implicit origin. Root editor metadata is omitted from rendered
|
|
553
|
+
content. Keep normal RichContent links or use the existing rich-link handler;
|
|
554
|
+
do not replace them with generic navigation or a WebView.
|
|
555
|
+
|
|
556
|
+
`ready` and genuine `empty` are successful captures. The section helper renders an
|
|
557
|
+
empty page's message from optional `emptyTitle` / `emptyDescription`; localize
|
|
558
|
+
that copy to the app and preserve the source empty-state intent. `invalid` (including missing
|
|
559
|
+
or malformed selectors/content), `unsupported`, `forbidden`, `unauthorized`,
|
|
560
|
+
`not_found` and `unavailable` remain distinct gaps. A failed document has no
|
|
561
|
+
emitted component. Preserve the gap and resolve it before claiming its coverage;
|
|
562
|
+
never substitute an empty paragraph, demo copy or owner read. Supported DraftJS
|
|
563
|
+
text, styled links, flat lists, headings and images are converted; nested lists
|
|
564
|
+
and unknown plugins remain explicit `unsupported` gaps.
|
|
565
|
+
|
|
566
|
+
This reconstruction captures editorial presentation only. Changing catalogs,
|
|
567
|
+
transactions and member records remain live. It uses the existing cross-platform
|
|
568
|
+
RichContent component and does not require a new Pages endpoint in native/web
|
|
569
|
+
runtime transports. A CLI/SDK source merge still needs its normal publication,
|
|
570
|
+
and an existing customer app must be regenerated, checked and published before
|
|
571
|
+
its text changes. Validate the actual generated screens and record every source
|
|
572
|
+
placement's text/link and native checks in the coverage ledger; collection alone
|
|
573
|
+
is not customer acceptance or permission to mark all rows supported.
|
|
574
|
+
|
|
513
575
|
### Navigation from top tabs
|
|
514
576
|
|
|
515
577
|
`navigation-plan.json` records the source navigation kind and the planned target.
|
|
@@ -984,6 +1046,43 @@ cannot be inspected: call the builder in your generator and serialize the value
|
|
|
984
1046
|
returns. Run the generator inside the app (after `npm install`), so
|
|
985
1047
|
`@wix/himalaya/screens` resolves to the app's own dependency.
|
|
986
1048
|
|
|
1049
|
+
### Preserve the template features the source exposes
|
|
1050
|
+
|
|
1051
|
+
Treat trimming as a source-feature decision, not a list of screens reached during
|
|
1052
|
+
one visitor walkthrough. Before removing a template destination, compare the source
|
|
1053
|
+
Account and native widget journeys under the appropriate visitor/member state.
|
|
1054
|
+
Keep the supported destination and its data/permission contract when the source
|
|
1055
|
+
exposes it. Do not add unrelated verticals merely because the template has them.
|
|
1056
|
+
|
|
1057
|
+
| Source feature | Preserve in the generated app |
|
|
1058
|
+
| --- | --- |
|
|
1059
|
+
| Business identity | Use the collected `business-context.json.displayName` for business identity and bind live chat header/sender/app-info values to the actual business or host state. Preserve the source logo as an image or image binding. Keep the authored app/screen title separate. The technical app slug is an identifier, not a replacement display name. Avoid a global string replacement across source, routes and URLs. |
|
|
1060
|
+
| Account Orders and Subscriptions | Retain source-exposed My activity links and their supported `himi_orders` / `himi_my_subscriptions` destinations, including their workers and sign-in/return routing. A visitor gate is not evidence that a member destination should be deleted. Installed services alone do not prove source exposure; compare the source Account. |
|
|
1061
|
+
| Programs | Reuse the supported Program card/detail and worker behavior. Preserve access type and the actual login/request/join/pay/Continue action for the visitor or participant state. Do not replace these with an image/title-only card or a generic authenticated Continue. Preserve paid/private policy; do not invoke a live purchase or membership mutation as part of a read-only comparison. |
|
|
1062
|
+
| Feed attachments | Reuse the template's rich post card and its `RichContent`/attachment presentation. Preserve inline images, files and their destinations together with text and actions. A text-only replacement is a functional loss even when it can read the post body. |
|
|
1063
|
+
|
|
1064
|
+
After applying identity and before claiming completion, run:
|
|
1065
|
+
|
|
1066
|
+
```sh
|
|
1067
|
+
himi one-app validate-identity --evidence-dir .himi/one-app --content . --json
|
|
1068
|
+
```
|
|
1069
|
+
|
|
1070
|
+
The command verifies the collected business-name hash, builds the current content,
|
|
1071
|
+
and checks emitted screen titles, supported component display fields and the known
|
|
1072
|
+
business-chat identity seed for accidental literal slugs. It ignores route IDs,
|
|
1073
|
+
URLs and arbitrary API/action values. Exact authored source copy containing the
|
|
1074
|
+
slug and a real business whose display name is its slug are preserved. An unrelated
|
|
1075
|
+
source page title cannot waive the business-chat identity or its name seed. An older
|
|
1076
|
+
collection without a business display name remains unverified; recollect rather
|
|
1077
|
+
than editing its evidence or guessing a name.
|
|
1078
|
+
|
|
1079
|
+
This is a narrow identity check. It cannot prove every dynamic or translated
|
|
1080
|
+
string, branding image, account journey, access policy or attachment is correct.
|
|
1081
|
+
Inspect the actual generated descriptors and workers, exercise recorded examples,
|
|
1082
|
+
then compare those four source journeys in the real host. Keep their missing
|
|
1083
|
+
behavior explicit in coverage and the report. A stock template screenshot or a
|
|
1084
|
+
passing identity check cannot substitute for the fresh reconstruction/device pass.
|
|
1085
|
+
|
|
987
1086
|
### Screen-content contract
|
|
988
1087
|
|
|
989
1088
|
Use the current [screen design guide](https://apps.wix.com/_api/himi-serve/docs/designing-himi-screens.md) and the app's
|
|
@@ -1108,6 +1207,116 @@ configuration, workers, evidence, screenshots or logs.
|
|
|
1108
1207
|
|
|
1109
1208
|
## 4. Verify the reconstructed app and publish its draft
|
|
1110
1209
|
|
|
1210
|
+
### Check the publish budget before final evidence
|
|
1211
|
+
|
|
1212
|
+
Plan for the **8,388,608-byte** publish JSON budget before spending time on final
|
|
1213
|
+
screenshots, behavioral runs or native UX records. `.himi` file size and source
|
|
1214
|
+
directory totals are different measurements: publication carries JSON-escaped
|
|
1215
|
+
descriptors, base64 bundles/assets/icon and the compressed source archive together.
|
|
1216
|
+
|
|
1217
|
+
First repoint navigation and retained detail/back-link destinations at the implemented
|
|
1218
|
+
generated screens, including destination IDs configured in shared workers. Keep every required
|
|
1219
|
+
source journey and its shared destinations in `SPEC.md`'s Screen catalogue, including
|
|
1220
|
+
cart, checkout, authentication and detail routes. Inspect a trim plan before applying it:
|
|
1221
|
+
|
|
1222
|
+
```sh
|
|
1223
|
+
himi template trim --from-spec SPEC.md --links follow --dry-run
|
|
1224
|
+
```
|
|
1225
|
+
|
|
1226
|
+
Review the retained/removed screens, workers and navigation. Trim only unused template
|
|
1227
|
+
definitions that the generated screens replace; `--links follow` can retain linked
|
|
1228
|
+
destinations that still matter. Review `workerRefs` and `reparented` results, and preserve
|
|
1229
|
+
overflow entries and back navigation instead of accepting their deletion. Do not remove a required vertical or drop its actions
|
|
1230
|
+
merely to fit. Apply the same reviewed command without `--dry-run`, then measure:
|
|
1231
|
+
|
|
1232
|
+
```sh
|
|
1233
|
+
himi publish-size --app <intended-publish-slug> --json
|
|
1234
|
+
```
|
|
1235
|
+
|
|
1236
|
+
This builds locally using the same release payload, source collector and JSON serializer
|
|
1237
|
+
as push. It never looks up an owner, claims a slug or publishes; no credentials or final
|
|
1238
|
+
UX/attestation records are required. It can write local build output. It reports
|
|
1239
|
+
`bodyBytes`, `limit`, `remainingBytes`, `overageBytes`, source archive bytes and screen/
|
|
1240
|
+
bundle counts. Failed static record-ID enumeration, missing declared icons/screens/bundles, unavailable font assets, failed declared widgets
|
|
1241
|
+
and failed token snapshots are refused instead of undercounted. The builder's optional
|
|
1242
|
+
token absence (404) is reported without inventing token bytes; it does not certify styling.
|
|
1243
|
+
The default `reserveBytes` is a **65,536-byte planning allowance** for final metadata;
|
|
1244
|
+
`planningBytes` includes it. `--reserve-bytes <n>` changes that allowance.
|
|
1245
|
+
|
|
1246
|
+
Measurement uses an isolated contained build: put the intended configuration and
|
|
1247
|
+
collected static seed IDs in the package explicitly. Host environment substitutions
|
|
1248
|
+
are not its input. A source module that needs host code or live catalog enumeration
|
|
1249
|
+
is refused as `build_failed`; materialize the verified source IDs from the collection
|
|
1250
|
+
before measuring, or report that prerequisite as blocked. Never swallow that refusal
|
|
1251
|
+
and treat missing detail screens as saved bytes.
|
|
1252
|
+
|
|
1253
|
+
`bodyBytes` is exact for the stated slug, source-included draft and **no publish metadata**.
|
|
1254
|
+
The allowance is not a verified upper bound: final label/notes, evidence and migration
|
|
1255
|
+
metadata must fit within the remaining bytes. A changed slug changes both app fields;
|
|
1256
|
+
`minimumBodyBytes` uses empty slugs and no metadata as a lower bound. If even that exceeds
|
|
1257
|
+
the limit, unknown owner metadata cannot rescue the build. A passing size check is
|
|
1258
|
+
conditional on those remaining bytes; the final push still measures its exact envelope
|
|
1259
|
+
and runs every evidence gate. The push command has no size-only dry run; use the
|
|
1260
|
+
measurement command for probes. Transport compression is not evidence that the current push guard accepts
|
|
1261
|
+
an oversized JSON body.
|
|
1262
|
+
|
|
1263
|
+
Init-generated `.agents/`, `.claude/` and `HIMALAYA.md` are already excluded by the
|
|
1264
|
+
source archive policy shown in `himi push --help`.
|
|
1265
|
+
Keep source included; do not work around the budget with `--no-source` or `--force`.
|
|
1266
|
+
|
|
1267
|
+
For a large static 8-bit PNG icon, lossless recompression is optional. Keep the original and candidate
|
|
1268
|
+
under `.himi/` while checking, use no resize, palette reduction, quantization or lossy
|
|
1269
|
+
format, and prove decoded RGBA pixels, dimensions and color profile are unchanged before
|
|
1270
|
+
replacing the declared icon. For example, with the optional `sharp` image tool installed
|
|
1271
|
+
locally (`npm install --prefix .himi/pixel-tools --no-save --package-lock=false sharp@0.33.5`):
|
|
1272
|
+
|
|
1273
|
+
```sh
|
|
1274
|
+
node --input-type=module - <declared-icon.png> .himi/icon-lossless.png <<'JS'
|
|
1275
|
+
import assert from 'node:assert/strict';
|
|
1276
|
+
import { createRequire } from 'node:module';
|
|
1277
|
+
import { createHash } from 'node:crypto';
|
|
1278
|
+
import { resolve } from 'node:path';
|
|
1279
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
1280
|
+
const sharp = createRequire(resolve('.himi/pixel-tools/tool.cjs'))('sharp');
|
|
1281
|
+
const [input, output] = process.argv.slice(2);
|
|
1282
|
+
assert.notEqual(resolve(input), resolve(output), 'preserve the original');
|
|
1283
|
+
const beforeMeta = await sharp(input).metadata();
|
|
1284
|
+
assert.equal(beforeMeta.format, 'png');
|
|
1285
|
+
assert.equal(beforeMeta.depth, 'uchar', 'retain higher-precision originals');
|
|
1286
|
+
assert.equal(beforeMeta.pages ?? 1, 1, 'retain animated originals');
|
|
1287
|
+
const before = await sharp(input).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
1288
|
+
await sharp(input).keepMetadata().png({ compressionLevel: 9, adaptiveFiltering: true, palette: false }).toFile(output);
|
|
1289
|
+
const afterMeta = await sharp(output).metadata();
|
|
1290
|
+
const after = await sharp(output).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
1291
|
+
assert.deepEqual(after.info, before.info);
|
|
1292
|
+
assert.deepEqual(afterMeta.icc, beforeMeta.icc);
|
|
1293
|
+
assert.equal(afterMeta.orientation ?? 1, beforeMeta.orientation ?? 1);
|
|
1294
|
+
assert.ok(after.data.equals(before.data), 'decoded RGBA pixels must match exactly');
|
|
1295
|
+
const hash = bytes => createHash('sha256').update(bytes).digest('hex');
|
|
1296
|
+
console.log(JSON.stringify({ pixelsEqual: true, width: after.info.width, height: after.info.height,
|
|
1297
|
+
channels: after.info.channels, beforeBytes: statSync(input).size, afterBytes: statSync(output).size,
|
|
1298
|
+
beforeSHA256: hash(readFileSync(input)), afterSHA256: hash(readFileSync(output)), rgbaSHA256: hash(after.data) }));
|
|
1299
|
+
JS
|
|
1300
|
+
```
|
|
1301
|
+
|
|
1302
|
+
Only copy the candidate over the declared icon if that proof passes and the file is
|
|
1303
|
+
smaller. If the tool is unavailable, retain the original and report that optimization
|
|
1304
|
+
as unverified. Re-run `himi icon check`, size measurement and affected visual checks
|
|
1305
|
+
after replacing it. Save the equality result and original/candidate hashes.
|
|
1306
|
+
|
|
1307
|
+
If required journeys still exceed the budget, stop before final evidence and report the
|
|
1308
|
+
measured bytes, limit and overage, source archive size, major contributing journeys/
|
|
1309
|
+
assets, reviewed trim results, compression/pixel proof, what was tried and what was
|
|
1310
|
+
preserved. Attach the numerical output and sanitized manifest/inventory; file sizes can
|
|
1311
|
+
explain contributors but never substitute for the assembled measurement. Hand this to
|
|
1312
|
+
the migration project owner for the maintained
|
|
1313
|
+
[Himalaya issue tracker](https://github.com/wix-private/himalaya/issues) (repository access
|
|
1314
|
+
required). If you lack access, return the prepared report to that owner for escalation;
|
|
1315
|
+
do not guess a person's contact or claim a hosted preview exists. This step does not
|
|
1316
|
+
authorize posting an issue, changing the server limit or publishing.
|
|
1317
|
+
|
|
1318
|
+
### Run the final checks
|
|
1319
|
+
|
|
1111
1320
|
After the source composition and same-site binding are implemented, use the
|
|
1112
1321
|
existing authoring loop:
|
|
1113
1322
|
|
|
@@ -1210,9 +1419,8 @@ himi push --draft --target bo
|
|
|
1210
1419
|
Keep the editable source archive included. The publish body is limited to 8,388,608
|
|
1211
1420
|
bytes. It is about base64(source archive + worker bundles + assets + icons) plus the
|
|
1212
1421
|
descriptor JSON, so a large app can exceed it: one 33-page migration measured
|
|
1213
|
-
11,259,935 bytes. Measure early, not at the end
|
|
1214
|
-
|
|
1215
|
-
paths below. `himi push` refuses an oversized body locally, before it sends anything,
|
|
1422
|
+
11,259,935 bytes. Measure early, not at the end, with `himi publish-size` (see
|
|
1423
|
+
"Check the publish budget before final evidence"). `himi push` refuses an oversized body locally, before it sends anything,
|
|
1216
1424
|
with `publish_body_too_large`; its `breakdown`
|
|
1217
1425
|
gives each part's bytes (`appSource`, `screens`, `bundles`, `assets`, `icon`, `other`)
|
|
1218
1426
|
and the largest entries by name. Reduce it in this order, and repeat affected
|
package/guides/one-app-viewer.md
CHANGED
|
@@ -26,7 +26,7 @@ Two runtime refinements below take precedence over simplified examples in the St
|
|
|
26
26
|
- Retain source IDs as relationship keys. Give generated files, components, and routes meaningful target names; keep a source-to-target lookup.
|
|
27
27
|
- Do not turn lifecycle or collection metadata into app requirements.
|
|
28
28
|
- The current scope does not introduce unconfigured drawer navigation or independent per-screen header surfaces. Use shared Himi header presentation where appropriate; preserve supplied header/drawer inputs that affect top-bar intent. Record configured behavior that exceeds this target scope as an adaptation or unresolved gap.
|
|
29
|
-
- Retain only `phoneNumber`, `website`, and `services` from the business object, including their permitted nested fields. Do not recover design or titles from excluded business fields.
|
|
29
|
+
- Retain only `phoneNumber`, `website`, and `services` from the business object, including their permitted nested fields, plus the same-site Business `displayName` as business identity only (the current workflow defines its use). Do not recover design or screen titles from other excluded business fields.
|
|
30
30
|
- An unmapped historical catalog row starts a current capability investigation. Implement app-local composition, workers and adapters when feasible. Do not silently drop it, invent different behavior, or substitute a WebView. Escalate only genuine platform-core or access unknowns that prevent the requested reconstruction.
|
|
31
31
|
|
|
32
32
|
## Step 1 — Establish the source interpretation
|
|
@@ -136,7 +136,7 @@ The source rules below describe the original viewer. **For the current One App m
|
|
|
136
136
|
Relevant source behavior to preserve when applicable:
|
|
137
137
|
|
|
138
138
|
- Header definition selects the renderer; a missing definition ID falls back to the detailed header in the inspected domain code.
|
|
139
|
-
- Title and subtitle come from the header domain. Do not silently substitute excluded business-title fields when a dynamic title cannot be resolved from permitted inputs.
|
|
139
|
+
- Title and subtitle come from the header domain. Do not silently substitute excluded business-title fields when a dynamic title cannot be resolved from permitted inputs; the Business `displayName` names the business, not a header or screen title.
|
|
140
140
|
- Detailed-header empty `coverImagesUrls` falls back to global Structure covers for compatibility. Preserve image order and transition timing where configured.
|
|
141
141
|
- `isCollapsible` coordinates the header with the page's scroll container. A static hero image alone does not reproduce collapse behavior.
|
|
142
142
|
- Logo, invite button, CTA, member count/avatars, and business-profile entry point have separate controls. A CTA needs both its configuration and its show flag.
|
|
@@ -1299,7 +1299,7 @@
|
|
|
1299
1299
|
"name": "LinkableScreen",
|
|
1300
1300
|
"kind": "interface",
|
|
1301
1301
|
"jsdoc": "",
|
|
1302
|
-
"decl": "export interface LinkableScreen {\n screenId: string;\n /** generic <scheme>://screen/<id> route allowed externally? */\n isPublic: boolean;\n paramKeys: string[];\n parentScreenId: string;\n tabId: string;\n}"
|
|
1302
|
+
"decl": "export interface LinkableScreen {\n screenId: string;\n /** generic <scheme>://screen/<id> route allowed externally? */\n isPublic: boolean;\n paramKeys: string[];\n parentScreenId: string;\n tabId: string;\n /** #4656 — a signed-in user is required: an external link / push route to this screen while\n * signed out presents the sign-in first, then continues to it. Absent ⇒ false. Needs an\n * `auth` block (validator warns otherwise). */\n requiresAuth?: boolean;\n}"
|
|
1303
1303
|
},
|
|
1304
1304
|
{
|
|
1305
1305
|
"name": "SiteNavConfig",
|
|
@@ -3714,8 +3714,8 @@
|
|
|
3714
3714
|
{
|
|
3715
3715
|
"name": "MotionSensor",
|
|
3716
3716
|
"kind": "type",
|
|
3717
|
-
"jsdoc": "/** Which sensor a watch streams. */",
|
|
3718
|
-
"decl": "export type MotionSensor
|
|
3717
|
+
"jsdoc": "/** Which sensor (or gesture event) a watch streams. */",
|
|
3718
|
+
"decl": "export type MotionSensor =\n | \"steps\" | \"altitude\" | \"heading\"\n | \"accelerometer\" | \"gyroscope\" | \"magnetometer\"\n | \"shake\" | \"tilt\" | \"significantMotion\";"
|
|
3719
3719
|
},
|
|
3720
3720
|
{
|
|
3721
3721
|
"name": "StepHistoryStatus",
|
|
@@ -3727,7 +3727,7 @@
|
|
|
3727
3727
|
"name": "MotionAvailability",
|
|
3728
3728
|
"kind": "interface",
|
|
3729
3729
|
"jsdoc": "/** What this device can actually do. Never assume — a barometer is common but not universal. */",
|
|
3730
|
-
"decl": "export interface MotionAvailability {\n /** Pedometer / step counter present (and, on Android, the runtime permission held). */\n steps: boolean;\n /** Barometer present. False on simulators and low-end hardware. */\n altimeter: boolean;\n /** Magnetometer / compass present. */\n heading: boolean;\n /** Whether `getStepCount` can answer a past window — see {@link StepHistoryStatus}. An\n * unknown or absent value reads as \"unsupported\", never as \"available\". */\n stepHistory: StepHistoryStatus;\n}"
|
|
3730
|
+
"decl": "export interface MotionAvailability {\n /** Pedometer / step counter present (and, on Android, the runtime permission held). */\n steps: boolean;\n /** Barometer present. False on simulators and low-end hardware. */\n altimeter: boolean;\n /** Magnetometer / compass present. */\n heading: boolean;\n /** Whether `getStepCount` can answer a past window — see {@link StepHistoryStatus}. An\n * unknown or absent value reads as \"unsupported\", never as \"available\". */\n stepHistory: StepHistoryStatus;\n /** Accelerometer present (web: DeviceMotion exists — false on desktop browsers). */\n accelerometer: boolean;\n /** Gyroscope present (web: DeviceMotion rotationRate). */\n gyroscope: boolean;\n /** Raw magnetometer present. Always false on web — no browser exposes one by default. */\n magnetometer: boolean;\n /** Shake events can be detected (needs an accelerometer). */\n shake: boolean;\n /** Tilt events can be detected (needs an accelerometer). */\n tilt: boolean;\n /** Significant-motion events can be detected (a hardware trigger or an accelerometer). */\n significantMotion: boolean;\n}"
|
|
3731
3731
|
},
|
|
3732
3732
|
{
|
|
3733
3733
|
"name": "StepSample",
|
|
@@ -3751,7 +3751,7 @@
|
|
|
3751
3751
|
"name": "MotionSample",
|
|
3752
3752
|
"kind": "type",
|
|
3753
3753
|
"jsdoc": "",
|
|
3754
|
-
"decl": "export type MotionSample
|
|
3754
|
+
"decl": "export type MotionSample =\n | StepSample | AltitudeSample | HeadingSample\n /** accelerometer / gyroscope / magnetometer: one raw reading. Units: accelerometer g (gravity\n * included; flat face-up ⇒ z ≈ +1 on every platform), gyroscope rad/s, magnetometer µT. */\n | { x: number; y: number; z: number; timestampMs: number }\n /** shake: ONE event per shake. `magnitude` is the shake's peak total acceleration, g. */\n | { magnitude: number; timestampMs: number }\n /** tilt: attitude relative to gravity, degrees. Flat face-up is { pitch: 0, roll: 0 }; pitch is\n * positive when the top edge rises, roll positive when the right edge dips. */\n | { pitch: number; roll: number; timestampMs: number }\n /** significantMotion: the device started moving after a period at rest. */\n | { timestampMs: number };"
|
|
3755
3755
|
},
|
|
3756
3756
|
{
|
|
3757
3757
|
"name": "getPermissionStatus",
|
|
@@ -3799,7 +3799,7 @@
|
|
|
3799
3799
|
"name": "MotionWatchOptions",
|
|
3800
3800
|
"kind": "interface",
|
|
3801
3801
|
"jsdoc": "",
|
|
3802
|
-
"decl": "export interface MotionWatchOptions {\n /** Which sensor to stream. Defaults to \"steps\". */\n sensor?: MotionSensor;\n /** Requested sample interval, ms.
|
|
3802
|
+
"decl": "export interface MotionWatchOptions {\n /** Which sensor to stream. Defaults to \"steps\". */\n sensor?: MotionSensor;\n /** Requested sample interval, ms. For the raw sensors (accelerometer / gyroscope /\n * magnetometer) it is clamped to 16–1000 ms (default 100) and honoured, subject to the\n * 60-samples/s ceiling. For steps / altitude / heading the platform treats it as a hint and\n * may deliver faster (heading is event-driven) or slower (a step sample needs steps to have\n * happened). Ignored by the gesture events, which fire when the gesture happens. */\n intervalMs?: number;\n /** Per-poll bridge timeout. Rarely needs changing — see DEFAULT_POLL_TIMEOUT_MS. */\n pollTimeoutMs?: number;\n}"
|
|
3803
3803
|
},
|
|
3804
3804
|
{
|
|
3805
3805
|
"name": "MotionWatcher",
|
|
@@ -3810,7 +3810,7 @@
|
|
|
3810
3810
|
{
|
|
3811
3811
|
"name": "watch",
|
|
3812
3812
|
"kind": "function",
|
|
3813
|
-
"jsdoc": "/**\n * Open a sensor stream. The native listener starts EAGERLY (not on first iteration), so\n * samples buffer from the moment you call `watch()` even if the consumer iterates late —\n * which matters for steps, where a missed window is lost data rather than a stale value.\n *\n * ```ts\n * // Elevation gain over a hike.\n * let gain = 0, prev: number | undefined;\n * const w = watch({ sensor: \"altitude\", intervalMs: 5000 });\n * for await (const s of w) {\n * if (prev != null && s.relativeAltitudeM > prev) gain += s.relativeAltitudeM - prev;\n * prev = s.relativeAltitudeM;\n * if (done) break; // break ⇒ auto-stop\n * }\n * ```\n *\n * Type the stream by passing the sample type: `watch<HeadingSample>({ sensor: \"heading\" })`.\n */",
|
|
3813
|
+
"jsdoc": "/**\n * Open a sensor stream. The native listener starts EAGERLY (not on first iteration), so\n * samples buffer from the moment you call `watch()` even if the consumer iterates late —\n * which matters for steps, where a missed window is lost data rather than a stale value.\n *\n * ```ts\n * // Elevation gain over a hike.\n * let gain = 0, prev: number | undefined;\n * const w = watch({ sensor: \"altitude\", intervalMs: 5000 });\n * for await (const s of w) {\n * if (prev != null && s.relativeAltitudeM > prev) gain += s.relativeAltitudeM - prev;\n * prev = s.relativeAltitudeM;\n * if (done) break; // break ⇒ auto-stop\n * }\n * ```\n *\n * Type the stream by passing the sample type: `watch<HeadingSample>({ sensor: \"heading\" })`.\n *\n * ```ts\n * // Shake to reroll.\n * for await (const _ of watch({ sensor: \"shake\" })) reroll();\n * // Tilt to steer.\n * for await (const t of watch<{ pitch: number; roll: number; timestampMs: number }>({ sensor: \"tilt\" })) steer(t.roll);\n * ```\n */",
|
|
3814
3814
|
"decl": "export function watch<T extends MotionSample = MotionSample>(options?: MotionWatchOptions): MotionWatcher<T>;"
|
|
3815
3815
|
},
|
|
3816
3816
|
{
|
|
@@ -3821,6 +3821,43 @@
|
|
|
3821
3821
|
}
|
|
3822
3822
|
]
|
|
3823
3823
|
},
|
|
3824
|
+
{
|
|
3825
|
+
"name": "@himalaya/network",
|
|
3826
|
+
"source": "core/sdk/network/src/index.ts",
|
|
3827
|
+
"description": "Tier-5 typed binding for the platform's network capability.",
|
|
3828
|
+
"api": [
|
|
3829
|
+
{
|
|
3830
|
+
"name": "NetworkType",
|
|
3831
|
+
"kind": "type",
|
|
3832
|
+
"jsdoc": "/** What kind of link carries the traffic. `\"none\"` when offline; `\"unknown\"` when the\n * platform cannot say (most desktop browsers). */",
|
|
3833
|
+
"decl": "export type NetworkType = \"wifi\" | \"cellular\" | \"ethernet\" | \"other\" | \"none\" | \"unknown\";"
|
|
3834
|
+
},
|
|
3835
|
+
{
|
|
3836
|
+
"name": "NetworkStatus",
|
|
3837
|
+
"kind": "interface",
|
|
3838
|
+
"jsdoc": "/** One reading of the device's connectivity. */",
|
|
3839
|
+
"decl": "export interface NetworkStatus {\n /** The device has a usable network path. */\n online: boolean;\n type: NetworkType;\n /** The link is metered / costly (cellular, a personal hotspot). Best-effort. */\n expensive: boolean;\n /** The user asked to save data (iOS Low Data Mode, Android Data Saver, web Save-Data). Best-effort. */\n constrained: boolean;\n}"
|
|
3840
|
+
},
|
|
3841
|
+
{
|
|
3842
|
+
"name": "normalizeNetworkStatus",
|
|
3843
|
+
"kind": "function",
|
|
3844
|
+
"jsdoc": "/** Coerce whatever crossed the bridge into a well-formed {@link NetworkStatus}. A malformed\n * or missing field degrades to the honest default rather than throwing. */",
|
|
3845
|
+
"decl": "export function normalizeNetworkStatus(raw: unknown): NetworkStatus;"
|
|
3846
|
+
},
|
|
3847
|
+
{
|
|
3848
|
+
"name": "status",
|
|
3849
|
+
"kind": "function",
|
|
3850
|
+
"jsdoc": "/** Read the current connectivity. */",
|
|
3851
|
+
"decl": "export async function status(): Promise<NetworkStatus>;"
|
|
3852
|
+
},
|
|
3853
|
+
{
|
|
3854
|
+
"name": "subscribe",
|
|
3855
|
+
"kind": "function",
|
|
3856
|
+
"jsdoc": "/**\n * Have `handler` (`\"<service>.<action>\"`) invoked with the new {@link NetworkStatus} on each\n * CHANGE. Changes are debounced 500 ms and a reading equal to the last one delivered is\n * suppressed, so a flapping interface does not storm the reducer. The subscription lives\n * as long as the calling worker and is released when it is torn down. Subscribing the same\n * handler twice is idempotent.\n *\n * Resolves with the status at the moment of subscribing, so the screen can paint the\n * current state without waiting for the first change.\n *\n * ```ts\n * import { subscribe } from \"@himalaya/network\";\n *\n * init: (s) => {\n * subscribe(\"net.changed\").then((now) => net.changed(now)).catch(() => {});\n * return s;\n * },\n * changed: (s, status) => ({ ...s, online: status.online, type: status.type }),\n * ```\n */",
|
|
3857
|
+
"decl": "export async function subscribe(handler: string): Promise<NetworkStatus>;"
|
|
3858
|
+
}
|
|
3859
|
+
]
|
|
3860
|
+
},
|
|
3824
3861
|
{
|
|
3825
3862
|
"name": "@himalaya/on-device-ai",
|
|
3826
3863
|
"source": "core/sdk/on-device-ai/src/index.ts",
|
|
@@ -23472,6 +23509,36 @@
|
|
|
23472
23509
|
"kind": "function",
|
|
23473
23510
|
"jsdoc": "/**\n * True when `url` is Wix media that is not PROVABLY bounded below the pixel ceiling\n * the renderers decode at: either dimension missing from the final stage, or either\n * one above `WIX_DETAIL_IMAGE`.\n *\n * Both dimensions are required, and one is genuinely not enough: `fit/w_1400` on a\n * 1400x9000 source derives a 9000px height, so a single stated side proves nothing\n * about the other.\n *\n * This reports the DEFECT. It is deliberately WIDER than what `wixMediaUrl` repairs\n * — the predicate says \"these pixels are not provably bounded\", the rewriter only\n * changes what it can without altering the picture. Four kinds stay flagged after a\n * round-trip:\n * - an oversized `crop` — NOT rewritten; moving `w_`/`h_` selects a different\n * source rectangle, so it needs a human to pick a smaller crop;\n * - EITHER mode stating one dimension — IS rewritten (that side gets bounded, and\n * one side is not a box, so nothing is re-cropped), but the derived side still\n * cannot be proven, so it remains flagged;\n * - a CHAINED transform (`crop/…/fill/…`) — this predicate reads its final stage,\n * but `WIX_TRANSFORM` matches a single stage, so `wixMediaUrl` returns it\n * verbatim. A chained url above the ceiling is therefore reported and not\n * repaired. Rewriting the last stage of a chain is a deliberate follow-up: it\n * is the media manager's own output shape, so it is worth having, and it is\n * more parsing than this change should carry.\n *\n * NOTE: `tools/ci/lint-wix-media-sizing.mjs` does not call this today — it matches\n * hand-built url construction in worker SOURCE, which is a different (static) check.\n * Wiring a runtime gate to this predicate is tracked separately.\n */",
|
|
23474
23511
|
"decl": "export function isUnsizedWixMedia(url: string): boolean;"
|
|
23512
|
+
},
|
|
23513
|
+
{
|
|
23514
|
+
"name": "ImageTarget",
|
|
23515
|
+
"kind": "interface",
|
|
23516
|
+
"jsdoc": "/** Pure rendition policy shared by web/RN. Native mirrors use the same request fixtures. */",
|
|
23517
|
+
"decl": "export interface ImageTarget {\n width: number;\n height: number;\n scale: number;\n mode?: string;\n maxEdge?: number;\n}"
|
|
23518
|
+
},
|
|
23519
|
+
{
|
|
23520
|
+
"name": "imagePixelSize",
|
|
23521
|
+
"kind": "function",
|
|
23522
|
+
"jsdoc": "/**\n * The pixel size an image is requested at for a box of `width`×`height` points at `scale`: the box in pixels,\n * its longer edge rounded up to a shared bucket (96 … 1400, or up to `maxEdge`, at most 4096) so nearby sizes\n * share one cached rendition. A size it returns maps to itself. An invalid box asks for `maxEdge` square.\n */",
|
|
23523
|
+
"decl": "export function imagePixelSize(width: number, height: number, scale: number, maxEdge = 1400);"
|
|
23524
|
+
},
|
|
23525
|
+
{
|
|
23526
|
+
"name": "resolveImageRendition",
|
|
23527
|
+
"kind": "function",
|
|
23528
|
+
"jsdoc": "/** Keep the caller's source untouched: this URL belongs to a display request, not entity data. */",
|
|
23529
|
+
"decl": "export function resolveImageRendition(source: string, target: ImageTarget);"
|
|
23530
|
+
},
|
|
23531
|
+
{
|
|
23532
|
+
"name": "ImageCandidate",
|
|
23533
|
+
"kind": "interface",
|
|
23534
|
+
"jsdoc": "",
|
|
23535
|
+
"decl": "export interface ImageCandidate { url: string; width: number; height: number }"
|
|
23536
|
+
},
|
|
23537
|
+
{
|
|
23538
|
+
"name": "imageCandidates",
|
|
23539
|
+
"kind": "function",
|
|
23540
|
+
"jsdoc": "/**\n * The renditions a renderer offers for one image, smallest first, so the HOST picks among them by\n * its own layout and pixel density (web `srcset`, a React Native `source` array) with no\n * measurement code of ours. A fixed box gets one candidate per screen density; a fluid one (no\n * numeric width) gets fluid widths, its height from `ratio` when known. A source that cannot be\n * resized safely yields exactly itself.\n */",
|
|
23541
|
+
"decl": "export function imageCandidates(\n source: string,\n box: { width?: number; height?: number; ratio?: number; mode?: string },\n scales: number[] = [1, 2, 3],\n): ImageCandidate[];"
|
|
23475
23542
|
}
|
|
23476
23543
|
]
|
|
23477
23544
|
},
|
|
@@ -660,6 +660,38 @@ linkableScreens: [
|
|
|
660
660
|
],
|
|
661
661
|
```
|
|
662
662
|
|
|
663
|
+
**A screen only a signed-in user should open** — an order, an account page, an invite — sets
|
|
664
|
+
`requiresAuth: true` on its linkable entry:
|
|
665
|
+
|
|
666
|
+
```ts
|
|
667
|
+
{ screenId: "order", isPublic: true, paramKeys: ["id"], parentScreenId: "orders", tabId: "account", requiresAuth: true },
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
An external link to it — custom scheme, universal/app link, push route — while signed out does
|
|
671
|
+
not open it anonymously. The native `DeepLinkCoordinator` holds the link, waits for the gate's
|
|
672
|
+
silent bootstrap (a restored session goes straight through, with no prompt), then presents the
|
|
673
|
+
app's sign-in cover (its `gateScreenId` when set). Signing in applies the held link unchanged —
|
|
674
|
+
tab, parent chain, params; cancelling lands on the target's tab root and drops the link
|
|
675
|
+
(`nav_verb_dropped` / `auth_cancelled`). A second link while the sign-in is up replaces the first.
|
|
676
|
+
Signed in, or `requiresAuth` unset: nothing changes. The flag needs an `auth` block — without one
|
|
677
|
+
there is no sign-in to present, the link opens as before, and serving the app's config logs a
|
|
678
|
+
warning. iOS and Android; the macOS coordinator honours it too, but no macOS shell binds a sign-in
|
|
679
|
+
gate today, so on macOS the flag is inert until a Mac shell sets `authGate`. The web host does not hold links yet. In-app navigation (`himi.open`,
|
|
680
|
+
`_nav`) is not gated: a screen the app itself opens is the app's own business.
|
|
681
|
+
|
|
682
|
+
A shell gets this through core: the coordinator asks the gate the shell's `AuthGateRoot` /
|
|
683
|
+
`AuthSignInCover` bound. Three things are the shell's:
|
|
684
|
+
|
|
685
|
+
- **Read the live config.** Build the coordinator with `configProvider:` (read at every apply),
|
|
686
|
+
not a `config:` snapshot — a snapshot taken before the OTA config is cached (a clean install)
|
|
687
|
+
has no linkables, so no `requiresAuth` either.
|
|
688
|
+
- **Bind the gate early.** A shell that can receive a link before that root has drawn (a cold
|
|
689
|
+
start) sets `coordinator.authGate = <its SessionGate>` where it builds the coordinator.
|
|
690
|
+
- **Mark the bootstrap.** Call `sessionGate.markSilentBootstrapSettled()` once its
|
|
691
|
+
`provider.bootstrap()` returns. Until then a held link waits (a provider not bound yet is
|
|
692
|
+
waited for too, never read as "no auth"); a shell that never marks it waits a short grace
|
|
693
|
+
(3 s) before presenting the sign-in.
|
|
694
|
+
|
|
663
695
|
**3. The detail worker reads `himalaya.input.id`** and loads in module-eval `load()`
|
|
664
696
|
(the blessed initial-load primitive above), **not** an `onAppear` action — `onAppear`
|
|
665
697
|
fires on every platform, but it is a mount hook, not the initial-load path (see the
|
|
@@ -37,6 +37,7 @@ the SDK sources, so it matches the shipped SDKs.
|
|
|
37
37
|
- [`location`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Flocation?format=md) — Device location. 10 methods.
|
|
38
38
|
- [`media_playback`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fmedia_playback?format=md) — Background-capable media playback and offline downloads. 21 methods · returns FileHandles.
|
|
39
39
|
- [`motion`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fmotion?format=md) — Device's motion sensors. 7 methods.
|
|
40
|
+
- [`network`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fnetwork?format=md) — Network capability. 1 method.
|
|
40
41
|
- [`on_device_ai`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fon_device_ai?format=md) — ON-DEVICE text generation. 4 methods.
|
|
41
42
|
- [`open_url`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fopen_url?format=md) — Opening links + external apps. 2 methods.
|
|
42
43
|
- [`pdf`](https://apps.wix.com/_api/himi-serve/authoring/resource/web-sdk%2Fpdf?format=md) — Viewing PDF documents. 2 methods.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1581.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": [
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"test": "node ../../tools/ci/run-tests.mjs --package tools/himi-cli --"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
+
"@jitl/quickjs-wasmfile-release-sync": "^0.32.0",
|
|
37
38
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
38
39
|
"@rive-app/canvas": "2.38.3",
|
|
39
40
|
"ajv": "^8.17.1",
|
|
@@ -71,5 +72,5 @@
|
|
|
71
72
|
"artifactId": "himalaya-cli"
|
|
72
73
|
}
|
|
73
74
|
},
|
|
74
|
-
"falconPackageHash": "
|
|
75
|
+
"falconPackageHash": "64fa52bfc77be18b169f50cc51f1c41e5a323d05cc64bbf39c166dbf"
|
|
75
76
|
}
|