skykoi 2026.3.362 → 2026.3.363

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-DYZYH4JM.js → archive-CESecfeV.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-DVPyLtcu.js → capture-service-BPwzlSOE.js} +233 -15
  5. package/dist/{channel-options-DseZbwUS.js → channel-options-zwslyp06.js} +1 -1
  6. package/dist/{channels-cli-tUGW1BdN.js → channels-cli-CWt6ydPN.js} +6 -6
  7. package/dist/cli/daemon-cli.js +1 -1
  8. package/dist/{cli-BJ_2gOn-.js → cli-DNGeeH_O.js} +1 -1
  9. package/dist/{completion-cli-BBwoUVln.js → completion-cli-BsJskaQs.js} +1 -1
  10. package/dist/{config-guard-BxZWOy88.js → config-guard-4cp7V4rC.js} +13 -13
  11. package/dist/{configure-CFDkXjgL.js → configure-DFrODS29.js} +3 -3
  12. package/dist/{daemon-cli-DM4-EaCQ.js → daemon-cli-2wt4he6F.js} +1 -1
  13. package/dist/{deps-CICTh0V_.js → deps-0dHAqQPZ.js} +1 -1
  14. package/dist/{doctor-BpP981es.js → doctor-Ce7vc1wR.js} +3 -3
  15. package/dist/{doctor-completion-CroMxa0u.js → doctor-completion-L793M3dP.js} +1 -1
  16. package/dist/entry.js +1 -1
  17. package/dist/extension-api.js +1 -1
  18. package/dist/{gateway-cli-TiqIwiHa.js → gateway-cli-DMafTZSt.js} +16 -16
  19. package/dist/{github-copilot-auth-B61AHThq.js → github-copilot-auth-CRPmNlXU.js} +1 -1
  20. package/dist/{health-format-Dw75LDa6.js → health-format-Cv2SBzMq.js} +1 -1
  21. package/dist/{hooks-cli-BWjd2y2G.js → hooks-cli-D_pptHPL.js} +3 -3
  22. package/dist/index.js +19 -19
  23. package/dist/{installs-BzTBsTtR.js → installs-J0qld2XT.js} +1 -1
  24. package/dist/{koi-D_JJc8iu.js → koi-CwOIbGaZ.js} +2 -2
  25. package/dist/{models-cli-DXXnp1Xi.js → models-cli-CGHn_wNj.js} +2 -2
  26. package/dist/{onboard-channels-Bwc8efrA.js → onboard-channels-CwSayqE8.js} +2 -2
  27. package/dist/{onboard-skills-B_7nD3Sb.js → onboard-skills-D8KGRTxy.js} +3 -3
  28. package/dist/{onboarding-D1yxhbJo.js → onboarding-DkNx4Kk8.js} +6 -6
  29. package/dist/{plugin-registry-DpZrr3UC.js → plugin-registry-DdBnvr9h.js} +1 -1
  30. package/dist/plugin-sdk/capture/capture-store.d.ts +1 -1
  31. package/dist/plugin-sdk/capture/message-capture.d.ts +3 -0
  32. package/dist/plugin-sdk/index.js +12 -12
  33. package/dist/plugin-sdk/{pi-model-discovery-CBWcyyqn.js → pi-model-discovery-szlzYGsC.js} +3 -3
  34. package/dist/{plugins-cli-C8lj6nYa.js → plugins-cli-DkDnozFB.js} +5 -5
  35. package/dist/{program-BUsVm8Fg.js → program-fMY3xJAW.js} +4 -4
  36. package/dist/{register.subclis-CeICyB4l.js → register.subclis-Dz8PuEdt.js} +10 -10
  37. package/dist/{reply-Bb7g4UzX.js → reply-mOlXreGp.js} +1 -1
  38. package/dist/{run-main-BTRshA-a.js → run-main-5pXCx8I1.js} +20 -20
  39. package/dist/{server-node-events-vRSruV-g.js → server-node-events-5bZjkTUd.js} +3 -3
  40. package/dist/{status-q2g_QGj0.js → status-BXwm4BKo.js} +1 -1
  41. package/dist/{update-B6qshQlu.js → update-BogXnYzz.js} +1 -1
  42. package/dist/{update-cli-DFC5PpoU.js → update-cli-BbhUwQMp.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-Bb7g4UzX.js";
2
+ import { mt as require_inherits } from "./reply-mOlXreGp.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.362",
2
+ "version": "2026.3.363",
3
3
  "commit": "4bd60b7c1b294bb24b257d2f381ec929031df39c",
4
- "builtAt": "2026-06-25T08:47:27.220Z"
4
+ "builtAt": "2026-06-25T09:02:04.541Z"
5
5
  }
@@ -1 +1 @@
1
- 2b32f0ff6d251a403f0d0e6a915126e3c96b4fcaacf2109cf9d3d8868ab727c0
1
+ 7f90826bcacb611fa96d6f01752cf33528ec1e0394138cc756e4aab2889212b5
@@ -720,7 +720,7 @@ function startWindowCapture() {
720
720
 
721
721
  //#endregion
722
722
  //#region src/capture/browser-capture.ts
723
- const EXEC_TIMEOUT$3 = 5e3;
723
+ const EXEC_TIMEOUT$4 = 5e3;
724
724
  const SAFARI_TABS_SCRIPT = `
725
725
  tell application "System Events" to set safariRunning to exists (process "Safari")
726
726
  if not safariRunning then return ""
@@ -750,7 +750,7 @@ end tell
750
750
  function runOsascript(script) {
751
751
  try {
752
752
  return execSync(`osascript -e ${JSON.stringify(script)}`, {
753
- timeout: EXEC_TIMEOUT$3,
753
+ timeout: EXEC_TIMEOUT$4,
754
754
  encoding: "utf8",
755
755
  stdio: [
756
756
  "pipe",
@@ -774,12 +774,12 @@ function parseTabs(raw, browser) {
774
774
  };
775
775
  }).filter((t) => t !== null);
776
776
  }
777
- function querySqlite(dbPath, query) {
777
+ function querySqlite$1(dbPath, query) {
778
778
  const tmp = join(homedir(), ".skykoi", "capture", `_tmp_${Date.now()}.db`);
779
779
  try {
780
780
  copyFileSync(dbPath, tmp);
781
781
  return execSync(`sqlite3 -json ${JSON.stringify(tmp)} ${JSON.stringify(query)}`, {
782
- timeout: EXEC_TIMEOUT$3,
782
+ timeout: EXEC_TIMEOUT$4,
783
783
  encoding: "utf8",
784
784
  stdio: [
785
785
  "pipe",
@@ -800,7 +800,7 @@ const CHROME_HISTORY_DB = join(homedir(), "Library", "Application Support", "Goo
800
800
  const CORE_DATA_OFFSET = 978307200;
801
801
  function getSafariHistory(sinceTs) {
802
802
  if (!existsSync(SAFARI_HISTORY_DB)) return [];
803
- const raw = querySqlite(SAFARI_HISTORY_DB, `SELECT h.url, v.title, v.visit_time FROM history_items h JOIN history_visits v ON h.id = v.history_item WHERE v.visit_time > ${Math.floor(sinceTs / 1e3) - CORE_DATA_OFFSET} ORDER BY v.visit_time DESC LIMIT 20`);
803
+ const raw = querySqlite$1(SAFARI_HISTORY_DB, `SELECT h.url, v.title, v.visit_time FROM history_items h JOIN history_visits v ON h.id = v.history_item WHERE v.visit_time > ${Math.floor(sinceTs / 1e3) - CORE_DATA_OFFSET} ORDER BY v.visit_time DESC LIMIT 20`);
804
804
  if (!raw) return [];
805
805
  try {
806
806
  return JSON.parse(raw).map((r) => ({
@@ -816,7 +816,7 @@ function getSafariHistory(sinceTs) {
816
816
  function getChromeHistory(sinceTs) {
817
817
  if (!existsSync(CHROME_HISTORY_DB)) return [];
818
818
  const chromeEpochOffset = 11644473600000000n;
819
- const raw = querySqlite(CHROME_HISTORY_DB, `SELECT url, title, last_visit_time FROM urls WHERE last_visit_time > ${BigInt(sinceTs) * 1000n + chromeEpochOffset} ORDER BY last_visit_time DESC LIMIT 20`);
819
+ const raw = querySqlite$1(CHROME_HISTORY_DB, `SELECT url, title, last_visit_time FROM urls WHERE last_visit_time > ${BigInt(sinceTs) * 1000n + chromeEpochOffset} ORDER BY last_visit_time DESC LIMIT 20`);
820
820
  if (!raw) return [];
821
821
  try {
822
822
  return JSON.parse(raw).map((r) => ({
@@ -900,7 +900,7 @@ function startBrowserCapture() {
900
900
 
901
901
  //#endregion
902
902
  //#region src/capture/calendar-capture.ts
903
- const EXEC_TIMEOUT$2 = 5e3;
903
+ const EXEC_TIMEOUT$3 = 5e3;
904
904
  const CALENDAR_SCRIPT = `
905
905
  set now to current date
906
906
  set later to now + (2 * hours)
@@ -949,7 +949,7 @@ function parseEvents(raw) {
949
949
  function fetchAndEmit(lastJson) {
950
950
  try {
951
951
  const events = parseEvents(execSync(`osascript -e ${JSON.stringify(CALENDAR_SCRIPT)}`, {
952
- timeout: EXEC_TIMEOUT$2,
952
+ timeout: EXEC_TIMEOUT$3,
953
953
  encoding: "utf8",
954
954
  stdio: [
955
955
  "pipe",
@@ -996,7 +996,7 @@ function startCalendarCapture() {
996
996
 
997
997
  //#endregion
998
998
  //#region src/capture/screen-capture.ts
999
- const EXEC_TIMEOUT$1 = 5e3;
999
+ const EXEC_TIMEOUT$2 = 5e3;
1000
1000
  const OCR_TIMEOUT = 15e3;
1001
1001
  const MAX_OCR_LENGTH = 15e3;
1002
1002
  const SCREENSHOT_PATH = "/tmp/skykoi-screen-capture.png";
@@ -1037,7 +1037,7 @@ function captureAndOcr() {
1037
1037
  ocrInFlight = true;
1038
1038
  try {
1039
1039
  execSync(`screencapture -x -t png ${SCREENSHOT_PATH}`, {
1040
- timeout: EXEC_TIMEOUT$1,
1040
+ timeout: EXEC_TIMEOUT$2,
1041
1041
  stdio: "pipe"
1042
1042
  });
1043
1043
  if (!existsSync(SCREENSHOT_PATH)) return;
@@ -1132,13 +1132,13 @@ async function startScreenCapture() {
1132
1132
 
1133
1133
  //#endregion
1134
1134
  //#region src/capture/notification-capture.ts
1135
- const EXEC_TIMEOUT = 5e3;
1135
+ const EXEC_TIMEOUT$1 = 5e3;
1136
1136
  const DB_PATH = join(homedir(), "Library/Group Containers/group.com.apple.usernoted/db2/db");
1137
1137
  let lastDeliveredDate = 0;
1138
1138
  function queryNotificationDb() {
1139
1139
  try {
1140
1140
  const raw = execSync(`sqlite3 "${DB_PATH}" "${`SELECT app_id, delivered_date FROM record WHERE delivered_date > ${lastDeliveredDate} ORDER BY delivered_date DESC LIMIT 20;`}"`, {
1141
- timeout: EXEC_TIMEOUT,
1141
+ timeout: EXEC_TIMEOUT$1,
1142
1142
  encoding: "utf8"
1143
1143
  });
1144
1144
  if (!raw?.trim()) return [];
@@ -1163,12 +1163,12 @@ function queryNotificationDb() {
1163
1163
  function tryExtractContent(appId, deliveredDate) {
1164
1164
  try {
1165
1165
  const hex = execSync(`sqlite3 "${DB_PATH}" "${`SELECT hex(data) FROM record WHERE app_id='${appId.replace(/'/g, "''")}' AND delivered_date=${deliveredDate} LIMIT 1;`}"`, {
1166
- timeout: EXEC_TIMEOUT,
1166
+ timeout: EXEC_TIMEOUT$1,
1167
1167
  encoding: "utf8"
1168
1168
  }).trim();
1169
1169
  if (!hex) return {};
1170
1170
  const plistXml = execSync(`echo '${hex}' | xxd -r -p | plutil -convert xml1 -o - -`, {
1171
- timeout: EXEC_TIMEOUT,
1171
+ timeout: EXEC_TIMEOUT$1,
1172
1172
  encoding: "utf8"
1173
1173
  });
1174
1174
  const titleMatch = plistXml.match(/<key>titl<\/key>\s*<string>([^<]*)<\/string>/);
@@ -1215,7 +1215,7 @@ function initializeBaseline() {
1215
1215
  if (!existsSync(DB_PATH)) return;
1216
1216
  try {
1217
1217
  const raw = execSync(`sqlite3 "${DB_PATH}" "SELECT MAX(delivered_date) FROM record;"`, {
1218
- timeout: EXEC_TIMEOUT,
1218
+ timeout: EXEC_TIMEOUT$1,
1219
1219
  encoding: "utf8"
1220
1220
  }).trim();
1221
1221
  const val = parseFloat(raw);
@@ -1245,6 +1245,147 @@ function startNotificationCapture() {
1245
1245
  } };
1246
1246
  }
1247
1247
 
1248
+ //#endregion
1249
+ //#region src/capture/message-capture.ts
1250
+ const EXEC_TIMEOUT = 5e3;
1251
+ const IMESSAGE_DB = join(homedir(), "Library", "Messages", "chat.db");
1252
+ const WHATSAPP_DB = join(homedir(), "Library/Group Containers/group.net.whatsapp.WhatsApp.shared/ChatStorage.sqlite");
1253
+ const CAPTURE_DIR = join(homedir(), ".skykoi", "capture");
1254
+ let lastImessageRowId = 0;
1255
+ let lastWhatsappTs = 0;
1256
+ function querySqlite(dbPath, query) {
1257
+ const tmp = join(CAPTURE_DIR, `_tmp_msg_${Date.now()}.db`);
1258
+ try {
1259
+ copyFileSync(dbPath, tmp);
1260
+ return execSync(`sqlite3 -json ${JSON.stringify(tmp)} ${JSON.stringify(query)}`, {
1261
+ timeout: EXEC_TIMEOUT,
1262
+ encoding: "utf8",
1263
+ stdio: [
1264
+ "pipe",
1265
+ "pipe",
1266
+ "pipe"
1267
+ ]
1268
+ }).trim();
1269
+ } catch {
1270
+ return "";
1271
+ } finally {
1272
+ try {
1273
+ unlinkSync(tmp);
1274
+ } catch {}
1275
+ }
1276
+ }
1277
+ function checkImessage() {
1278
+ if (!existsSync(IMESSAGE_DB)) return;
1279
+ try {
1280
+ const raw = querySqlite(IMESSAGE_DB, `SELECT m.ROWID, m.text, m.is_from_me, m.date, h.id AS handle_id, h.uncanonicalized_id
1281
+ FROM message m LEFT JOIN handle h ON m.handle_id = h.ROWID
1282
+ WHERE m.ROWID > ${lastImessageRowId}
1283
+ ORDER BY m.ROWID DESC LIMIT 10`);
1284
+ if (!raw) return;
1285
+ const rows = JSON.parse(raw);
1286
+ if (rows.length === 0) return;
1287
+ let maxRow = lastImessageRowId;
1288
+ for (const row of rows.reverse()) {
1289
+ if (row.ROWID <= lastImessageRowId) continue;
1290
+ if (row.ROWID > maxRow) maxRow = row.ROWID;
1291
+ const unixMs = Math.floor(row.date / 1e6) + 9783072e5;
1292
+ pushCaptureEvent({
1293
+ source: "message",
1294
+ ts: Date.now(),
1295
+ data: {
1296
+ type: "imessage",
1297
+ from: row.is_from_me ? "me" : row.uncanonicalized_id || row.handle_id || "unknown",
1298
+ text: row.text?.slice(0, 500) || "[attachment]",
1299
+ sentAt: new Date(unixMs).toISOString(),
1300
+ direction: row.is_from_me ? "outgoing" : "incoming"
1301
+ }
1302
+ });
1303
+ }
1304
+ lastImessageRowId = maxRow;
1305
+ } catch {}
1306
+ }
1307
+ function checkWhatsapp() {
1308
+ if (!existsSync(WHATSAPP_DB)) return;
1309
+ try {
1310
+ const raw = querySqlite(WHATSAPP_DB, `SELECT ZMESSAGEDATE, ZTEXT, ZISFROMME, ZFROMJID
1311
+ FROM ZWAMESSAGE
1312
+ WHERE ZMESSAGEDATE > ${lastWhatsappTs}
1313
+ ORDER BY ZMESSAGEDATE DESC LIMIT 10`);
1314
+ if (!raw) return;
1315
+ const rows = JSON.parse(raw);
1316
+ if (rows.length === 0) return;
1317
+ let maxTs = lastWhatsappTs;
1318
+ for (const row of rows.reverse()) {
1319
+ if (row.ZMESSAGEDATE <= lastWhatsappTs) continue;
1320
+ if (row.ZMESSAGEDATE > maxTs) maxTs = row.ZMESSAGEDATE;
1321
+ const unixMs = (row.ZMESSAGEDATE + 978307200) * 1e3;
1322
+ const sender = row.ZFROMJID?.replace(/@s\.whatsapp\.net$/, "") || "unknown";
1323
+ pushCaptureEvent({
1324
+ source: "message",
1325
+ ts: Date.now(),
1326
+ data: {
1327
+ type: "whatsapp",
1328
+ from: row.ZISFROMME ? "me" : sender,
1329
+ text: row.ZTEXT?.slice(0, 500) || "[media]",
1330
+ sentAt: new Date(unixMs).toISOString(),
1331
+ direction: row.ZISFROMME ? "outgoing" : "incoming"
1332
+ }
1333
+ });
1334
+ }
1335
+ lastWhatsappTs = maxTs;
1336
+ } catch {}
1337
+ }
1338
+ function initBaseline() {
1339
+ if (existsSync(IMESSAGE_DB)) try {
1340
+ const raw = querySqlite(IMESSAGE_DB, "SELECT MAX(ROWID) as maxid FROM message");
1341
+ if (raw) {
1342
+ const rows = JSON.parse(raw);
1343
+ if (rows[0]?.maxid) lastImessageRowId = rows[0].maxid;
1344
+ }
1345
+ } catch {}
1346
+ if (existsSync(WHATSAPP_DB)) try {
1347
+ const raw = querySqlite(WHATSAPP_DB, "SELECT MAX(ZMESSAGEDATE) as maxts FROM ZWAMESSAGE");
1348
+ if (raw) {
1349
+ const rows = JSON.parse(raw);
1350
+ if (rows[0]?.maxts) lastWhatsappTs = rows[0].maxts;
1351
+ }
1352
+ } catch {}
1353
+ }
1354
+ function startMessageCapture() {
1355
+ if (process.platform !== "darwin") return { stop: () => {} };
1356
+ initBaseline();
1357
+ const watchers = [];
1358
+ let imsgDebounce = null;
1359
+ let waDebounce = null;
1360
+ if (existsSync(IMESSAGE_DB)) try {
1361
+ const w = watch(IMESSAGE_DB, () => {
1362
+ if (imsgDebounce) clearTimeout(imsgDebounce);
1363
+ imsgDebounce = setTimeout(checkImessage, 500);
1364
+ });
1365
+ watchers.push(w);
1366
+ } catch {}
1367
+ if (existsSync(WHATSAPP_DB)) try {
1368
+ const w = watch(WHATSAPP_DB, () => {
1369
+ if (waDebounce) clearTimeout(waDebounce);
1370
+ waDebounce = setTimeout(checkWhatsapp, 500);
1371
+ });
1372
+ watchers.push(w);
1373
+ } catch {}
1374
+ const fallback = setInterval(() => {
1375
+ checkImessage();
1376
+ checkWhatsapp();
1377
+ }, 3e4);
1378
+ fallback.unref?.();
1379
+ return { stop: () => {
1380
+ for (const w of watchers) try {
1381
+ w.close();
1382
+ } catch {}
1383
+ if (imsgDebounce) clearTimeout(imsgDebounce);
1384
+ if (waDebounce) clearTimeout(waDebounce);
1385
+ clearInterval(fallback);
1386
+ } };
1387
+ }
1388
+
1248
1389
  //#endregion
1249
1390
  //#region src/capture/capture-service.ts
1250
1391
  /**
@@ -1295,6 +1436,10 @@ function buildCaptureContextBlock() {
1295
1436
  let source = "input";
1296
1437
  if (type === "clipboard") source = "clipboard";
1297
1438
  else if (type === "window_title") source = "window";
1439
+ else if (type === "sleep" || type === "wake" || type === "screen_off" || type === "screen_on" || type === "screen_locked" || type === "screen_unlocked" || type === "idle_start" || type === "idle_end" || type === "power" || type === "wifi" || type === "volume" || type === "display_config" || type === "bluetooth" || type === "usb" || type === "volume_mount" || type === "volume_unmount") source = "system";
1440
+ else if (type === "download") source = "downloads";
1441
+ else if (type === "location") source = "location";
1442
+ else if (type === "spotlight") source = "input";
1298
1443
  directInputs.push({
1299
1444
  source,
1300
1445
  ts,
@@ -1336,6 +1481,8 @@ function buildCaptureContextBlock() {
1336
1481
  sections.push(`[${ts}] KEY ${mods}${d.key} in ${d.app}`);
1337
1482
  } else if (d.type === "click") sections.push(`[${ts}] CLICK ${d.button} (${d.x},${d.y}) in ${d.app}`);
1338
1483
  else if (d.type === "app_switch") sections.push(`[${ts}] APP_SWITCH ${d.prev} → ${d.app}`);
1484
+ else if (d.type === "mouse_move") sections.push(`[${ts}] MOUSE (${d.x},${d.y}) in ${d.app}`);
1485
+ else if (d.type === "spotlight") sections.push(`[${ts}] SPOTLIGHT_SEARCH "${d.query}"`);
1339
1486
  }
1340
1487
  }
1341
1488
  if (processes.length > 0) {
@@ -1448,6 +1595,71 @@ function buildCaptureContextBlock() {
1448
1595
  sections.push(`[${ts}] ${d.app}${title}${body}`);
1449
1596
  }
1450
1597
  }
1598
+ const systemEvents = allEvents.filter((e) => e.source === "system");
1599
+ if (systemEvents.length > 0) {
1600
+ sections.push("## Device State");
1601
+ for (const e of systemEvents) {
1602
+ const d = e.data;
1603
+ const ts = new Date(e.ts).toISOString().slice(11, 19);
1604
+ const t = d.type;
1605
+ if (t === "sleep") sections.push(`[${ts}] SLEEP — device going to sleep`);
1606
+ else if (t === "wake") sections.push(`[${ts}] WAKE — device woke up`);
1607
+ else if (t === "screen_off") sections.push(`[${ts}] SCREEN OFF`);
1608
+ else if (t === "screen_on") sections.push(`[${ts}] SCREEN ON`);
1609
+ else if (t === "screen_locked") sections.push(`[${ts}] SCREEN LOCKED`);
1610
+ else if (t === "screen_unlocked") sections.push(`[${ts}] SCREEN UNLOCKED`);
1611
+ else if (t === "idle_start") sections.push(`[${ts}] IDLE — user inactive`);
1612
+ else if (t === "idle_end") sections.push(`[${ts}] ACTIVE — user returned`);
1613
+ else if (t === "power") {
1614
+ const pct = d.batteryPercent ?? "?";
1615
+ const src = d.charging ? "charging" : d.powerSource ?? "battery";
1616
+ const mins = typeof d.minutesRemaining === "number" && d.minutesRemaining >= 0 ? `, ${d.minutesRemaining}min remaining` : "";
1617
+ sections.push(`[${ts}] POWER ${pct}% (${src}${mins})`);
1618
+ } else if (t === "wifi") sections.push(`[${ts}] WIFI ${d.connected ? d.ssid : "disconnected"}`);
1619
+ else if (t === "volume") sections.push(`[${ts}] VOLUME ${d.volume}%${d.muted ? " (muted)" : ""}`);
1620
+ else if (t === "display_config") {
1621
+ const desc = d.displays?.map((dd) => `${dd.width}x${dd.height}${dd.main ? " (main)" : ""}`).join(", ") ?? "";
1622
+ sections.push(`[${ts}] DISPLAYS ${d.count}: ${desc}`);
1623
+ } else if (t === "bluetooth") {
1624
+ const devs = d.devices;
1625
+ sections.push(`[${ts}] BLUETOOTH ${devs?.map((dd) => dd.name).join(", ") || "none"}`);
1626
+ } else if (t === "usb") {
1627
+ const devs = d.devices;
1628
+ sections.push(`[${ts}] USB ${devs?.join(", ") || "none"}`);
1629
+ } else if (t === "volume_mount") sections.push(`[${ts}] MOUNTED ${d.path}`);
1630
+ else if (t === "volume_unmount") sections.push(`[${ts}] UNMOUNTED ${d.path}`);
1631
+ }
1632
+ }
1633
+ const downloads = allEvents.filter((e) => e.source === "downloads");
1634
+ if (downloads.length > 0) {
1635
+ sections.push("## Downloads");
1636
+ for (const e of downloads) {
1637
+ const d = e.data;
1638
+ const ts = new Date(e.ts).toISOString().slice(11, 19);
1639
+ const files = d.files;
1640
+ if (files) for (const f of files) {
1641
+ const sizeStr = f.size > 1024 * 1024 ? `${(f.size / 1024 / 1024).toFixed(1)}MB` : `${(f.size / 1024).toFixed(0)}KB`;
1642
+ sections.push(`[${ts}] DOWNLOADED ${f.name} (${sizeStr})`);
1643
+ }
1644
+ }
1645
+ }
1646
+ const locations = allEvents.filter((e) => e.source === "location");
1647
+ if (locations.length > 0) {
1648
+ const d = locations.at(-1).data;
1649
+ sections.push(`## Location`);
1650
+ sections.push(`Lat: ${d.lat}, Lon: ${d.lon} (±${d.accuracy}m, alt ${d.altitude}m)`);
1651
+ }
1652
+ const messages = allEvents.filter((e) => e.source === "message");
1653
+ if (messages.length > 0) {
1654
+ sections.push("## Messages");
1655
+ for (const e of messages) {
1656
+ const d = e.data;
1657
+ const ts = new Date(e.ts).toISOString().slice(11, 19);
1658
+ const platform = d.type === "imessage" ? "iMessage" : "WhatsApp";
1659
+ const dir = d.direction === "outgoing" ? "→" : "←";
1660
+ sections.push(`[${ts}] ${platform} ${dir} ${d.from}: ${String(d.text).slice(0, 200)}`);
1661
+ }
1662
+ }
1451
1663
  if (sections.length === 0) return "";
1452
1664
  return "# Device Activity (exact, real-time)\n\n" + sections.join("\n");
1453
1665
  }
@@ -1615,6 +1827,12 @@ async function startCaptureService(opts) {
1615
1827
  } catch (err) {
1616
1828
  console.error(`[capture] Notification capture failed to start: ${err}`);
1617
1829
  }
1830
+ try {
1831
+ const messageHandle = startMessageCapture();
1832
+ stops.push(messageHandle.stop);
1833
+ } catch (err) {
1834
+ console.error(`[capture] Message capture failed to start: ${err}`);
1835
+ }
1618
1836
  const flushTimer = setInterval(() => {
1619
1837
  if (!stopped) flushToDisk();
1620
1838
  }, 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-DpZrr3UC.js";
5
+ import { t as ensurePluginRegistryLoaded } from "./plugin-registry-DdBnvr9h.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-Bb7g4UzX.js";
2
+ import { Gt as parseDiscordTarget, Kt as fetchChannelPermissionsDiscord, in as createSlackWebClient, lt as loadProviderUsageSummary, ut as formatUsageReportLines } from "./reply-mOlXreGp.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-Bwc8efrA.js";
76
+ import { i as reloadOnboardingPluginRegistry, n as setupChannels, r as ensureOnboardingPluginInstalled } from "./onboard-channels-CwSayqE8.js";
77
77
  import { i as listChannelPluginCatalogEntries } from "./plugin-auto-enable-Cg3LRidd.js";
78
- import "./archive-DYZYH4JM.js";
78
+ import "./archive-CESecfeV.js";
79
79
  import "./skill-scanner-CBHxr1An.js";
80
- import "./installs-BzTBsTtR.js";
80
+ import "./installs-J0qld2XT.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-DpZrr3UC.js";
85
+ import { n as hasExplicitOptions } from "./plugin-registry-DdBnvr9h.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-DseZbwUS.js";
89
+ import { t as formatCliChannelOptions } from "./channel-options-zwslyp06.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-DM4-EaCQ.js";
2
+ export { registerDaemonCli, runDaemonInstall, runDaemonRestart, runDaemonStart, runDaemonStatus, runDaemonStop, runDaemonUninstall } from "../daemon-cli-2wt4he6F.js";
@@ -1,5 +1,5 @@
1
1
  import "./pi-embedded-helpers-VJ9hOBTv.js";
2
- import { ct as loadSKYKOIPlugins } from "./reply-Bb7g4UzX.js";
2
+ import { ct as loadSKYKOIPlugins } from "./reply-mOlXreGp.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-CeICyB4l.js";
3
+ import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-Dz8PuEdt.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-Bb7g4UzX.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-mOlXreGp.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-CICTh0V_.js";
24
+ import { t as createDefaultDeps } from "./deps-0dHAqQPZ.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-D1yxhbJo.js";
31
- import { d as applyAuthChoice, f as applyOpenAIConfig, h as promptAuthChoiceGrouped, m as applyGoogleGeminiModelDefault, p as upsertSharedEnvVar, u as warnIfModelConfigLooksOff } from "./onboard-skills-B_7nD3Sb.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-B61AHThq.js";
33
- import { n as setupChannels } from "./onboard-channels-Bwc8efrA.js";
34
- import { i as healthCommand } from "./health-format-Dw75LDa6.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-DkNx4Kk8.js";
31
+ import { d as applyAuthChoice, f as applyOpenAIConfig, h as promptAuthChoiceGrouped, m as applyGoogleGeminiModelDefault, p as upsertSharedEnvVar, u as warnIfModelConfigLooksOff } from "./onboard-skills-D8KGRTxy.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-CRPmNlXU.js";
33
+ import { n as setupChannels } from "./onboard-channels-CwSayqE8.js";
34
+ import { i as healthCommand } from "./health-format-Cv2SBzMq.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-CeICyB4l.js";
38
+ import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-Dz8PuEdt.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-D_JJc8iu.js";
43
- import { n as hasExplicitOptions, t as ensurePluginRegistryLoaded } from "./plugin-registry-DpZrr3UC.js";
42
+ import { a as createOutboundSendDeps, n as resolveSessionKeyForRequest, t as koiCommand } from "./koi-CwOIbGaZ.js";
43
+ import { n as hasExplicitOptions, t as ensurePluginRegistryLoaded } from "./plugin-registry-DdBnvr9h.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-CFDkXjgL.js";
45
+ import { i as CONFIGURE_WIZARD_SECTIONS, n as configureCommand, r as configureCommandWithSections } from "./configure-DFrODS29.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-BpP981es.js";
49
+ import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-Ce7vc1wR.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-CFDkXjgL.js").then((n) => n.t);
2800
+ const { CONFIGURE_WIZARD_SECTIONS, configureCommand, configureCommandWithSections } = await import("./configure-DFrODS29.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-B_7nD3Sb.js";
18
- import { n as setupChannels, t as noteChannelStatus } from "./onboard-channels-Bwc8efrA.js";
19
- import { i as healthCommand, t as formatHealthCheckFailure } from "./health-format-Dw75LDa6.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-D8KGRTxy.js";
18
+ import { n as setupChannels, t as noteChannelStatus } from "./onboard-channels-CwSayqE8.js";
19
+ import { i as healthCommand, t as formatHealthCheckFailure } from "./health-format-Cv2SBzMq.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-CICTh0V_.js";
18
+ import { t as createDefaultDeps } from "./deps-0dHAqQPZ.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-Bb7g4UzX.js";
1
+ import { Ht as sendMessageTelegram, Ut as sendMessageDiscord, ht as sendMessageIMessage, nn as sendMessageWhatsApp, rn as sendMessageSlack } from "./reply-mOlXreGp.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-Bb7g4UzX.js";
1
+ import { Jn as loadModelCatalog, ct as loadSKYKOIPlugins } from "./reply-mOlXreGp.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-Dw75LDa6.js";
29
+ import { i as healthCommand, t as formatHealthCheckFailure } from "./health-format-Cv2SBzMq.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-CroMxa0u.js";
37
+ import { n as doctorShellCompletion } from "./doctor-completion-L793M3dP.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-BBwoUVln.js";
6
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-BsJskaQs.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-BTRshA-a.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
250
+ import("./run-main-5pXCx8I1.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-Bb7g4UzX.js";
2
+ import { c as runEmbeddedPiKoi, lr as resolveKoiTimeoutMs, sn as resolveKoiIdentity } from "./reply-mOlXreGp.js";
3
3
  import "./subsystem-hATE68va.js";
4
4
  import "./paths-VdmjGGyc.js";
5
5
  import "./theme-C5EwWDWE.js";