sliccy 5.16.0 → 5.18.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/node-server/electron-controller.d.ts +0 -1
- package/dist/node-server/electron-controller.js +4 -10
- package/dist/node-server/electron-main.js +5 -13
- package/dist/node-server/electron-runtime.d.ts +0 -4
- package/dist/node-server/electron-runtime.js +4 -21
- package/dist/node-server/index.js +28 -178
- package/dist/node-server/runtime-flags.d.ts +0 -1
- package/dist/node-server/runtime-flags.js +184 -170
- package/dist/ui/assets/{account-store-BVzBgQ-v.js → account-store-BlJxZ8bA.js} +2 -2
- package/dist/ui/assets/{account-store-CVlnJB81.js → account-store-CXTiaOBF.js} +2 -2
- package/dist/ui/assets/{adobe-SkYkxgg4.js → adobe-4-CD_R9o.js} +1 -1
- package/dist/ui/assets/{adobe-BFJRWiBP.js → adobe-E2DIgnz1.js} +1 -1
- package/dist/ui/assets/{adobe-oauth-state-BlTiu0EW.js → adobe-oauth-state-B9YxNQJp.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-IZJU7XsF.js → agent-message-to-chat-DZEPoDrl.js} +1 -1
- package/dist/ui/assets/{apps-CGs6f4_D.js → apps-Fb83z-vc.js} +1 -1
- package/dist/ui/assets/{azure-openai-BPKSSyhH.js → azure-openai-D7rHwq_y.js} +1 -1
- package/dist/ui/assets/{azure-openai-CGgQnr10.js → azure-openai-Dsscn7WN.js} +1 -1
- package/dist/ui/assets/{composer-speech-HQRRG5ym.js → composer-speech-DJ-Mw0M5.js} +1 -1
- package/dist/ui/assets/{connect-surface-CK4b42-9.js → connect-surface-C-4d0ls3.js} +1 -1
- package/dist/ui/assets/dip-BINZ1ICD.js +1 -0
- package/dist/ui/assets/{dist-x2GYqOXm.js → dist-CseAKSVh.js} +1 -1
- package/dist/ui/assets/{dist-DtpnSVfI.js → dist-V73PvJP5.js} +1 -1
- package/dist/ui/assets/{ensure-speech-assets-Dn8D8dRb.js → ensure-speech-assets-CpXHTB8K.js} +1 -1
- package/dist/ui/assets/esp8266-CiVYkcWu.js +1 -0
- package/dist/ui/assets/{esptool-operations-D9gFmxN7.js → esptool-operations-BrkzeaKN.js} +2 -2
- package/dist/ui/assets/{fs-BdfVEExy.js → fs-DR-xqM-9.js} +1 -1
- package/dist/ui/assets/{fs-Bd593l61.js → fs-e_JED6o9.js} +2 -2
- package/dist/ui/assets/{github-B8weBp2j.js → github-D1teU7MS.js} +1 -1
- package/dist/ui/assets/{github-8kxwir4q.js → github-Db5GCKq4.js} +2 -2
- package/dist/ui/assets/{github-copilot-CPYs96aw.js → github-copilot-BhDan7GW.js} +1 -1
- package/dist/ui/assets/{github-copilot-DdE_r53L.js → github-copilot-DC5kS9aJ.js} +1 -1
- package/dist/ui/assets/{hear-Dk1gIguU.js → hear-CISOdKc7.js} +1 -1
- package/dist/ui/assets/{hear-J30GxNJC.js → hear-ST2A8Ojf.js} +1 -1
- package/dist/ui/assets/{kernel-worker-CHH5Mx3j.js → kernel-worker-DElXqFYz.js} +18 -18
- package/dist/ui/assets/{kokoro-engine-DXi-4Lk1.js → kokoro-engine-pjPKeKE-.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-Di_eIPel.js → lick-ws-bridge-CgLt3-md.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-BErTRf2C.js → lick-ws-bridge-uMf3lFqX.js} +1 -1
- package/dist/ui/assets/{local-llm-Bhn3zPzV.js → local-llm-CYNOX_zH.js} +1 -1
- package/dist/ui/assets/{main-CBEoDTj_.js → main-99mCaNK1.js} +4 -4
- package/dist/ui/assets/{mime-types-CIg5nqjf.js → mime-types-ugOWOUZ9.js} +1 -1
- package/dist/ui/assets/{mount-D0PTVzqd.js → mount-CIoB0cu-.js} +2 -2
- package/dist/ui/assets/{mount-C4pLRV8G.js → mount-DDFp4uJK.js} +1 -1
- package/dist/ui/assets/{new-session-D3cDkirv.js → new-session-yO9a-skO.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-CW0Iq4DJ.js → oauth-bootstrap-BjE1yxq_.js} +2 -2
- package/dist/ui/assets/{openai-codex-BhKQGaPl.js → openai-codex-CxQ8e4UF.js} +1 -1
- package/dist/ui/assets/{openai-codex-jRbHGzPJ.js → openai-codex-D9qpuznd.js} +1 -1
- package/dist/ui/assets/{page-follower-tray-B7V5Hdk3.js → page-follower-tray-DWGutKN6.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-HGirMMc_.js → panel-rpc-handlers-Bh3kNYD4.js} +2 -2
- package/dist/ui/assets/{provider-fwp5doUF.js → provider-BHsa0Rrz.js} +1 -1
- package/dist/ui/assets/{provider-T0IaN12Z.js → provider-BWRxgi1b.js} +2 -2
- package/dist/ui/assets/provider-store-access-Ct7bph7W.js +1 -0
- package/dist/ui/assets/provider-store-access-Dxm0WwoL.js +1 -0
- package/dist/ui/assets/{providers-BJpLjsbl.js → providers-D3nv5fF8.js} +1 -1
- package/dist/ui/assets/{quick-llm-DmM8V850.js → quick-llm-nkhmm4Rf.js} +1 -1
- package/dist/ui/assets/session-freezer-BoHtcQZ7.js +1 -0
- package/dist/ui/assets/{shared-Cddyus7m.js → shared-mxZcIrza.js} +1 -1
- package/dist/ui/assets/speak-DoCdEEhw.js +3 -0
- package/dist/ui/assets/speak-zyz6ag-g.js +1 -0
- package/dist/ui/assets/{sprinkle-bridge-Cd-pvRLY.js → sprinkle-bridge-BB1Ge79t.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-Cu6u-z69.js → sprinkle-manager-BqIyFmnb.js} +1 -1
- package/dist/ui/assets/{store-BaMl32ka.js → store-CYnFF7yg.js} +1 -1
- package/dist/ui/assets/{sudo-DBuMJPLn.js → sudo-Bs4eVV8G.js} +1 -1
- package/dist/ui/assets/{transformers-env-CEn9s_Z3.js → transformers-env-B2qCXqw-.js} +1 -1
- package/dist/ui/assets/{transformers-env-BNvU2_5X.js → transformers-env-t6_cAHU1.js} +1 -1
- package/dist/ui/assets/{tray-leader-BufiJcof.js → tray-leader-BjtMXiMR.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-CPPXBBg9.js → tray-leave-runtime-BoCD9arc.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-D19M3hIS.js → upgrade-detection-CLuyCKRm.js} +1 -1
- package/dist/ui/assets/voice-reply-BLN1aJMo.js +1 -0
- package/dist/ui/assets/{wc-attach-jjQplnwa.js → wc-attach-BoWNytPR.js} +2 -2
- package/dist/ui/assets/{wc-detached-Dz2uBF5T.js → wc-detached-Cyqt2rB-.js} +1 -1
- package/dist/ui/assets/{wc-extension-BmxoVHlX.js → wc-extension-TU20M11H.js} +2 -2
- package/dist/ui/assets/{wc-follower-Cr4dFgMb.js → wc-follower-J9dIOTtr.js} +2 -2
- package/dist/ui/assets/wc-live-C00evhz8.js +253 -0
- package/dist/ui/assets/{wc-nav-CXbbv1oy.js → wc-nav-CDGop7zp.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-n0z_itcq.js → wc-onboarding-BJdN1JOs.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-D5zdaLbn.js → wc-placeholder-CX_bmbWN.js} +3 -3
- package/dist/ui/assets/{wc-settings-qtsuiHg1.js → wc-settings-pnqs-c98.js} +2 -2
- package/dist/ui/assets/{wc-shell-B2jkbIzt.js → wc-shell-DoOezClu.js} +963 -786
- package/dist/ui/assets/{wc-sprinkles-BAKT9WrK.js → wc-sprinkles-B3Di9lOW.js} +2 -2
- package/dist/ui/assets/{wc-tray-cnJoLvS2.js → wc-tray-D-6xnB2i.js} +2 -2
- package/dist/ui/assets/{whisper-engine-BSOAcb8a.js → whisper-engine-C_zUz3xO.js} +1 -1
- package/dist/ui/assets/{whisper-session-CW3OA9V7.js → whisper-session-7nSKj94g.js} +2 -2
- package/dist/ui/assets/{xai-grok---YndVHa.js → xai-grok-C3lfFdpm.js} +1 -1
- package/dist/ui/assets/{xai-grok-Da_y6R6g.js → xai-grok-Di62sFOW.js} +1 -1
- package/dist/ui/electron-overlay-entry.js +299 -6180
- package/dist/ui/index.html +2 -2
- package/dist/ui/packages/webapp/index.html +2 -2
- package/package.json +8 -6
- package/dist/node-server/ui-serving.d.ts +0 -18
- package/dist/node-server/ui-serving.js +0 -91
- package/dist/ui/assets/dip-NVUHjmhc.js +0 -1
- package/dist/ui/assets/esp8266-DL6QxCn7.js +0 -1
- package/dist/ui/assets/provider-store-access-BVRQIXtM.js +0 -1
- package/dist/ui/assets/provider-store-access-DTw81yRr.js +0 -1
- package/dist/ui/assets/session-freezer-D6XPq9Ct.js +0 -1
- package/dist/ui/assets/speak-BLaMFnqh.js +0 -3
- package/dist/ui/assets/speak-BM_ACI3J.js +0 -1
- package/dist/ui/assets/voice-reply--p0t9Lgo.js +0 -1
- package/dist/ui/assets/wc-live-DbLgOajX.js +0 -253
- package/dist/ui/electron-overlay-entry.css +0 -37
package/dist/ui/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>slicc</title>
|
|
7
7
|
<link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
|
|
8
|
-
<script type="module" crossorigin src="/assets/main-
|
|
8
|
+
<script type="module" crossorigin src="/assets/main-99mCaNK1.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-aKtaBQYM.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-Dezn_h7o.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/transform-messages-DzB_lMo-.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-9-QEmC9Z.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/tool-ui-DfXu6quJ.js">
|
|
27
|
-
<link rel="modulepreload" crossorigin href="/assets/account-store-
|
|
27
|
+
<link rel="modulepreload" crossorigin href="/assets/account-store-CXTiaOBF.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/clipboard-DgFtRQbq.js">
|
|
29
29
|
</head>
|
|
30
30
|
<body>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>slicc</title>
|
|
7
7
|
<link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
|
|
8
|
-
<script type="module" crossorigin src="/assets/main-
|
|
8
|
+
<script type="module" crossorigin src="/assets/main-99mCaNK1.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-aKtaBQYM.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-Dezn_h7o.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/transform-messages-DzB_lMo-.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-9-QEmC9Z.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/tool-ui-DfXu6quJ.js">
|
|
27
|
-
<link rel="modulepreload" crossorigin href="/assets/account-store-
|
|
27
|
+
<link rel="modulepreload" crossorigin href="/assets/account-store-CXTiaOBF.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/clipboard-DgFtRQbq.js">
|
|
29
29
|
</head>
|
|
30
30
|
<body>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sliccy",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.18.0",
|
|
4
4
|
"description": "Browser-based coding agent with thin CLI server",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"workspaces": [
|
|
27
27
|
"packages/shared-ts",
|
|
28
28
|
"packages/cloud-core",
|
|
29
|
+
"packages/spoon",
|
|
29
30
|
"packages/webcomponents",
|
|
30
31
|
"packages/webapp",
|
|
31
32
|
"packages/cherry",
|
|
@@ -37,19 +38,19 @@
|
|
|
37
38
|
"packages/swift-optel"
|
|
38
39
|
],
|
|
39
40
|
"scripts": {
|
|
40
|
-
"dev": "tsx packages/node-server/src/index.ts
|
|
41
|
-
"dev:electron": "tsx packages/node-server/src/index.ts --
|
|
41
|
+
"dev": "tsx packages/node-server/src/index.ts",
|
|
42
|
+
"dev:electron": "tsx packages/node-server/src/index.ts --electron",
|
|
42
43
|
"dev:standalone:fresh": "bash packages/dev-tools/tools/dev-standalone-fresh.sh",
|
|
43
44
|
"dev:swift:fresh": "PORT=5720 CDP_PORT=9224 bash packages/dev-tools/tools/dev-swift-fresh.sh",
|
|
44
45
|
"dev:extension:fresh": "CDP_PORT=9333 bash packages/dev-tools/tools/dev-extension-fresh.sh",
|
|
45
46
|
"dev:electron:node:fresh": "PORT=5730 CDP_PORT=9225 bash packages/dev-tools/tools/dev-electron-node-fresh.sh",
|
|
46
47
|
"dev:electron:swift:fresh": "PORT=5740 CDP_PORT=9226 bash packages/dev-tools/tools/dev-electron-swift-fresh.sh",
|
|
47
|
-
"build": "npm run build -w @slicc/shared-ts && npm run build -w @slicc/cloud-core && npm run build -w @slicc/webcomponents && npm run build -w @slicc/webapp && npm run build -w @ai-ecoverse/cherry && npm run build -w @slicc/node-server && npm run build -w @slicc/chrome-extension && npm run build -w @slicc/cloudflare-worker && npm run build -w @slicc/swift-server && npm run build -w @slicc/swift-optel && npm run build -w @slicc/swift-launcher",
|
|
48
|
+
"build": "npm run build -w @slicc/shared-ts && npm run build -w @slicc/cloud-core && npm run build -w @ai-ecoverse/spoon && npm run build -w @slicc/webcomponents && npm run build -w @slicc/webapp && npm run build -w @ai-ecoverse/cherry && npm run build -w @slicc/node-server && npm run build -w @slicc/chrome-extension && npm run build -w @slicc/cloudflare-worker && npm run build -w @slicc/swift-server && npm run build -w @slicc/swift-optel && npm run build -w @slicc/swift-launcher",
|
|
48
49
|
"start": "node dist/node-server/index.js",
|
|
49
50
|
"start:electron": "node dist/node-server/index.js --electron",
|
|
50
51
|
"preflight": "node packages/dev-tools/tools/preflight-deps.mjs",
|
|
51
52
|
"pretypecheck": "npm run preflight",
|
|
52
|
-
"typecheck": "tsc --noEmit -p tsconfig.cli.json && tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.worker.json && tsc --noEmit -p tsconfig.webapp-worker.json && tsc --noEmit -p packages/cloud-core/tsconfig.json && tsc --noEmit -p packages/cherry/tsconfig.json && tsc --noEmit -p packages/webcomponents/tsconfig.json",
|
|
53
|
+
"typecheck": "tsc --noEmit -p tsconfig.cli.json && tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.worker.json && tsc --noEmit -p tsconfig.webapp-worker.json && tsc --noEmit -p packages/cloud-core/tsconfig.json && tsc --noEmit -p packages/cherry/tsconfig.json && tsc --noEmit -p packages/spoon/tsconfig.json && tsc --noEmit -p packages/webcomponents/tsconfig.json",
|
|
53
54
|
"pretest": "npm run preflight",
|
|
54
55
|
"test": "vitest run",
|
|
55
56
|
"test:coverage": "vitest run --coverage",
|
|
@@ -61,6 +62,7 @@
|
|
|
61
62
|
"test:coverage:cloud-core": "node packages/dev-tools/tools/coverage-gate.mjs cloud-core",
|
|
62
63
|
"test:coverage:shared": "node packages/dev-tools/tools/coverage-gate.mjs shared",
|
|
63
64
|
"test:coverage:webcomponents": "npm run test:coverage -w @slicc/webcomponents",
|
|
65
|
+
"test:coverage:spoon": "npm run test:coverage -w @ai-ecoverse/spoon",
|
|
64
66
|
"coverage:ratchet": "node packages/dev-tools/tools/coverage-ratchet.mjs",
|
|
65
67
|
"test:server-integration": "vitest run --config packages/node-server/tests/integration/server/vitest.config.ts",
|
|
66
68
|
"test:e2e": "npx playwright test --config packages/webapp/tests/e2e/playwright.config.ts",
|
|
@@ -82,7 +84,7 @@
|
|
|
82
84
|
"package:release": "node dist/node-server/release-package.js",
|
|
83
85
|
"publish:chrome": "node dist/node-server/publish-chrome-web-store.js",
|
|
84
86
|
"publish:worker": "bash packages/cloudflare-worker/scripts/publish-worker.sh",
|
|
85
|
-
"postinstall": "if [ -d patches ]; then npx --no-install patch-package || { echo \"ERROR: patches/ present but patch-package not installed (run a full 'npm ci' incl. devDependencies)\"; exit 1; }; fi && if [ -d packages/shared-ts ]; then npm run build -w @slicc/shared-ts; fi && if [ -d packages/cloud-core ]; then npm run build -w @slicc/cloud-core; fi && if [ -d packages/webcomponents ]; then npm run build -w @slicc/webcomponents; fi",
|
|
87
|
+
"postinstall": "if [ -d patches ]; then npx --no-install patch-package || { echo \"ERROR: patches/ present but patch-package not installed (run a full 'npm ci' incl. devDependencies)\"; exit 1; }; fi && if [ -d packages/shared-ts ]; then npm run build -w @slicc/shared-ts; fi && if [ -d packages/cloud-core ]; then npm run build -w @slicc/cloud-core; fi && if [ -d packages/spoon ]; then npm run build -w @ai-ecoverse/spoon; fi && if [ -d packages/webcomponents ]; then npm run build -w @slicc/webcomponents; fi",
|
|
86
88
|
"prepare": "husky"
|
|
87
89
|
},
|
|
88
90
|
"dependencies": {
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Server as HttpServer } from 'node:http';
|
|
2
|
-
import { type Express } from 'express';
|
|
3
|
-
export interface UiServingOptions {
|
|
4
|
-
devMode: boolean;
|
|
5
|
-
hosted: boolean;
|
|
6
|
-
/** Origin string used only for the dev-server log line. */
|
|
7
|
-
serveOrigin: string;
|
|
8
|
-
/** Built UI directory served in production mode. */
|
|
9
|
-
uiDir: string;
|
|
10
|
-
/** Repo root used to locate the webapp Vite config in dev mode. */
|
|
11
|
-
webappRoot?: string;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Attach UI serving to the Express app. In dev mode (and not hosted) this wires
|
|
15
|
-
* Vite's dev server as middleware for HMR; otherwise it serves the built static
|
|
16
|
-
* bundle with an SPA fallback.
|
|
17
|
-
*/
|
|
18
|
-
export declare function attachUiServing(app: Express, server: HttpServer, opts: UiServingOptions): Promise<void>;
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { join, resolve, sep } from 'node:path';
|
|
3
|
-
import express from 'express';
|
|
4
|
-
/**
|
|
5
|
-
* Attach UI serving to the Express app. In dev mode (and not hosted) this wires
|
|
6
|
-
* Vite's dev server as middleware for HMR; otherwise it serves the built static
|
|
7
|
-
* bundle with an SPA fallback.
|
|
8
|
-
*/
|
|
9
|
-
export async function attachUiServing(app, server, opts) {
|
|
10
|
-
if (opts.devMode && !opts.hosted) {
|
|
11
|
-
await attachViteDevServer(app, server, opts);
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
attachStaticServing(app, opts.uiDir);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
async function attachViteDevServer(app, server, opts) {
|
|
18
|
-
const root = opts.webappRoot ?? process.cwd();
|
|
19
|
-
const { createServer: createViteServer } = await import('vite');
|
|
20
|
-
const webappIndexHtml = resolve(root, 'packages/webapp/index.html');
|
|
21
|
-
const vite = await createViteServer({
|
|
22
|
-
configFile: resolve(root, 'packages/webapp/vite.config.ts'),
|
|
23
|
-
server: {
|
|
24
|
-
middlewareMode: true,
|
|
25
|
-
hmr: {
|
|
26
|
-
server, // Share the HTTP server — our upgrade handler routes /cdp and /licks-ws separately
|
|
27
|
-
path: '/__vite_hmr', // Dedicated path avoids conflicts with /cdp upgrade handler
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
appType: 'custom', // We handle index.html serving ourselves via the handler below
|
|
31
|
-
root,
|
|
32
|
-
});
|
|
33
|
-
app.use(vite.middlewares);
|
|
34
|
-
app.use(async (req, res, next) => {
|
|
35
|
-
if (req.method !== 'GET' ||
|
|
36
|
-
!req.headers.accept?.includes('text/html') ||
|
|
37
|
-
req.path.includes('.')) {
|
|
38
|
-
next();
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
try {
|
|
42
|
-
const template = readFileSync(webappIndexHtml, 'utf-8');
|
|
43
|
-
const html = await vite.transformIndexHtml(req.originalUrl, template);
|
|
44
|
-
res.status(200).setHeader('Content-Type', 'text/html');
|
|
45
|
-
res.end(html);
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
if (err instanceof Error) {
|
|
49
|
-
vite.ssrFixStacktrace(err);
|
|
50
|
-
}
|
|
51
|
-
next(err);
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
console.log(`Vite dev server middleware attached (HMR on ${opts.serveOrigin}/__vite_hmr)`);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Cache-Control policy for the built static bundle. Default `no-cache` forces a
|
|
58
|
-
* cheap conditional revalidation so a stale `index.html` never pins outdated
|
|
59
|
-
* `/assets/<hash>.js` references; service workers are `no-store`; content-hashed
|
|
60
|
-
* `/assets/*` are immutable. Each branch overrides the default by assigning to
|
|
61
|
-
* `cacheControl` — never add a separate setHeader after, or the catch-all wins.
|
|
62
|
-
*/
|
|
63
|
-
function setStaticCacheControl(res, path) {
|
|
64
|
-
let cacheControl = 'no-cache';
|
|
65
|
-
if (path.endsWith('llm-proxy-sw.js') || path.endsWith('preview-sw.js')) {
|
|
66
|
-
// Service workers need `Service-Worker-Allowed: /` for the root-scoped
|
|
67
|
-
// registration `llm-proxy-sw.js` does (`preview-sw.js` registers at the
|
|
68
|
-
// narrower `/preview/` scope, so the broader allowance is harmless).
|
|
69
|
-
// `no-store`, not `no-cache`: a stale SW pinned in cache would intercept
|
|
70
|
-
// fetch / dispatch `preview/*` with outdated logic — a worse failure mode
|
|
71
|
-
// than the revalidation cost.
|
|
72
|
-
res.setHeader('Service-Worker-Allowed', '/');
|
|
73
|
-
cacheControl = 'no-store';
|
|
74
|
-
}
|
|
75
|
-
else if (path.includes(`${sep}assets${sep}`)) {
|
|
76
|
-
// Vite emits content-hashed filenames into `/assets/` — immutable per URL.
|
|
77
|
-
// `path` is a filesystem path, hence the platform-aware `sep` match.
|
|
78
|
-
cacheControl = 'public, max-age=31536000, immutable';
|
|
79
|
-
}
|
|
80
|
-
res.setHeader('Cache-Control', cacheControl);
|
|
81
|
-
}
|
|
82
|
-
function attachStaticServing(app, uiDir) {
|
|
83
|
-
app.use(express.static(uiDir, { setHeaders: setStaticCacheControl }));
|
|
84
|
-
// SPA fallback — serve index.html for all non-file routes. The served
|
|
85
|
-
// index.html carries references to the current asset hashes, and stale-cached
|
|
86
|
-
// HTML is the canonical post-update breakage, hence `no-cache`.
|
|
87
|
-
app.get('/{*path}', (_req, res) => {
|
|
88
|
-
res.setHeader('Cache-Control', 'no-cache');
|
|
89
|
-
res.sendFile(join(uiDir, 'index.html'));
|
|
90
|
-
});
|
|
91
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{m as e}from"./wc-live-DbLgOajX.js";export{e as setDipExecHandler};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./esptool-operations-D9gFmxN7.js";export{e as ESP8266ROM};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./store-BaMl32ka.js";import"./provider-fwp5doUF.js";export{e as readMcpAuthEntries};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./provider-T0IaN12Z.js";export{e as readMcpAuthEntries};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as e}from"./wc-live-DbLgOajX.js";export{e as readSessionsIndex};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/transformers.web-CuUo4MLm.js","assets/chunk-aKtaBQYM.js","assets/preload-helper-zJ_50EbN.js","assets/kokoro-B5jJ2WUJ.js","assets/__vite-browser-external-C7iut881.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{t as e}from"./preload-helper-zJ_50EbN.js";import{t}from"./logger-DDBAeTLF.js";import{t as n}from"./speech-assets-bridge-B8NqCAE8.js";import{i as r,n as i,r as a,t as o}from"./transformers-env-BNvU2_5X.js";var s=t(`speech:espeak`),c=`/workspace/node_modules/espeak-ng/dist/`,l=`espeak-ng.js`,u=`espeak-ng.wasm`;async function d(e,t,n,r){let i=`phonemes.txt`;return(await e({arguments:[`-q`,`-b=1`,`--ipa`,`-v`,n,`--phonout`,i,t],...r?{locateFile:r}:{}})).FS.readFile(i,{encoding:`utf8`}).split(`
|
|
3
|
-
`).map(e=>e.trim()).filter(e=>e.length>0)}function f(e,t){return async n=>{let r=URL.createObjectURL(new Blob([new Uint8Array(t)],{type:`application/wasm`}));try{let t=e=>e.endsWith(`.wasm`)?r:n.locateFile?.(e)??e;return await e({...n,locateFile:t})}finally{URL.revokeObjectURL(r)}}}function p(e){if(typeof BroadcastChannel>`u`)return Promise.reject(Error(`Cannot read VFS path ${e}: BroadcastChannel unavailable`));let t=new BroadcastChannel(`preview-vfs`),n=`espeak-${Date.now()}-${Math.random().toString(36).slice(2)}`;return new Promise((r,i)=>{let a=e=>{t.removeEventListener(`message`,s),t.close(),e()},o=setTimeout(()=>a(()=>i(Error(`ENOENT: ${e} (timed out)`))),3e4),s=t=>{let s=t.data;if(!(s?.type!==`preview-vfs-response`||s.id!==n))if(clearTimeout(o),typeof s.error==`string`)a(()=>i(Error(s.error)));else if(s.content instanceof Uint8Array){let e=s.content;a(()=>r(e))}else if(typeof s.content==`string`){let e=s.content;a(()=>r(new TextEncoder().encode(e)))}else a(()=>i(Error(`Empty preview-vfs response for ${e}`)))};t.addEventListener(`message`,s),t.postMessage({type:`preview-vfs-read`,id:n,path:e,asText:!1})})}async function ee(){let[t,n]=await Promise.all([p(`${c}${l}`),p(`${c}${u}`)]),r=URL.createObjectURL(new Blob([new Uint8Array(t)],{type:`text/javascript`}));try{return{factory:f((await e(()=>import(r),[])).default,n)}}finally{URL.revokeObjectURL(r)}}var m=ee,h=null;function g(){return h||=m().then(({factory:e,locateFile:t})=>(s.info(`espeak-ng multilingual phonemizer loaded`),(n,r)=>d(e,n,r,t)),e=>{throw h=null,s.error(`espeak-ng load failed`,e),e}),h}var te=Object.freeze({e:`es`,f:`fr-fr`,i:`it`,h:`hi`,p:`pt-br`});function _(e){return te[e[0]]??null}var v=RegExp(`(\\s*[${`;:,.!?¡¿—…"«»“”(){}[]`.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}]+\\s*)+`,`g`);function y(e){let t=[],n=0;for(let r of e.matchAll(v)){let i=r[0],a=r.index??0;n<a&&t.push({punct:!1,text:e.slice(n,a)}),i.length>0&&t.push({punct:!0,text:i}),n=a+i.length}return n<e.length&&t.push({punct:!1,text:e.slice(n)}),t}function b(e){return e.replace(/kəkˈoːɹoʊ/g,`kˈoʊkəɹoʊ`).replace(/kəkˈɔːɹəʊ/g,`kˈəʊkəɹəʊ`).replace(/(?<=[a-zɹrː])(?=hˈʌndɹɪd)/g,` `).replace(/ z(?=[;:,.!?¡¿—…"«»“” ]|$)/g,`z`).trim()}async function ne(e,t,n){let r=y(e);return b((await Promise.all(r.map(async e=>e.punct?e.text:(await n(e.text,t)).join(` `)))).join(``))}var x=t(`speech:kokoro`),S=`onnx-community/Kokoro-82M-v1.0-ONNX`,C={a:`en-US`,b:`en-GB`,e:`es-ES`,f:`fr-FR`,i:`it-IT`,h:`hi-IN`,p:`pt-BR`,j:`ja-JP`,z:`zh-CN`},w=new Set([`en-US`,`en-GB`,`es-ES`,`fr-FR`,`it-IT`,`hi-IN`,`pt-BR`]);function re(e){let[t,n]=e.split(`-`);return n?`${t.toLowerCase()}-${n.toUpperCase()}`:t.toLowerCase()}function ie(e,t){if(!t)return!1;if(w.has(t))return!0;if(t.includes(`-`))return!1;let n=C[e[0]];return n!==void 0&&w.has(n)&&n.split(`-`)[0].toLowerCase()===t}function T(e){return Object.entries(e).map(([e,t])=>{let n=t.language?re(t.language):C[e[0]];return{id:e,name:t.name||e,lang:n??`en-US`,onDevice:ie(e,n),...t.gender?{gender:t.gender}:{}}})}var E=Object.freeze({ef_dora:{name:`Dora`,gender:`Female`},em_alex:{name:`Alex`,gender:`Male`},em_santa:{name:`Santa`,gender:`Male`},ff_siwis:{name:`Siwis`,gender:`Female`},hf_alpha:{name:`Alpha`,gender:`Female`},hf_beta:{name:`Beta`,gender:`Female`},hm_omega:{name:`Omega`,gender:`Male`},hm_psi:{name:`Psi`,gender:`Male`},if_sara:{name:`Sara`,gender:`Female`},im_nicola:{name:`Nicola`,gender:`Male`},pf_dora:{name:`Dora`,gender:`Female`},pm_alex:{name:`Alex`,gender:`Male`},pm_santa:{name:`Santa`,gender:`Male`},jf_alpha:{name:`Alpha`,gender:`Female`},jf_gongitsune:{name:`Gongitsune`,gender:`Female`},jf_nezumi:{name:`Nezumi`,gender:`Female`},jf_tebukuro:{name:`Tebukuro`,gender:`Female`},jm_kumo:{name:`Kumo`,gender:`Male`},zf_xiaobei:{name:`Xiaobei`,gender:`Female`},zf_xiaoni:{name:`Xiaoni`,gender:`Female`},zf_xiaoxiao:{name:`Xiaoxiao`,gender:`Female`},zf_xiaoyi:{name:`Xiaoyi`,gender:`Female`},zm_yunjian:{name:`Yunjian`,gender:`Male`},zm_yunxi:{name:`Yunxi`,gender:`Male`},zm_yunxia:{name:`Yunxia`,gender:`Male`},zm_yunyang:{name:`Yunyang`,gender:`Male`}});function ae(e){let t={...e};for(let[e,n]of Object.entries(E))e in t||(t[e]=n);return T(t)}var D=`style_text_to_speech_2`,O=`StyleTextToSpeech2Model`;function k(e){return e?.model_type===D&&(!Array.isArray(e.architectures)||e.architectures.length===0)&&(e.architectures=[O]),e}var A=Symbol.for(`slicc.kokoro.style-tts2-arch-shim`);function j(e){let t=e?.AutoConfig,n=t?.from_pretrained;if(!t||typeof n!=`function`){x.debug(`style_text_to_speech_2 shim skipped: AutoConfig.from_pretrained unavailable`);return}if(n[A])return;let r=async(...e)=>{let r=await n.apply(t,e),i=r?.model_type===D&&(!Array.isArray(r.architectures)||r.architectures.length===0);return k(r),i&&x.debug(`style_text_to_speech_2 architectures injected for "${String(e[0])}": [${O}]`),r};r[A]=!0,t.from_pretrained=r,x.debug(`style_text_to_speech_2 architecture shim installed on AutoConfig.from_pretrained`)}async function M(e,t,n,r,i,a){let o=await ne(t,n,a),s=e.tokenizer,{input_ids:c}=s(o,{truncation:!0}),l=await e.generate_from_ids(c,{voice:r,...i?{speed:i}:{}});return{audio:l.audio,sampleRate:l.sampling_rate}}var oe=/(?<=[.!?。!?…])\s+|\n{2,}/u;function se(e,t){let n=t??oe,r=e.split(n).map(e=>e.trim()).filter(e=>e.length>0),i=e.trim();return r.length>0?r:i?[i]:[]}var N=null,P=`idle`,F=null,I=null;function L(){return P}function R(){return F}function z(){return I}function B(e){return N||=(P=`loading`,V(e).then(e=>(P=`ready`,I=e,e),e=>{throw P=`failed`,N=null,x.error(`kokoro load failed`,e),e})),N}async function V(t){let n=await e(()=>import(`./transformers.web-CuUo4MLm.js`),__vite__mapDeps([0,1,2]));i(n.env),j(n),await o(S),await a();let{KokoroTTS:s,TextSplitterStream:c}=await e(async()=>{let{KokoroTTS:e,TextSplitterStream:t}=await import(`./kokoro-B5jJ2WUJ.js`);return{KokoroTTS:e,TextSplitterStream:t}},__vite__mapDeps([3,1,0,2,4])),l=r(),u=typeof navigator<`u`&&`gpu`in navigator,d=await s.from_pretrained(S,{device:u?`webgpu`:`wasm`,dtype:u?`fp32`:`q8`,progress_callback:e=>{if(e?.file){if(e.status===`progress`)l.update(e.file,e.loaded??0,e.total??0);else if(e.status===`done`)l.complete(e.file);else return;F=l.snapshot(),t?.(F)}}});x.info(`kokoro ready`,{model:S,device:u?`webgpu`:`wasm`});let f=ae(d.voices);return{async synthesize(e,t){let n=t?.voice??`af_heart`,r=_(n);if(r){let i=await g();return M(d,e,r,n,t?.speed,i)}let i=await d.generate(e,{...t?.voice?{voice:t.voice}:{},...t?.speed?{speed:t.speed}:{}});return{audio:i.audio,sampleRate:i.sampling_rate}},async*synthesizeStream(e,t){let n=t?.voice??`af_heart`,r=_(n);if(r){let i=await g();for(let a of se(e,t?.splitPattern))yield await M(d,a,r,n,t?.speed,i);return}let i={...t?.voice?{voice:t.voice}:{},...t?.speed?{speed:t.speed}:{}},a=new c;if(t?.splitPattern){let n=e.split(t.splitPattern).map(e=>e.trim()).filter(e=>e.length>0);a.push(...n)}else a.push(e);a.close();for await(let e of d.stream(a,i))yield{audio:e.audio.audio,sampleRate:e.audio.sampling_rate}},voices:()=>f}}var H=44,U=16,W=1,G=U/8;function K(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}function ce(e){let t=Math.max(-1,Math.min(1,e));return Math.round(t<0?t*32768:t*32767)}function le(e){if(e.length===0)throw Error(`wav-encode: at least one PCM chunk is required`);let t=e[0].sampleRate;if(!Number.isFinite(t)||t<=0)throw Error(`wav-encode: invalid sample rate ${t}`);let n=0;for(let r of e){if(r.sampleRate!==t)throw Error(`wav-encode: mixed sample rates (${r.sampleRate} vs ${t}) — resample upstream`);n+=r.audio.length}let r=n*W*G,i=new ArrayBuffer(H+r),a=new DataView(i);K(a,0,`RIFF`),a.setUint32(4,36+r,!0),K(a,8,`WAVE`),K(a,12,`fmt `),a.setUint32(16,16,!0),a.setUint16(20,1,!0),a.setUint16(22,W,!0),a.setUint32(24,t,!0),a.setUint32(28,t*W*G,!0),a.setUint16(32,W*G,!0),a.setUint16(34,U,!0),K(a,36,`data`),a.setUint32(40,r,!0);let o=H;for(let t of e)for(let e=0;e<t.audio.length;e++)a.setInt16(o,ce(t.audio[e]),!0),o+=G;return new Uint8Array(i)}var q=t(`speech:speak`),J=2e4;function Y(e){return e.toLowerCase().startsWith(`en`)}function ue(e,t){if(!t.ready)return`webspeech`;let n=e=>e.onDevice&&(Y(e.lang)||t.nonEnglishOnDevice);if(e.voice){let r=t.voices.find(t=>t.id===e.voice);return r&&n(r)?`kokoro`:`webspeech`}let r=(e.lang?e.lang.split(`-`)[0]:`en`).toLowerCase();return t.voices.some(e=>e.lang.split(`-`)[0].toLowerCase()===r&&n(e))?`kokoro`:`webspeech`}function de(e,t){if(!e||Y(e))return;let n=e.split(`-`)[0].toLowerCase();return t.find(e=>e.onDevice&&e.lang.split(`-`)[0].toLowerCase()===n)?.id}var fe=48;function pe(e){let t=e;return t=t.replace(/```[\s\S]*?```/g,` `),t=t.replace(/~~~[\s\S]*?~~~/g,` `),t=t.replace(/(?:```|~~~)[\s\S]*$/,` `),t=t.replace(/!\[([^\]]*)\]\([^)]*\)/g,`$1`),t=t.replace(/\[([^\]]+)\]\([^)]*\)/g,`$1`),t=t.replace(/`([^`]*)`/g,(e,t)=>t.length>fe?` `:t),t=t.replace(/<[^>\n]+>/g,` `),t=t.replace(/^[ \t]{0,3}#{1,6}[ \t]+/gm,``),t=t.replace(/^[ \t]*>[ \t]?/gm,``),t=t.replace(/^[ \t]*(?:[-*+]|\d+[.)])[ \t]+/gm,``),t=t.replace(/[*_~]{1,3}([^*_~]+)[*_~]{1,3}/g,`$1`),t=t.replace(/\s+/g,` `).trim(),t.length>J&&(t=`${t.slice(0,J).replace(/\s+\S*$/,``)}…`),t}var X=()=>typeof chrome<`u`&&!!chrome?.runtime?.id;function me(e){return e.onDevice&&(Y(e.lang)||!X())}function he(){return z()?.voices().map(e=>({...e,onDevice:me(e)}))??[]}var Z;function ge(e){Z=e}function Q(){let e=R();return{state:L(),...e?{loaded:e.loaded,total:e.total,etaSeconds:e.etaSeconds}:{}}}async function _e(){try{X()||await n({instanceId:Z})}catch(e){q.warn(`kokoro asset staging failed; trying already-present weights`,e)}try{await B()}catch(e){q.warn(`kokoro warmup load failed`,e)}}function ve(){return _e(),Q()}var $=null;function ye(){return(!$||$.state===`closed`)&&($=new AudioContext),$}async function be(e,t,n=1){let r=ye();r.state===`suspended`&&await r.resume();let i=r.createBuffer(1,e.length,t);i.copyToChannel(new Float32Array(e),0);let a=r.createBufferSource();a.buffer=i;let o=r.createGain();o.gain.value=n,a.connect(o),o.connect(r.destination),await new Promise(e=>{a.onended=()=>e(),a.start()})}function xe(e){return typeof speechSynthesis>`u`?Promise.reject(Error(`speechSynthesis is unavailable in this realm`)):new Promise((t,n)=>{let r=new SpeechSynthesisUtterance(e.text);if(e.lang!==void 0&&(r.lang=e.lang),e.rate!==void 0&&(r.rate=e.rate),e.pitch!==void 0&&(r.pitch=e.pitch),e.volume!==void 0&&(r.volume=e.volume),e.voice){let t=speechSynthesis.getVoices().find(t=>t.name===e.voice);t&&(r.voice=t)}r.onend=()=>t(),r.onerror=e=>n(Error(`speak: ${e.error||`utterance failed`}`)),speechSynthesis.speak(r)})}async function Se(e){let t=z(),n=t?.voices()??[];if(ue(e,{ready:t!==null,voices:n,nonEnglishOnDevice:!X()})===`kokoro`&&t){let r=e.voice??de(e.lang,n),i=0;try{let n=t.synthesizeStream(e.text,{...r?{voice:r}:{},...e.rate?{speed:e.rate}:{}});for await(let t of n)await be(t.audio,t.sampleRate,e.volume),i++;return{engine:`kokoro`}}catch(e){if(i>0)return q.warn(`kokoro stream failed mid-playback; stopping`,e),{engine:`kokoro`};q.warn(`kokoro synthesis failed; falling back to webspeech`,e)}}return await xe(e),{engine:`webspeech`}}async function Ce(e){let t=z();if(!t)throw Error(`on-device voice not ready — run say --warmup and retry once it reports ready`);if(e.lang&&!e.lang.toLowerCase().startsWith(`en`))throw Error(`-o writes WAV via the on-device voice, which is English-only (got ${e.lang})`);if(e.voice&&!t.voices().map(e=>e.id).includes(e.voice))throw Error(`-o writes WAV via the on-device voice; "${e.voice}" is a Web Speech voice. Pick a kokoro voice (e.g. af_heart) or omit -v.`);let n=[],r=t.synthesizeStream(e.text,{...e.voice?{voice:e.voice}:{},...e.rate?{speed:e.rate}:{}});for await(let e of r)n.push({audio:e.audio,sampleRate:e.sampleRate});if(n.length===0)throw Error(`kokoro produced no audio (text is empty after sentence split?)`);return le(n)}export{Q as kokoroStatus,he as kokoroVoicesIfReady,ve as kokoroWarmup,ge as setSpeakAssetsInstanceId,Se as speak,pe as speechTextFromMarkdown,Ce as synthesizeToWav};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-LESFN7Hj.js";import{callEnsureSpeechAssets as t}from"./speech-assets-bridge-BUDIvdid.js";import{a as n,i as r,n as i,r as a}from"./kokoro-engine-DXi-4Lk1.js";function o(e,t,n){for(let r=0;r<n.length;r++)e.setUint8(t+r,n.charCodeAt(r))}function s(e){let t=Math.max(-1,Math.min(1,e));return Math.round(t<0?t*32768:t*32767)}function c(e){if(e.length===0)throw Error(`wav-encode: at least one PCM chunk is required`);let t=e[0].sampleRate;if(!Number.isFinite(t)||t<=0)throw Error(`wav-encode: invalid sample rate ${t}`);let n=0;for(let r of e){if(r.sampleRate!==t)throw Error(`wav-encode: mixed sample rates (${r.sampleRate} vs ${t}) — resample upstream`);n+=r.audio.length}let r=n*1*2,i=new ArrayBuffer(44+r),a=new DataView(i);o(a,0,`RIFF`),a.setUint32(4,36+r,!0),o(a,8,`WAVE`),o(a,12,`fmt `),a.setUint32(16,16,!0),a.setUint16(20,1,!0),a.setUint16(22,1,!0),a.setUint32(24,t,!0),a.setUint32(28,t*1*2,!0),a.setUint16(32,2,!0),a.setUint16(34,16,!0),o(a,36,`data`),a.setUint32(40,r,!0);let c=44;for(let t of e)for(let e=0;e<t.audio.length;e++)a.setInt16(c,s(t.audio[e]),!0),c+=2;return new Uint8Array(i)}const l=e(`speech:speak`);function u(e){return e.toLowerCase().startsWith(`en`)}function d(e,t){if(!t.ready)return`webspeech`;let n=e=>e.onDevice&&(u(e.lang)||t.nonEnglishOnDevice);if(e.voice){let r=t.voices.find(t=>t.id===e.voice);return r&&n(r)?`kokoro`:`webspeech`}let r=(e.lang?e.lang.split(`-`)[0]:`en`).toLowerCase();return t.voices.some(e=>e.lang.split(`-`)[0].toLowerCase()===r&&n(e))?`kokoro`:`webspeech`}function f(e,t){if(!e||u(e))return;let n=e.split(`-`)[0].toLowerCase();return t.find(e=>e.onDevice&&e.lang.split(`-`)[0].toLowerCase()===n)?.id}const p=()=>typeof chrome<`u`&&!!chrome?.runtime?.id;function m(e){return e.onDevice&&(u(e.lang)||!p())}function h(){return r()?.voices().map(e=>({...e,onDevice:m(e)}))??[]}function g(){let e=a();return{state:n(),...e?{loaded:e.loaded,total:e.total,etaSeconds:e.etaSeconds}:{}}}async function _(){try{p()||await t({instanceId:void 0})}catch(e){l.warn(`kokoro asset staging failed; trying already-present weights`,e)}try{await i()}catch(e){l.warn(`kokoro warmup load failed`,e)}}function v(){return _(),g()}let y=null;function b(){return(!y||y.state===`closed`)&&(y=new AudioContext),y}async function x(e,t,n=1){let r=b();r.state===`suspended`&&await r.resume();let i=r.createBuffer(1,e.length,t);i.copyToChannel(new Float32Array(e),0);let a=r.createBufferSource();a.buffer=i;let o=r.createGain();o.gain.value=n,a.connect(o),o.connect(r.destination),await new Promise(e=>{a.onended=()=>e(),a.start()})}function S(e){return typeof speechSynthesis>`u`?Promise.reject(Error(`speechSynthesis is unavailable in this realm`)):new Promise((t,n)=>{let r=new SpeechSynthesisUtterance(e.text);if(e.lang!==void 0&&(r.lang=e.lang),e.rate!==void 0&&(r.rate=e.rate),e.pitch!==void 0&&(r.pitch=e.pitch),e.volume!==void 0&&(r.volume=e.volume),e.voice){let t=speechSynthesis.getVoices().find(t=>t.name===e.voice);t&&(r.voice=t)}r.onend=()=>t(),r.onerror=e=>n(Error(`speak: ${e.error||`utterance failed`}`)),speechSynthesis.speak(r)})}async function C(e){let t=r(),n=t?.voices()??[];if(d(e,{ready:t!==null,voices:n,nonEnglishOnDevice:!p()})===`kokoro`&&t){let r=e.voice??f(e.lang,n),i=0;try{let n=t.synthesizeStream(e.text,{...r?{voice:r}:{},...e.rate?{speed:e.rate}:{}});for await(let t of n)await x(t.audio,t.sampleRate,e.volume),i++;return{engine:`kokoro`}}catch(e){if(i>0)return l.warn(`kokoro stream failed mid-playback; stopping`,e),{engine:`kokoro`};l.warn(`kokoro synthesis failed; falling back to webspeech`,e)}}return await S(e),{engine:`webspeech`}}async function w(e){let t=r();if(!t)throw Error(`on-device voice not ready — run say --warmup and retry once it reports ready`);if(e.lang&&!e.lang.toLowerCase().startsWith(`en`))throw Error(`-o writes WAV via the on-device voice, which is English-only (got ${e.lang})`);if(e.voice&&!t.voices().map(e=>e.id).includes(e.voice))throw Error(`-o writes WAV via the on-device voice; "${e.voice}" is a Web Speech voice. Pick a kokoro voice (e.g. af_heart) or omit -v.`);let n=[],i=t.synthesizeStream(e.text,{...e.voice?{voice:e.voice}:{},...e.rate?{speed:e.rate}:{}});for await(let e of i)n.push({audio:e.audio,sampleRate:e.sampleRate});if(n.length===0)throw Error(`kokoro produced no audio (text is empty after sentence split?)`);return c(n)}export{g as kokoroStatus,h as kokoroVoicesIfReady,v as kokoroWarmup,C as speak,w as synthesizeToWav};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./logger-DDBAeTLF.js";import{speak as t,speechTextFromMarkdown as n}from"./speak-BLaMFnqh.js";var r=e(`speech:voice-reply`),i=0;function a(){i++}function o(){return i<=0?!1:(i--,!0)}async function s(e,i=t){let a=n(e);if(a)try{await i({text:a})}catch(e){r.warn(`spoken reply failed`,e)}}export{o as consumeVoiceSubmission,a as markVoiceSubmission,s as speakReplyMarkdown};
|