@wix/himalaya-cli 0.1633.0 → 0.1634.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 (65) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/members-feed-viewer/src/index.d.ts +10 -6
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/members-v1/src/index.d.ts +34 -0
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-members-feed-viewer.mjs +8 -7
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-members.mjs +29 -0
  5. package/dist/browser-plane/assets.json +166 -0
  6. package/dist/browser-plane/host.html +156 -0
  7. package/dist/browser-plane/package-reader.js +4 -0
  8. package/dist/browser-plane/preview-deferred/368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5.bin +0 -0
  9. package/dist/browser-plane/preview-deferred/37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29.bin +0 -0
  10. package/dist/browser-plane/preview-deferred/4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02.bin +0 -0
  11. package/dist/browser-plane/preview-deferred/521a0e528916d678d7588b2cddf3dadd3bb959a6d62426382f61c77a82017e35.bin +1 -0
  12. package/dist/browser-plane/preview-deferred/62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9.bin +0 -0
  13. package/dist/browser-plane/preview-deferred/642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e.bin +0 -0
  14. package/dist/browser-plane/preview-deferred/97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1.bin +0 -0
  15. package/dist/browser-plane/preview-deferred/a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e.bin +28 -0
  16. package/dist/browser-plane/preview-deferred/bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa.bin +0 -0
  17. package/dist/browser-plane/preview-deferred/c3457ce58c96b65f303fec0ddf5f06733004eaf9e21e62302b155ec63a7765f7.bin +56 -0
  18. package/dist/browser-plane/preview-deferred/d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134.bin +0 -0
  19. package/dist/browser-plane/preview-deferred/dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b.bin +0 -0
  20. package/dist/browser-plane/preview-deferred/dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5.bin +0 -0
  21. package/dist/browser-plane/preview-deferred/ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf.bin +0 -0
  22. package/dist/browser-plane/sw.js +13 -0
  23. package/dist/browser-plane/t5-frame.html +350 -0
  24. package/dist/browser-plane/t5-worker-frame.html +350 -0
  25. package/dist/cli.mjs +6412 -5067
  26. package/dist/preview-assets.generated.bin +0 -0
  27. package/fixtures/wix-canned.json +31 -1
  28. package/guides/himi-json-output.md +2 -0
  29. package/guides/one-app-to-himi-app.md +81 -5
  30. package/guides/sdk-reference.json +34 -3
  31. package/package.json +3 -3
  32. package/templates/beauty-salon/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  33. package/templates/branded-lite/config.ts +7 -0
  34. package/templates/branded-lite/dev/index.ts +719 -83
  35. package/templates/branded-lite/himalaya.content.json +3 -0
  36. package/templates/branded-lite/l10n/en.json +4 -2
  37. package/templates/branded-lite/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  38. package/templates/branded-lite/tier5-src/_shared/business-chat-history.ts +4 -1
  39. package/templates/branded-lite/tier5-src/_shared/business-chat-presenter.ts +2 -7
  40. package/templates/branded-lite/tier5-src/_shared/header-badges.ts +1 -1
  41. package/templates/branded-lite/tier5-src/_shared/inbox-rooms.ts +68 -0
  42. package/templates/branded-lite/tier5-src/_shared/member-activity.ts +34 -0
  43. package/templates/branded-lite/tier5-src/_shared/member-row-extras.ts +167 -0
  44. package/templates/branded-lite/tier5-src/_shared/notification-target.ts +141 -0
  45. package/templates/branded-lite/tier5-src/_shared/source-badges.ts +6 -4
  46. package/templates/branded-lite/tier5-src/_shared/wix-member-links.ts +114 -0
  47. package/templates/branded-lite/tier5-src/business-chat/index.ts +114 -59
  48. package/templates/branded-lite/tier5-src/himi-branded-lite-inbox/index.ts +83 -0
  49. package/templates/branded-lite/tier5-src/himi-branded-lite-notifications/index.ts +62 -7
  50. package/templates/branded-lite/tier5-src/wix-spaces-members/index.ts +60 -12
  51. package/templates/community-club/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  52. package/templates/events-meetups/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  53. package/templates/gym-fitness/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  54. package/templates/nonprofit-cause/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  55. package/templates/podcast-creator/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  56. package/templates/portfolio-creative/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  57. package/templates/restaurant/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  58. package/templates/retail-store/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  59. package/templates/salon-spa/dev/index.ts +112 -70
  60. package/templates/salon-spa/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  61. package/templates/salon-spa/tier5-src/_shared/business-chat-history.ts +4 -1
  62. package/templates/salon-spa/tier5-src/_shared/business-chat-presenter.ts +2 -7
  63. package/templates/salon-spa/tier5-src/_shared/inbox-rooms.ts +68 -0
  64. package/templates/salon-spa/tier5-src/business-chat/index.ts +114 -59
  65. package/templates/yoga-studio/tier5-src/_shared/branded-lite-hosted.ts +1 -0
Binary file
@@ -1230,6 +1230,36 @@
1230
1230
  "count": 2
1231
1231
  }
1232
1232
  },
1233
+ "POST /badges/v4/assignments/query": {
1234
+ "badgeAssignments": [
1235
+ {
1236
+ "id": "asg-0001",
1237
+ "badgeId": "bdg-0001",
1238
+ "memberId": "mem-0001"
1239
+ }
1240
+ ],
1241
+ "pagingMetadata": {
1242
+ "count": 1,
1243
+ "hasNext": false
1244
+ }
1245
+ },
1246
+ "POST https://apps.wix.com/_api/members-one-app/api/members": {
1247
+ "items": [
1248
+ {
1249
+ "id": "mem-0001",
1250
+ "displayName": "Dana R.",
1251
+ "member": {
1252
+ "role": "MEMBER",
1253
+ "online": false,
1254
+ "lastOpenApp": {
1255
+ "amount": 3,
1256
+ "unit": "hour"
1257
+ }
1258
+ }
1259
+ }
1260
+ ],
1261
+ "total": 1
1262
+ },
1233
1263
  "POST /badges/v4/badges/query": {
1234
1264
  "badges": [
1235
1265
  {
@@ -1408,7 +1438,7 @@
1408
1438
  ]
1409
1439
  }
1410
1440
  },
1411
- "POST /members-feed-viewer/v1/members-viewer-feed-notifications/query": {
1441
+ "POST /_api/members-feed-viewer/v1/members-viewer-feed-notifications/query": {
1412
1442
  "viewerFeedNotifications": [
1413
1443
  {
1414
1444
  "id": "ntf-0001",
@@ -112,6 +112,7 @@ return an empty array.
112
112
  | `identity_source_unverified` | Collected source hashes or the business display name cannot be verified. Recollect older evidence that did not save business identity. |
113
113
  | `identity_target_unverified` | The technical app slug, target compilation or complete built descriptors are unavailable. |
114
114
  | `literal_slug_visible` | Built display text or the known business-chat identity seed contains the technical slug instead of the collected business identity, without matching exact authored source copy. |
115
+ | `app_name_is_slug` | `config.ts`'s `name` (the launcher label and the screens that show the app name) is still the technical slug, while the built display text has no literal slug to report. The result carries `appName` with a `hint`; `--fix` writes the collected business name into `config.ts` (only a literal equal to the slug is rewritten, never a name the author chose). |
115
116
 
116
117
  The check reads built descriptors, not every possible runtime string. A passing
117
118
  result does not verify dynamic live data, translations, branding images or device
@@ -139,6 +140,7 @@ is a positional screen ID; use `--deep=<value>` to diagnose a nonnumeric depth.
139
140
  | `ux_evidence_unreadable` | The UX evidence artifact cannot be read. |
140
141
  | `lint_errors` | Build/lint validation found errors. |
141
142
  | `depth_budget_exceeded` | A screen or a bound list/grid row template nests deeper, or has more components, than the depth budget (`depth-budget` validator pass), or any of its JSON — props, modifiers, `input`, action `args` — nests past the raw-JSON ceiling of 256 levels. Each `issues[]` entry with `pass: "depth-budget"` carries the JSON `path` of the deepest node (the tree root for a node count, the first value past the ceiling for raw JSON), the `limit` and the `actual` value. Takes precedence over `lint_errors`, and `--force` does not override it: content over the budget overflows the renderer's stack on devices already in the field. Flatten the layout and push again. `himi patch screen` refuses an over-deep raw descriptor with the same code, before any network request, and `himi pack` / `himi template publish` refuse with it even under `--force`. |
143
+ | `placeholder_site_binding` | The app declares `wix_api` and uses the `wix-consumer` auth provider, but its resolved auth still has the scaffold placeholder `clientId` (`YOUR_WIX_CLIENT_ID`) or `siteUrl` (`https://your-site.example.com`), and it is not bound to a source site through the One App identity. Nothing is published: every Wix call would fail. Bind the site (`himi one-app provision` for a One App migration; otherwise a real clientId and siteUrl). `--force` does not override it. |
142
144
  | `one_app_readiness_failed` | Reserved legacy refusal code. One App migration readiness is now advisory: publish and promotion report structured warnings instead. Other independent release checks may still refuse a push. |
143
145
  | `control_token_expired` | The selected control token has expired. |
144
146
  | `app_source_contains_secrets` | Source archiving detected a possible credential. |
@@ -163,6 +163,7 @@ The CLI's versioned native-widget inventory supplies these rows automatically.
163
163
  | `achievements_carousel_section` | The same Program state/display rules, default limit 5 and page dots. |
164
164
  | `newBlog_postlist_vertical_section`, `newBlog_compact_post_list_vertical_section` | Row display options, unlimited paging or a limited count with See All Posts, and layout. Coverage derives these per placement from the authored settings: see "Generate blog post lists from their settings". |
165
165
  | `events_list_section` | Date badge, Share and the appropriate RSVP/ticket action. |
166
+ | `platform_elements_image_section` | Press behavior. `onPressType: "openAsModal"` opens the image full screen: tap it with the reserved `himi.lightbox` action and `args.images` set to `[{ "url": <the image url>, "alt": <its accessibility label> }]`. `nothing` and a `none` action need no tap. Coverage derives the row per placement from the authored value. |
166
167
  | `platform_general_members_section`, `platform_general_members_section_bp` | Effective member strip and directory journey: totals/search, alphabetical sections, Follow, activity/privacy. Distinguish badge chips from actual viewed-member program progress. |
167
168
  | `file_share_section` | Signed-in-only file/folder section. Preserve access rules, instance settings and View All (`media.openFileShareListScreen`); a media gallery is not File Share. |
168
169
  | `events_guests_section` | Signed-in-only guests for the configured event, preserving the event selector, guest privacy and display settings; an avatar summary is not the full guest list. |
@@ -282,7 +283,10 @@ the same values:
282
283
  - **Row facts.** Every `displayOptions` key set to `true` is shown: `author` (avatar, name and the
283
284
  admin badge), `comments` (comment count), `likes`, `times_viewed`, `post_date`, `reading_time`,
284
285
  `cover_image`. Bind each from the post and its metrics. A row that shows a fixed subset such as
285
- date, views and likes is a gap. A key that is `false` or absent stays hidden.
286
+ date, views and likes is a gap. A key that is `false` or absent stays hidden. Blog v3 `queryPosts` returns no
287
+ view, like or comment counts unless the request asks for `fieldsets: ["METRICS"]` (without it every count reads
288
+ 0), and only the author's `memberId`: resolve the name and photo with `getMember` and show the author only when
289
+ the member resolves. A count the API did not return stays hidden, never 0.
286
290
  - **Unlimited.** `contentSettings.postsPerCategory: "unlimited"` follows the page cursor to the last
287
291
  post. Bind `pagination.cursor` and `pagination.onLoadMore` as described in `himi docs
288
292
  designing-himi-screens`; a fixed first page (for example 20 posts) is not an unlimited list.
@@ -427,7 +431,9 @@ Apply these interpretation rules:
427
431
  It resolves the effective source theme with the reader the source app instance
428
432
  actually uses, then compares the resolved primary, background and content colors,
429
433
  each button's `borderRadius` and `outlineWidth`, and resolved heading/body font families
430
- against the app's `tokens.json`.
434
+ against the app's `tokens.json`. A Branded theme that stores only `primaryColor`
435
+ (no `colors`) is still compared: that value is the app's brand color, so the template's
436
+ default accent fails the check until `--fix` writes it.
431
437
  Hex case and shorthand are normalized; an absent button token is compared with the
432
438
  value the renderer draws (an outline only on `secondary`; a radius of `radius.pill`,
433
439
  else 24), not called a difference. A variant without its own radius must draw the
@@ -504,6 +510,22 @@ Apply these interpretation rules:
504
510
  list then shows no Ended label for a time without an offset, which is correct, and a
505
511
  `business_time_zone_unavailable` warning says so. A re-apply keeps the zone for the same site and
506
512
  drops it for another.
513
+ - **Write the verified values with the CLI.** Run `himi one-app provision --evidence-dir .himi/one-app --content .`
514
+ after scaffolding. From the collected evidence it sets `currency` on `himi_loyalty` and `businessTimeZone` on
515
+ `himi_services`, `himi_service` and `himi_time` (a value it could not verify stays as the template ships it;
516
+ nothing is invented). It writes the business name into `config.ts`'s `name` and over the slug `himi init` baked
517
+ into displayed names (display slots only, never ids or URLs; a name you chose is kept), so the normal flow needs
518
+ no `validate-identity --fix`. It states the bottom bar as native (`navigation.tabBar.presentation: "native"`; an
519
+ explicit `"kit"` is kept; the output's `tabBar` reports `set`, `unchanged` or `absent`). When the collection
520
+ recorded `memberChat: true` (never a guess), it opens the member Inbox from every baked door (the top-bar chat
521
+ action, the drawer's Inbox item, the chat thread's parent and "Back to inbox", the Profile link) if the scaffold
522
+ contains `himi_inbox`; otherwise the output's `chat` says `unverified` and the doors keep opening
523
+ `himi_business_chat`. `himi one-app header-badges` writes the top-bar action, so run provision again after it.
524
+ It also **binds the app to the source site**: the scaffold's `WixConsumerAuthProvider` carries placeholders
525
+ (`YOUR_WIX_CLIENT_ID`, `your-site.example.com`) that make every Wix read fail, so provision writes
526
+ `visitorSource: "one-app"`, the collected `metaSiteId` and `siteUrl` (a real clientId you set is kept;
527
+ `siteBinding` reports `set`, `unchanged`, `unverified` or `absent`). `himi push` refuses a Wix-backed app that
528
+ still has the placeholders (code `placeholder_site_binding`, no `--force`). It is safe to run again.
507
529
  - **Native navigation is the migration target.** Use the shell's native top bar
508
530
  and, for bottom-tab navigation, `navigation.tabBar.presentation: "native"`.
509
531
  Do not recreate the source Detailed header, call `detailedHeader`, or insert a
@@ -536,6 +558,20 @@ Apply these interpretation rules:
536
558
  totals. A collected total is a source snapshot. Only use an injected live
537
559
  count reader when its public, site-bound permission path has been verified.
538
560
  See the screens SDK's downloadable business-contact guide for the full recipe.
561
+ - **Chat opens the Inbox when the source allows member chat.** The source top-bar chat
562
+ button opens a member-to-business room only when the branded app's `inbox.chatType`
563
+ is `MEMBER_TO_BUSINESS`; in every other case, including an app whose config has no
564
+ `inbox` at all, it opens the Inbox: a list of the member's conversations with the
565
+ business and with other members, plus a way to start a new chat with a member.
566
+ `collect` reads that setting from the app's public mobile config, as a Visitor, and
567
+ records it in `inbox-settings.json` (`chatType` and its `source`) and `manifest.json`
568
+ `memberChat`: `true` or `false`, or `null` when it could not be read or the source is
569
+ a free One App (warning `inbox_chat_type_unknown`). Carry it: when `memberChat` is
570
+ `true`, set provisioning `memberChat: true` and point the top-bar chat action at
571
+ `himi_inbox`; every other Inbox entry (tab, drawer, Explore, Profile) follows the same
572
+ flag. When it is `false` or `null` leave `memberChat` unset and keep the top-bar chat
573
+ on `himi_business_chat`. Never turn member chat on from a guess: an owner who limited
574
+ the app to the business must not gain a member chat.
539
575
  - Emit resolved native actions in `navigation.topBarDefault` or a complete
540
576
  per-screen `topBar` override. The shell owns back/menu controls. Per-screen
541
577
  actions support `hiddenPath` when `navigation.topBarDefault.actions` declares
@@ -682,8 +718,9 @@ Apply these interpretation rules:
682
718
  output against the source. A persistent nav worker needs a supported refresh
683
719
  path; a screen-only load, page-row count or foreground push receipt count is
684
720
  insufficient. The source Member notification aggregate is MOBILE/UNSEEN, capped
685
- at100. `countUnseenNotifications({ site: boundMetaSiteId })` reads that aggregate
686
- through the source Member route. It requires the updated native core, rebuilt
721
+ at100. `countUnseenNotifications()` reads that aggregate through the source Member
722
+ route. Name no site: a bound host sends its own, and the multi-tenant Player (no
723
+ bound site) lets the Member credential decide and refuses any named one. It requires the updated native core, rebuilt
687
724
  consuming binaries and published SDK; default web and old binaries remain
688
725
  unavailable for this reader. Never replace that refusal with zero.
689
726
  Chat counts unread rooms, while legacy cart counters can include unsynced local
@@ -1257,6 +1294,24 @@ function call in the literal makes them fail with "expected a `"<screenId>": {`
1257
1294
  authored descriptor". Blank lines and whole-line `//` comments between entries are
1258
1295
  accepted.
1259
1296
 
1297
+ Do not write a generator of your own. `himi one-app generate --evidence-dir .himi/one-app --content .` turns each
1298
+ source page into a screen descriptor from the collected evidence alone: the screen id and title come from the page's
1299
+ source label, and styles, alignment, buttons, images and their tap (`openAsModal` opens full screen), the contact
1300
+ section and the business description are read from the source. A section it has no mapping for is reported with
1301
+ `sections_unmapped` and nothing stands in for it. Data sections use shared modules and recipes
1302
+ (`recipes/*.json`) when the scaffold ships them; the current starter ships none, so today they take the fallback
1303
+ below. A page with such modules gets ONE worker, `tier5-src/page-<screen>/index.ts`, that registers the modules
1304
+ its sections use (blog list, programs carousel, inline events). A page that is only a template vertical (programs list,
1305
+ members, loyalty, shop, groups feed) opens the template's screen, and a groups feed passes the source's own title,
1306
+ "Group list" label and post count. A data section never vanishes: when the shared modules cannot honor its settings
1307
+ (featured-only lists, another post layout, events or groups limited to a chosen set) or its recipe is missing from the
1308
+ scaffold, it keeps its place as the source's title and a "See All" button that opens the page showing that data,
1309
+ and the reason is listed in `gaps`, never approximated as the real list. Only a section with no mapping at all stays
1310
+ in `unmapped`. The first four visible pages become the bottom tabs and the rest the More screen. The output names the
1311
+ published `revision` and `fetchedAt` of the evidence it read, so a migration generated from older evidence shows the
1312
+ old value: run `himi one-app migrate` again to refresh it before the final check. The file it writes is the
1313
+ `--upsert` input below.
1314
+
1260
1315
  So generate descriptors as data and write them with the CLI:
1261
1316
 
1262
1317
  ```sh
@@ -1266,11 +1321,27 @@ himi template screens --upsert --from .himi/one-app/gen/screens.json
1266
1321
  The file is one JSON object, `{ "<screenId>": <ScreenDescriptor>, … }`. Each existing
1267
1322
  id is replaced in place; each new id is added and registered in
1268
1323
  `navigation.linkableScreens`. One invalid entry refuses the batch and restores every
1269
- file. A builder call such as `detailedHeader(...)` written inline in `dev/index.ts`
1324
+ file. A screen that starts with an empty slot (a `Spacer`, a container with no children, an
1325
+ `Image` with no url) is refused: when a source header is dropped, do not leave its place behind,
1326
+ because the slot paints a blank band under the toolbar. A builder call such as `detailedHeader(...)` written inline in `dev/index.ts`
1270
1327
  cannot be inspected: call the builder in your generator and serialize the value it
1271
1328
  returns. Run the generator inside the app (after `npm install`), so
1272
1329
  `@wix/himalaya/screens` resolves to the app's own dependency.
1273
1330
 
1331
+ ### Repoint the template's tab ids
1332
+
1333
+ The template's `navigation.linkableScreens` entries and its home and profile tabs carry its own tab ids (`"home"`,
1334
+ `"profile"`, the vertical tabs). Your `navigation.tabBar` replaces those tabs, so every entry whose `tabId` is not
1335
+ one of yours is a leftover. `himi validate --strict` reports each as `nav-linkable-tab-unknown` and lists your real
1336
+ ids; nothing repoints them, because the right tab depends on where the source shows the screen:
1337
+
1338
+ - a screen the source opens from a tab keeps that tab's id;
1339
+ - a screen reached from the overflow list takes the id of the **More** tab only if you created one; a template with no More tab uses `""`;
1340
+ - a screen with no tab owner takes `""`, the default stack.
1341
+
1342
+ Check `homeScreenId` and any `himi.open` target that still names a template screen (`"home"`, `"profile"`) the same
1343
+ way: it must be a screen your `SCREENS` map defines.
1344
+
1274
1345
  ### Preserve the template features the source exposes
1275
1346
 
1276
1347
  Treat trimming as a source-feature decision, not a list of screens reached during
@@ -1292,6 +1363,11 @@ After applying identity and before claiming completion, run:
1292
1363
  himi one-app validate-identity --evidence-dir .himi/one-app --content . --json
1293
1364
  ```
1294
1365
 
1366
+ `himi init` names a scaffold after its technical slug, and `config.ts`'s `name` is the app's
1367
+ display name (launcher label and the screens that show it). The command also fails with
1368
+ `app_name_is_slug` while that name is still the slug; `--fix` writes the collected business
1369
+ name into it (only a literal equal to the slug is rewritten, never a name you chose).
1370
+
1295
1371
  The command verifies the collected business-name hash, builds the current content,
1296
1372
  and checks emitted screen titles, supported component display fields and the known
1297
1373
  business-chat identity seed for accidental literal slugs. It ignores route IDs,
@@ -28162,6 +28162,37 @@
28162
28162
  "decl": "export async function isFollowingMember(targetId: string): Promise<boolean>;",
28163
28163
  "http": "POST /members/v3/followers/my/connections",
28164
28164
  "verificationChecked": true
28165
+ },
28166
+ {
28167
+ "name": "WixMemberLastOpenApp",
28168
+ "kind": "interface",
28169
+ "jsdoc": "/** When a member last opened the app, as the One App computes it: `unit` is \"min\", \"hour\" or \"day\", and `ts`\n * (epoch milliseconds, as a string) is there for a day count the One App prints as a date. */",
28170
+ "decl": "export interface WixMemberLastOpenApp {\n amount?: number;\n unit?: string;\n ts?: string;\n}",
28171
+ "verificationChecked": true
28172
+ },
28173
+ {
28174
+ "name": "WixMemberActivity",
28175
+ "kind": "interface",
28176
+ "jsdoc": "/** One member's activity from the One App members service. */",
28177
+ "decl": "export interface WixMemberActivity {\n id: string;\n /** Server role, e.g. \"MEMBER\". */\n role?: string;\n online: boolean;\n /** `null` for a member who never opened the app. */\n lastOpenApp: WixMemberLastOpenApp | null;\n}",
28178
+ "verificationChecked": true
28179
+ },
28180
+ {
28181
+ "name": "queryMemberActivity",
28182
+ "kind": "function",
28183
+ "jsdoc": "/** Role and last-active for up to 100 members by id — POST apps.wix.com/_api/members-one-app/api/members.\n * Public Members v1 carries neither: `lastLoginDate` is a login time and needs the owner-only FULL field\n * set. The One App service answers a Visitor with this, so a members list can show \"Active 11h ago\".\n * A member id the service does not know is left out of the answer.\n *\n * Pinned One App member source, like the notification count: it needs a native runtime that allows this\n * one route for the bound business. Older native builds and web reject, so callers treat a rejection as\n * \"no activity to show\", never as an error in their own list.\n *\n * @scope visitor — a Visitor reads it as well as a signed-in member; the native runtime allows only the bound business's route. */",
28184
+ "decl": "export async function queryMemberActivity(ids: string[]): Promise<WixMemberActivity[]>;",
28185
+ "scope": "visitor",
28186
+ "verificationChecked": true
28187
+ },
28188
+ {
28189
+ "name": "listFollowedMembers",
28190
+ "kind": "function",
28191
+ "jsdoc": "/** Which of `targetIds` the signed-in member follows, in ONE call — POST\n * /members/v3/followers/my/connections. For a members list that shows a Follow control per row.\n * A Visitor gets an empty answer (no connections), so nothing here needs a sign-in; callers still\n * skip the call for a Visitor.\n *\n * @scope visitor — an anonymous visitor session is enough; it answers an empty list when nobody is signed in. */",
28192
+ "decl": "export async function listFollowedMembers(targetIds: string[]): Promise<string[]>;",
28193
+ "http": "POST /members/v3/followers/my/connections",
28194
+ "scope": "visitor",
28195
+ "verificationChecked": true
28165
28196
  }
28166
28197
  ]
28167
28198
  },
@@ -28208,15 +28239,15 @@
28208
28239
  {
28209
28240
  "name": "queryNotifications",
28210
28241
  "kind": "function",
28211
- "jsdoc": "/** List the signed-in member's notifications, newest first. MOBILE channel. */",
28242
+ "jsdoc": "/** List the signed-in member's notifications, newest first. MOBILE channel. Needs a Member\n * transport: a Visitor is refused (403) and an old native build refuses the route, so both\n * reject. The bound site is stamped by the host, so no site argument is needed. */",
28212
28243
  "decl": "export async function queryNotifications(limit = 25, options?: WixCallOptions): Promise<MfvNotification[]>;",
28213
28244
  "verificationChecked": true
28214
28245
  },
28215
28246
  {
28216
28247
  "name": "countUnseenNotifications",
28217
28248
  "kind": "function",
28218
- "jsdoc": "/** Source member-app MOBILE/UNSEEN aggregate, capped at 100. Requires a bound\n * single-site Member transport; old native binaries and web reject. A missing,\n * malformed or failed result is unavailable, never an authoritative zero. */",
28219
- "decl": "export async function countUnseenNotifications(options: { site: string }): Promise<number>;",
28249
+ "jsdoc": "/** Source member-app MOBILE/UNSEEN aggregate, capped at 100. Needs a Member transport; old native\n * binaries and web reject. A missing, malformed or failed result is unavailable, never an\n * authoritative zero. The host fixes the business: a bound capability sends its own site, and the\n * multi-tenant Player (no bound site) lets the Member credential decide. `site` is optional and only\n * ever names the bound site: native refuses any other, and an unbound host refuses every named one. */",
28250
+ "decl": "export async function countUnseenNotifications(options?: { site?: string }): Promise<number>;",
28220
28251
  "verificationChecked": true
28221
28252
  },
28222
28253
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1633.0",
3
+ "version": "0.1634.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": [
@@ -30,7 +30,7 @@
30
30
  "himi": "node --import tsx src/cli.ts",
31
31
  "gen:guides": "npm --prefix ../.. run authoring:gen",
32
32
  "build": "node --import tsx ../authoring-kit/gen-templates.mts && node ../authoring-kit/bundle.mjs && npm run build:dist",
33
- "build:dist": "node --import tsx ../html-to-t5/vocab-gen/gen-v2.ts && node scripts/bundle.mjs && node scripts/stage-authoring-runtime.mjs",
33
+ "build:dist": "node --import tsx ../html-to-t5/vocab-gen/gen-v2.ts && node scripts/bundle.mjs && node scripts/stage-authoring-runtime.mjs && node scripts/stage-browser-plane.mjs",
34
34
  "test": "node ../../tools/ci/run-tests.mjs --package tools/himi-cli --"
35
35
  },
36
36
  "dependencies": {
@@ -72,5 +72,5 @@
72
72
  "artifactId": "himalaya-cli"
73
73
  }
74
74
  },
75
- "falconPackageHash": "cfec110399d1528f327a0ca1caf2543b95efba31f33781fa136164a8"
75
+ "falconPackageHash": "7e33d424d99d05998b91ee4390198d50459ab4ce4a5aec4d4c999ae1"
76
76
  }
@@ -97,6 +97,7 @@ export const HOSTED_SCREEN_VERTICALS: Readonly<Record<string, readonly BrandedLi
97
97
  himi_gift_card: ["giftCards"],
98
98
  himi_gift_cards: ["giftCards"],
99
99
  himi_groups: ["groups"],
100
+ himi_inbox: ["inbox"],
100
101
  himi_group_about: ["groups"],
101
102
  himi_my_groups: ["groups"],
102
103
  himi_invoice: ["invoices"],
@@ -371,6 +371,13 @@ export default defineApp({
371
371
  "parentScreenId": "himi_account",
372
372
  "tabId": "profile"
373
373
  },
374
+ {
375
+ "screenId": "himi_inbox",
376
+ "isPublic": true,
377
+ "paramKeys": [],
378
+ "parentScreenId": "",
379
+ "tabId": ""
380
+ },
374
381
  {
375
382
  "screenId": "himi_business_chat",
376
383
  "isPublic": true,