skykoi 2026.3.365 → 2026.3.366

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{archive-V8-RCbVU.js → archive-lc4aTrME.js} +1 -1
  2. package/dist/build-info.json +2 -2
  3. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  4. package/dist/{capture-service-SdKz2CMm.js → capture-service-Cf1TbNjO.js} +170 -4
  5. package/dist/{channel-options-za1_wuVW.js → channel-options-DyDeQlCI.js} +1 -1
  6. package/dist/{channels-cli-CrvMS744.js → channels-cli-DrMs9_n6.js} +6 -6
  7. package/dist/cli/daemon-cli.js +1 -1
  8. package/dist/{cli-m2eMMz9I.js → cli-Bp5p4fp9.js} +1 -1
  9. package/dist/{completion-cli-C9ir8GOD.js → completion-cli-DvRTz9tW.js} +1 -1
  10. package/dist/{config-guard-Y04pZGJc.js → config-guard-D2MuFG-R.js} +13 -13
  11. package/dist/{configure-PZiKU3V7.js → configure-YnJ1tddp.js} +3 -3
  12. package/dist/{daemon-cli-7PvPfrov.js → daemon-cli-CWGXZMX3.js} +1 -1
  13. package/dist/{deps-CaffRbsR.js → deps-bxV4Fhqd.js} +1 -1
  14. package/dist/{doctor-vUQ-UZG1.js → doctor-BmZlvlO9.js} +3 -3
  15. package/dist/{doctor-completion-BMyOL8bF.js → doctor-completion-B_DB6yKB.js} +1 -1
  16. package/dist/entry.js +1 -1
  17. package/dist/extension-api.js +1 -1
  18. package/dist/{gateway-cli-5-NDy9DQ.js → gateway-cli-CKUmcFLG.js} +16 -16
  19. package/dist/{github-copilot-auth-Bi9_8JjO.js → github-copilot-auth-B8anaBMU.js} +1 -1
  20. package/dist/{health-format-CxmTuy8H.js → health-format-HJ49Tlyk.js} +1 -1
  21. package/dist/{hooks-cli-4TyhUU7r.js → hooks-cli-tNp3Hoa1.js} +3 -3
  22. package/dist/index.js +19 -19
  23. package/dist/{installs-Nxn1YLbh.js → installs-CgF6acAX.js} +1 -1
  24. package/dist/{koi-AmEsOzbA.js → koi-C7h4YyTn.js} +2 -2
  25. package/dist/{models-cli-BD34jgwV.js → models-cli-Duetla7W.js} +2 -2
  26. package/dist/{onboard-channels-DsBq18pU.js → onboard-channels-Cg-RtF_Q.js} +2 -2
  27. package/dist/{onboard-skills-DocB9vHW.js → onboard-skills-AM1-GoCb.js} +3 -3
  28. package/dist/{onboarding-DxB2jPaW.js → onboarding-BXqZpqCS.js} +6 -6
  29. package/dist/{plugin-registry-D7fneJ6X.js → plugin-registry-OEYl6Glv.js} +1 -1
  30. package/dist/plugin-sdk/capture/audio-capture.d.ts +4 -0
  31. package/dist/plugin-sdk/capture/capture-store.d.ts +1 -1
  32. package/dist/plugin-sdk/index.js +16 -16
  33. package/dist/plugin-sdk/{pi-model-discovery-szlzYGsC.js → pi-model-discovery-CBWcyyqn.js} +3 -3
  34. package/dist/{plugins-cli-DEQgAvf2.js → plugins-cli-Drazdm-4.js} +5 -5
  35. package/dist/{program-CMod3Tkq.js → program-B4F-KxtZ.js} +4 -4
  36. package/dist/{register.subclis-Cxfj8DMz.js → register.subclis-C514WXu2.js} +10 -10
  37. package/dist/{reply-Dx6GW2J0.js → reply-kg3drq1N.js} +1 -1
  38. package/dist/{run-main-CLkrpAdw.js → run-main-CWySis6K.js} +20 -20
  39. package/dist/{server-node-events-Lr_FVpbB.js → server-node-events-B1vg4hw3.js} +3 -3
  40. package/dist/{status-DNr2zDWJ.js → status-CrxsbMfq.js} +1 -1
  41. package/dist/{update-BhiebIic.js → update-DCBf0mrX.js} +1 -1
  42. package/dist/{update-cli-CZ0GwPc-.js → update-cli-CHpskZMu.js} +11 -11
  43. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { i as __require, o as __toESM, t as __commonJSMin } from "./chunk-D_gEzPfs.js";
2
- import { mt as require_inherits } from "./reply-Dx6GW2J0.js";
2
+ import { mt as require_inherits } from "./reply-kg3drq1N.js";
3
3
  import path from "node:path";
4
4
  import fs from "node:fs/promises";
5
5
  import * as tar from "tar";
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.3.365",
2
+ "version": "2026.3.366",
3
3
  "commit": "4bd60b7c1b294bb24b257d2f381ec929031df39c",
4
- "builtAt": "2026-06-25T09:22:30.389Z"
4
+ "builtAt": "2026-06-25T09:30:50.695Z"
5
5
  }
@@ -1 +1 @@
1
- 755bda0f54fcac0213738469095508aab7603d5bb6e3d4e30a96495df130d4b0
1
+ 8cc8d318fda386cc3a78e86697fb9c588ce6d4e1edbcdd5c2485df465242429d
@@ -1,7 +1,7 @@
1
1
  import { appendFileSync, closeSync, copyFileSync, createReadStream, existsSync, mkdirSync, openSync, readFileSync, readSync, statSync, unlinkSync, watch, writeFileSync } from "node:fs";
2
- import { extname, join, relative } from "node:path";
2
+ import { dirname, extname, join, relative } from "node:path";
3
3
  import { homedir } from "node:os";
4
- import { execFile, execSync } from "node:child_process";
4
+ import { execFile, execFileSync, execSync, spawn } from "node:child_process";
5
5
 
6
6
  //#region src/capture/terminal-capture.ts
7
7
  const ITERM_SCRIPT = `
@@ -1386,6 +1386,104 @@ function startMessageCapture() {
1386
1386
  } };
1387
1387
  }
1388
1388
 
1389
+ //#endregion
1390
+ //#region src/capture/audio-capture.ts
1391
+ const AUDIO_LIVE_FILE$1 = join(homedir(), ".skykoi", "capture", "audio-live.jsonl");
1392
+ function findPackageRoot() {
1393
+ let dir = dirname(new URL(import.meta.url).pathname);
1394
+ for (let i = 0; i < 10; i++) {
1395
+ if (existsSync(join(dir, "package.json"))) return dir;
1396
+ dir = dirname(dir);
1397
+ }
1398
+ return dir;
1399
+ }
1400
+ function daemonDir() {
1401
+ return join(findPackageRoot(), "src", "capture", "audio-daemon");
1402
+ }
1403
+ function daemonBinary() {
1404
+ return join(daemonDir(), "audio-daemon");
1405
+ }
1406
+ function isDaemonRunning() {
1407
+ try {
1408
+ return execFileSync("pgrep", ["-f", "audio-daemon"], {
1409
+ encoding: "utf8",
1410
+ timeout: 3e3
1411
+ }).trim().length > 0;
1412
+ } catch {
1413
+ return false;
1414
+ }
1415
+ }
1416
+ function compileDaemon() {
1417
+ const dir = daemonDir();
1418
+ if (!existsSync(join(dir, "main.swift"))) return false;
1419
+ try {
1420
+ execFileSync("swiftc", [
1421
+ "-O",
1422
+ "-o",
1423
+ "audio-daemon",
1424
+ "main.swift",
1425
+ "-framework",
1426
+ "AVFoundation",
1427
+ "-framework",
1428
+ "Speech",
1429
+ "-framework",
1430
+ "ScreenCaptureKit",
1431
+ "-framework",
1432
+ "CoreMedia"
1433
+ ], {
1434
+ cwd: dir,
1435
+ timeout: 12e4
1436
+ });
1437
+ return true;
1438
+ } catch (err) {
1439
+ console.error(`[capture] Audio daemon compilation failed: ${err}`);
1440
+ return false;
1441
+ }
1442
+ }
1443
+ function startAudioCapture() {
1444
+ if (process.platform !== "darwin") return { stop: () => {} };
1445
+ if (isDaemonRunning()) {
1446
+ console.log("[capture] Audio daemon already running");
1447
+ return { stop: () => {
1448
+ try {
1449
+ execFileSync("pkill", ["-f", "audio-daemon"], { timeout: 3e3 });
1450
+ } catch {}
1451
+ } };
1452
+ }
1453
+ const binary = daemonBinary();
1454
+ if (!existsSync(binary)) {
1455
+ console.log("[capture] Audio daemon not found, compiling...");
1456
+ if (!compileDaemon()) {
1457
+ console.error("[capture] Audio daemon compilation failed — audio capture disabled");
1458
+ return { stop: () => {} };
1459
+ }
1460
+ }
1461
+ try {
1462
+ writeFileSync(AUDIO_LIVE_FILE$1, "");
1463
+ } catch {}
1464
+ let proc = null;
1465
+ try {
1466
+ proc = spawn(binary, [], {
1467
+ stdio: "ignore",
1468
+ detached: true
1469
+ });
1470
+ proc.unref();
1471
+ console.log(`[capture] Audio daemon started (PID ${proc.pid})`);
1472
+ } catch (err) {
1473
+ console.error(`[capture] Audio daemon failed to start: ${err}`);
1474
+ return { stop: () => {} };
1475
+ }
1476
+ const pid = proc?.pid;
1477
+ return { stop: () => {
1478
+ if (pid) try {
1479
+ process.kill(pid, "SIGTERM");
1480
+ } catch {}
1481
+ try {
1482
+ execFileSync("pkill", ["-f", "audio-daemon"], { timeout: 3e3 });
1483
+ } catch {}
1484
+ } };
1485
+ }
1486
+
1389
1487
  //#endregion
1390
1488
  //#region src/capture/capture-service.ts
1391
1489
  /**
@@ -1397,7 +1495,9 @@ function startMessageCapture() {
1397
1495
  * receives raw data on every turn.
1398
1496
  */
1399
1497
  const INPUT_LIVE_FILE = join(homedir(), ".skykoi", "capture", "input-live.jsonl");
1498
+ const AUDIO_LIVE_FILE = join(homedir(), ".skykoi", "capture", "audio-live.jsonl");
1400
1499
  let inputFileLastReadOffset = -1;
1500
+ let audioFileLastReadOffset = -1;
1401
1501
  let lastTerminalSnapshot = [];
1402
1502
  let lastProcessSnapshot = null;
1403
1503
  const TERMINAL_POLL_MS = 5e3;
@@ -1452,8 +1552,44 @@ function buildCaptureContextBlock() {
1452
1552
  }
1453
1553
  }
1454
1554
  } catch {}
1455
- const allEvents = [...events, ...directInputs];
1456
- console.log(`[capture] buildCaptureContextBlock: storeEvents=${events.length}, directInputs=${directInputs.length}, total=${allEvents.length}, fileOffset=${inputFileLastReadOffset}`);
1555
+ const audioInputs = [];
1556
+ try {
1557
+ if (existsSync(AUDIO_LIVE_FILE)) {
1558
+ const audioFileSize = statSync(AUDIO_LIVE_FILE).size;
1559
+ if (audioFileLastReadOffset < 0) audioFileLastReadOffset = audioFileSize;
1560
+ if (audioFileSize > audioFileLastReadOffset) {
1561
+ const buf = Buffer.alloc(audioFileSize - audioFileLastReadOffset);
1562
+ const fd = openSync(AUDIO_LIVE_FILE, "r");
1563
+ try {
1564
+ readSync(fd, buf, 0, buf.length, audioFileLastReadOffset);
1565
+ } finally {
1566
+ closeSync(fd);
1567
+ }
1568
+ audioFileLastReadOffset = audioFileSize;
1569
+ for (const line of buf.toString("utf8").split("\n")) {
1570
+ if (!line.trim()) continue;
1571
+ try {
1572
+ const evt = JSON.parse(line);
1573
+ const type = evt.type;
1574
+ if (type === "mic_transcript" || type === "audio_transcript") {
1575
+ const ts = typeof evt.ts === "number" ? evt.ts : Date.now();
1576
+ audioInputs.push({
1577
+ source: "audio",
1578
+ ts,
1579
+ data: evt
1580
+ });
1581
+ }
1582
+ } catch {}
1583
+ }
1584
+ }
1585
+ }
1586
+ } catch {}
1587
+ const allEvents = [
1588
+ ...events,
1589
+ ...directInputs,
1590
+ ...audioInputs
1591
+ ];
1592
+ console.log(`[capture] buildCaptureContextBlock: storeEvents=${events.length}, directInputs=${directInputs.length}, audioInputs=${audioInputs.length}, total=${allEvents.length}`);
1457
1593
  if (allEvents.length === 0) return "";
1458
1594
  const sections = [];
1459
1595
  const terminals = allEvents.filter((e) => e.source === "terminal");
@@ -1690,6 +1826,30 @@ function buildCaptureContextBlock() {
1690
1826
  sections.push(`[${ts}] ${platform} ${dir} ${d.from}: ${String(d.text).slice(0, 200)}`);
1691
1827
  }
1692
1828
  }
1829
+ const audioEvents = allEvents.filter((e) => e.source === "audio");
1830
+ if (audioEvents.length > 0) {
1831
+ const micEvents = audioEvents.filter((e) => e.data.type === "mic_transcript");
1832
+ const systemAudioEvents = audioEvents.filter((e) => e.data.type === "audio_transcript");
1833
+ if (micEvents.length > 0 || systemAudioEvents.length > 0) {
1834
+ sections.push("## Audio Transcription (live)");
1835
+ if (micEvents.length > 0) {
1836
+ sections.push("### Microphone (you):");
1837
+ for (const e of micEvents) {
1838
+ const ts = new Date(e.ts).toISOString().slice(11, 19);
1839
+ const final = e.data.isFinal ? "" : " [partial]";
1840
+ sections.push(`[${ts}]${final} ${e.data.text}`);
1841
+ }
1842
+ }
1843
+ if (systemAudioEvents.length > 0) {
1844
+ sections.push("### Device Audio (others/media):");
1845
+ for (const e of systemAudioEvents) {
1846
+ const ts = new Date(e.ts).toISOString().slice(11, 19);
1847
+ const final = e.data.isFinal ? "" : " [partial]";
1848
+ sections.push(`[${ts}]${final} ${e.data.text}`);
1849
+ }
1850
+ }
1851
+ }
1852
+ }
1693
1853
  if (sections.length === 0) return "";
1694
1854
  return "# Device Activity (exact, real-time)\n\n" + sections.join("\n");
1695
1855
  }
@@ -1863,6 +2023,12 @@ async function startCaptureService(opts) {
1863
2023
  } catch (err) {
1864
2024
  console.error(`[capture] Message capture failed to start: ${err}`);
1865
2025
  }
2026
+ try {
2027
+ const audioHandle = startAudioCapture();
2028
+ stops.push(audioHandle.stop);
2029
+ } catch (err) {
2030
+ console.error(`[capture] Audio capture failed to start: ${err}`);
2031
+ }
1866
2032
  const flushTimer = setInterval(() => {
1867
2033
  if (!stopped) flushToDisk();
1868
2034
  }, FLUSH_INTERVAL_MS);
@@ -2,7 +2,7 @@ import { O as CHAT_CHANNEL_ORDER } from "./subsystem-hATE68va.js";
2
2
  import { t as isTruthyEnvValue } from "./env-ChCKTuXK.js";
3
3
  import { n as listChannelPlugins } from "./plugins-BXfIVhTg.js";
4
4
  import { i as listChannelPluginCatalogEntries } from "./plugin-auto-enable-Cg3LRidd.js";
5
- import { t as ensurePluginRegistryLoaded } from "./plugin-registry-D7fneJ6X.js";
5
+ import { t as ensurePluginRegistryLoaded } from "./plugin-registry-OEYl6Glv.js";
6
6
 
7
7
  //#region src/cli/channel-options.ts
8
8
  function dedupe(values) {
@@ -1,5 +1,5 @@
1
1
  import "./pi-embedded-helpers-VJ9hOBTv.js";
2
- import { Gt as parseDiscordTarget, Kt as fetchChannelPermissionsDiscord, in as createSlackWebClient, lt as loadProviderUsageSummary, ut as formatUsageReportLines } from "./reply-Dx6GW2J0.js";
2
+ import { Gt as parseDiscordTarget, Kt as fetchChannelPermissionsDiscord, in as createSlackWebClient, lt as loadProviderUsageSummary, ut as formatUsageReportLines } from "./reply-kg3drq1N.js";
3
3
  import { f as danger, s as defaultRuntime, w as getResolvedLoggerSettings } from "./subsystem-hATE68va.js";
4
4
  import "./paths-VdmjGGyc.js";
5
5
  import { r as theme } from "./theme-C5EwWDWE.js";
@@ -73,20 +73,20 @@ import "./event-log-BJRHlOn8.js";
73
73
  import { t as resolveChannelDefaultAccountId } from "./helpers-y1KKH5pe.js";
74
74
  import "./note-DRoVRuAi.js";
75
75
  import { t as createClackPrompter } from "./clack-prompter-B9o3eQeW.js";
76
- import { i as reloadOnboardingPluginRegistry, n as setupChannels, r as ensureOnboardingPluginInstalled } from "./onboard-channels-DsBq18pU.js";
76
+ import { i as reloadOnboardingPluginRegistry, n as setupChannels, r as ensureOnboardingPluginInstalled } from "./onboard-channels-Cg-RtF_Q.js";
77
77
  import { i as listChannelPluginCatalogEntries } from "./plugin-auto-enable-Cg3LRidd.js";
78
- import "./archive-V8-RCbVU.js";
78
+ import "./archive-lc4aTrME.js";
79
79
  import "./skill-scanner-CBHxr1An.js";
80
- import "./installs-Nxn1YLbh.js";
80
+ import "./installs-CgF6acAX.js";
81
81
  import "./service-BGkVTESM.js";
82
82
  import "./systemd-BzTSelz8.js";
83
83
  import "./diagnostics-CFV2YxpG.js";
84
84
  import { t as collectChannelStatusIssues } from "./channels-status-issues-BLygTpUh.js";
85
- import { n as hasExplicitOptions } from "./plugin-registry-D7fneJ6X.js";
85
+ import { n as hasExplicitOptions } from "./plugin-registry-OEYl6Glv.js";
86
86
  import "./daemon-runtime-r19-i0S0.js";
87
87
  import "./ensure-local-gateway-VbJtdpui.js";
88
88
  import { n as runChannelLoginAll, r as runChannelLogout, t as runChannelLogin } from "./channel-auth-DrJ2FCUT.js";
89
- import { t as formatCliChannelOptions } from "./channel-options-za1_wuVW.js";
89
+ import { t as formatCliChannelOptions } from "./channel-options-DyDeQlCI.js";
90
90
  import { t as buildChannelAccountSnapshot } from "./status-BLjOBDvD.js";
91
91
  import { t as parseLogLine } from "./parse-log-line-cWE1HOyo.js";
92
92
  import fs from "node:fs/promises";
@@ -1,2 +1,2 @@
1
1
  // Legacy shim for pre-tsdown update-cli imports.
2
- export { registerDaemonCli, runDaemonInstall, runDaemonRestart, runDaemonStart, runDaemonStatus, runDaemonStop, runDaemonUninstall } from "../daemon-cli-7PvPfrov.js";
2
+ export { registerDaemonCli, runDaemonInstall, runDaemonRestart, runDaemonStart, runDaemonStatus, runDaemonStop, runDaemonUninstall } from "../daemon-cli-CWGXZMX3.js";
@@ -1,5 +1,5 @@
1
1
  import "./pi-embedded-helpers-VJ9hOBTv.js";
2
- import { ct as loadSKYKOIPlugins } from "./reply-Dx6GW2J0.js";
2
+ import { ct as loadSKYKOIPlugins } from "./reply-kg3drq1N.js";
3
3
  import { t as createSubsystemLogger } from "./subsystem-hATE68va.js";
4
4
  import "./paths-VdmjGGyc.js";
5
5
  import "./theme-C5EwWDWE.js";
@@ -1,6 +1,6 @@
1
1
  import { r as __exportAll } from "./chunk-D_gEzPfs.js";
2
2
  import { g as resolveStateDir } from "./paths-VdmjGGyc.js";
3
- import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-Cxfj8DMz.js";
3
+ import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-C514WXu2.js";
4
4
  import path from "node:path";
5
5
  import os from "node:os";
6
6
  import fs from "node:fs/promises";
@@ -1,4 +1,4 @@
1
- import { B as CHANNEL_MESSAGE_ACTION_NAMES, Bn as lookupContextTokens, F as runMessageAction, Ot as registerMemoryCli, R as formatTargetDisplay, it as CHANNEL_TARGET_DESCRIPTION, kt as runMemoryStatus, rt as CHANNEL_TARGETS_DESCRIPTION } from "./reply-Dx6GW2J0.js";
1
+ import { B as CHANNEL_MESSAGE_ACTION_NAMES, Bn as lookupContextTokens, F as runMessageAction, Ot as registerMemoryCli, R as formatTargetDisplay, it as CHANNEL_TARGET_DESCRIPTION, kt as runMemoryStatus, rt as CHANNEL_TARGETS_DESCRIPTION } from "./reply-kg3drq1N.js";
2
2
  import { I as normalizeChatChannelId, M as getChatChannelMeta, c as restoreTerminalState, f as danger, k as DEFAULT_CHAT_CHANNEL, p as info, s as defaultRuntime, v as setVerbose } from "./subsystem-hATE68va.js";
3
3
  import { g as resolveStateDir, i as isNixMode, m as resolveOAuthDir, o as resolveConfigPath, r as STATE_DIR, t as CONFIG_PATH, u as resolveGatewayPort } from "./paths-VdmjGGyc.js";
4
4
  import { n as isRich, r as theme, t as colorize } from "./theme-C5EwWDWE.js";
@@ -21,32 +21,32 @@ import { n as runCommandWithRuntime } from "./cli-utils-CwUbbnsD.js";
21
21
  import { n as withProgress } from "./progress-BPDEiFpj.js";
22
22
  import { a as ensureWorkspaceAndSessions, c as handleReset, d as openUrl, h as resolveControlUiLinks, i as detectBrowserOpenSupport, l as moveToTrash, m as randomToken, n as applyWizardMetadata, o as formatControlUiSshHint, t as DEFAULT_WORKSPACE, v as waitForGatewayReachable } from "./onboard-helpers-DKhundDe.js";
23
23
  import { n as stylePromptMessage, r as stylePromptTitle, t as stylePromptHint } from "./prompt-style-e5zz5JM8.js";
24
- import { t as createDefaultDeps } from "./deps-CaffRbsR.js";
24
+ import { t as createDefaultDeps } from "./deps-bxV4Fhqd.js";
25
25
  import { t as assertSupportedRuntime } from "./runtime-guard-C80qkv4W.js";
26
26
  import { t as resolveChannelDefaultAccountId } from "./helpers-y1KKH5pe.js";
27
27
  import { n as logConfigUpdated, t as formatConfigPath } from "./logging-1Q_KlUsW.js";
28
28
  import { t as WizardCancelledError } from "./prompts-yNyvMdpp.js";
29
29
  import { t as createClackPrompter } from "./clack-prompter-B9o3eQeW.js";
30
- import { a as buildKoiSummaries, c as loadKoiIdentity, f as parseIdentityMarkdown, i as applyKoiConfig, l as pruneKoiConfig, n as statusCommand, o as findKoiEntryIndex, s as listKoiEntries, t as runOnboardingWizard, u as identityHasValues } from "./onboarding-DxB2jPaW.js";
31
- import { d as applyAuthChoice, f as applyOpenAIConfig, h as promptAuthChoiceGrouped, m as applyGoogleGeminiModelDefault, p as upsertSharedEnvVar, u as warnIfModelConfigLooksOff } from "./onboard-skills-DocB9vHW.js";
32
- import { $ as setOpenrouterApiKey, C as applyMoonshotConfig, D as applyOpenrouterConfig, F as applyVercelAiGatewayConfig, J as setGeminiApiKey, K as setAnthropicApiKey, L as applyXaiConfig, N as applyVeniceConfig, Q as setOpencodeZenApiKey, V as applyZaiConfig, X as setMinimaxApiKey, Y as setKimiCodingApiKey, Z as setMoonshotApiKey, at as setXiaomiApiKey, et as setQianfanApiKey, f as applyOpencodeZenConfig, ft as buildTokenProfileId, g as applyMinimaxConfig, it as setXaiApiKey, j as applySyntheticConfig, k as applyQianfanConfig, m as applyMinimaxApiConfig, nt as setVeniceApiKey, ot as setZaiApiKey, pt as validateAnthropicSetupToken, q as setCloudflareAiGatewayConfig, rt as setVercelAiGatewayApiKey, tt as setSyntheticApiKey, v as applyAuthProfileConfig, w as applyMoonshotConfigCn, x as applyKimiCodeConfig, y as applyCloudflareAiGatewayConfig, z as applyXiaomiConfig } from "./github-copilot-auth-Bi9_8JjO.js";
33
- import { n as setupChannels } from "./onboard-channels-DsBq18pU.js";
34
- import { i as healthCommand } from "./health-format-CxmTuy8H.js";
30
+ import { a as buildKoiSummaries, c as loadKoiIdentity, f as parseIdentityMarkdown, i as applyKoiConfig, l as pruneKoiConfig, n as statusCommand, o as findKoiEntryIndex, s as listKoiEntries, t as runOnboardingWizard, u as identityHasValues } from "./onboarding-BXqZpqCS.js";
31
+ import { d as applyAuthChoice, f as applyOpenAIConfig, h as promptAuthChoiceGrouped, m as applyGoogleGeminiModelDefault, p as upsertSharedEnvVar, u as warnIfModelConfigLooksOff } from "./onboard-skills-AM1-GoCb.js";
32
+ import { $ as setOpenrouterApiKey, C as applyMoonshotConfig, D as applyOpenrouterConfig, F as applyVercelAiGatewayConfig, J as setGeminiApiKey, K as setAnthropicApiKey, L as applyXaiConfig, N as applyVeniceConfig, Q as setOpencodeZenApiKey, V as applyZaiConfig, X as setMinimaxApiKey, Y as setKimiCodingApiKey, Z as setMoonshotApiKey, at as setXiaomiApiKey, et as setQianfanApiKey, f as applyOpencodeZenConfig, ft as buildTokenProfileId, g as applyMinimaxConfig, it as setXaiApiKey, j as applySyntheticConfig, k as applyQianfanConfig, m as applyMinimaxApiConfig, nt as setVeniceApiKey, ot as setZaiApiKey, pt as validateAnthropicSetupToken, q as setCloudflareAiGatewayConfig, rt as setVercelAiGatewayApiKey, tt as setSyntheticApiKey, v as applyAuthProfileConfig, w as applyMoonshotConfigCn, x as applyKimiCodeConfig, y as applyCloudflareAiGatewayConfig, z as applyXiaomiConfig } from "./github-copilot-auth-B8anaBMU.js";
33
+ import { n as setupChannels } from "./onboard-channels-Cg-RtF_Q.js";
34
+ import { i as healthCommand } from "./health-format-HJ49Tlyk.js";
35
35
  import { t as renderTable } from "./table-B3RHVa0g.js";
36
36
  import { t as resolveGatewayService } from "./service-BGkVTESM.js";
37
37
  import { r as isSystemdUserServiceAvailable } from "./systemd-BzTSelz8.js";
38
- import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-Cxfj8DMz.js";
38
+ import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-C514WXu2.js";
39
39
  import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-CIxOsvvC.js";
40
40
  import { t as formatHelpExamples } from "./help-format-BVBm9rU4.js";
41
41
  import { t as adminUnlockCommand } from "./admin-unlock-Dr4FqRVP.js";
42
- import { a as createOutboundSendDeps, n as resolveSessionKeyForRequest, t as koiCommand } from "./koi-AmEsOzbA.js";
43
- import { n as hasExplicitOptions, t as ensurePluginRegistryLoaded } from "./plugin-registry-D7fneJ6X.js";
42
+ import { a as createOutboundSendDeps, n as resolveSessionKeyForRequest, t as koiCommand } from "./koi-C7h4YyTn.js";
43
+ import { n as hasExplicitOptions, t as ensurePluginRegistryLoaded } from "./plugin-registry-OEYl6Glv.js";
44
44
  import { n as parsePositiveIntOrUndefined, t as collectOption } from "./helpers-BwzKU4J1.js";
45
- import { i as CONFIGURE_WIZARD_SECTIONS, n as configureCommand, r as configureCommandWithSections } from "./configure-PZiKU3V7.js";
45
+ import { i as CONFIGURE_WIZARD_SECTIONS, n as configureCommand, r as configureCommandWithSections } from "./configure-YnJ1tddp.js";
46
46
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, r as isGatewayDaemonRuntime, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-r19-i0S0.js";
47
47
  import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-Be49_NdF.js";
48
48
  import { t as loginCommand } from "./login-C71-L2cR.js";
49
- import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-vUQ-UZG1.js";
49
+ import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-BmZlvlO9.js";
50
50
  import { fileURLToPath } from "node:url";
51
51
  import fs from "node:fs";
52
52
  import path from "node:path";
@@ -2797,7 +2797,7 @@ async function loadValidConfig() {
2797
2797
  }
2798
2798
  function registerConfigCli(program) {
2799
2799
  const cmd = program.command("config").description("Config helpers (get/set/unset). Run without subcommand for the wizard.").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.skykoi.com/cli/config")}\n`).option("--section <section>", "Configure wizard sections (repeatable). Use with no subcommand.", (value, previous) => [...previous, value], []).action(async (opts) => {
2800
- const { CONFIGURE_WIZARD_SECTIONS, configureCommand, configureCommandWithSections } = await import("./configure-PZiKU3V7.js").then((n) => n.t);
2800
+ const { CONFIGURE_WIZARD_SECTIONS, configureCommand, configureCommandWithSections } = await import("./configure-YnJ1tddp.js").then((n) => n.t);
2801
2801
  const sections = Array.isArray(opts.section) ? opts.section.map((value) => typeof value === "string" ? value.trim() : "").filter(Boolean) : [];
2802
2802
  if (sections.length === 0) {
2803
2803
  await configureCommand(defaultRuntime);
@@ -14,9 +14,9 @@ import { n as logConfigUpdated } from "./logging-1Q_KlUsW.js";
14
14
  import { t as note$1 } from "./note-DRoVRuAi.js";
15
15
  import { t as WizardCancelledError } from "./prompts-yNyvMdpp.js";
16
16
  import { t as createClackPrompter } from "./clack-prompter-B9o3eQeW.js";
17
- import { a as applyModelFallbacksFromSelection, c as promptModelAllowlist, d as applyAuthChoice, h as promptAuthChoiceGrouped, i as applyModelAllowlist, l as resolvePreferredProviderForAuthChoice, o as applyPrimaryModel, r as promptRemoteGatewayConfig, s as promptDefaultModel, t as setupSkills } from "./onboard-skills-DocB9vHW.js";
18
- import { n as setupChannels, t as noteChannelStatus } from "./onboard-channels-DsBq18pU.js";
19
- import { i as healthCommand, t as formatHealthCheckFailure } from "./health-format-CxmTuy8H.js";
17
+ import { a as applyModelFallbacksFromSelection, c as promptModelAllowlist, d as applyAuthChoice, h as promptAuthChoiceGrouped, i as applyModelAllowlist, l as resolvePreferredProviderForAuthChoice, o as applyPrimaryModel, r as promptRemoteGatewayConfig, s as promptDefaultModel, t as setupSkills } from "./onboard-skills-AM1-GoCb.js";
18
+ import { n as setupChannels, t as noteChannelStatus } from "./onboard-channels-Cg-RtF_Q.js";
19
+ import { i as healthCommand, t as formatHealthCheckFailure } from "./health-format-HJ49Tlyk.js";
20
20
  import { t as resolveGatewayService } from "./service-BGkVTESM.js";
21
21
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-B0N-n2rD.js";
22
22
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-r19-i0S0.js";
@@ -15,7 +15,7 @@ import { n as withProgress } from "./progress-BPDEiFpj.js";
15
15
  import { h as resolveControlUiLinks } from "./onboard-helpers-DKhundDe.js";
16
16
  import { n as isWSLEnv, t as isWSL } from "./wsl-DiiAe4Ci.js";
17
17
  import { d as resolveGatewaySystemdServiceName, l as resolveGatewayLaunchAgentLabel } from "./constants-BezzOOYJ.js";
18
- import { t as createDefaultDeps } from "./deps-CaffRbsR.js";
18
+ import { t as createDefaultDeps } from "./deps-bxV4Fhqd.js";
19
19
  import { o as resolveGatewayLogPaths, t as resolveGatewayService } from "./service-BGkVTESM.js";
20
20
  import { r as isSystemdUserServiceAvailable } from "./systemd-BzTSelz8.js";
21
21
  import { t as readLastGatewayErrorLine } from "./diagnostics-CFV2YxpG.js";
@@ -1,4 +1,4 @@
1
- import { Ht as sendMessageTelegram, Ut as sendMessageDiscord, ht as sendMessageIMessage, nn as sendMessageWhatsApp, rn as sendMessageSlack } from "./reply-Dx6GW2J0.js";
1
+ import { Ht as sendMessageTelegram, Ut as sendMessageDiscord, ht as sendMessageIMessage, nn as sendMessageWhatsApp, rn as sendMessageSlack } from "./reply-kg3drq1N.js";
2
2
  import { b as sendMessageSignal } from "./deliver-DJbxwsAM.js";
3
3
 
4
4
  //#region src/cli/deps.ts
@@ -1,4 +1,4 @@
1
- import { Jn as loadModelCatalog, ct as loadSKYKOIPlugins } from "./reply-Dx6GW2J0.js";
1
+ import { Jn as loadModelCatalog, ct as loadSKYKOIPlugins } from "./reply-kg3drq1N.js";
2
2
  import { s as defaultRuntime, w as getResolvedLoggerSettings } from "./subsystem-hATE68va.js";
3
3
  import { d as resolveIsNixMode, f as resolveLegacyStateDirs, g as resolveStateDir, m as resolveOAuthDir, p as resolveNewStateDir, t as CONFIG_PATH, u as resolveGatewayPort } from "./paths-VdmjGGyc.js";
4
4
  import { a as buildKoiMainSessionKey, l as normalizeKoiId, r as DEFAULT_MAIN_KEY, t as DEFAULT_ACCOUNT_ID } from "./session-key-B2OXLVi_.js";
@@ -26,7 +26,7 @@ import { t as resolveChannelDefaultAccountId } from "./helpers-y1KKH5pe.js";
26
26
  import { n as logConfigUpdated } from "./logging-1Q_KlUsW.js";
27
27
  import { t as note$1 } from "./note-DRoVRuAi.js";
28
28
  import { t as applyPluginAutoEnable } from "./plugin-auto-enable-Cg3LRidd.js";
29
- import { i as healthCommand, t as formatHealthCheckFailure } from "./health-format-CxmTuy8H.js";
29
+ import { i as healthCommand, t as formatHealthCheckFailure } from "./health-format-HJ49Tlyk.js";
30
30
  import { t as runGatewayUpdate } from "./update-runner-odTAl-uh.js";
31
31
  import { i as resolveGatewayAuth } from "./auth-Vh115fQN.js";
32
32
  import { t as buildWorkspaceSkillStatus } from "./skills-status-DakSfN8r.js";
@@ -34,7 +34,7 @@ import { a as repairLaunchAgentBootstrap, i as launchAgentPlistExists, n as isLa
34
34
  import { r as isSystemdUserServiceAvailable } from "./systemd-BzTSelz8.js";
35
35
  import { t as readLastGatewayErrorLine } from "./diagnostics-CFV2YxpG.js";
36
36
  import { t as collectChannelStatusIssues } from "./channels-status-issues-BLygTpUh.js";
37
- import { n as doctorShellCompletion } from "./doctor-completion-BMyOL8bF.js";
37
+ import { n as doctorShellCompletion } from "./doctor-completion-B_DB6yKB.js";
38
38
  import { n as resolveControlUiDistIndexHealth, r as resolveControlUiDistIndexPathForRoot } from "./control-ui-assets-B0N-n2rD.js";
39
39
  import { a as gatewayInstallErrorHint, d as renderSystemNodeWarning, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, p as resolveSystemNodeInfo, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-r19-i0S0.js";
40
40
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-Be49_NdF.js";
@@ -3,7 +3,7 @@ import { r as resolveCliName, t as formatCliCommand } from "./command-format-DOY
3
3
  import { t as VERSION } from "./version-BKRSzdyx.js";
4
4
  import { t as note } from "./note-DRoVRuAi.js";
5
5
  import { c as compareSemverStrings, s as checkUpdateStatus } from "./update-runner-odTAl-uh.js";
6
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-C9ir8GOD.js";
6
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-DvRTz9tW.js";
7
7
  import path from "node:path";
8
8
  import { spawnSync } from "node:child_process";
9
9
 
package/dist/entry.js CHANGED
@@ -247,7 +247,7 @@ if (!ensureExperimentalWarningSuppressed()) {
247
247
  applyCliProfileEnv({ profile: parsed.profile });
248
248
  process$1.argv = parsed.argv;
249
249
  }
250
- import("./run-main-CLkrpAdw.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
250
+ import("./run-main-CWySis6K.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
251
251
  console.error("[SKYKOI] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
252
252
  process$1.exitCode = 1;
253
253
  });
@@ -1,5 +1,5 @@
1
1
  import "./pi-embedded-helpers-VJ9hOBTv.js";
2
- import { c as runEmbeddedPiKoi, lr as resolveKoiTimeoutMs, sn as resolveKoiIdentity } from "./reply-Dx6GW2J0.js";
2
+ import { c as runEmbeddedPiKoi, lr as resolveKoiTimeoutMs, sn as resolveKoiIdentity } from "./reply-kg3drq1N.js";
3
3
  import "./subsystem-hATE68va.js";
4
4
  import "./paths-VdmjGGyc.js";
5
5
  import "./theme-C5EwWDWE.js";
@@ -1,6 +1,6 @@
1
1
  import { o as __toESM } from "./chunk-D_gEzPfs.js";
2
2
  import { B as normalizeThinkLevel, F as formatXHighModelHint, H as normalizeVerboseLevel, P as formatThinkingLevels, R as normalizeElevatedLevel, V as normalizeUsageDisplay, W as supportsXHighThinking, z as normalizeReasoningLevel } from "./pi-embedded-helpers-VJ9hOBTv.js";
3
- import { $ as normalizeOptionalText, $n as DEFAULT_INPUT_IMAGE_MIMES, $t as findSubkoiRunByRunId, A as capArrayByJsonBytes, An as setCommandLaneConcurrency, Bn as lookupContextTokens, Bt as onHeartbeatEvent, C as listKoisForGateway, Cn as resolveTtsPrefsPath, Ct as registerSkillsChangeListener, D as resolveGatewaySessionStoreTarget, Dn as textToSpeech, Dt as isExternalHookSession, E as loadSessionEntry, En as setTtsProvider, Et as getHookType, Fn as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, G as consumeGatewaySigusr1RestartAuthorization, Gn as enqueueSystemEvent, H as runWithModelFallback, Hn as applyModelOverrideToSessionEntry, I as ensureOutboundSessionEntry, It as buildHistoryContextFromEntries, J as setGatewaySigusr1RestartPolicy, Jn as loadModelCatalog, Jt as createReplyDispatcher, K as isGatewaySigusr1RestartExternallyAllowed, Kn as isSystemEventContextChanged, L as resolveOutboundSessionRoute, Lt as resolveHeartbeatVisibility, M as readSessionPreviewItemsFromTranscript, Mn as startDiagnosticHeartbeat, Mt as normalizeGroupActivation, N as resolveSessionTranscriptCandidates, Nn as stopDiagnosticHeartbeat, O as resolveSessionModelRef, P as stripEnvelopeFromMessages, Pn as isDiagnosticsEnabled, Pt as registerUnhandledRejectionHandler, Q as normalizeOptionalKoiId, Qn as DEFAULT_INPUT_IMAGE_MAX_BYTES, Qt as findSubkoiRunByChildSessionKey, S as resolveAnnounceTargetFromKey, Sn as resolveTtsConfig, St as getSkillsSnapshotVersion, T as loadCombinedSessionStoreForGateway, Tn as setTtsEnabled, Tt as detectSuspiciousPatterns, Un as applyVerboseOverride, V as readRecentActivity, W as authorizeGatewaySigusr1Restart, Wn as parseVerboseOverride, Wt as getChannelActivity, X as normalizeCronJobPatch, Xn as DEFAULT_INPUT_FILE_MAX_CHARS, Xt as isAbortTrigger, Y as normalizeCronJobCreate, Yn as DEFAULT_INPUT_FILE_MAX_BYTES, Yt as formatZonedTimestamp, Z as inferLegacyName, Zn as DEFAULT_INPUT_FILE_MIMES, Zt as stopSubkoisForRequester, _ as canvasUri, _n as getTtsProvider, _t as primeRemoteSkillsCache, a as normalizeSendPolicy, ar as extractFileContentFromSource, at as requestHeartbeatNow, b as onCanvasChange, bn as resolveTtsApiKey, bt as refreshRemoteNodeBins, c as runEmbeddedPiKoi, cn as formatUserTime, ct as loadSKYKOIPlugins, dn as clearInternalHooks, en as initSubkoiRegistry, er as DEFAULT_INPUT_MAX_REDIRECTS, et as normalizePayloadToSystemText, f as waitForEmbeddedPiRunEnd, fn as createInternalHookEvent, g as createSKYKOITools, gn as OPENAI_TTS_VOICES, gt as getRemoteSkillEligibility, h as initRuntimeContext, hn as OPENAI_TTS_MODELS, i as runCliKoi, ir as DEFAULT_INPUT_TIMEOUT_MS, j as readSessionMessages, jn as CommandLane, jt as createReplyPrefixOptions, k as archiveFileOnDisk, l as getLastSystemPrompt, ln as resolveUserTimeFormat, lr as resolveKoiTimeoutMs, lt as loadProviderUsageSummary, mn as triggerInternalHook, n as getCliSessionId, nr as DEFAULT_INPUT_PDF_MAX_PIXELS, nt as migrateLegacyCronPayload, o as resolveSendPolicy, or as extractImageContentFromSource, pn as registerInternalHook, pt as handleSlackHttpRequest, q as scheduleGatewaySigusr1Restart, qt as dispatchInboundMessage, r as setCliSessionId, rr as DEFAULT_INPUT_PDF_MIN_TEXT_CHARS, s as clearSessionQueues, sn as resolveKoiIdentity, sr as normalizeMimeList, st as getPluginToolMeta, tr as DEFAULT_INPUT_PDF_MAX_PAGES, tt as normalizeRequiredName, u as abortEmbeddedPiRun, un as resolveUserTimezone, v as getCanvasResource, vn as isTtsEnabled, vt as recordRemoteNodeInfo, w as listSessionsFromStore, wn as resolveTtsProviderOrder, wt as buildSafeExternalPrompt, x as replaceCanvasResource, xn as resolveTtsAutoMode, xt as setSkillsRemoteRegistry, y as listCanvasUris, yn as isTtsProviderConfigured, yt as refreshRemoteBinsForConnectedNodes, z as resetDirectoryCache, zn as stripHeartbeatToken, zt as getLastHeartbeatEvent } from "./reply-Dx6GW2J0.js";
3
+ import { $ as normalizeOptionalText, $n as DEFAULT_INPUT_IMAGE_MIMES, $t as findSubkoiRunByRunId, A as capArrayByJsonBytes, An as setCommandLaneConcurrency, Bn as lookupContextTokens, Bt as onHeartbeatEvent, C as listKoisForGateway, Cn as resolveTtsPrefsPath, Ct as registerSkillsChangeListener, D as resolveGatewaySessionStoreTarget, Dn as textToSpeech, Dt as isExternalHookSession, E as loadSessionEntry, En as setTtsProvider, Et as getHookType, Fn as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, G as consumeGatewaySigusr1RestartAuthorization, Gn as enqueueSystemEvent, H as runWithModelFallback, Hn as applyModelOverrideToSessionEntry, I as ensureOutboundSessionEntry, It as buildHistoryContextFromEntries, J as setGatewaySigusr1RestartPolicy, Jn as loadModelCatalog, Jt as createReplyDispatcher, K as isGatewaySigusr1RestartExternallyAllowed, Kn as isSystemEventContextChanged, L as resolveOutboundSessionRoute, Lt as resolveHeartbeatVisibility, M as readSessionPreviewItemsFromTranscript, Mn as startDiagnosticHeartbeat, Mt as normalizeGroupActivation, N as resolveSessionTranscriptCandidates, Nn as stopDiagnosticHeartbeat, O as resolveSessionModelRef, P as stripEnvelopeFromMessages, Pn as isDiagnosticsEnabled, Pt as registerUnhandledRejectionHandler, Q as normalizeOptionalKoiId, Qn as DEFAULT_INPUT_IMAGE_MAX_BYTES, Qt as findSubkoiRunByChildSessionKey, S as resolveAnnounceTargetFromKey, Sn as resolveTtsConfig, St as getSkillsSnapshotVersion, T as loadCombinedSessionStoreForGateway, Tn as setTtsEnabled, Tt as detectSuspiciousPatterns, Un as applyVerboseOverride, V as readRecentActivity, W as authorizeGatewaySigusr1Restart, Wn as parseVerboseOverride, Wt as getChannelActivity, X as normalizeCronJobPatch, Xn as DEFAULT_INPUT_FILE_MAX_CHARS, Xt as isAbortTrigger, Y as normalizeCronJobCreate, Yn as DEFAULT_INPUT_FILE_MAX_BYTES, Yt as formatZonedTimestamp, Z as inferLegacyName, Zn as DEFAULT_INPUT_FILE_MIMES, Zt as stopSubkoisForRequester, _ as canvasUri, _n as getTtsProvider, _t as primeRemoteSkillsCache, a as normalizeSendPolicy, ar as extractFileContentFromSource, at as requestHeartbeatNow, b as onCanvasChange, bn as resolveTtsApiKey, bt as refreshRemoteNodeBins, c as runEmbeddedPiKoi, cn as formatUserTime, ct as loadSKYKOIPlugins, dn as clearInternalHooks, en as initSubkoiRegistry, er as DEFAULT_INPUT_MAX_REDIRECTS, et as normalizePayloadToSystemText, f as waitForEmbeddedPiRunEnd, fn as createInternalHookEvent, g as createSKYKOITools, gn as OPENAI_TTS_VOICES, gt as getRemoteSkillEligibility, h as initRuntimeContext, hn as OPENAI_TTS_MODELS, i as runCliKoi, ir as DEFAULT_INPUT_TIMEOUT_MS, j as readSessionMessages, jn as CommandLane, jt as createReplyPrefixOptions, k as archiveFileOnDisk, l as getLastSystemPrompt, ln as resolveUserTimeFormat, lr as resolveKoiTimeoutMs, lt as loadProviderUsageSummary, mn as triggerInternalHook, n as getCliSessionId, nr as DEFAULT_INPUT_PDF_MAX_PIXELS, nt as migrateLegacyCronPayload, o as resolveSendPolicy, or as extractImageContentFromSource, pn as registerInternalHook, pt as handleSlackHttpRequest, q as scheduleGatewaySigusr1Restart, qt as dispatchInboundMessage, r as setCliSessionId, rr as DEFAULT_INPUT_PDF_MIN_TEXT_CHARS, s as clearSessionQueues, sn as resolveKoiIdentity, sr as normalizeMimeList, st as getPluginToolMeta, tr as DEFAULT_INPUT_PDF_MAX_PAGES, tt as normalizeRequiredName, u as abortEmbeddedPiRun, un as resolveUserTimezone, v as getCanvasResource, vn as isTtsEnabled, vt as recordRemoteNodeInfo, w as listSessionsFromStore, wn as resolveTtsProviderOrder, wt as buildSafeExternalPrompt, x as replaceCanvasResource, xn as resolveTtsAutoMode, xt as setSkillsRemoteRegistry, y as listCanvasUris, yn as isTtsProviderConfigured, yt as refreshRemoteBinsForConnectedNodes, z as resetDirectoryCache, zn as stripHeartbeatToken, zt as getLastHeartbeatEvent } from "./reply-kg3drq1N.js";
4
4
  import { C as getLogger, D as CHANNEL_IDS, L as getActivePluginRegistry, S as getChildLogger, a as setConsoleTimestampPrefix, i as setConsoleSubsystemFilter, k as DEFAULT_CHAT_CHANNEL, n as runtimeForLogger, s as defaultRuntime, t as createSubsystemLogger, v as setVerbose, w as getResolvedLoggerSettings } from "./subsystem-hATE68va.js";
5
5
  import { g as resolveStateDir, i as isNixMode, l as resolveGatewayLockDir, o as resolveConfigPath, r as STATE_DIR, t as CONFIG_PATH, u as resolveGatewayPort } from "./paths-VdmjGGyc.js";
6
6
  import { n as isRich, r as theme, t as colorize } from "./theme-C5EwWDWE.js";
@@ -79,7 +79,7 @@ import { t as parseAbsoluteTimeMs } from "./parse-B6Z5uj5w.js";
79
79
  import { a as summarizeRestartSentinel, n as formatDoctorNonInteractiveHint, r as formatRestartSentinelMessage, s as writeRestartSentinel, t as consumeRestartSentinel } from "./restart-sentinel-Cu-Tbnik.js";
80
80
  import { n as resolveMessageChannelSelection } from "./channel-selection-Cd-vguDM.js";
81
81
  import { i as readEventsSince, n as clearEventLogForSession, o as subscribeAll, r as hydrateSession, t as appendEvent } from "./event-log-BJRHlOn8.js";
82
- import { n as createOutboundSendDeps, t as createDefaultDeps } from "./deps-CaffRbsR.js";
82
+ import { n as createOutboundSendDeps, t as createDefaultDeps } from "./deps-bxV4Fhqd.js";
83
83
  import { i as enableTailscaleServe, n as disableTailscaleServe, o as getTailnetHostname, r as enableTailscaleFunnel, t as disableTailscaleFunnel } from "./tailscale-BO36kRfh.js";
84
84
  import { t as ensureSKYKOICliOnPath } from "./path-env-gxBbRHVZ.js";
85
85
  import { t as forceFreePortAndWait } from "./ports-YIGvuUFy.js";
@@ -87,15 +87,15 @@ import { t as resolveChannelDefaultAccountId } from "./helpers-y1KKH5pe.js";
87
87
  import "./logging-1Q_KlUsW.js";
88
88
  import "./note-DRoVRuAi.js";
89
89
  import { t as WizardCancelledError } from "./prompts-yNyvMdpp.js";
90
- import { c as loadKoiIdentity, d as loadKoiIdentityFromWorkspace, i as applyKoiConfig, l as pruneKoiConfig, o as findKoiEntryIndex, r as getStatusSummary, s as listKoiEntries, t as runOnboardingWizard } from "./onboarding-DxB2jPaW.js";
91
- import { n as installSkill } from "./onboard-skills-DocB9vHW.js";
92
- import "./github-copilot-auth-Bi9_8JjO.js";
93
- import "./onboard-channels-DsBq18pU.js";
90
+ import { c as loadKoiIdentity, d as loadKoiIdentityFromWorkspace, i as applyKoiConfig, l as pruneKoiConfig, o as findKoiEntryIndex, r as getStatusSummary, s as listKoiEntries, t as runOnboardingWizard } from "./onboarding-BXqZpqCS.js";
91
+ import { n as installSkill } from "./onboard-skills-AM1-GoCb.js";
92
+ import "./github-copilot-auth-B8anaBMU.js";
93
+ import "./onboard-channels-Cg-RtF_Q.js";
94
94
  import { r as buildChannelUiCatalog, t as applyPluginAutoEnable } from "./plugin-auto-enable-Cg3LRidd.js";
95
- import "./archive-V8-RCbVU.js";
95
+ import "./archive-lc4aTrME.js";
96
96
  import "./skill-scanner-CBHxr1An.js";
97
- import "./installs-Nxn1YLbh.js";
98
- import { c as startHeartbeatRunner, n as formatHealthChannelLines, o as runHeartbeatOnce, r as getHealthSnapshot, s as setHeartbeatsEnabled } from "./health-format-CxmTuy8H.js";
97
+ import "./installs-CgF6acAX.js";
98
+ import { c as startHeartbeatRunner, n as formatHealthChannelLines, o as runHeartbeatOnce, r as getHealthSnapshot, s as setHeartbeatsEnabled } from "./health-format-HJ49Tlyk.js";
99
99
  import { c as compareSemverStrings, d as resolveNpmChannelTag, g as normalizeUpdateChannel, l as fetchNpmLatestVersion, p as DEFAULT_PACKAGE_CHANNEL, s as checkUpdateStatus, t as runGatewayUpdate } from "./update-runner-odTAl-uh.js";
100
100
  import { i as resolveGatewayAuth, n as authorizeGatewayConnect, r as isLocalDirectRequest, t as assertGatewayAuthConfigured } from "./auth-Vh115fQN.js";
101
101
  import { i as probeGateway } from "./audit-BhMw948Z.js";
@@ -106,21 +106,21 @@ import { p as resolveGatewayStateDir } from "./systemd-BzTSelz8.js";
106
106
  import "./diagnostics-CFV2YxpG.js";
107
107
  import "./node-service-BzD7Bqwc.js";
108
108
  import "./channels-status-issues-BLygTpUh.js";
109
- import "./doctor-completion-BMyOL8bF.js";
110
- import "./register.subclis-Cxfj8DMz.js";
111
- import { a as createOutboundSendDeps$1, i as resolveKoiOutboundTarget, r as resolveKoiDeliveryPlan, t as koiCommand } from "./koi-AmEsOzbA.js";
109
+ import "./doctor-completion-B_DB6yKB.js";
110
+ import "./register.subclis-C514WXu2.js";
111
+ import { a as createOutboundSendDeps$1, i as resolveKoiOutboundTarget, r as resolveKoiDeliveryPlan, t as koiCommand } from "./koi-C7h4YyTn.js";
112
112
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-B0N-n2rD.js";
113
113
  import "./daemon-runtime-r19-i0S0.js";
114
114
  import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } from "./widearea-dns-Bb9eE_C1.js";
115
115
  import { n as discoverGatewayBeacons } from "./bonjour-discovery-Du_kGDHQ.js";
116
116
  import "./ensure-local-gateway-VbJtdpui.js";
117
- import "./completion-cli-C9ir8GOD.js";
117
+ import "./completion-cli-DvRTz9tW.js";
118
118
  import "./service-audit-C3mNLBya.js";
119
119
  import { i as shouldIncludeHook, n as loadWorkspaceHookEntries, r as resolveHookConfig } from "./hooks-status-B0H9mn8K.js";
120
120
  import "./tui-CvbO7Ge0.js";
121
121
  import { t as buildChannelAccountSnapshot } from "./status-BLjOBDvD.js";
122
122
  import "./shared-Dn4Lf8u-.js";
123
- import { a as runDaemonStop, i as runDaemonStart, n as runDaemonStatus, o as runDaemonUninstall, r as runDaemonRestart, s as runDaemonInstall } from "./daemon-cli-7PvPfrov.js";
123
+ import { a as runDaemonStop, i as runDaemonStart, n as runDaemonStatus, o as runDaemonUninstall, r as runDaemonRestart, s as runDaemonInstall } from "./daemon-cli-CWGXZMX3.js";
124
124
  import { a as toOptionString, i as parsePort$1, n as extractGatewayMiskeys, r as maybeExplainGatewayServiceStop, t as describeUnknownError } from "./shared-DNbcd3wi.js";
125
125
  import { i as setGatewayWsLogStyle, n as logWs, r as summarizeKoiEventForWsLog, t as formatForLog } from "./ws-log--YWgaGe1.js";
126
126
  import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-DI2DjT9y.js";
@@ -12024,7 +12024,7 @@ const nodeHandlers = {
12024
12024
  const p = params;
12025
12025
  const payloadJSON = typeof p.payloadJSON === "string" ? p.payloadJSON : p.payload !== void 0 ? JSON.stringify(p.payload) : null;
12026
12026
  await respondUnavailableOnThrow(respond, async () => {
12027
- const { handleNodeEvent } = await import("./server-node-events-Lr_FVpbB.js");
12027
+ const { handleNodeEvent } = await import("./server-node-events-B1vg4hw3.js");
12028
12028
  const nodeId = client?.connect?.device?.id ?? client?.connect?.client?.id ?? "node";
12029
12029
  await handleNodeEvent({
12030
12030
  deps: context.deps,
@@ -21087,7 +21087,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
21087
21087
  let captureServiceStop = null;
21088
21088
  (async () => {
21089
21089
  try {
21090
- const { startCaptureService } = await import("./capture-service-SdKz2CMm.js");
21090
+ const { startCaptureService } = await import("./capture-service-Cf1TbNjO.js");
21091
21091
  captureServiceStop = (await startCaptureService()).stop;
21092
21092
  console.log("[capture] Device capture service started");
21093
21093
  } catch (err) {
@@ -1,4 +1,4 @@
1
- import { ct as loadSKYKOIPlugins } from "./reply-Dx6GW2J0.js";
1
+ import { ct as loadSKYKOIPlugins } from "./reply-kg3drq1N.js";
2
2
  import { t as createSubsystemLogger } from "./subsystem-hATE68va.js";
3
3
  import { l as normalizeKoiId } from "./session-key-B2OXLVi_.js";
4
4
  import { b as sleep } from "./utils-D019Z2NU.js";
@@ -1,4 +1,4 @@
1
- import { Fn as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, In as DEFAULT_HEARTBEAT_EVERY, Ln as isHeartbeatContentEffectivelyEmpty, Lt as resolveHeartbeatVisibility, On as enqueueCommandInLane, Rn as resolveHeartbeatPrompt$1, Rt as emitHeartbeatEvent, Vt as resolveIndicatorType, at as requestHeartbeatNow, d as isEmbeddedPiRunActive, jn as CommandLane, kn as getQueueSize, on as resolveEffectiveMessagesConfig, ot as setHeartbeatWakeHandler, qn as peekSystemEvents, t as getReplyFromConfig, un as resolveUserTimezone, zn as stripHeartbeatToken } from "./reply-Dx6GW2J0.js";
1
+ import { Fn as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, In as DEFAULT_HEARTBEAT_EVERY, Ln as isHeartbeatContentEffectivelyEmpty, Lt as resolveHeartbeatVisibility, On as enqueueCommandInLane, Rn as resolveHeartbeatPrompt$1, Rt as emitHeartbeatEvent, Vt as resolveIndicatorType, at as requestHeartbeatNow, d as isEmbeddedPiRunActive, jn as CommandLane, kn as getQueueSize, on as resolveEffectiveMessagesConfig, ot as setHeartbeatWakeHandler, qn as peekSystemEvents, t as getReplyFromConfig, un as resolveUserTimezone, zn as stripHeartbeatToken } from "./reply-kg3drq1N.js";
2
2
  import { p as info, s as defaultRuntime, t as createSubsystemLogger } from "./subsystem-hATE68va.js";
3
3
  import { n as isRich, r as theme, t as colorize } from "./theme-C5EwWDWE.js";
4
4
  import { d as resolveKoiIdFromSessionKey, h as toKoiStoreSessionKey, l as normalizeKoiId } from "./session-key-B2OXLVi_.js";
@@ -1,5 +1,5 @@
1
1
  import "./pi-embedded-helpers-VJ9hOBTv.js";
2
- import "./reply-Dx6GW2J0.js";
2
+ import "./reply-kg3drq1N.js";
3
3
  import { s as defaultRuntime } from "./subsystem-hATE68va.js";
4
4
  import "./paths-VdmjGGyc.js";
5
5
  import { r as theme } from "./theme-C5EwWDWE.js";
@@ -68,10 +68,10 @@ import "./control-service-Bbl6R2bi.js";
68
68
  import "./restart-sentinel-Cu-Tbnik.js";
69
69
  import "./channel-selection-Cd-vguDM.js";
70
70
  import "./event-log-BJRHlOn8.js";
71
- import { a as resolvePackedRootDir, i as resolveArchiveKind, n as fileExists, r as readJsonFile, t as extractArchive } from "./archive-V8-RCbVU.js";
71
+ import { a as resolvePackedRootDir, i as resolveArchiveKind, n as fileExists, r as readJsonFile, t as extractArchive } from "./archive-lc4aTrME.js";
72
72
  import { t as renderTable } from "./table-B3RHVa0g.js";
73
73
  import { a as parseFrontmatter, n as loadWorkspaceHookEntries, t as buildWorkspaceHookStatus } from "./hooks-status-B0H9mn8K.js";
74
- import { t as buildPluginStatusReport } from "./status-DNr2zDWJ.js";
74
+ import { t as buildPluginStatusReport } from "./status-CrxsbMfq.js";
75
75
  import fs from "node:fs";
76
76
  import path from "node:path";
77
77
  import os from "node:os";