@wix/himalaya-cli 0.970.0 → 0.972.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/stdlib/wix-sdk/genie-chat/src/index.d.ts +12 -0
- package/dist/cli.mjs +196 -161
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/sdk-reference.json +7 -1
- package/guides/tier-5-add-a-screen.md +8 -4
- package/package.json +2 -2
- package/templates/beauty-salon-owner/config.ts +1 -1
- package/templates/beauty-salon-owner/dev/index.ts +79 -1
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/community-club-owner/config.ts +1 -1
- package/templates/community-club-owner/dev/index.ts +79 -1
- package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/community-club-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/events-meetups-owner/config.ts +1 -1
- package/templates/events-meetups-owner/dev/index.ts +79 -1
- package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/gym-fitness-owner/config.ts +1 -1
- package/templates/gym-fitness-owner/dev/index.ts +79 -1
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/nonprofit-cause-owner/config.ts +1 -1
- package/templates/nonprofit-cause-owner/dev/index.ts +79 -1
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/owner-lite/config.ts +1 -1
- package/templates/owner-lite/dev/index.ts +79 -1
- package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/owner-lite/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/podcast-creator-owner/config.ts +1 -1
- package/templates/podcast-creator-owner/dev/index.ts +79 -1
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/portfolio-creative-owner/config.ts +1 -1
- package/templates/portfolio-creative-owner/dev/index.ts +79 -1
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/restaurant-owner/config.ts +1 -1
- package/templates/restaurant-owner/dev/index.ts +79 -1
- package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/retail-store-owner/config.ts +1 -1
- package/templates/retail-store-owner/dev/index.ts +79 -1
- package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
- package/templates/yoga-studio-owner/config.ts +1 -1
- package/templates/yoga-studio-owner/dev/index.ts +79 -1
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +238 -11
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-aria/index.ts +15 -0
|
@@ -34,11 +34,23 @@ export declare function isGenieChatError(e: unknown): e is GenieChatError;
|
|
|
34
34
|
declare function wixCall<T>(method: string, path: string, body?: unknown): Promise<T>;
|
|
35
35
|
export type MessageRole = "UNKNOWN" | "USER" | "ASSISTANT";
|
|
36
36
|
export type CommunicationMode = "UNKNOWN" | "POLLING" | "REAL_TIME";
|
|
37
|
+
/** Where the service is with one message. `STATUS_PENDING` on an ASSISTANT row
|
|
38
|
+
* means the agent is still writing it: whatever `content` holds so far is a
|
|
39
|
+
* draft, not the answer. Open-ended because the wire may grow values.
|
|
40
|
+
*
|
|
41
|
+
* Taken from the service's published message entity (the generated
|
|
42
|
+
* `genie-chat-service-v1` client in `wix-private/aria-native-apps`), where the
|
|
43
|
+
* native Aria app ends a turn ONLY on a polled `STATUS_COMPLETED`, and resumes a
|
|
44
|
+
* conversation whose newest assistant row is still pending. Not observed on
|
|
45
|
+
* this repo's own captures, which is why it is optional and every consumer
|
|
46
|
+
* must treat an absent status as "settled". */
|
|
47
|
+
export type MessageStatus = "STATUS_UNSPECIFIED" | "STATUS_PENDING" | "STATUS_COMPLETED" | (string & {});
|
|
37
48
|
export interface ConversationMessage {
|
|
38
49
|
id?: string;
|
|
39
50
|
content?: string;
|
|
40
51
|
role?: MessageRole;
|
|
41
52
|
createdDate?: string;
|
|
53
|
+
status?: MessageStatus;
|
|
42
54
|
}
|
|
43
55
|
/** Which assistant the conversation talks to. The real dashboard sends a
|
|
44
56
|
* `unifiedAssistantReference`; helper `ariaAssistantConfig()` builds it. */
|
package/dist/cli.mjs
CHANGED
|
@@ -5290,7 +5290,6 @@ function resolveTranslation(value, catalog, sourceCatalog) {
|
|
|
5290
5290
|
var BINDING_SIGILS, BINDING_SIGIL_RE, TRANSLATION_PREFIX, TRANSLATION_KEY_RE;
|
|
5291
5291
|
var init_bindings = __esm({
|
|
5292
5292
|
"../../core/ts/src/bindings.ts"() {
|
|
5293
|
-
"use strict";
|
|
5294
5293
|
BINDING_SIGILS = ["service", "flag", "item", "t"];
|
|
5295
5294
|
BINDING_SIGIL_RE = new RegExp(
|
|
5296
5295
|
`^\\$(?:${BINDING_SIGILS.filter((s) => s !== "t").join("|")})\\b|^\\$t:`
|
|
@@ -43592,19 +43591,19 @@ var init_preview_assets_generated = __esm({
|
|
|
43592
43591
|
"../../packages/serve/src/preview-assets.generated.ts"() {
|
|
43593
43592
|
init_preview_assets_format();
|
|
43594
43593
|
PREVIEW_ASSET_MANIFEST = [
|
|
43595
|
-
{ key: "assets/index-
|
|
43596
|
-
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset:
|
|
43597
|
-
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
43598
|
-
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset:
|
|
43599
|
-
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset:
|
|
43600
|
-
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
43601
|
-
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset:
|
|
43602
|
-
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
43603
|
-
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset:
|
|
43604
|
-
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset:
|
|
43605
|
-
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
43606
|
-
{ key: "index.html", contentType: "text/html; charset=utf-8", offset:
|
|
43607
|
-
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset:
|
|
43594
|
+
{ key: "assets/index-CRa9DnKn.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 985527, sha256: "1c58488280b45b11e8bbe7fa084de9f7413518465af6e7c9fea5c200befef90b" },
|
|
43595
|
+
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 985535, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
|
|
43596
|
+
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1076459, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
|
|
43597
|
+
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1167443, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
|
|
43598
|
+
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1258423, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
|
|
43599
|
+
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 1349295, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
|
|
43600
|
+
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 1440275, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
|
|
43601
|
+
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 1548911, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
|
|
43602
|
+
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 1657995, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
|
|
43603
|
+
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 1767043, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
|
|
43604
|
+
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 1874743, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
|
|
43605
|
+
{ key: "index.html", contentType: "text/html; charset=utf-8", offset: 1962851, length: 4448, sha256: "4cb74dd5b24622561a40f778caca44cb69451235a60d393f210d026f27bd51f6" },
|
|
43606
|
+
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 1967299, length: 13784, sha256: "cfb9465254fab84f0e084bb4542c282758ea29774b5f172840cc0b9e4194ef89" }
|
|
43608
43607
|
];
|
|
43609
43608
|
}
|
|
43610
43609
|
});
|
|
@@ -44150,7 +44149,7 @@ async function runStore(pos, flags, io, deps) {
|
|
|
44150
44149
|
}
|
|
44151
44150
|
let findings;
|
|
44152
44151
|
try {
|
|
44153
|
-
findings = await deps.preflightApp(app);
|
|
44152
|
+
findings = await deps.preflightApp(app, { profileFlag: str2(flags.profile) });
|
|
44154
44153
|
} catch (e) {
|
|
44155
44154
|
return fail2(e.message);
|
|
44156
44155
|
}
|
|
@@ -44423,6 +44422,125 @@ var init_preflight = __esm({
|
|
|
44423
44422
|
}
|
|
44424
44423
|
});
|
|
44425
44424
|
|
|
44425
|
+
// ../store-release/credential-profile.ts
|
|
44426
|
+
var credential_profile_exports = {};
|
|
44427
|
+
__export(credential_profile_exports, {
|
|
44428
|
+
credentialEnv: () => credentialEnv,
|
|
44429
|
+
credentialsDir: () => credentialsDir,
|
|
44430
|
+
maskIssuer: () => maskIssuer,
|
|
44431
|
+
namedProfile: () => namedProfile,
|
|
44432
|
+
parseProfile: () => parseProfile,
|
|
44433
|
+
profilePath: () => profilePath,
|
|
44434
|
+
resolveStoreCredentials: () => resolveStoreCredentials
|
|
44435
|
+
});
|
|
44436
|
+
import { existsSync as existsSync50, readFileSync as readFileSync57 } from "node:fs";
|
|
44437
|
+
import { homedir as homedir6 } from "node:os";
|
|
44438
|
+
import { join as join47 } from "node:path";
|
|
44439
|
+
function credentialsDir(home = homedir6()) {
|
|
44440
|
+
return join47(home, ".himalaya", "store-credentials");
|
|
44441
|
+
}
|
|
44442
|
+
function profilePath(name, home = homedir6()) {
|
|
44443
|
+
if (!PROFILE_NAME.test(name)) {
|
|
44444
|
+
throw new Error(
|
|
44445
|
+
`credential profile ${JSON.stringify(name)} is not a profile name \u2014 use letters, digits, ".", "_" or "-" starting with a letter or digit. It names ${join47(credentialsDir(home), "<name>.json")}; it is never a path.`
|
|
44446
|
+
);
|
|
44447
|
+
}
|
|
44448
|
+
return join47(credentialsDir(home), `${name}.json`);
|
|
44449
|
+
}
|
|
44450
|
+
function parseProfile(text2, label2) {
|
|
44451
|
+
let doc;
|
|
44452
|
+
try {
|
|
44453
|
+
doc = JSON.parse(text2);
|
|
44454
|
+
} catch (e) {
|
|
44455
|
+
throw new Error(`${label2} is not valid JSON: ${e.message}`);
|
|
44456
|
+
}
|
|
44457
|
+
if (!doc || typeof doc !== "object" || Array.isArray(doc)) {
|
|
44458
|
+
throw new Error(`${label2} must be a JSON object with ${FIELDS.join(", ")}.`);
|
|
44459
|
+
}
|
|
44460
|
+
const rec = doc;
|
|
44461
|
+
const out = {};
|
|
44462
|
+
for (const f of FIELDS) {
|
|
44463
|
+
const v = rec[f];
|
|
44464
|
+
if (typeof v !== "string" || !v.trim() || /^TODO/i.test(v.trim())) {
|
|
44465
|
+
throw new Error(`${label2} is missing a usable "${f}" (got ${JSON.stringify(v)}).`);
|
|
44466
|
+
}
|
|
44467
|
+
out[f] = v.trim();
|
|
44468
|
+
}
|
|
44469
|
+
return out;
|
|
44470
|
+
}
|
|
44471
|
+
function namedProfile(cfg, profileFlag) {
|
|
44472
|
+
const ios = cfg.ios ?? {};
|
|
44473
|
+
return profileFlag?.trim() || ios.credentialProfile?.trim() || void 0;
|
|
44474
|
+
}
|
|
44475
|
+
function resolveStoreCredentials(opts) {
|
|
44476
|
+
const { app, cfg } = opts;
|
|
44477
|
+
const env = opts.env ?? process.env;
|
|
44478
|
+
const home = opts.home ?? homedir6();
|
|
44479
|
+
const read = opts.readProfile ?? ((p) => readFileSync57(p, "utf8"));
|
|
44480
|
+
const exists = opts.profileExists ?? existsSync50;
|
|
44481
|
+
const ios = cfg.ios ?? {};
|
|
44482
|
+
const flagName = opts.profileFlag?.trim();
|
|
44483
|
+
const named = namedProfile(cfg, opts.profileFlag);
|
|
44484
|
+
if (named) {
|
|
44485
|
+
const source = flagName ? "flag" : "config";
|
|
44486
|
+
const p = profilePath(named, home);
|
|
44487
|
+
assertCredentialOutsideRepo(`credential profile "${named}"`, p);
|
|
44488
|
+
if (!exists(p)) {
|
|
44489
|
+
throw new Error(
|
|
44490
|
+
`credential profile "${named}" not found at ${p}. Create it with the App Store Connect identifiers for that account: { "team": \u2026, "ascKeyId": \u2026, "ascIssuerId": \u2026, "ascKeyPath": \u2026 }. The .p8 itself stays outside the repo and is never committed.`
|
|
44491
|
+
);
|
|
44492
|
+
}
|
|
44493
|
+
const doc = parseProfile(read(p), `credential profile "${named}" (${p})`);
|
|
44494
|
+
assertCredentialOutsideRepo(`credential profile "${named}" ascKeyPath`, doc.ascKeyPath);
|
|
44495
|
+
if (ios.team && !/^TODO/i.test(ios.team) && ios.team !== doc.team) {
|
|
44496
|
+
throw new Error(
|
|
44497
|
+
`apps/${app}/store/store.config.yaml declares ios.team "${ios.team}" but credential profile "${named}" is for team "${doc.team}". Fix whichever is stale \u2014 never upload to a team the app config does not name.`
|
|
44498
|
+
);
|
|
44499
|
+
}
|
|
44500
|
+
return { ...doc, source, profile: named };
|
|
44501
|
+
}
|
|
44502
|
+
const missing = ["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"].filter((n) => !env[n]);
|
|
44503
|
+
if (missing.length) {
|
|
44504
|
+
throw new Error(
|
|
44505
|
+
`no App Store Connect account resolved for "${app}": ${missing.join(", ")} unset and no credential profile declared. Either export the ASC_* vars, or set ios.credentialProfile in apps/${app}/store/store.config.yaml (see /setup-store-signing).`
|
|
44506
|
+
);
|
|
44507
|
+
}
|
|
44508
|
+
const ascKeyPath = env.ASC_KEY_PATH;
|
|
44509
|
+
assertCredentialOutsideRepo("ASC_KEY_PATH", ascKeyPath);
|
|
44510
|
+
const team = env.HIMALAYA_APPLE_TEAM_ID || ios.team;
|
|
44511
|
+
if (!team || /^TODO/i.test(team)) {
|
|
44512
|
+
throw new Error(
|
|
44513
|
+
`no Apple team for "${app}": set ios.team in apps/${app}/store/store.config.yaml or export HIMALAYA_APPLE_TEAM_ID.`
|
|
44514
|
+
);
|
|
44515
|
+
}
|
|
44516
|
+
return {
|
|
44517
|
+
team,
|
|
44518
|
+
ascKeyId: env.ASC_KEY_ID,
|
|
44519
|
+
ascIssuerId: env.ASC_ISSUER_ID,
|
|
44520
|
+
ascKeyPath,
|
|
44521
|
+
source: "env"
|
|
44522
|
+
};
|
|
44523
|
+
}
|
|
44524
|
+
function credentialEnv(c) {
|
|
44525
|
+
return {
|
|
44526
|
+
ASC_KEY_ID: c.ascKeyId,
|
|
44527
|
+
ASC_ISSUER_ID: c.ascIssuerId,
|
|
44528
|
+
ASC_KEY_PATH: c.ascKeyPath,
|
|
44529
|
+
HIMALAYA_APPLE_TEAM_ID: c.team
|
|
44530
|
+
};
|
|
44531
|
+
}
|
|
44532
|
+
function maskIssuer(issuer) {
|
|
44533
|
+
return issuer.length <= 8 ? issuer : `${issuer.slice(0, 8)}\u2026`;
|
|
44534
|
+
}
|
|
44535
|
+
var PROFILE_NAME, FIELDS;
|
|
44536
|
+
var init_credential_profile = __esm({
|
|
44537
|
+
"../store-release/credential-profile.ts"() {
|
|
44538
|
+
init_preflight();
|
|
44539
|
+
PROFILE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
44540
|
+
FIELDS = ["team", "ascKeyId", "ascIssuerId", "ascKeyPath"];
|
|
44541
|
+
}
|
|
44542
|
+
});
|
|
44543
|
+
|
|
44426
44544
|
// ../store-release/preflight-app.ts
|
|
44427
44545
|
var preflight_app_exports = {};
|
|
44428
44546
|
__export(preflight_app_exports, {
|
|
@@ -44436,12 +44554,13 @@ __export(preflight_app_exports, {
|
|
|
44436
44554
|
jpegSize: () => jpegSize,
|
|
44437
44555
|
playListingAssets: () => playListingAssets,
|
|
44438
44556
|
pngSize: () => pngSize,
|
|
44439
|
-
preflightApp: () => preflightApp
|
|
44557
|
+
preflightApp: () => preflightApp,
|
|
44558
|
+
profileAccount: () => profileAccount
|
|
44440
44559
|
});
|
|
44441
|
-
import { readFileSync as
|
|
44560
|
+
import { readFileSync as readFileSync58, existsSync as existsSync51, readdirSync as readdirSync24, statSync as statSync10 } from "node:fs";
|
|
44442
44561
|
import { createHash as createHash23 } from "node:crypto";
|
|
44443
|
-
import { join as
|
|
44444
|
-
function analyze(projectYml, storeConfig, icon) {
|
|
44562
|
+
import { join as join48 } from "node:path";
|
|
44563
|
+
function analyze(projectYml, storeConfig, icon, account) {
|
|
44445
44564
|
const f = [];
|
|
44446
44565
|
const has = (re, s) => re.test(s);
|
|
44447
44566
|
const iconNameSet = has(/ASSETCATALOG_COMPILER_APPICON_NAME:\s*\S+/, projectYml);
|
|
@@ -44480,18 +44599,39 @@ function analyze(projectYml, storeConfig, icon) {
|
|
|
44480
44599
|
f.push({ level: "warn", message: "Declares associated-domains \u2192 requires ASSOCIATED_DOMAINS enabled on the App ID (and a real applinks host, not localhost) or signing/AASA breaks. Enable + set the host, or remove the entitlement." });
|
|
44481
44600
|
}
|
|
44482
44601
|
const todo = (key2) => new RegExp(`${key2}:\\s*TODO`).test(storeConfig) || !new RegExp(`${key2}:`).test(storeConfig);
|
|
44483
|
-
if (
|
|
44484
|
-
|
|
44485
|
-
|
|
44602
|
+
if (account) {
|
|
44603
|
+
if (account.error) f.push({ level: "error", message: account.error });
|
|
44604
|
+
} else {
|
|
44605
|
+
if (!/team:\s*\S+/.test(storeConfig) || /team:\s*TODO/.test(storeConfig)) f.push({ level: "error", message: "store.config.yaml ios.team is unset/TODO." });
|
|
44606
|
+
for (const k of ["ascKeyId", "ascIssuerId"]) {
|
|
44607
|
+
if (todo(k)) f.push({ level: "error", message: `store.config.yaml ios.${k} is unset/TODO (needed to sign + upload).` });
|
|
44608
|
+
}
|
|
44486
44609
|
}
|
|
44487
44610
|
if (todo("appStoreId")) f.push({ level: "warn", message: "store.config.yaml ios.appStoreId is unset/TODO \u2014 create the App Store Connect app record first (the API can't), then fill it." });
|
|
44488
44611
|
return f;
|
|
44489
44612
|
}
|
|
44490
|
-
|
|
44491
|
-
const
|
|
44492
|
-
const
|
|
44613
|
+
function profileAccount(app, storeConfig, opts = {}) {
|
|
44614
|
+
const cfg = parseStoreConfig(storeConfig);
|
|
44615
|
+
const profile = namedProfile(cfg, opts.profileFlag);
|
|
44616
|
+
if (!profile) return void 0;
|
|
44617
|
+
try {
|
|
44618
|
+
resolveStoreCredentials({ app, cfg, ...opts });
|
|
44619
|
+
return { profile };
|
|
44620
|
+
} catch (e) {
|
|
44621
|
+
const why = e instanceof Error ? e.message : String(e ?? "");
|
|
44622
|
+
return { profile, error: why.trim() || `credential profile "${profile}" could not be resolved.` };
|
|
44623
|
+
}
|
|
44624
|
+
}
|
|
44625
|
+
async function preflightApp(app, opts = {}) {
|
|
44626
|
+
const projectYml = existsSync51(iosProjectYml(app)) ? readFileSync58(iosProjectYml(app), "utf8") : "";
|
|
44627
|
+
const storeConfig = existsSync51(storeConfigPath(app)) ? readFileSync58(storeConfigPath(app), "utf8") : "";
|
|
44493
44628
|
if (!storeConfig) return [{ level: "error", message: `no apps/${app}/store/store.config.yaml \u2014 run /setup-store-signing first.` }];
|
|
44494
|
-
const findings = analyze(
|
|
44629
|
+
const findings = analyze(
|
|
44630
|
+
projectYml,
|
|
44631
|
+
storeConfig,
|
|
44632
|
+
await appIconState(join48(appDir(app), "ios")),
|
|
44633
|
+
profileAccount(app, storeConfig, opts)
|
|
44634
|
+
);
|
|
44495
44635
|
findings.push(...analyzeListing(metadataFilesPresent(app), listScreenshots(app)));
|
|
44496
44636
|
findings.push(
|
|
44497
44637
|
...analyzePlayListing(playListingAssets(app)).map((finding) => ({ ...finding, level: "warn" }))
|
|
@@ -44518,17 +44658,17 @@ function analyzeSubmissionRecord(appLevel, review, opts) {
|
|
|
44518
44658
|
return f;
|
|
44519
44659
|
}
|
|
44520
44660
|
function appLevelMetadataFiles(app, locale = "en-US") {
|
|
44521
|
-
const root =
|
|
44661
|
+
const root = join48(storeDir(app), "metadata");
|
|
44522
44662
|
const out = /* @__PURE__ */ new Set();
|
|
44523
|
-
if (
|
|
44663
|
+
if (existsSync51(root)) {
|
|
44524
44664
|
for (const n of readdirSync24(root)) if (n.endsWith(".txt")) out.add(n);
|
|
44525
44665
|
}
|
|
44526
|
-
if (
|
|
44666
|
+
if (existsSync51(join48(root, locale, "privacy_url.txt"))) out.add("privacy_url.txt");
|
|
44527
44667
|
return out;
|
|
44528
44668
|
}
|
|
44529
44669
|
function reviewInfoFiles(app) {
|
|
44530
|
-
const dir =
|
|
44531
|
-
if (!
|
|
44670
|
+
const dir = join48(storeDir(app), "review_information");
|
|
44671
|
+
if (!existsSync51(dir)) return /* @__PURE__ */ new Set();
|
|
44532
44672
|
return new Set(readdirSync24(dir).filter((n) => n.endsWith(".txt")));
|
|
44533
44673
|
}
|
|
44534
44674
|
function isValidAppStoreSize(w, h) {
|
|
@@ -44638,12 +44778,12 @@ function analyzePlayListing(assets) {
|
|
|
44638
44778
|
return f;
|
|
44639
44779
|
}
|
|
44640
44780
|
function playListingAssets(app, locale = "en-US") {
|
|
44641
|
-
const dir =
|
|
44781
|
+
const dir = join48(storeDir(app), "play", locale, "images");
|
|
44642
44782
|
const read = (names) => {
|
|
44643
44783
|
for (const name of names) {
|
|
44644
|
-
const p =
|
|
44784
|
+
const p = join48(dir, name);
|
|
44645
44785
|
try {
|
|
44646
|
-
if (statSync10(p).isFile()) return { name, bytes:
|
|
44786
|
+
if (statSync10(p).isFile()) return { name, bytes: readFileSync58(p) };
|
|
44647
44787
|
} catch {
|
|
44648
44788
|
}
|
|
44649
44789
|
}
|
|
@@ -44674,26 +44814,26 @@ function analyzeListing(metaFiles, shots) {
|
|
|
44674
44814
|
return f;
|
|
44675
44815
|
}
|
|
44676
44816
|
function metadataFilesPresent(app, locale = "en-US") {
|
|
44677
|
-
const dir =
|
|
44678
|
-
if (!
|
|
44817
|
+
const dir = join48(storeDir(app), "metadata", locale);
|
|
44818
|
+
if (!existsSync51(dir)) return /* @__PURE__ */ new Set();
|
|
44679
44819
|
return new Set(readdirSync24(dir).filter((n) => n.endsWith(".txt")));
|
|
44680
44820
|
}
|
|
44681
44821
|
function listScreenshots(app, locale = "en-US") {
|
|
44682
44822
|
const out = [];
|
|
44683
|
-
const flat =
|
|
44684
|
-
if (
|
|
44823
|
+
const flat = join48(storeDir(app), "screenshots", locale);
|
|
44824
|
+
if (existsSync51(flat)) {
|
|
44685
44825
|
for (const png of readdirSync24(flat).filter((n) => n.endsWith(".png"))) {
|
|
44686
|
-
const sz = pngSize(
|
|
44826
|
+
const sz = pngSize(readFileSync58(join48(flat, png)));
|
|
44687
44827
|
if (sz) out.push({ name: png, w: sz.w, h: sz.h });
|
|
44688
44828
|
}
|
|
44689
44829
|
}
|
|
44690
|
-
const legacy =
|
|
44691
|
-
if (
|
|
44830
|
+
const legacy = join48(storeDir(app), "metadata", locale, "screenshots");
|
|
44831
|
+
if (existsSync51(legacy)) {
|
|
44692
44832
|
for (const deviceDir of readdirSync24(legacy)) {
|
|
44693
|
-
const d =
|
|
44833
|
+
const d = join48(legacy, deviceDir);
|
|
44694
44834
|
if (!statSync10(d).isDirectory()) continue;
|
|
44695
44835
|
for (const png of readdirSync24(d).filter((n) => n.endsWith(".png"))) {
|
|
44696
|
-
const sz = pngSize(
|
|
44836
|
+
const sz = pngSize(readFileSync58(join48(d, png)));
|
|
44697
44837
|
if (sz) out.push({ name: `${deviceDir}/${png}`, w: sz.w, h: sz.h });
|
|
44698
44838
|
}
|
|
44699
44839
|
}
|
|
@@ -44701,13 +44841,13 @@ function listScreenshots(app, locale = "en-US") {
|
|
|
44701
44841
|
return out;
|
|
44702
44842
|
}
|
|
44703
44843
|
function placeholderHashes2() {
|
|
44704
|
-
const templateIos =
|
|
44705
|
-
if (!
|
|
44844
|
+
const templateIos = join48(appDir("_template"), "ios");
|
|
44845
|
+
if (!existsSync51(templateIos)) return [LEGACY_PLACEHOLDER_SHA2562];
|
|
44706
44846
|
for (const target of readdirSync24(templateIos)) {
|
|
44707
|
-
const p =
|
|
44847
|
+
const p = join48(templateIos, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
|
|
44708
44848
|
try {
|
|
44709
44849
|
if (!statSync10(p).isFile()) continue;
|
|
44710
|
-
return [LEGACY_PLACEHOLDER_SHA2562, createHash23("sha256").update(
|
|
44850
|
+
return [LEGACY_PLACEHOLDER_SHA2562, createHash23("sha256").update(readFileSync58(p)).digest("hex")];
|
|
44711
44851
|
} catch {
|
|
44712
44852
|
}
|
|
44713
44853
|
}
|
|
@@ -44738,12 +44878,12 @@ async function pixelIssues(bytes2) {
|
|
|
44738
44878
|
}
|
|
44739
44879
|
}
|
|
44740
44880
|
async function appIconState(iosDir) {
|
|
44741
|
-
if (!
|
|
44881
|
+
if (!existsSync51(iosDir)) return { exists: false, isPlaceholder: false, storeIssues: [] };
|
|
44742
44882
|
for (const target of readdirSync24(iosDir)) {
|
|
44743
|
-
const p =
|
|
44883
|
+
const p = join48(iosDir, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
|
|
44744
44884
|
try {
|
|
44745
44885
|
if (!statSync10(p).isFile()) continue;
|
|
44746
|
-
const bytes2 =
|
|
44886
|
+
const bytes2 = readFileSync58(p);
|
|
44747
44887
|
const hash = createHash23("sha256").update(bytes2).digest("hex");
|
|
44748
44888
|
const pixels = await pixelIssues(bytes2);
|
|
44749
44889
|
return {
|
|
@@ -44781,6 +44921,7 @@ var init_preflight_app = __esm({
|
|
|
44781
44921
|
"../store-release/preflight-app.ts"() {
|
|
44782
44922
|
init_paths();
|
|
44783
44923
|
init_preflight();
|
|
44924
|
+
init_credential_profile();
|
|
44784
44925
|
init_app_icon_rules();
|
|
44785
44926
|
APP_STORE_SIZES = [
|
|
44786
44927
|
[1320, 2868],
|
|
@@ -44803,114 +44944,6 @@ var init_preflight_app = __esm({
|
|
|
44803
44944
|
}
|
|
44804
44945
|
});
|
|
44805
44946
|
|
|
44806
|
-
// ../store-release/credential-profile.ts
|
|
44807
|
-
var credential_profile_exports = {};
|
|
44808
|
-
__export(credential_profile_exports, {
|
|
44809
|
-
credentialEnv: () => credentialEnv,
|
|
44810
|
-
credentialsDir: () => credentialsDir,
|
|
44811
|
-
maskIssuer: () => maskIssuer,
|
|
44812
|
-
parseProfile: () => parseProfile,
|
|
44813
|
-
profilePath: () => profilePath,
|
|
44814
|
-
resolveStoreCredentials: () => resolveStoreCredentials
|
|
44815
|
-
});
|
|
44816
|
-
import { existsSync as existsSync51, readFileSync as readFileSync58 } from "node:fs";
|
|
44817
|
-
import { homedir as homedir6 } from "node:os";
|
|
44818
|
-
import { join as join48 } from "node:path";
|
|
44819
|
-
function credentialsDir(home = homedir6()) {
|
|
44820
|
-
return join48(home, ".himalaya", "store-credentials");
|
|
44821
|
-
}
|
|
44822
|
-
function profilePath(name, home = homedir6()) {
|
|
44823
|
-
return join48(credentialsDir(home), `${name}.json`);
|
|
44824
|
-
}
|
|
44825
|
-
function parseProfile(text2, label2) {
|
|
44826
|
-
let doc;
|
|
44827
|
-
try {
|
|
44828
|
-
doc = JSON.parse(text2);
|
|
44829
|
-
} catch (e) {
|
|
44830
|
-
throw new Error(`${label2} is not valid JSON: ${e.message}`);
|
|
44831
|
-
}
|
|
44832
|
-
if (!doc || typeof doc !== "object" || Array.isArray(doc)) {
|
|
44833
|
-
throw new Error(`${label2} must be a JSON object with ${FIELDS.join(", ")}.`);
|
|
44834
|
-
}
|
|
44835
|
-
const rec = doc;
|
|
44836
|
-
const out = {};
|
|
44837
|
-
for (const f of FIELDS) {
|
|
44838
|
-
const v = rec[f];
|
|
44839
|
-
if (typeof v !== "string" || !v.trim() || /^TODO/i.test(v.trim())) {
|
|
44840
|
-
throw new Error(`${label2} is missing a usable "${f}" (got ${JSON.stringify(v)}).`);
|
|
44841
|
-
}
|
|
44842
|
-
out[f] = v.trim();
|
|
44843
|
-
}
|
|
44844
|
-
return out;
|
|
44845
|
-
}
|
|
44846
|
-
function resolveStoreCredentials(opts) {
|
|
44847
|
-
const { app, cfg } = opts;
|
|
44848
|
-
const env = opts.env ?? process.env;
|
|
44849
|
-
const home = opts.home ?? homedir6();
|
|
44850
|
-
const read = opts.readProfile ?? ((p) => readFileSync58(p, "utf8"));
|
|
44851
|
-
const exists = opts.profileExists ?? existsSync51;
|
|
44852
|
-
const ios = cfg.ios ?? {};
|
|
44853
|
-
const flagName = opts.profileFlag?.trim();
|
|
44854
|
-
const named = flagName || ios.credentialProfile?.trim();
|
|
44855
|
-
if (named) {
|
|
44856
|
-
const source = flagName ? "flag" : "config";
|
|
44857
|
-
const p = profilePath(named, home);
|
|
44858
|
-
assertCredentialOutsideRepo(`credential profile "${named}"`, p);
|
|
44859
|
-
if (!exists(p)) {
|
|
44860
|
-
throw new Error(
|
|
44861
|
-
`credential profile "${named}" not found at ${p}. Create it with the App Store Connect identifiers for that account: { "team": \u2026, "ascKeyId": \u2026, "ascIssuerId": \u2026, "ascKeyPath": \u2026 }. The .p8 itself stays outside the repo and is never committed.`
|
|
44862
|
-
);
|
|
44863
|
-
}
|
|
44864
|
-
const doc = parseProfile(read(p), `credential profile "${named}" (${p})`);
|
|
44865
|
-
assertCredentialOutsideRepo(`credential profile "${named}" ascKeyPath`, doc.ascKeyPath);
|
|
44866
|
-
if (ios.team && !/^TODO/i.test(ios.team) && ios.team !== doc.team) {
|
|
44867
|
-
throw new Error(
|
|
44868
|
-
`apps/${app}/store/store.config.yaml declares ios.team "${ios.team}" but credential profile "${named}" is for team "${doc.team}". Fix whichever is stale \u2014 never upload to a team the app config does not name.`
|
|
44869
|
-
);
|
|
44870
|
-
}
|
|
44871
|
-
return { ...doc, source, profile: named };
|
|
44872
|
-
}
|
|
44873
|
-
const missing = ["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"].filter((n) => !env[n]);
|
|
44874
|
-
if (missing.length) {
|
|
44875
|
-
throw new Error(
|
|
44876
|
-
`no App Store Connect account resolved for "${app}": ${missing.join(", ")} unset and no credential profile declared. Either export the ASC_* vars, or set ios.credentialProfile in apps/${app}/store/store.config.yaml (see /setup-store-signing).`
|
|
44877
|
-
);
|
|
44878
|
-
}
|
|
44879
|
-
const ascKeyPath = env.ASC_KEY_PATH;
|
|
44880
|
-
assertCredentialOutsideRepo("ASC_KEY_PATH", ascKeyPath);
|
|
44881
|
-
const team = env.HIMALAYA_APPLE_TEAM_ID || ios.team;
|
|
44882
|
-
if (!team || /^TODO/i.test(team)) {
|
|
44883
|
-
throw new Error(
|
|
44884
|
-
`no Apple team for "${app}": set ios.team in apps/${app}/store/store.config.yaml or export HIMALAYA_APPLE_TEAM_ID.`
|
|
44885
|
-
);
|
|
44886
|
-
}
|
|
44887
|
-
return {
|
|
44888
|
-
team,
|
|
44889
|
-
ascKeyId: env.ASC_KEY_ID,
|
|
44890
|
-
ascIssuerId: env.ASC_ISSUER_ID,
|
|
44891
|
-
ascKeyPath,
|
|
44892
|
-
source: "env"
|
|
44893
|
-
};
|
|
44894
|
-
}
|
|
44895
|
-
function credentialEnv(c) {
|
|
44896
|
-
return {
|
|
44897
|
-
ASC_KEY_ID: c.ascKeyId,
|
|
44898
|
-
ASC_ISSUER_ID: c.ascIssuerId,
|
|
44899
|
-
ASC_KEY_PATH: c.ascKeyPath,
|
|
44900
|
-
HIMALAYA_APPLE_TEAM_ID: c.team
|
|
44901
|
-
};
|
|
44902
|
-
}
|
|
44903
|
-
function maskIssuer(issuer) {
|
|
44904
|
-
return issuer.length <= 8 ? issuer : `${issuer.slice(0, 8)}\u2026`;
|
|
44905
|
-
}
|
|
44906
|
-
var FIELDS;
|
|
44907
|
-
var init_credential_profile = __esm({
|
|
44908
|
-
"../store-release/credential-profile.ts"() {
|
|
44909
|
-
init_preflight();
|
|
44910
|
-
FIELDS = ["team", "ascKeyId", "ascIssuerId", "ascKeyPath"];
|
|
44911
|
-
}
|
|
44912
|
-
});
|
|
44913
|
-
|
|
44914
44947
|
// ../store-release/version.ts
|
|
44915
44948
|
var version_exports = {};
|
|
44916
44949
|
__export(version_exports, {
|
|
@@ -55193,8 +55226,10 @@ var USAGE = `himi \u2014 the Himalaya authoring CLI (remote dev loop)
|
|
|
55193
55226
|
--release <published-release-id> --version <x.y.z> --yes --target bo.
|
|
55194
55227
|
Job Service builds the IPA; deployed serve validates it, then
|
|
55195
55228
|
invokes MRE with its service identity. This is separate from QA himi dist.
|
|
55196
|
-
himi store preflight <app> [--json]
|
|
55197
|
-
|
|
55229
|
+
himi store preflight <app> [--profile <name>] [--json]
|
|
55230
|
+
readiness only \u2014 icon, entitlements, encryption flag,
|
|
55231
|
+
version, store.config ids (or the --profile /
|
|
55232
|
+
ios.credentialProfile account), listing + review record.
|
|
55198
55233
|
No network, nothing built.
|
|
55199
55234
|
himi store upload <app> [--track <t>] [--profile <name>] [--yes] [--dry-run]
|
|
55200
55235
|
the same upload himi testflight runs.
|
|
@@ -55406,7 +55441,7 @@ var COMMANDS = [
|
|
|
55406
55441
|
{ name: "visibility", summary: "read (no value) or set whether the public registry (/v1/apps + the Himi Player picker) LISTS the app. `public` lists it for everyone; `unlisted` hides it from listings while direct reads by app id \u2014 deep links, previews \u2014 keep working. App from --app or the content dir. Setting it needs no republish.", required: "[public|unlisted] [--app <a>] [--content <dir>] (--control-token)" },
|
|
55407
55442
|
{ name: "dist", summary: "build an INSTALLABLE QA binary (signed IPA / APK) on the Wix Job Service Mac pool and return an install link \u2014 the serve plane brokers the job, the pool builds it. WAITS for the build by default (~4 min) and prints the install link; `--no-wait` returns a jobId immediately instead. Omitting `--release` builds whatever is LIVE for the app. A named draft is refused unless `--allow-draft` makes that exceptional build explicit. `status <jobId>` / `watch <jobId>` / `list --app <a>` / `cancel <jobId>` inspect and stop builds (`watch` reports up front whether the job mints its own signing identity or borrows one, so a doomed iOS build is cancellable in seconds rather than after the archive). Off-repo, name a target \u2014 `--target wix` for a self-serve Wix login or `--target bo` for the internal employee path (the in-repo default is a local dev plane that isn't reachable off-repo); self-serve callers may build their OWN apps under a tighter budget (2 in flight / 5 per 24h), while a manage-only owner-role credential is refused. `--shell` picks the native host to sign into (branded-lite | owner-lite | player | demo-app). `--signing` defaults to `wix-managed` \u2014 the Wix Apple account mints a per-app signing identity for the build, so the caller provisions no Apple credentials of their own; `--signing byo` (sign with your own Apple account) is reserved and 501s. `--android-signing` is the Android counterpart and a SEPARATE axis (a keystore, not an Apple account): `qa-keystore` (default \u2014 the repo's committed QA key, identical on every pool machine, so a build installs over the previous one), `wix-keystore` (the Wix key the pool machine carries; the build FAILS naming the paths searched if it carries none, rather than quietly signing with something else), or `debug` (the old per-machine key \u2014 QA must uninstall any previous build first). NOT the normal way to ship: screens, Tier-5 bundles, tokens and app-config all go over the air with `himi push` in seconds \u2014 a binary trip is only needed for a NATIVE delta (a new SDUI component, a new declared capability/entitlement, a new bundle id, or a minBinaryVersion floor bump). Refuses to build an app whose launcher icon is missing, a placeholder, or one a store would reject \u2014 the one thing a binary carries that no later OTA push can fix; `--force` builds anyway", required: "[--app <a>] [--platform ios,android] [--release <id>] [--allow-draft] [--target <t>] [--shell branded-lite|owner-lite|player|demo-app] [--signing wix-managed|byo] [--android-signing qa-keystore|wix-keystore|debug] [--borrow-ios-id <bundleId>] [--no-wait] [--force] | status <jobId> [--target <t>] | watch <jobId> [--target <t>] [--interval <ms>] | list --app <a> [--target <t>] | cancel <jobId> [--target <t>]" },
|
|
55408
55443
|
{ name: "testflight", summary: 'build, sign and upload an app to TestFlight (internal testers \u2014 no Beta App Review), then WAIT until App Store Connect finishes processing it. Sugar for `store upload --track testflight`. Prompts first: a build number is consumed permanently on a real Apple account and cannot be reused \u2014 `--yes` for CI, `--dry-run` to see the plan without touching anything. The wait is the real check, not a nicety: fastlane prints "Successfully uploaded" for a binary App Store Connect then rejects in processing, and a rejected binary leaves NO build record at all (the reason is emailed). Public App Store review is deliberately NOT automatable here \u2014 `--track appstore` is refused; use /submit-ios-app when you mean to go public', required: "<app> [--track testflight|internal] [--profile <name>] [--yes] [--dry-run] [--skip-build] [--no-wait] [--json]" },
|
|
55409
|
-
{ name: "store", summary: "the App Store Connect group behind `testflight`. `preflight <app>` checks readiness offline (icon, entitlements, encryption flag, version, store.config ids, listing + review record); `upload <app>` is what `testflight` runs; `status <app>` reads live build + processing state. `--profile` selects WHICH App Store Connect account: an app built for a Wix customer ships under the CUSTOMER's Apple team (Apple guideline 4.2.6 forbids an app-generation service submitting on a client's behalf), declared per-app as ios.credentialProfile in store.config.yaml and resolved from ~/.himalaya/store-credentials/<name>.json \u2014 the .p8 itself never enters the repo", required: "preflight <app> | upload <app> [--track <t>] [--profile <n>] [--yes] [--dry-run] | status <app> [--profile <n>]" },
|
|
55444
|
+
{ name: "store", summary: "the App Store Connect group behind `testflight`. `preflight <app>` checks readiness offline (icon, entitlements, encryption flag, version, store.config ids, listing + review record); `upload <app>` is what `testflight` runs; `status <app>` reads live build + processing state. `--profile` selects WHICH App Store Connect account: an app built for a Wix customer ships under the CUSTOMER's Apple team (Apple guideline 4.2.6 forbids an app-generation service submitting on a client's behalf), declared per-app as ios.credentialProfile in store.config.yaml and resolved from ~/.himalaya/store-credentials/<name>.json \u2014 the .p8 itself never enters the repo", required: "preflight <app> [--profile <n>] | upload <app> [--track <t>] [--profile <n>] [--yes] [--dry-run] | status <app> [--profile <n>]" },
|
|
55410
55445
|
{ name: "guide", summary: "print the Himalaya overview + headless dev loop + available topics (offline)", required: "[--json]" },
|
|
55411
55446
|
{ name: "docs", summary: "print an authoring guide; no topic = list them (offline)", required: "[<topic>] [--json]" },
|
|
55412
55447
|
{ name: "components", summary: "print the SDUI component vocabulary + props; a name = that component (offline)", required: "[<Name>] [--json]" },
|
|
Binary file
|
|
@@ -16696,11 +16696,17 @@
|
|
|
16696
16696
|
"jsdoc": "",
|
|
16697
16697
|
"decl": "export type CommunicationMode = \"UNKNOWN\" | \"POLLING\" | \"REAL_TIME\";"
|
|
16698
16698
|
},
|
|
16699
|
+
{
|
|
16700
|
+
"name": "MessageStatus",
|
|
16701
|
+
"kind": "type",
|
|
16702
|
+
"jsdoc": "/** Where the service is with one message. `STATUS_PENDING` on an ASSISTANT row\n * means the agent is still writing it: whatever `content` holds so far is a\n * draft, not the answer. Open-ended because the wire may grow values.\n *\n * Taken from the service's published message entity (the generated\n * `genie-chat-service-v1` client in `wix-private/aria-native-apps`), where the\n * native Aria app ends a turn ONLY on a polled `STATUS_COMPLETED`, and resumes a\n * conversation whose newest assistant row is still pending. Not observed on\n * this repo's own captures, which is why it is optional and every consumer\n * must treat an absent status as \"settled\". */",
|
|
16703
|
+
"decl": "export type MessageStatus = \"STATUS_UNSPECIFIED\" | \"STATUS_PENDING\" | \"STATUS_COMPLETED\" | (string & {});"
|
|
16704
|
+
},
|
|
16699
16705
|
{
|
|
16700
16706
|
"name": "ConversationMessage",
|
|
16701
16707
|
"kind": "interface",
|
|
16702
16708
|
"jsdoc": "",
|
|
16703
|
-
"decl": "export interface ConversationMessage {\n id?: string;\n content?: string;\n role?: MessageRole;\n createdDate?: string;\n}"
|
|
16709
|
+
"decl": "export interface ConversationMessage {\n id?: string;\n content?: string;\n role?: MessageRole;\n createdDate?: string;\n status?: MessageStatus;\n}"
|
|
16704
16710
|
},
|
|
16705
16711
|
{
|
|
16706
16712
|
"name": "AssistantConfig",
|
|
@@ -515,14 +515,18 @@ What the host guarantees, on every surface:
|
|
|
515
515
|
window stays visible while unfocused), and a **React Native** host must pass
|
|
516
516
|
`installPollLifecycle: makeAppStatePollLifecycle(AppState)` or it never suspends there
|
|
517
517
|
either. See the RFC's per-surface table.
|
|
518
|
-
- **
|
|
518
|
+
- **Worker teardown cancels it; leaving a pooled screen pauses it.** The timer starts with
|
|
519
|
+
the worker and dies with it. A host that keeps a navigated-away screen's worker warm in
|
|
520
|
+
a keep-alive pool suspends its poll while it sits there — it fires immediately when the
|
|
521
|
+
screen reappears, then resumes cadence. The poll ends only when the worker itself is
|
|
522
|
+
torn down: evicted from the pool, or the pool reset.
|
|
519
523
|
|
|
520
524
|
Two things to know before you reach for it:
|
|
521
525
|
|
|
522
526
|
- **`_poll` has no stop form.** The directive can start and replace a poll, not end one.
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
527
|
+
Worker teardown is the only stop; navigating away from a pooled screen pauses the poll
|
|
528
|
+
rather than ending it. Pick a cadence you would be comfortable running on several
|
|
529
|
+
screens at once.
|
|
526
530
|
- **Emit it from the action that runs on every entry**, not only from a first-open path.
|
|
527
531
|
Restored worker state re-paints data but arms no timer, so a poll armed only by `open`
|
|
528
532
|
restores into a screen that *looks* live and never refreshes.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.972.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": [
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"artifactId": "himalaya-cli"
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
|
-
"falconPackageHash": "
|
|
67
|
+
"falconPackageHash": "9d8d2a86205140b8694ab07b45d09c35b40bfb375a3baf1f123ffacf"
|
|
68
68
|
}
|
|
@@ -37,7 +37,7 @@ export default defineApp({
|
|
|
37
37
|
actions: "http://localhost:8190/v1/actions",
|
|
38
38
|
sync: "http://localhost:8190/v1/sync",
|
|
39
39
|
},
|
|
40
|
-
capabilities: ["live_activity","push","share","secure_storage","open_url","local_database"],
|
|
40
|
+
capabilities: ["live_activity","push","share","secure_storage","open_url","local_database","clipboard"],
|
|
41
41
|
designTokensPath: "./tokens.json",
|
|
42
42
|
navigation: {
|
|
43
43
|
"navKind": "responsive",
|