@wix/himalaya-cli 0.1146.0 → 0.1148.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/push/src/index.d.ts +6 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/sdk-types/src/capabilities.generated.d.ts +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/audio-record.mjs +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calendar.mjs +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calls.mjs +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/contacts.mjs +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/location.mjs +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/motion.mjs +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/photos.mjs +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/push.mjs +5 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdk-types.mjs +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/tasks.mjs +1 -1
- package/dist/cli.mjs +75 -20
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/headless-loop.md +34 -0
- package/guides/himi-mcp.md +2 -0
- package/guides/sdk-reference.json +6 -0
- package/guides/tier-5-add-a-screen.md +4 -2
- package/package.json +2 -2
- package/templates/beauty-salon/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/branded-lite/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/community-club/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/community-club-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/events-meetups/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/gym-fitness/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/nonprofit-cause/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/owner-lite/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/podcast-creator/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/portfolio-creative/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/restaurant/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/retail-store/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
- package/templates/yoga-studio/tier5-src/himi-branded-lite-home/index.ts +6 -1
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-home/index.ts +6 -1
package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/push/src/index.d.ts
CHANGED
|
@@ -37,6 +37,12 @@ export declare function getPermissionStatus(): Promise<PushPermission>;
|
|
|
37
37
|
/** Request the OS notification permission, prompting if still undetermined.
|
|
38
38
|
* Resolves with the resulting status. */
|
|
39
39
|
export declare function requestPermission(): Promise<PushPermission>;
|
|
40
|
+
/** Open this app's notification settings in the OS (iOS 16+: the app's Notifications pane;
|
|
41
|
+
* Android 8+: the app's notification settings; earlier: the app's settings page). The only
|
|
42
|
+
* way back after a denial — once denied, `requestPermission()` can never prompt again — so
|
|
43
|
+
* offer it when `getPermissionStatus()` is "denied". Resolves `true` when the OS opened it.
|
|
44
|
+
* It does not report the outcome; re-read `getPermissionStatus()` when the app returns. */
|
|
45
|
+
export declare function openSettings(): Promise<boolean>;
|
|
40
46
|
/** Schedule a local (on-device) notification. Resolves with its id. */
|
|
41
47
|
export declare function scheduleLocal(options: ScheduleLocalOptions): Promise<{
|
|
42
48
|
id: string;
|
|
@@ -26,7 +26,7 @@ export declare const CAPABILITY_REGISTRY: {
|
|
|
26
26
|
readonly pdf: readonly ["isAvailable", "open"];
|
|
27
27
|
readonly photos: readonly ["getSavePermissionStatus", "pick", "saveToLibrary"];
|
|
28
28
|
readonly presigned_upload: readonly ["put", "putFile"];
|
|
29
|
-
readonly push: readonly ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"];
|
|
29
|
+
readonly push: readonly ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"];
|
|
30
30
|
readonly release_control: readonly ["active", "available", "list", "select"];
|
|
31
31
|
readonly secure_storage: readonly ["availability", "read", "remove", "write"];
|
|
32
32
|
readonly share: readonly ["availability", "share"];
|
|
@@ -41,7 +41,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
41
41
|
"pdf": ["isAvailable", "open"],
|
|
42
42
|
"photos": ["getSavePermissionStatus", "pick", "saveToLibrary"],
|
|
43
43
|
"presigned_upload": ["put", "putFile"],
|
|
44
|
-
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"],
|
|
44
|
+
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"],
|
|
45
45
|
"release_control": ["active", "available", "list", "select"],
|
|
46
46
|
"secure_storage": ["availability", "read", "remove", "write"],
|
|
47
47
|
"share": ["availability", "share"],
|
|
@@ -41,7 +41,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
41
41
|
"pdf": ["isAvailable", "open"],
|
|
42
42
|
"photos": ["getSavePermissionStatus", "pick", "saveToLibrary"],
|
|
43
43
|
"presigned_upload": ["put", "putFile"],
|
|
44
|
-
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"],
|
|
44
|
+
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"],
|
|
45
45
|
"release_control": ["active", "available", "list", "select"],
|
|
46
46
|
"secure_storage": ["availability", "read", "remove", "write"],
|
|
47
47
|
"share": ["availability", "share"],
|
|
@@ -41,7 +41,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
41
41
|
"pdf": ["isAvailable", "open"],
|
|
42
42
|
"photos": ["getSavePermissionStatus", "pick", "saveToLibrary"],
|
|
43
43
|
"presigned_upload": ["put", "putFile"],
|
|
44
|
-
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"],
|
|
44
|
+
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"],
|
|
45
45
|
"release_control": ["active", "available", "list", "select"],
|
|
46
46
|
"secure_storage": ["availability", "read", "remove", "write"],
|
|
47
47
|
"share": ["availability", "share"],
|
|
@@ -41,7 +41,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
41
41
|
"pdf": ["isAvailable", "open"],
|
|
42
42
|
"photos": ["getSavePermissionStatus", "pick", "saveToLibrary"],
|
|
43
43
|
"presigned_upload": ["put", "putFile"],
|
|
44
|
-
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"],
|
|
44
|
+
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"],
|
|
45
45
|
"release_control": ["active", "available", "list", "select"],
|
|
46
46
|
"secure_storage": ["availability", "read", "remove", "write"],
|
|
47
47
|
"share": ["availability", "share"],
|
|
@@ -41,7 +41,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
41
41
|
"pdf": ["isAvailable", "open"],
|
|
42
42
|
"photos": ["getSavePermissionStatus", "pick", "saveToLibrary"],
|
|
43
43
|
"presigned_upload": ["put", "putFile"],
|
|
44
|
-
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"],
|
|
44
|
+
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"],
|
|
45
45
|
"release_control": ["active", "available", "list", "select"],
|
|
46
46
|
"secure_storage": ["availability", "read", "remove", "write"],
|
|
47
47
|
"share": ["availability", "share"],
|
|
@@ -41,7 +41,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
41
41
|
"pdf": ["isAvailable", "open"],
|
|
42
42
|
"photos": ["getSavePermissionStatus", "pick", "saveToLibrary"],
|
|
43
43
|
"presigned_upload": ["put", "putFile"],
|
|
44
|
-
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"],
|
|
44
|
+
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"],
|
|
45
45
|
"release_control": ["active", "available", "list", "select"],
|
|
46
46
|
"secure_storage": ["availability", "read", "remove", "write"],
|
|
47
47
|
"share": ["availability", "share"],
|
|
@@ -41,7 +41,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
41
41
|
"pdf": ["isAvailable", "open"],
|
|
42
42
|
"photos": ["getSavePermissionStatus", "pick", "saveToLibrary"],
|
|
43
43
|
"presigned_upload": ["put", "putFile"],
|
|
44
|
-
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"],
|
|
44
|
+
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"],
|
|
45
45
|
"release_control": ["active", "available", "list", "select"],
|
|
46
46
|
"secure_storage": ["availability", "read", "remove", "write"],
|
|
47
47
|
"share": ["availability", "share"],
|
|
@@ -22,6 +22,10 @@ async function requestPermission() {
|
|
|
22
22
|
const r = await dispatch("capability.push.requestPermission");
|
|
23
23
|
return normalizePermission(r?.status);
|
|
24
24
|
}
|
|
25
|
+
async function openSettings() {
|
|
26
|
+
const r = await dispatch("capability.push.openSettings");
|
|
27
|
+
return r?.opened === true;
|
|
28
|
+
}
|
|
25
29
|
async function scheduleLocal(options) {
|
|
26
30
|
const params = {
|
|
27
31
|
title: options.title ?? "",
|
|
@@ -99,6 +103,7 @@ export {
|
|
|
99
103
|
getDeviceToken,
|
|
100
104
|
getPermissionStatus,
|
|
101
105
|
listDelivered,
|
|
106
|
+
openSettings,
|
|
102
107
|
readNotificationEvent,
|
|
103
108
|
requestPermission,
|
|
104
109
|
scheduleLocal,
|
|
@@ -26,7 +26,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
26
26
|
"pdf": ["isAvailable", "open"],
|
|
27
27
|
"photos": ["getSavePermissionStatus", "pick", "saveToLibrary"],
|
|
28
28
|
"presigned_upload": ["put", "putFile"],
|
|
29
|
-
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"],
|
|
29
|
+
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"],
|
|
30
30
|
"release_control": ["active", "available", "list", "select"],
|
|
31
31
|
"secure_storage": ["availability", "read", "remove", "write"],
|
|
32
32
|
"share": ["availability", "share"],
|
|
@@ -41,7 +41,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
41
41
|
"pdf": ["isAvailable", "open"],
|
|
42
42
|
"photos": ["getSavePermissionStatus", "pick", "saveToLibrary"],
|
|
43
43
|
"presigned_upload": ["put", "putFile"],
|
|
44
|
-
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "requestPermission", "scheduleLocal", "setBadge"],
|
|
44
|
+
"push": ["cancelAllLocal", "cancelLocal", "clearDelivered", "getBadge", "getDeviceToken", "getPermissionStatus", "listDelivered", "openSettings", "requestPermission", "scheduleLocal", "setBadge"],
|
|
45
45
|
"release_control": ["active", "available", "list", "select"],
|
|
46
46
|
"secure_storage": ["availability", "read", "remove", "write"],
|
|
47
47
|
"share": ["availability", "share"],
|
package/dist/cli.mjs
CHANGED
|
@@ -6791,7 +6791,6 @@ function resolveTranslation(value, catalog, sourceCatalog) {
|
|
|
6791
6791
|
var BINDING_SIGILS, BINDING_SIGIL_RE, TRANSLATION_PREFIX, TRANSLATION_KEY_RE;
|
|
6792
6792
|
var init_bindings = __esm({
|
|
6793
6793
|
"../../core/ts/src/bindings.ts"() {
|
|
6794
|
-
"use strict";
|
|
6795
6794
|
BINDING_SIGILS = ["service", "flag", "item", "t"];
|
|
6796
6795
|
BINDING_SIGIL_RE = new RegExp(
|
|
6797
6796
|
`^\\$(?:${BINDING_SIGILS.filter((s) => s !== "t").join("|")})\\b|^\\$t:`
|
|
@@ -56159,6 +56158,56 @@ ${log}` : ""}`, true);
|
|
|
56159
56158
|
return r.code === 0 && r.json && typeof r.json === "object" && !Array.isArray(r.json) ? { ...res, structuredContent: r.json } : res;
|
|
56160
56159
|
}
|
|
56161
56160
|
},
|
|
56161
|
+
{
|
|
56162
|
+
name: "himi_logs",
|
|
56163
|
+
title: "Worker console logs",
|
|
56164
|
+
description: "What the app's Tier-5 workers printed with `console.log/info/warn/error` at runtime, in the web preview, Himi Player or the native app \u2014 read back from the serve plane. The CONSOLE channel only: failed actions and `error_logged` events are on himi_telemetry. To watch a flow, interact with the preview, then call again with `since` = the last `seq` you saw. A draft release's logs are readable as-is; a live release's need a telemetry token configured for the CLI (`HIMI_TELEMETRY_TOKEN`) \u2014 himi_login does not provide one, so on a 403 tell the user.",
|
|
56165
|
+
annotations: READ_PLANE,
|
|
56166
|
+
inputSchema: z2.object({ app: APP_ID, release: RELEASE_ID.optional(), screen: z2.string().optional().describe("Only lines from this screen id."), level: LOG_LEVEL, since: SINCE, limit: LIMIT }),
|
|
56167
|
+
handler: async (a, d) => fromCli(await d.runCli([
|
|
56168
|
+
"logs",
|
|
56169
|
+
"--app",
|
|
56170
|
+
String(a.app),
|
|
56171
|
+
...opt("--release", a.release),
|
|
56172
|
+
...opt("--screen", a.screen),
|
|
56173
|
+
...opt("--level", a.level),
|
|
56174
|
+
...opt("--since", a.since),
|
|
56175
|
+
...opt("--limit", a.limit),
|
|
56176
|
+
...opt("--target", d.login.target())
|
|
56177
|
+
]))
|
|
56178
|
+
},
|
|
56179
|
+
{
|
|
56180
|
+
name: "himi_telemetry",
|
|
56181
|
+
title: "Runtime telemetry for a release",
|
|
56182
|
+
description: "A release's runtime telemetry from the serve plane: the EVENT stream (screen views, `action_failed`, `error_logged`, `worker_console`, \u2026) plus the worker console lines, each with a `seq` cursor. The first place to look when a screen misbehaves at runtime but validate/test pass. `type` narrows to one event (e.g. `action_failed`); `crashes` adds crash reports. The two channels count separately: to read only what is new, pass the returned `cursor` as `since` and `logCursor` as `logSince`. Same access rule as himi_logs: a draft is readable as-is, a live release needs `HIMI_TELEMETRY_TOKEN`.",
|
|
56183
|
+
annotations: READ_PLANE,
|
|
56184
|
+
inputSchema: z2.object({
|
|
56185
|
+
app: APP_ID,
|
|
56186
|
+
release: RELEASE_ID.min(1),
|
|
56187
|
+
screen: z2.string().optional().describe("Only rows from this screen id."),
|
|
56188
|
+
type: z2.string().optional().describe("Only events of this type, e.g. `action_failed` or `error_logged`."),
|
|
56189
|
+
level: LOG_LEVEL,
|
|
56190
|
+
since: z2.number().int().min(0).optional().describe("Only EVENTS after this `seq` \u2014 the `cursor` a previous call returned."),
|
|
56191
|
+
logSince: z2.number().int().min(0).optional().describe("Only console LINES after this `seq` \u2014 the `logCursor` a previous call returned. Omitted: the console channel is read from `since` too, which only lines up on a first read."),
|
|
56192
|
+
limit: LIMIT,
|
|
56193
|
+
crashes: z2.boolean().optional().describe("Also return crash reports.")
|
|
56194
|
+
}),
|
|
56195
|
+
handler: async (a, d) => fromCli(await d.runCli([
|
|
56196
|
+
"telemetry",
|
|
56197
|
+
"--app",
|
|
56198
|
+
String(a.app),
|
|
56199
|
+
"--release",
|
|
56200
|
+
String(a.release),
|
|
56201
|
+
...opt("--screen", a.screen),
|
|
56202
|
+
...opt("--type", a.type),
|
|
56203
|
+
...opt("--level", a.level),
|
|
56204
|
+
...opt("--since", a.since),
|
|
56205
|
+
...opt("--log-since", a.logSince),
|
|
56206
|
+
...opt("--limit", a.limit),
|
|
56207
|
+
...sw("--crashes", a.crashes),
|
|
56208
|
+
...opt("--target", d.login.target())
|
|
56209
|
+
]))
|
|
56210
|
+
},
|
|
56162
56211
|
{
|
|
56163
56212
|
name: "himi_preview_links",
|
|
56164
56213
|
title: "Preview links for a release",
|
|
@@ -56176,7 +56225,7 @@ ${log}` : ""}`, true);
|
|
|
56176
56225
|
}
|
|
56177
56226
|
];
|
|
56178
56227
|
}
|
|
56179
|
-
var MAX_TEXT2, clip, text6, json3, opt, sw, DIR2, LEARN, CHECK, LOCAL_WRITE, PUBLISH, PREVIEW_HINT, LOGIN_HINT, PATH_ARGS;
|
|
56228
|
+
var MAX_TEXT2, clip, text6, json3, opt, sw, DIR2, LEARN, CHECK, LOCAL_WRITE, PUBLISH, READ_PLANE, APP_ID, RELEASE_ID, LOG_LEVEL, SINCE, LIMIT, PREVIEW_HINT, LOGIN_HINT, PATH_ARGS;
|
|
56180
56229
|
var init_tools = __esm({
|
|
56181
56230
|
"src/mcp/tools.ts"() {
|
|
56182
56231
|
init_file_tools();
|
|
@@ -56192,6 +56241,12 @@ var init_tools = __esm({
|
|
|
56192
56241
|
CHECK = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
56193
56242
|
LOCAL_WRITE = { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
56194
56243
|
PUBLISH = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true };
|
|
56244
|
+
READ_PLANE = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true };
|
|
56245
|
+
APP_ID = z2.string().min(1).describe("The app id as published (`himalaya.content.json` `appId`).");
|
|
56246
|
+
RELEASE_ID = z2.string().describe("The release id \u2014 e.g. the draft `himi_push` returned.");
|
|
56247
|
+
LOG_LEVEL = z2.enum(["log", "info", "warn", "error", "debug"]).optional().describe("Keep only console lines at this level.");
|
|
56248
|
+
SINCE = z2.number().int().min(0).optional().describe("Only rows after this `seq` cursor \u2014 pass the last `seq` you saw to read just what is new.");
|
|
56249
|
+
LIMIT = z2.number().int().min(1).max(2e3).optional().describe("At most this many rows.");
|
|
56195
56250
|
PREVIEW_HINT = "The preview is already running: open `url` in your built-in browser \u2014 Claude Code desktop's browser pane, Cursor's Browser tool, the Browser in Codex inside the ChatGPT desktop app, VS Code's integrated browser. Do not also start the `himi-preview` launch configuration: it serves the same port, and is the way to start a preview only when none is running. A terminal-only agent should show the owner `himi_render` PNGs instead. `board` (when present) is the build board on the same origin.";
|
|
56196
56251
|
LOGIN_HINT = "Not signed in to the himi serve plane. Call himi_login: it opens a browser window where the user signs in to Wix (this server never sees the credential). A user with a terminal can run `himi login --browser` instead. Then retry.";
|
|
56197
56252
|
PATH_ARGS = ["dir", "parentDir", "file", "out"];
|
|
@@ -59032,21 +59087,21 @@ var init_preview_assets_generated = __esm({
|
|
|
59032
59087
|
"../../packages/serve/src/preview-assets.generated.ts"() {
|
|
59033
59088
|
init_preview_assets_format();
|
|
59034
59089
|
PREVIEW_ASSET_MANIFEST = [
|
|
59035
|
-
{ key: "assets/index-
|
|
59036
|
-
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset:
|
|
59037
|
-
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset:
|
|
59038
|
-
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset:
|
|
59039
|
-
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
59040
|
-
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset:
|
|
59041
|
-
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset:
|
|
59042
|
-
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
59043
|
-
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset:
|
|
59044
|
-
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
59045
|
-
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset:
|
|
59046
|
-
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset:
|
|
59047
|
-
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
59048
|
-
{ key: "index.html", contentType: "text/html; charset=utf-8", offset:
|
|
59049
|
-
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset:
|
|
59090
|
+
{ key: "assets/index-DmgAgpqU.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 1106099, sha256: "b9a50991da0d7ccf02a7a3adfaf7c5151e96d20ba88c48f5d18035e3e0581147" },
|
|
59091
|
+
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 1106107, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
|
|
59092
|
+
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 1110717, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
|
|
59093
|
+
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 1599301, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
|
|
59094
|
+
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1690225, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
|
|
59095
|
+
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1781209, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
|
|
59096
|
+
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1872189, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
|
|
59097
|
+
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 1963061, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
|
|
59098
|
+
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 2054041, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
|
|
59099
|
+
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 2162677, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
|
|
59100
|
+
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 2271761, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
|
|
59101
|
+
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 2380809, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
|
|
59102
|
+
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 2488509, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
|
|
59103
|
+
{ key: "index.html", contentType: "text/html; charset=utf-8", offset: 2576617, length: 4947, sha256: "1a1b2faf9584d7b41d338d5ff54c4eb0d1cbf7f1a63efd9abe30339f5ff55c94" },
|
|
59104
|
+
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 2581564, length: 17209, sha256: "dffc9718e2faa63ae2cc919e0a842f585ed565aaaa7c53778e90379442c731b6" }
|
|
59050
59105
|
];
|
|
59051
59106
|
}
|
|
59052
59107
|
});
|
|
@@ -64781,7 +64836,7 @@ async function visitorPass(url, siteFetch) {
|
|
|
64781
64836
|
}
|
|
64782
64837
|
return { identity, routes: routes.slice(0, MAX_ROUTES), gaps };
|
|
64783
64838
|
}
|
|
64784
|
-
var MAX_HTML_BYTES, MAX_BUNDLE_BYTES, MAX_BUNDLES, MAX_ROUTES,
|
|
64839
|
+
var MAX_HTML_BYTES, MAX_BUNDLE_BYTES, MAX_BUNDLES, MAX_ROUTES, APP_ID2, attr, decodeEntities;
|
|
64785
64840
|
var init_visitor = __esm({
|
|
64786
64841
|
"src/base44-analyze/visitor.ts"() {
|
|
64787
64842
|
init_write_artifacts();
|
|
@@ -64789,7 +64844,7 @@ var init_visitor = __esm({
|
|
|
64789
64844
|
MAX_BUNDLE_BYTES = 8 * 1024 * 1024;
|
|
64790
64845
|
MAX_BUNDLES = 4;
|
|
64791
64846
|
MAX_ROUTES = 80;
|
|
64792
|
-
|
|
64847
|
+
APP_ID2 = /^[a-f0-9]{24}$/;
|
|
64793
64848
|
attr = (tag, name) => {
|
|
64794
64849
|
const m = new RegExp(`\\b${name}\\s*=\\s*("([^"]*)"|'([^']*)')`, "i").exec(tag);
|
|
64795
64850
|
return m ? m[2] ?? m[3] : void 0;
|
|
@@ -64813,7 +64868,7 @@ async function analyzeBase44(input, ports) {
|
|
|
64813
64868
|
const appId2 = input.appId?.trim() || void 0;
|
|
64814
64869
|
const sample = input.sample ?? DEFAULT_SAMPLE_ROWS;
|
|
64815
64870
|
if (!url && !appId2) throw new Base44InputError("himi base44 analyze needs --url (visitor pass) or --app-id (owner pass)");
|
|
64816
|
-
if (appId2 && !
|
|
64871
|
+
if (appId2 && !APP_ID2.test(appId2)) throw new Base44InputError(`--app-id must be a 24-character hex Base44 app id, got ${JSON.stringify(appId2)}`);
|
|
64817
64872
|
if (!Number.isInteger(sample) || sample < 0 || sample > 100) throw new Base44InputError("--sample must be an integer from 0 to 100");
|
|
64818
64873
|
const owner = !!appId2 && !!ports.token;
|
|
64819
64874
|
if (appId2 && !ports.token) {
|
|
Binary file
|
package/guides/headless-loop.md
CHANGED
|
@@ -432,6 +432,40 @@ navigation/error, crash, and worker-console events from the pinned draft release
|
|
|
432
432
|
screen/type and cursorable with `--since` / `--follow`. `himi logs` remains the narrow
|
|
433
433
|
console-only view for `console.log(...)` output.
|
|
434
434
|
|
|
435
|
+
Over MCP the same two reads are `himi_telemetry` and `himi_logs` (pass the last `seq` you saw
|
|
436
|
+
as `since` to read only what is new).
|
|
437
|
+
|
|
438
|
+
### Logging from a worker
|
|
439
|
+
|
|
440
|
+
There is no logging SDK to import: a worker's plain `console.log/info/warn/error` **is** the log
|
|
441
|
+
channel, on every surface. In the web preview each line lands in the DEV panel's **Console** tab
|
|
442
|
+
(with the worker's boot errors, failed actions and uncaught errors); on every surface it ships as a
|
|
443
|
+
`worker_console` event that `himi logs` / `himi_logs` read back.
|
|
444
|
+
|
|
445
|
+
```ts
|
|
446
|
+
try {
|
|
447
|
+
products = await loadProducts();
|
|
448
|
+
} catch (e) {
|
|
449
|
+
// The status code only — never String(e): a Wix failure carries part of the response body.
|
|
450
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
451
|
+
console.warn("[catalog.load] products failed, showing cached", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
452
|
+
products = cached;
|
|
453
|
+
}
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
- **Prefix with `[service.action]`** so a line names its source when many screens log.
|
|
457
|
+
- **Log decisions, not every step:** a load that failed, a fallback taken, an unexpected shape.
|
|
458
|
+
Native samples console lines and a chatty worker drowns the one that matters.
|
|
459
|
+
- **Never log tokens, emails or other personal data** — the lines are stored on the plane. That
|
|
460
|
+
includes a raw caught error: a Wix failure carries part of the upstream response body, so log a
|
|
461
|
+
status or code (as above), not `String(e)`.
|
|
462
|
+
- **Two channels:** `himi logs` is console lines only. A failed action arrives as
|
|
463
|
+
`action_failed` + `error_logged` on the EVENT stream — read it with
|
|
464
|
+
`himi telemetry --app <app> --release <id> --type action_failed`.
|
|
465
|
+
- **The DEV panel's "N errors" chip** totals every tab (failed network calls, SDK faults, failed
|
|
466
|
+
actions, error telemetry, console errors) and says which; a Console count of 0 next to errors
|
|
467
|
+
means they are on those other tabs.
|
|
468
|
+
|
|
435
469
|
## 7. Promote
|
|
436
470
|
|
|
437
471
|
```sh
|
package/guides/himi-mcp.md
CHANGED
|
@@ -77,6 +77,8 @@ runs a session with it.
|
|
|
77
77
|
| `himi_login` | Open a browser window where the user signs in to Wix, so publishing works with no terminal. It returns the sign-in link at once; call it again to see whether the sign-in finished. |
|
|
78
78
|
| `himi_push` | Publish a **draft**: private to the owner, viewable by preview link and in Himi Player, not live. |
|
|
79
79
|
| `himi_share`, `himi_preview_links` | Share links for a published release. |
|
|
80
|
+
| `himi_logs` | What the app's workers printed with `console.*` at runtime (preview, Himi Player, device) — what `himi logs` shows. Read-only. |
|
|
81
|
+
| `himi_telemetry` | A release's runtime event stream — screen views, `action_failed`, `error_logged`, crashes — plus the console lines. Read-only. |
|
|
80
82
|
| `himi_base44_analyze` | Read a Base44 app into an app book (read-only) and return it as structured content — `himi docs base44-app-context`. |
|
|
81
83
|
|
|
82
84
|
Each tool acts on the agent's workspace folder unless it is given a `dir`.
|
|
@@ -2646,6 +2646,12 @@
|
|
|
2646
2646
|
"jsdoc": "/** Request the OS notification permission, prompting if still undetermined.\n * Resolves with the resulting status. */",
|
|
2647
2647
|
"decl": "export async function requestPermission(): Promise<PushPermission>;"
|
|
2648
2648
|
},
|
|
2649
|
+
{
|
|
2650
|
+
"name": "openSettings",
|
|
2651
|
+
"kind": "function",
|
|
2652
|
+
"jsdoc": "/** Open this app's notification settings in the OS (iOS 16+: the app's Notifications pane;\n * Android 8+: the app's notification settings; earlier: the app's settings page). The only\n * way back after a denial — once denied, `requestPermission()` can never prompt again — so\n * offer it when `getPermissionStatus()` is \"denied\". Resolves `true` when the OS opened it.\n * It does not report the outcome; re-read `getPermissionStatus()` when the app returns. */",
|
|
2653
|
+
"decl": "export async function openSettings(): Promise<boolean>;"
|
|
2654
|
+
},
|
|
2649
2655
|
{
|
|
2650
2656
|
"name": "scheduleLocal",
|
|
2651
2657
|
"kind": "function",
|
|
@@ -463,8 +463,10 @@ surface (web, iOS, Android, and the local `himi test` / `himi render --live` loo
|
|
|
463
463
|
`_error`. Nothing is invented.
|
|
464
464
|
2. **It emits `action_failed`** (`{ actionId: "tier5.<service>.<action>", source:
|
|
465
465
|
"worker", error }` — the same payload the dispatcher emits for a failed dispatch)
|
|
466
|
-
plus the `error_logged` central-log line, so the message reaches telemetry
|
|
467
|
-
`himi
|
|
466
|
+
plus the `error_logged` central-log line, so the message reaches the telemetry
|
|
467
|
+
EVENT stream (`himi telemetry --app <app> --release <id> --type action_failed`; not `himi logs`, which is the
|
|
468
|
+
`console.*` channel only) and, in the web preview, the DEV panel's Console tab,
|
|
469
|
+
instead of vanishing.
|
|
468
470
|
3. **It re-throws.** The failure is made *visible*, not caught and continued: an
|
|
469
471
|
awaiting bundle and the host's `unhandledrejection` net keep every signal they had.
|
|
470
472
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1148.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": [
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"artifactId": "himalaya-cli"
|
|
68
68
|
}
|
|
69
69
|
},
|
|
70
|
-
"falconPackageHash": "
|
|
70
|
+
"falconPackageHash": "52e86f230b8cc57583d2c24e85aac3657e75223799125f992e6f2df3"
|
|
71
71
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|
|
@@ -508,7 +508,12 @@ async function fetchBookingsSignal(arg: unknown): Promise<BookingsSignal> {
|
|
|
508
508
|
try {
|
|
509
509
|
const response = await queryServices({ query: { paging: { limit: 50 } } });
|
|
510
510
|
return bookingsSignal(response.services ?? []);
|
|
511
|
-
} catch {
|
|
511
|
+
} catch (e) {
|
|
512
|
+
// The block collapses without a word on screen, so say why where an agent looks:
|
|
513
|
+
// the DEV panel's Console tab and `himi logs`. The status only — a Wix failure's
|
|
514
|
+
// message carries part of the upstream body, which may hold personal data.
|
|
515
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
516
|
+
console.warn("[home.bookings] services query failed; showcase hidden", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
512
517
|
return emptyBookingsSignal();
|
|
513
518
|
}
|
|
514
519
|
}
|
|
@@ -309,7 +309,12 @@ async function measuredRevenue7d(
|
|
|
309
309
|
if (typeof measure.total === "number") return measure.total;
|
|
310
310
|
const values = measure.values ?? [];
|
|
311
311
|
return values.length ? values.reduce((sum, v) => sum + (v.value || 0), 0) : undefined;
|
|
312
|
-
} catch {
|
|
312
|
+
} catch (e) {
|
|
313
|
+
// The fallback is silent on screen (Home shows the order-row sum), so say it where
|
|
314
|
+
// an agent looks: the DEV panel's Console tab and `himi logs`. The status only — a Wix
|
|
315
|
+
// failure's message carries part of the upstream body, which may hold personal data.
|
|
316
|
+
const status = (e as { status?: unknown } | null)?.status ?? /\bHTTP (\d{3})\b/.exec(String(e))?.[1];
|
|
317
|
+
console.warn("[home.revenue] analytics failed; showing the order-row sum", status !== undefined ? `HTTP ${String(status)}` : "");
|
|
313
318
|
return undefined;
|
|
314
319
|
}
|
|
315
320
|
}
|