@wix/himalaya-cli 0.853.0 → 0.855.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 (48) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-analytics.mjs +3 -3
  2. package/dist/cli.mjs +35 -3
  3. package/guides/sdk-reference.json +4 -2
  4. package/package.json +2 -2
  5. package/templates/beauty-salon-owner/config.ts +34 -4
  6. package/templates/beauty-salon-owner/dev/index.ts +0 -94
  7. package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +73 -4
  8. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  9. package/templates/community-club-owner/config.ts +34 -4
  10. package/templates/community-club-owner/dev/index.ts +0 -94
  11. package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +73 -4
  12. package/templates/community-club-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  13. package/templates/events-meetups-owner/config.ts +34 -4
  14. package/templates/events-meetups-owner/dev/index.ts +0 -94
  15. package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +73 -4
  16. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  17. package/templates/gym-fitness-owner/config.ts +34 -4
  18. package/templates/gym-fitness-owner/dev/index.ts +0 -94
  19. package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +73 -4
  20. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  21. package/templates/nonprofit-cause-owner/config.ts +34 -4
  22. package/templates/nonprofit-cause-owner/dev/index.ts +0 -94
  23. package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +73 -4
  24. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  25. package/templates/owner-lite/config.ts +34 -4
  26. package/templates/owner-lite/dev/index.ts +0 -94
  27. package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +73 -4
  28. package/templates/owner-lite/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  29. package/templates/podcast-creator-owner/config.ts +34 -4
  30. package/templates/podcast-creator-owner/dev/index.ts +0 -94
  31. package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +73 -4
  32. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  33. package/templates/portfolio-creative-owner/config.ts +34 -4
  34. package/templates/portfolio-creative-owner/dev/index.ts +0 -94
  35. package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +73 -4
  36. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  37. package/templates/restaurant-owner/config.ts +34 -4
  38. package/templates/restaurant-owner/dev/index.ts +0 -94
  39. package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +73 -4
  40. package/templates/restaurant-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  41. package/templates/retail-store-owner/config.ts +34 -4
  42. package/templates/retail-store-owner/dev/index.ts +0 -94
  43. package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +73 -4
  44. package/templates/retail-store-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
  45. package/templates/yoga-studio-owner/config.ts +34 -4
  46. package/templates/yoga-studio-owner/dev/index.ts +0 -94
  47. package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +73 -4
  48. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-aria/index.ts +7 -0
@@ -153,6 +153,10 @@ export interface AriaChatLabels {
153
153
  typing?: Resolvable<string>;
154
154
  /** Status line when the wait ran out without a reply. */
155
155
  slow?: Resolvable<string>;
156
+ /** Shown instead of a raw transport error when this HOST cannot reach Wix at
157
+ * all — it carries no Wix app binding to sign the chat-service call with.
158
+ * See `isWixAccountUnreachable`, and note what it is NOT: a signed-out user. */
159
+ unavailable?: Resolvable<string>;
156
160
  }
157
161
 
158
162
  export interface AriaChatOptions {
@@ -271,6 +275,62 @@ export function hostOf(url: string): string {
271
275
  return PLAIN_HOST.test(host) ? host : "";
272
276
  }
273
277
 
278
+ /** The web bridge's DESIGNED refusals — the ones that mean "this host cannot
279
+ * reach Wix", as opposed to "the chat-service is broken".
280
+ *
281
+ * Matched by NAME, never by the 501 status alone: 501 is also what an unrelated
282
+ * gateway failure carries, and an unknown future refusal should stay loud rather
283
+ * than be quietly absorbed into a reassuring sentence.
284
+ *
285
+ * - `webwix_bridge_no_client_id` — the host carries no Wix app binding at all,
286
+ * so nothing can be signed and no Wix call leaves the browser.
287
+ * - `webwix_owner_only` — the call targets an owner-scoped Wix host
288
+ * (`*.wix.com`) rather than the `wixapis.com` gateway the web bridge is
289
+ * host-locked to. Aria's chat-service lives on `manage.wix.com`, so on web
290
+ * this is the refusal it gets once a site IS connected: structural, and not
291
+ * fixed by any amount of signing in or re-binding.
292
+ * - `webwix_owner_mint_failed` — no owner session for this business on this
293
+ * host. The shell already puts its own "Sign in to Wix again" affordance up
294
+ * for this one, so Aria says the same neutral thing rather than competing
295
+ * with it.
296
+ *
297
+ * ALL THREE READ THE SAME WAY TO AN OWNER: Aria cannot work on this surface,
298
+ * and nothing they do in the chat will change it. None of them is a reason to
299
+ * show red, and none is a reason to tell them to sign in — an earlier version
300
+ * of this said "Sign in to your Wix account" and was wrong on exactly that
301
+ * point, since the owner is typically already signed in.
302
+ *
303
+ * Aria cannot degrade to sample rows the way the data screens do — there is no
304
+ * conversation to invent — so it degrades to the greeting plus one plain
305
+ * sentence in the NEUTRAL status line. */
306
+ const DESIGNED_BRIDGE_REFUSALS = [
307
+ "webwix_bridge_no_client_id",
308
+ "webwix_owner_only",
309
+ "webwix_owner_mint_failed",
310
+ ];
311
+
312
+ export function isWixAccountUnreachable(e: unknown): boolean {
313
+ const msg = String((e as Error)?.message ?? e ?? "");
314
+ return DESIGNED_BRIDGE_REFUSALS.some((name) => msg.includes(name));
315
+ }
316
+
317
+ /** Which of the screen's two message slots a failure belongs in.
318
+ *
319
+ * Both already exist and they say different things: `error` renders in `danger`
320
+ * and `statusText` in `textSecondary`. "This host has no owner session" is not
321
+ * a fault, so putting it in the red slot still tells the owner something broke
322
+ * and sends them looking for a breakage that is not there — the words would be
323
+ * right and the colour would be lying. It goes in the neutral slot instead.
324
+ *
325
+ * Always returns BOTH keys so the two can never show at once: a real error
326
+ * clears any stale status line, and the signed-out sentence clears any red text
327
+ * left over from an earlier failure. */
328
+ function failureSlots(e: unknown, unavailable: () => string): { error: string; statusText: string } {
329
+ return isWixAccountUnreachable(e)
330
+ ? { error: "", statusText: unavailable() }
331
+ : { error: String((e as Error)?.message ?? e), statusText: "" };
332
+ }
333
+
274
334
  /** Is this url somewhere Wix itself serves?
275
335
  *
276
336
  * Guarded by `PLAIN_HOST` first. The suffix tests are string operations, so
@@ -528,6 +588,13 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
528
588
  const you = () => res(o.labels?.you ?? "You");
529
589
  const typingText = () => res(o.labels?.typing ?? `${assistant()} is typing…`);
530
590
  const slowText = () => res(o.labels?.slow ?? `${assistant()} is taking a while…`);
591
+ // States the fact and stops. It deliberately gives no instruction, because
592
+ // there is none the owner could follow: they are signed in, and the thing that
593
+ // is missing is the app's own Wix binding. "Here" is doing real work — it says
594
+ // the limit is this surface, not their account and not Aria.
595
+ const unavailableText = () => res(
596
+ o.labels?.unavailable ?? `${assistant()} can't reach your Wix account from here.`,
597
+ );
531
598
  const promptList = () => res(o.prompts);
532
599
  const siteOf = o.siteId ?? (() => "");
533
600
  const resumeOf = o.resumeConversationId ?? inputConversationId;
@@ -686,12 +753,14 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
686
753
  } catch (e) {
687
754
  inFlightSend = null;
688
755
  return {
689
- ...base, status: "ready", statusText: "", _pending: "",
756
+ ...base, status: "ready", _pending: "",
690
757
  // `_siteId` moves with the id or neither does: a conversation remembered
691
758
  // without the site it belongs to reads as another business's on the next
692
759
  // send, and gets replaced instead of retried.
693
760
  _convId: convId, _siteId: convId === s._convId ? s._siteId : site,
694
- error: String((e as Error)?.message ?? e),
761
+ // Sets BOTH error and statusText, so it must come after the `statusText: ""`
762
+ // this object used to carry — otherwise the literal would blank the sentence.
763
+ ...failureSlots(e, unavailableText),
695
764
  };
696
765
  }
697
766
  }
@@ -756,7 +825,7 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
756
825
  messages: greetingOnly(), ...observed([]), prompts: promptList() };
757
826
  } catch (e) {
758
827
  // Even if create fails, show the greeting; submit retries the create.
759
- return { ...s, status: "ready", _convId: "", _siteId: site, _pending: "", error: String((e as Error)?.message ?? e),
828
+ return { ...s, status: "ready", _convId: "", _siteId: site, _pending: "", ...failureSlots(e, unavailableText),
760
829
  messages: greetingOnly(), ...observed([]), prompts: promptList() };
761
830
  }
762
831
  },
@@ -801,7 +870,7 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
801
870
  return slow({ ...s, status: "ready", _convId: conversationIdOf(res), _siteId: site, input: "", statusText: "", error: "",
802
871
  _pending: "", messages: greetingOnly(), ...observed([]), prompts: promptList(), ok: false });
803
872
  } catch (e) {
804
- return slow({ ...s, status: "ready", _convId: "", _siteId: site, input: "", error: String((e as Error)?.message ?? e),
873
+ return slow({ ...s, status: "ready", _convId: "", _siteId: site, input: "", ...failureSlots(e, unavailableText),
805
874
  _pending: "", messages: greetingOnly(), ...observed([]), prompts: promptList(), ok: false });
806
875
  }
807
876
  },
@@ -141,6 +141,13 @@ const core = createAriaChat({
141
141
  you: () => copyParam("ownerAria.you", "You"),
142
142
  typing: () => copyParam("ownerAria.typing", "Aria is typing…"),
143
143
  slow: () => copyParam("ownerAria.slow", "Aria is taking a while…"),
144
+ // Shown when the HOST carries no Wix app binding, so no Wix call can leave
145
+ // the browser (the web preview). Through copyParam like every other string
146
+ // here — a default baked into the shared core cannot be localized by this
147
+ // app's copy pack, and a non-English owner would have read this one line in
148
+ // English. Says no "sign in": the owner already is, and the missing piece is
149
+ // the app's binding, so there is no action for them to take.
150
+ unavailable: () => copyParam("ownerAria.unavailable", "Aria can't reach your Wix account from here."),
144
151
  },
145
152
  historyKey: "ol.aria.history.v1",
146
153
  // No local title cache in THIS app. __HIMI_APP_NAME__ is multi-account and
@@ -103,15 +103,15 @@ export default defineApp({
103
103
  "paramKeys": [
104
104
  "conversationId"
105
105
  ],
106
- "parentScreenId": "himi_owner_lite_manage",
107
- "tabId": "manage"
106
+ "parentScreenId": "",
107
+ "tabId": "aria"
108
108
  },
109
109
  {
110
110
  "screenId": "himi_owner_lite_aria_history",
111
111
  "isPublic": false,
112
112
  "paramKeys": [],
113
113
  "parentScreenId": "himi_owner_lite_aria",
114
- "tabId": "manage"
114
+ "tabId": "aria"
115
115
  },
116
116
  {
117
117
  "screenId": "himi_owner_lite_brief",
@@ -465,7 +465,7 @@ export default defineApp({
465
465
  "isPublic": false,
466
466
  "paramKeys": [],
467
467
  "parentScreenId": "",
468
- "tabId": "account"
468
+ "tabId": ""
469
469
  }
470
470
  ],
471
471
  "tabBar": {
@@ -477,6 +477,36 @@ export default defineApp({
477
477
  "icon": "home",
478
478
  "selectedIcon": "home_fill"
479
479
  },
480
+ {
481
+ "id": "aria",
482
+ "screenId": "himi_owner_lite_aria",
483
+ "label": "Aria",
484
+ "icon": "ai"
485
+ },
486
+ {
487
+ "id": "manage",
488
+ "screenId": "himi_owner_lite_manage",
489
+ "label": "Programme",
490
+ "icon": "grid",
491
+ "selectedIcon": "grid_fill"
492
+ }
493
+ ]
494
+ },
495
+ "sidebar": {
496
+ "items": [
497
+ {
498
+ "id": "home",
499
+ "screenId": "himi_owner_lite_home",
500
+ "label": "Run of show",
501
+ "icon": "home",
502
+ "selectedIcon": "home_fill"
503
+ },
504
+ {
505
+ "id": "aria",
506
+ "screenId": "himi_owner_lite_aria",
507
+ "label": "Aria",
508
+ "icon": "ai"
509
+ },
480
510
  {
481
511
  "id": "manage",
482
512
  "screenId": "himi_owner_lite_manage",
@@ -50407,100 +50407,6 @@ const SCREENS = runtimeSetting({
50407
50407
  "haptic": "light",
50408
50408
  "accessibilityLabel": "himi_owner_lite.manage_analytics"
50409
50409
  }
50410
- },
50411
- {
50412
- "id": "",
50413
- "body": {
50414
- "package": "himalaya",
50415
- "type": "HStack",
50416
- "props": {
50417
- "spacing": 12,
50418
- "children": [
50419
- {
50420
- "id": "",
50421
- "body": {
50422
- "package": "himalaya",
50423
- "type": "HStack",
50424
- "props": {
50425
- "spacing": 12,
50426
- "children": [
50427
- {
50428
- "id": "",
50429
- "body": {
50430
- "package": "himalaya",
50431
- "type": "Icon",
50432
- "props": {
50433
- "name": "chat",
50434
- "size": 20,
50435
- "tint": "accentPrimary"
50436
- }
50437
- }
50438
- },
50439
- {
50440
- "id": "",
50441
- "body": {
50442
- "package": "himalaya",
50443
- "type": "Text",
50444
- "props": {
50445
- "text": "Ask Aria",
50446
- "style": "bodyEmphasis"
50447
- }
50448
- }
50449
- }
50450
- ]
50451
- }
50452
- }
50453
- },
50454
- {
50455
- "id": "",
50456
- "body": {
50457
- "package": "himalaya",
50458
- "type": "Spacer",
50459
- "props": {}
50460
- }
50461
- },
50462
- {
50463
- "id": "",
50464
- "body": {
50465
- "package": "himalaya",
50466
- "type": "Icon",
50467
- "props": {
50468
- "name": "chevron_right",
50469
- "size": 16,
50470
- "tint": "textTertiary"
50471
- }
50472
- }
50473
- }
50474
- ]
50475
- }
50476
- },
50477
- "modifiers": {
50478
- "background": {
50479
- "token": "surfaceElevated"
50480
- },
50481
- "border": {
50482
- "width": 1,
50483
- "color": {
50484
- "token": "border"
50485
- }
50486
- },
50487
- "cornerRadius": 12,
50488
- "padding": {
50489
- "leading": 14,
50490
- "trailing": 14,
50491
- "top": 14,
50492
- "bottom": 14
50493
- },
50494
- "onTap": {
50495
- "actionId": "himi.open",
50496
- "params": {
50497
- "screenId": "himi_owner_lite_aria"
50498
- }
50499
- },
50500
- "pressFeedback": "scale",
50501
- "haptic": "light",
50502
- "accessibilityLabel": "himi_owner_lite.manage_aria"
50503
- }
50504
50410
  }
50505
50411
  ]
50506
50412
  }
@@ -153,6 +153,10 @@ export interface AriaChatLabels {
153
153
  typing?: Resolvable<string>;
154
154
  /** Status line when the wait ran out without a reply. */
155
155
  slow?: Resolvable<string>;
156
+ /** Shown instead of a raw transport error when this HOST cannot reach Wix at
157
+ * all — it carries no Wix app binding to sign the chat-service call with.
158
+ * See `isWixAccountUnreachable`, and note what it is NOT: a signed-out user. */
159
+ unavailable?: Resolvable<string>;
156
160
  }
157
161
 
158
162
  export interface AriaChatOptions {
@@ -271,6 +275,62 @@ export function hostOf(url: string): string {
271
275
  return PLAIN_HOST.test(host) ? host : "";
272
276
  }
273
277
 
278
+ /** The web bridge's DESIGNED refusals — the ones that mean "this host cannot
279
+ * reach Wix", as opposed to "the chat-service is broken".
280
+ *
281
+ * Matched by NAME, never by the 501 status alone: 501 is also what an unrelated
282
+ * gateway failure carries, and an unknown future refusal should stay loud rather
283
+ * than be quietly absorbed into a reassuring sentence.
284
+ *
285
+ * - `webwix_bridge_no_client_id` — the host carries no Wix app binding at all,
286
+ * so nothing can be signed and no Wix call leaves the browser.
287
+ * - `webwix_owner_only` — the call targets an owner-scoped Wix host
288
+ * (`*.wix.com`) rather than the `wixapis.com` gateway the web bridge is
289
+ * host-locked to. Aria's chat-service lives on `manage.wix.com`, so on web
290
+ * this is the refusal it gets once a site IS connected: structural, and not
291
+ * fixed by any amount of signing in or re-binding.
292
+ * - `webwix_owner_mint_failed` — no owner session for this business on this
293
+ * host. The shell already puts its own "Sign in to Wix again" affordance up
294
+ * for this one, so Aria says the same neutral thing rather than competing
295
+ * with it.
296
+ *
297
+ * ALL THREE READ THE SAME WAY TO AN OWNER: Aria cannot work on this surface,
298
+ * and nothing they do in the chat will change it. None of them is a reason to
299
+ * show red, and none is a reason to tell them to sign in — an earlier version
300
+ * of this said "Sign in to your Wix account" and was wrong on exactly that
301
+ * point, since the owner is typically already signed in.
302
+ *
303
+ * Aria cannot degrade to sample rows the way the data screens do — there is no
304
+ * conversation to invent — so it degrades to the greeting plus one plain
305
+ * sentence in the NEUTRAL status line. */
306
+ const DESIGNED_BRIDGE_REFUSALS = [
307
+ "webwix_bridge_no_client_id",
308
+ "webwix_owner_only",
309
+ "webwix_owner_mint_failed",
310
+ ];
311
+
312
+ export function isWixAccountUnreachable(e: unknown): boolean {
313
+ const msg = String((e as Error)?.message ?? e ?? "");
314
+ return DESIGNED_BRIDGE_REFUSALS.some((name) => msg.includes(name));
315
+ }
316
+
317
+ /** Which of the screen's two message slots a failure belongs in.
318
+ *
319
+ * Both already exist and they say different things: `error` renders in `danger`
320
+ * and `statusText` in `textSecondary`. "This host has no owner session" is not
321
+ * a fault, so putting it in the red slot still tells the owner something broke
322
+ * and sends them looking for a breakage that is not there — the words would be
323
+ * right and the colour would be lying. It goes in the neutral slot instead.
324
+ *
325
+ * Always returns BOTH keys so the two can never show at once: a real error
326
+ * clears any stale status line, and the signed-out sentence clears any red text
327
+ * left over from an earlier failure. */
328
+ function failureSlots(e: unknown, unavailable: () => string): { error: string; statusText: string } {
329
+ return isWixAccountUnreachable(e)
330
+ ? { error: "", statusText: unavailable() }
331
+ : { error: String((e as Error)?.message ?? e), statusText: "" };
332
+ }
333
+
274
334
  /** Is this url somewhere Wix itself serves?
275
335
  *
276
336
  * Guarded by `PLAIN_HOST` first. The suffix tests are string operations, so
@@ -528,6 +588,13 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
528
588
  const you = () => res(o.labels?.you ?? "You");
529
589
  const typingText = () => res(o.labels?.typing ?? `${assistant()} is typing…`);
530
590
  const slowText = () => res(o.labels?.slow ?? `${assistant()} is taking a while…`);
591
+ // States the fact and stops. It deliberately gives no instruction, because
592
+ // there is none the owner could follow: they are signed in, and the thing that
593
+ // is missing is the app's own Wix binding. "Here" is doing real work — it says
594
+ // the limit is this surface, not their account and not Aria.
595
+ const unavailableText = () => res(
596
+ o.labels?.unavailable ?? `${assistant()} can't reach your Wix account from here.`,
597
+ );
531
598
  const promptList = () => res(o.prompts);
532
599
  const siteOf = o.siteId ?? (() => "");
533
600
  const resumeOf = o.resumeConversationId ?? inputConversationId;
@@ -686,12 +753,14 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
686
753
  } catch (e) {
687
754
  inFlightSend = null;
688
755
  return {
689
- ...base, status: "ready", statusText: "", _pending: "",
756
+ ...base, status: "ready", _pending: "",
690
757
  // `_siteId` moves with the id or neither does: a conversation remembered
691
758
  // without the site it belongs to reads as another business's on the next
692
759
  // send, and gets replaced instead of retried.
693
760
  _convId: convId, _siteId: convId === s._convId ? s._siteId : site,
694
- error: String((e as Error)?.message ?? e),
761
+ // Sets BOTH error and statusText, so it must come after the `statusText: ""`
762
+ // this object used to carry — otherwise the literal would blank the sentence.
763
+ ...failureSlots(e, unavailableText),
695
764
  };
696
765
  }
697
766
  }
@@ -756,7 +825,7 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
756
825
  messages: greetingOnly(), ...observed([]), prompts: promptList() };
757
826
  } catch (e) {
758
827
  // Even if create fails, show the greeting; submit retries the create.
759
- return { ...s, status: "ready", _convId: "", _siteId: site, _pending: "", error: String((e as Error)?.message ?? e),
828
+ return { ...s, status: "ready", _convId: "", _siteId: site, _pending: "", ...failureSlots(e, unavailableText),
760
829
  messages: greetingOnly(), ...observed([]), prompts: promptList() };
761
830
  }
762
831
  },
@@ -801,7 +870,7 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
801
870
  return slow({ ...s, status: "ready", _convId: conversationIdOf(res), _siteId: site, input: "", statusText: "", error: "",
802
871
  _pending: "", messages: greetingOnly(), ...observed([]), prompts: promptList(), ok: false });
803
872
  } catch (e) {
804
- return slow({ ...s, status: "ready", _convId: "", _siteId: site, input: "", error: String((e as Error)?.message ?? e),
873
+ return slow({ ...s, status: "ready", _convId: "", _siteId: site, input: "", ...failureSlots(e, unavailableText),
805
874
  _pending: "", messages: greetingOnly(), ...observed([]), prompts: promptList(), ok: false });
806
875
  }
807
876
  },
@@ -141,6 +141,13 @@ const core = createAriaChat({
141
141
  you: () => copyParam("ownerAria.you", "You"),
142
142
  typing: () => copyParam("ownerAria.typing", "Aria is typing…"),
143
143
  slow: () => copyParam("ownerAria.slow", "Aria is taking a while…"),
144
+ // Shown when the HOST carries no Wix app binding, so no Wix call can leave
145
+ // the browser (the web preview). Through copyParam like every other string
146
+ // here — a default baked into the shared core cannot be localized by this
147
+ // app's copy pack, and a non-English owner would have read this one line in
148
+ // English. Says no "sign in": the owner already is, and the missing piece is
149
+ // the app's binding, so there is no action for them to take.
150
+ unavailable: () => copyParam("ownerAria.unavailable", "Aria can't reach your Wix account from here."),
144
151
  },
145
152
  historyKey: "ol.aria.history.v1",
146
153
  // No local title cache in THIS app. __HIMI_APP_NAME__ is multi-account and
@@ -103,15 +103,15 @@ export default defineApp({
103
103
  "paramKeys": [
104
104
  "conversationId"
105
105
  ],
106
- "parentScreenId": "himi_owner_lite_manage",
107
- "tabId": "manage"
106
+ "parentScreenId": "",
107
+ "tabId": "aria"
108
108
  },
109
109
  {
110
110
  "screenId": "himi_owner_lite_aria_history",
111
111
  "isPublic": false,
112
112
  "paramKeys": [],
113
113
  "parentScreenId": "himi_owner_lite_aria",
114
- "tabId": "manage"
114
+ "tabId": "aria"
115
115
  },
116
116
  {
117
117
  "screenId": "himi_owner_lite_brief",
@@ -541,7 +541,7 @@ export default defineApp({
541
541
  "isPublic": false,
542
542
  "paramKeys": [],
543
543
  "parentScreenId": "",
544
- "tabId": "account"
544
+ "tabId": ""
545
545
  }
546
546
  ],
547
547
  "tabBar": {
@@ -553,6 +553,36 @@ export default defineApp({
553
553
  "icon": "home",
554
554
  "selectedIcon": "home_fill"
555
555
  },
556
+ {
557
+ "id": "aria",
558
+ "screenId": "himi_owner_lite_aria",
559
+ "label": "Aria",
560
+ "icon": "ai"
561
+ },
562
+ {
563
+ "id": "manage",
564
+ "screenId": "himi_owner_lite_manage",
565
+ "label": "Gym",
566
+ "icon": "grid",
567
+ "selectedIcon": "grid_fill"
568
+ }
569
+ ]
570
+ },
571
+ "sidebar": {
572
+ "items": [
573
+ {
574
+ "id": "home",
575
+ "screenId": "himi_owner_lite_home",
576
+ "label": "Floor",
577
+ "icon": "home",
578
+ "selectedIcon": "home_fill"
579
+ },
580
+ {
581
+ "id": "aria",
582
+ "screenId": "himi_owner_lite_aria",
583
+ "label": "Aria",
584
+ "icon": "ai"
585
+ },
556
586
  {
557
587
  "id": "manage",
558
588
  "screenId": "himi_owner_lite_manage",
@@ -50840,100 +50840,6 @@ const SCREENS = runtimeSetting({
50840
50840
  "haptic": "light",
50841
50841
  "accessibilityLabel": "himi_owner_lite.manage_analytics"
50842
50842
  }
50843
- },
50844
- {
50845
- "id": "",
50846
- "body": {
50847
- "package": "himalaya",
50848
- "type": "HStack",
50849
- "props": {
50850
- "spacing": 12,
50851
- "children": [
50852
- {
50853
- "id": "",
50854
- "body": {
50855
- "package": "himalaya",
50856
- "type": "HStack",
50857
- "props": {
50858
- "spacing": 12,
50859
- "children": [
50860
- {
50861
- "id": "",
50862
- "body": {
50863
- "package": "himalaya",
50864
- "type": "Icon",
50865
- "props": {
50866
- "name": "chat",
50867
- "size": 20,
50868
- "tint": "accentPrimary"
50869
- }
50870
- }
50871
- },
50872
- {
50873
- "id": "",
50874
- "body": {
50875
- "package": "himalaya",
50876
- "type": "Text",
50877
- "props": {
50878
- "text": "Ask Aria",
50879
- "style": "bodyEmphasis"
50880
- }
50881
- }
50882
- }
50883
- ]
50884
- }
50885
- }
50886
- },
50887
- {
50888
- "id": "",
50889
- "body": {
50890
- "package": "himalaya",
50891
- "type": "Spacer",
50892
- "props": {}
50893
- }
50894
- },
50895
- {
50896
- "id": "",
50897
- "body": {
50898
- "package": "himalaya",
50899
- "type": "Icon",
50900
- "props": {
50901
- "name": "chevron_right",
50902
- "size": 16,
50903
- "tint": "textTertiary"
50904
- }
50905
- }
50906
- }
50907
- ]
50908
- }
50909
- },
50910
- "modifiers": {
50911
- "background": {
50912
- "token": "surfaceElevated"
50913
- },
50914
- "border": {
50915
- "width": 1,
50916
- "color": {
50917
- "token": "border"
50918
- }
50919
- },
50920
- "cornerRadius": 12,
50921
- "padding": {
50922
- "leading": 14,
50923
- "trailing": 14,
50924
- "top": 14,
50925
- "bottom": 14
50926
- },
50927
- "onTap": {
50928
- "actionId": "himi.open",
50929
- "params": {
50930
- "screenId": "himi_owner_lite_aria"
50931
- }
50932
- },
50933
- "pressFeedback": "scale",
50934
- "haptic": "light",
50935
- "accessibilityLabel": "himi_owner_lite.manage_aria"
50936
- }
50937
50843
  }
50938
50844
  ]
50939
50845
  }