skykoi 2026.3.381 → 2026.3.382

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 (55) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  3. package/dist/{completion-cli-DJhbwMcK.js → completion-cli-Cgn9V9Yi.js} +1 -1
  4. package/dist/{config-guard-Q3Pl253R.js → config-guard-D-KPEEh3.js} +4 -4
  5. package/dist/{doctor-BfH7c1Hp.js → doctor-avyHLn58.js} +1 -1
  6. package/dist/{doctor-completion-lahrpE_z.js → doctor-completion-Bgky03RU.js} +1 -1
  7. package/dist/entry.js +1 -1
  8. package/dist/{gateway-cli-s90jfqW_.js → gateway-cli-a1_NKkBz.js} +5 -5
  9. package/dist/index.js +8 -8
  10. package/dist/{onboarding-f7KcL7qR.js → onboarding-2M92MzZF.js} +3 -3
  11. package/dist/plugin-sdk/index.js +7 -7
  12. package/dist/{program-DSIl6v9h.js → program-Bz1TDywf.js} +3 -3
  13. package/dist/{register.subclis-9L79xJNr.js → register.subclis-DtKT5IYt.js} +4 -4
  14. package/dist/{run-main-qyMlhjLF.js → run-main-BeyzyGQQ.js} +9 -9
  15. package/dist/{tui-cli-juhjLupf.js → tui-cli-NTTLb66c.js} +1 -1
  16. package/dist/{tui-DC1slGZV.js → tui-yuAuvrAb.js} +211 -4
  17. package/dist/{update-cli-BNyQj6jL.js → update-cli-CDJKQnMK.js} +4 -4
  18. package/extensions/bluebubbles/package.json +1 -1
  19. package/extensions/copilot-proxy/package.json +1 -1
  20. package/extensions/diagnostics-otel/package.json +1 -1
  21. package/extensions/discord/package.json +1 -1
  22. package/extensions/feishu/package.json +1 -1
  23. package/extensions/google-antigravity-auth/package.json +1 -1
  24. package/extensions/google-gemini-cli-auth/package.json +1 -1
  25. package/extensions/googlechat/package.json +1 -1
  26. package/extensions/imessage/package.json +1 -1
  27. package/extensions/line/package.json +1 -1
  28. package/extensions/llm-task/package.json +1 -1
  29. package/extensions/lobster/package.json +1 -1
  30. package/extensions/matrix/CHANGELOG.md +5 -0
  31. package/extensions/matrix/package.json +1 -1
  32. package/extensions/mattermost/package.json +1 -1
  33. package/extensions/memory-core/package.json +1 -1
  34. package/extensions/memory-lancedb/package.json +1 -1
  35. package/extensions/minimax-portal-auth/package.json +1 -1
  36. package/extensions/msteams/CHANGELOG.md +5 -0
  37. package/extensions/msteams/package.json +1 -1
  38. package/extensions/nextcloud-talk/package.json +1 -1
  39. package/extensions/nostr/CHANGELOG.md +5 -0
  40. package/extensions/nostr/package.json +1 -1
  41. package/extensions/open-prose/package.json +1 -1
  42. package/extensions/signal/package.json +1 -1
  43. package/extensions/slack/package.json +1 -1
  44. package/extensions/telegram/package.json +1 -1
  45. package/extensions/tlon/package.json +1 -1
  46. package/extensions/twitch/CHANGELOG.md +5 -0
  47. package/extensions/twitch/package.json +1 -1
  48. package/extensions/voice-call/CHANGELOG.md +5 -0
  49. package/extensions/voice-call/package.json +1 -1
  50. package/extensions/whatsapp/package.json +1 -1
  51. package/extensions/zalo/CHANGELOG.md +5 -0
  52. package/extensions/zalo/package.json +1 -1
  53. package/extensions/zalouser/CHANGELOG.md +5 -0
  54. package/extensions/zalouser/package.json +1 -1
  55. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.3.381",
3
- "commit": "24563d534b1eb61172d758368466cfedf458d6df",
4
- "builtAt": "2026-07-04T00:29:09.829Z"
2
+ "version": "2026.3.382",
3
+ "commit": "92a89a6bc383e5e25d2208bfa2aadfc0e4c8ed41",
4
+ "builtAt": "2026-07-04T00:39:09.333Z"
5
5
  }
@@ -1 +1 @@
1
- 955f41785c6bd32b8d2f3d1941eb6494ab2ab1fde4ffeb85b8957775fbada3b0
1
+ 356f06f799320804907cce69605fe7aeaa5ef5206ca96503345f43e1558bd366
@@ -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-9L79xJNr.js";
3
+ import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-DtKT5IYt.js";
4
4
  import path from "node:path";
5
5
  import os from "node:os";
6
6
  import fs from "node:fs/promises";
@@ -28,7 +28,7 @@ import { t as resolveChannelDefaultAccountId } from "./helpers-C0u-oaDR.js";
28
28
  import { n as logConfigUpdated, t as formatConfigPath } from "./logging-CE47aZcO.js";
29
29
  import { t as WizardCancelledError } from "./prompts-D59uQQdA.js";
30
30
  import { t as createClackPrompter } from "./clack-prompter-BbdTlNx8.js";
31
- 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-f7KcL7qR.js";
31
+ 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-2M92MzZF.js";
32
32
  import { d as applyAuthChoice, f as applyOpenAIConfig, h as promptAuthChoiceGrouped, m as applyGoogleGeminiModelDefault, p as upsertSharedEnvVar, u as warnIfModelConfigLooksOff } from "./onboard-skills-CbhAiENM.js";
33
33
  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-fS8wMQ0N.js";
34
34
  import { n as setupChannels } from "./onboard-channels-DSqwLtZ3.js";
@@ -36,7 +36,7 @@ import { i as healthCommand } from "./health-format-Mqf6E6Pb.js";
36
36
  import { t as renderTable } from "./table-BFIT6RB5.js";
37
37
  import { t as resolveGatewayService } from "./service-CW9nUfWU.js";
38
38
  import { r as isSystemdUserServiceAvailable } from "./systemd-fjt-WYE7.js";
39
- import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-9L79xJNr.js";
39
+ import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-DtKT5IYt.js";
40
40
  import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-DYI5hnM6.js";
41
41
  import { t as formatHelpExamples } from "./help-format-VHofKIT0.js";
42
42
  import { t as adminUnlockCommand } from "./admin-unlock-CTCNN-zM.js";
@@ -47,7 +47,7 @@ import { i as CONFIGURE_WIZARD_SECTIONS, n as configureCommand, r as configureCo
47
47
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, r as isGatewayDaemonRuntime, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-jkMiwykI.js";
48
48
  import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-T7_vGBN4.js";
49
49
  import { t as loginCommand } from "./login-Du7RjDym.js";
50
- import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-BfH7c1Hp.js";
50
+ import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-avyHLn58.js";
51
51
  import { fileURLToPath } from "node:url";
52
52
  import fs from "node:fs";
53
53
  import path from "node:path";
@@ -3106,7 +3106,7 @@ function registerLoginCommand(program) {
3106
3106
  console.log(theme.muted(` user=${result.userId} org=${result.orgId}`));
3107
3107
  }
3108
3108
  if (opts.chat !== false && result.gatewayUrl && process.stdin.isTTY && process.stdout.isTTY) {
3109
- const { runTui } = await import("./tui-DC1slGZV.js").then((n) => n.n);
3109
+ const { runTui } = await import("./tui-yuAuvrAb.js").then((n) => n.n);
3110
3110
  console.log(theme.muted("\n Opening your koi chat…\n"));
3111
3111
  await runTui({
3112
3112
  url: result.gatewayUrl,
@@ -34,7 +34,7 @@ import { a as repairLaunchAgentBootstrap, i as launchAgentPlistExists, n as isLa
34
34
  import { r as isSystemdUserServiceAvailable } from "./systemd-fjt-WYE7.js";
35
35
  import { t as readLastGatewayErrorLine } from "./diagnostics-DPRvn_ky.js";
36
36
  import { t as collectChannelStatusIssues } from "./channels-status-issues-D92ZMiSY.js";
37
- import { n as doctorShellCompletion } from "./doctor-completion-lahrpE_z.js";
37
+ import { n as doctorShellCompletion } from "./doctor-completion-Bgky03RU.js";
38
38
  import { n as resolveControlUiDistIndexHealth, r as resolveControlUiDistIndexPathForRoot } from "./control-ui-assets-Dcc_8tht.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-jkMiwykI.js";
40
40
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-T7_vGBN4.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-BDX6ZDm1.js";
5
5
  import { c as compareSemverStrings, s as checkUpdateStatus } from "./update-runner-BTHuBI1s.js";
6
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-DJhbwMcK.js";
6
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-Cgn9V9Yi.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-qyMlhjLF.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
250
+ import("./run-main-BeyzyGQQ.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
  });
@@ -94,7 +94,7 @@ import { t as resolveChannelDefaultAccountId } from "./helpers-C0u-oaDR.js";
94
94
  import "./logging-CE47aZcO.js";
95
95
  import "./note-BDX6ZDm1.js";
96
96
  import { t as WizardCancelledError } from "./prompts-D59uQQdA.js";
97
- 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-f7KcL7qR.js";
97
+ 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-2M92MzZF.js";
98
98
  import { n as installSkill } from "./onboard-skills-CbhAiENM.js";
99
99
  import "./github-copilot-auth-fS8wMQ0N.js";
100
100
  import "./onboard-channels-DSqwLtZ3.js";
@@ -113,18 +113,18 @@ import { p as resolveGatewayStateDir } from "./systemd-fjt-WYE7.js";
113
113
  import "./diagnostics-DPRvn_ky.js";
114
114
  import "./node-service--cl-zK26.js";
115
115
  import "./channels-status-issues-D92ZMiSY.js";
116
- import "./doctor-completion-lahrpE_z.js";
117
- import "./register.subclis-9L79xJNr.js";
116
+ import "./doctor-completion-Bgky03RU.js";
117
+ import "./register.subclis-DtKT5IYt.js";
118
118
  import { a as createOutboundSendDeps$1, i as resolveKoiOutboundTarget, r as resolveKoiDeliveryPlan, t as koiCommand } from "./koi-Dykd-hEW.js";
119
119
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-Dcc_8tht.js";
120
120
  import "./daemon-runtime-jkMiwykI.js";
121
121
  import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } from "./widearea-dns-DmDtfScg.js";
122
122
  import { n as discoverGatewayBeacons } from "./bonjour-discovery-BcGs4w0m.js";
123
123
  import "./ensure-local-gateway-B2qYYNsm.js";
124
- import "./completion-cli-DJhbwMcK.js";
124
+ import "./completion-cli-Cgn9V9Yi.js";
125
125
  import "./service-audit-B_swanYW.js";
126
126
  import { i as shouldIncludeHook, n as loadWorkspaceHookEntries, r as resolveHookConfig } from "./hooks-status-CJBhXrQP.js";
127
- import "./tui-DC1slGZV.js";
127
+ import "./tui-yuAuvrAb.js";
128
128
  import { t as buildChannelAccountSnapshot } from "./status-C8ntwWk9.js";
129
129
  import "./shared-CsJmoyjd.js";
130
130
  import { a as runDaemonStop, i as runDaemonStart, n as runDaemonStatus, o as runDaemonUninstall, r as runDaemonRestart, s as runDaemonInstall } from "./daemon-cli-B_iflZzZ.js";
package/dist/index.js CHANGED
@@ -80,11 +80,11 @@ import { t as isMainModule } from "./is-main-D5NmXew9.js";
80
80
  import { t as ensureSKYKOICliOnPath } from "./path-env-C0IwmyXV.js";
81
81
  import { t as assertSupportedRuntime } from "./runtime-guard-DQEzrjPX.js";
82
82
  import "./ports-CVcXIoyn.js";
83
- import "./config-guard-Q3Pl253R.js";
83
+ import "./config-guard-D-KPEEh3.js";
84
84
  import "./logging-CE47aZcO.js";
85
85
  import "./note-BDX6ZDm1.js";
86
86
  import "./clack-prompter-BbdTlNx8.js";
87
- import "./onboarding-f7KcL7qR.js";
87
+ import "./onboarding-2M92MzZF.js";
88
88
  import "./onboard-skills-CbhAiENM.js";
89
89
  import "./github-copilot-auth-fS8wMQ0N.js";
90
90
  import "./onboard-channels-DSqwLtZ3.js";
@@ -103,8 +103,8 @@ import "./systemd-fjt-WYE7.js";
103
103
  import "./diagnostics-DPRvn_ky.js";
104
104
  import "./node-service--cl-zK26.js";
105
105
  import "./channels-status-issues-D92ZMiSY.js";
106
- import "./doctor-completion-lahrpE_z.js";
107
- import "./register.subclis-9L79xJNr.js";
106
+ import "./doctor-completion-Bgky03RU.js";
107
+ import "./register.subclis-DtKT5IYt.js";
108
108
  import "./gateway-rpc-DYI5hnM6.js";
109
109
  import "./help-format-VHofKIT0.js";
110
110
  import "./admin-unlock-CTCNN-zM.js";
@@ -120,13 +120,13 @@ import "./ensure-local-gateway-B2qYYNsm.js";
120
120
  import "./channel-auth-DOqfPLIr.js";
121
121
  import "./login-Du7RjDym.js";
122
122
  import "./auth-health-DfT6NGrM.js";
123
- import "./doctor-BfH7c1Hp.js";
124
- import "./completion-cli-DJhbwMcK.js";
123
+ import "./doctor-avyHLn58.js";
124
+ import "./completion-cli-Cgn9V9Yi.js";
125
125
  import "./service-audit-B_swanYW.js";
126
126
  import "./hooks-status-CJBhXrQP.js";
127
- import "./tui-DC1slGZV.js";
127
+ import "./tui-yuAuvrAb.js";
128
128
  import "./channel-options-BI4411cy.js";
129
- import { n as buildProgram } from "./program-DSIl6v9h.js";
129
+ import { n as buildProgram } from "./program-Bz1TDywf.js";
130
130
  import process from "node:process";
131
131
  import { fileURLToPath } from "node:url";
132
132
 
@@ -38,12 +38,12 @@ import { t as readLastGatewayErrorLine } from "./diagnostics-DPRvn_ky.js";
38
38
  import { t as resolveNodeService } from "./node-service--cl-zK26.js";
39
39
  import { t as collectChannelStatusIssues } from "./channels-status-issues-D92ZMiSY.js";
40
40
  import { i as redactSecrets, n as formatDuration$1, r as formatGatewayAuthUsed, t as formatAge$1 } from "./format-lvtLJpBH.js";
41
- import { a as formatUpdateOneLiner, i as formatUpdateAvailableHint, o as getUpdateCheckResult, r as ensureCompletionCacheExists, s as resolveUpdateAvailability, t as checkShellCompletionStatus } from "./doctor-completion-lahrpE_z.js";
41
+ import { a as formatUpdateOneLiner, i as formatUpdateAvailableHint, o as getUpdateCheckResult, r as ensureCompletionCacheExists, s as resolveUpdateAvailability, t as checkShellCompletionStatus } from "./doctor-completion-Bgky03RU.js";
42
42
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-Dcc_8tht.js";
43
43
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-jkMiwykI.js";
44
- import { r as installCompletion } from "./completion-cli-DJhbwMcK.js";
44
+ import { r as installCompletion } from "./completion-cli-Cgn9V9Yi.js";
45
45
  import { t as buildWorkspaceHookStatus } from "./hooks-status-CJBhXrQP.js";
46
- import { t as runTui } from "./tui-DC1slGZV.js";
46
+ import { t as runTui } from "./tui-yuAuvrAb.js";
47
47
  import fs from "node:fs";
48
48
  import path from "node:path";
49
49
  import os from "node:os";
@@ -21,7 +21,7 @@ import chalk, { Chalk } from "chalk";
21
21
  import fs, { constants, createWriteStream, existsSync, promises, statSync } from "node:fs";
22
22
  import path, { join } from "node:path";
23
23
  import { Logger } from "tslog";
24
- import JSON5 from "json5";
24
+ import json5 from "json5";
25
25
  import os, { homedir, tmpdir } from "node:os";
26
26
  import { promisify } from "node:util";
27
27
  import fs$1 from "node:fs/promises";
@@ -2263,7 +2263,7 @@ function readLoggingConfig() {
2263
2263
  try {
2264
2264
  if (!fs.existsSync(configPath)) return;
2265
2265
  const raw = fs.readFileSync(configPath, "utf-8");
2266
- const logging = JSON5.parse(raw)?.logging;
2266
+ const logging = json5.parse(raw)?.logging;
2267
2267
  if (!logging || typeof logging !== "object" || Array.isArray(logging)) return;
2268
2268
  return logging;
2269
2269
  } catch {
@@ -19093,7 +19093,7 @@ var IncludeProcessor = class IncludeProcessor {
19093
19093
  };
19094
19094
  const defaultResolver = {
19095
19095
  readFile: (p) => fs.readFileSync(p, "utf-8"),
19096
- parseJson: (raw) => JSON5.parse(raw)
19096
+ parseJson: (raw) => json5.parse(raw)
19097
19097
  };
19098
19098
  /**
19099
19099
  * Resolves all $include directives in a parsed config object.
@@ -21791,18 +21791,18 @@ function resolveConfigPathForDeps(deps) {
21791
21791
  function normalizeDeps(overrides = {}) {
21792
21792
  return {
21793
21793
  fs: overrides.fs ?? fs,
21794
- json5: overrides.json5 ?? JSON5,
21794
+ json5: overrides.json5 ?? json5,
21795
21795
  env: overrides.env ?? process.env,
21796
21796
  homedir: overrides.homedir ?? os.homedir,
21797
21797
  configPath: overrides.configPath ?? "",
21798
21798
  logger: overrides.logger ?? console
21799
21799
  };
21800
21800
  }
21801
- function parseConfigJson5(raw, json5 = JSON5) {
21801
+ function parseConfigJson5(raw, json5$1 = json5) {
21802
21802
  try {
21803
21803
  return {
21804
21804
  ok: true,
21805
- parsed: json5.parse(raw)
21805
+ parsed: json5$1.parse(raw)
21806
21806
  };
21807
21807
  } catch (err) {
21808
21808
  return {
@@ -22316,7 +22316,7 @@ function loadSessionStore(storePath, opts = {}) {
22316
22316
  let mtimeMs = getFileMtimeMs(storePath);
22317
22317
  try {
22318
22318
  const raw = fs.readFileSync(storePath, "utf-8");
22319
- const parsed = JSON5.parse(raw);
22319
+ const parsed = json5.parse(raw);
22320
22320
  if (isSessionStoreRecord(parsed)) store = parsed;
22321
22321
  mtimeMs = getFileMtimeMs(storePath) ?? mtimeMs;
22322
22322
  } catch {}
@@ -5,10 +5,10 @@ import { n as replaceCliName, r as resolveCliName } from "./command-format-DOYW_
5
5
  import { t as isTruthyEnvValue } from "./env-ChCKTuXK.js";
6
6
  import { t as VERSION } from "./version-BKRSzdyx.js";
7
7
  import { t as formatDocsLink } from "./links-CFNtV6AI.js";
8
- import { i as registerProgramCommands, n as PLUGIN_CLI_COMMANDS, t as ensureConfigReady } from "./config-guard-Q3Pl253R.js";
9
- import { a as getCommandPath, d as hasHelpOrVersion, l as getVerboseFlag } from "./register.subclis-9L79xJNr.js";
8
+ import { i as registerProgramCommands, n as PLUGIN_CLI_COMMANDS, t as ensureConfigReady } from "./config-guard-D-KPEEh3.js";
9
+ import { a as getCommandPath, d as hasHelpOrVersion, l as getVerboseFlag } from "./register.subclis-DtKT5IYt.js";
10
10
  import { t as ensurePluginRegistryLoaded } from "./plugin-registry-Ct2B6APr.js";
11
- import { a as hasEmittedCliBanner, i as formatCliBannerLine, r as emitCliBanner } from "./tui-DC1slGZV.js";
11
+ import { a as hasEmittedCliBanner, i as formatCliBannerLine, r as emitCliBanner } from "./tui-yuAuvrAb.js";
12
12
  import { n as resolveCliChannelOptions } from "./channel-options-BI4411cy.js";
13
13
  import { Command } from "commander";
14
14
 
@@ -124,7 +124,7 @@ const entries = [
124
124
  name: "gateway",
125
125
  description: "Gateway control",
126
126
  register: async (program) => {
127
- (await import("./gateway-cli-s90jfqW_.js")).registerGatewayCli(program);
127
+ (await import("./gateway-cli-a1_NKkBz.js")).registerGatewayCli(program);
128
128
  }
129
129
  },
130
130
  {
@@ -194,7 +194,7 @@ const entries = [
194
194
  name: "tui",
195
195
  description: "Terminal UI",
196
196
  register: async (program) => {
197
- (await import("./tui-cli-juhjLupf.js")).registerTuiCli(program);
197
+ (await import("./tui-cli-NTTLb66c.js")).registerTuiCli(program);
198
198
  }
199
199
  },
200
200
  {
@@ -310,14 +310,14 @@ const entries = [
310
310
  name: "update",
311
311
  description: "CLI update helpers",
312
312
  register: async (program) => {
313
- (await import("./update-cli-BNyQj6jL.js")).registerUpdateCli(program);
313
+ (await import("./update-cli-CDJKQnMK.js")).registerUpdateCli(program);
314
314
  }
315
315
  },
316
316
  {
317
317
  name: "completion",
318
318
  description: "Generate shell completion script",
319
319
  register: async (program) => {
320
- (await import("./completion-cli-DJhbwMcK.js").then((n) => n.n)).registerCompletionCli(program);
320
+ (await import("./completion-cli-Cgn9V9Yi.js").then((n) => n.n)).registerCompletionCli(program);
321
321
  }
322
322
  }
323
323
  ];
@@ -77,11 +77,11 @@ import "./deps-CCbeQohF.js";
77
77
  import "./tailscale-B0Nz70aN.js";
78
78
  import { t as ensureSKYKOICliOnPath } from "./path-env-C0IwmyXV.js";
79
79
  import { t as assertSupportedRuntime } from "./runtime-guard-DQEzrjPX.js";
80
- import { n as PLUGIN_CLI_COMMANDS, r as findRoutedCommand, t as ensureConfigReady } from "./config-guard-Q3Pl253R.js";
80
+ import { n as PLUGIN_CLI_COMMANDS, r as findRoutedCommand, t as ensureConfigReady } from "./config-guard-D-KPEEh3.js";
81
81
  import "./logging-CE47aZcO.js";
82
82
  import "./note-BDX6ZDm1.js";
83
83
  import "./clack-prompter-BbdTlNx8.js";
84
- import "./onboarding-f7KcL7qR.js";
84
+ import "./onboarding-2M92MzZF.js";
85
85
  import "./onboard-skills-CbhAiENM.js";
86
86
  import "./github-copilot-auth-fS8wMQ0N.js";
87
87
  import "./onboard-channels-DSqwLtZ3.js";
@@ -100,8 +100,8 @@ import "./systemd-fjt-WYE7.js";
100
100
  import "./diagnostics-DPRvn_ky.js";
101
101
  import "./node-service--cl-zK26.js";
102
102
  import "./channels-status-issues-D92ZMiSY.js";
103
- import "./doctor-completion-lahrpE_z.js";
104
- import { a as getCommandPath, c as getPrimaryCommand, d as hasHelpOrVersion } from "./register.subclis-9L79xJNr.js";
103
+ import "./doctor-completion-Bgky03RU.js";
104
+ import { a as getCommandPath, c as getPrimaryCommand, d as hasHelpOrVersion } from "./register.subclis-DtKT5IYt.js";
105
105
  import "./gateway-rpc-DYI5hnM6.js";
106
106
  import "./help-format-VHofKIT0.js";
107
107
  import "./admin-unlock-CTCNN-zM.js";
@@ -117,11 +117,11 @@ import "./ensure-local-gateway-B2qYYNsm.js";
117
117
  import "./channel-auth-DOqfPLIr.js";
118
118
  import "./login-Du7RjDym.js";
119
119
  import "./auth-health-DfT6NGrM.js";
120
- import "./doctor-BfH7c1Hp.js";
121
- import "./completion-cli-DJhbwMcK.js";
120
+ import "./doctor-avyHLn58.js";
121
+ import "./completion-cli-Cgn9V9Yi.js";
122
122
  import "./service-audit-B_swanYW.js";
123
123
  import "./hooks-status-CJBhXrQP.js";
124
- import { r as emitCliBanner } from "./tui-DC1slGZV.js";
124
+ import { r as emitCliBanner } from "./tui-yuAuvrAb.js";
125
125
  import process$1 from "node:process";
126
126
  import { fileURLToPath } from "node:url";
127
127
  import fs from "node:fs";
@@ -175,7 +175,7 @@ async function runCli(argv = process$1.argv) {
175
175
  assertSupportedRuntime();
176
176
  if (await tryRouteCli(normalizedArgv)) return;
177
177
  enableConsoleCapture();
178
- const { buildProgram } = await import("./program-DSIl6v9h.js").then((n) => n.t);
178
+ const { buildProgram } = await import("./program-Bz1TDywf.js").then((n) => n.t);
179
179
  const program = buildProgram();
180
180
  installUnhandledRejectionHandler();
181
181
  process$1.on("uncaughtException", (error) => {
@@ -208,7 +208,7 @@ async function runCli(argv = process$1.argv) {
208
208
  }
209
209
  const primary = getPrimaryCommand(parseArgv);
210
210
  if (primary) {
211
- const { registerSubCliByName } = await import("./register.subclis-9L79xJNr.js").then((n) => n.i);
211
+ const { registerSubCliByName } = await import("./register.subclis-DtKT5IYt.js").then((n) => n.i);
212
212
  await registerSubCliByName(program, primary);
213
213
  }
214
214
  if (!!primary && PLUGIN_CLI_COMMANDS.has(primary)) {
@@ -52,7 +52,7 @@ import "./systemd-fjt-WYE7.js";
52
52
  import "./diagnostics-DPRvn_ky.js";
53
53
  import "./daemon-runtime-jkMiwykI.js";
54
54
  import "./ensure-local-gateway-B2qYYNsm.js";
55
- import { t as runTui } from "./tui-DC1slGZV.js";
55
+ import { t as runTui } from "./tui-yuAuvrAb.js";
56
56
 
57
57
  //#region src/cli/tui-cli.ts
58
58
  function registerTuiCli(program) {
@@ -7,7 +7,7 @@ import { n as visibleWidth } from "./ansi-By7x1TI7.js";
7
7
  import { a as buildKoiMainSessionKey, l as normalizeKoiId, u as normalizeMainKey, v as parseKoiSessionKey } from "./session-key-B2OXLVi_.js";
8
8
  import { b as sleep } from "./utils-D019Z2NU.js";
9
9
  import { T as resolveDefaultKoiWorkspaceDir, r as resolveDefaultKoiId, x as DEFAULT_USER_FILENAME } from "./koi-scope-7GA83nWp.js";
10
- import { wt as SKYKOI_MODEL_DEFS } from "./model-selection-DANeZg-K.js";
10
+ import { H as resolveEnvApiKey, wt as SKYKOI_MODEL_DEFS } from "./model-selection-DANeZg-K.js";
11
11
  import { t as VERSION } from "./version-BKRSzdyx.js";
12
12
  import { o as loadConfig } from "./config-CLGE0n41.js";
13
13
  import { C as isKeyRelease, D as wrapTextWithAnsi, E as visibleWidth$1, N as require_dist, O as CombinedAutocompleteProvider, S as Key, T as truncateToWidth, _ as SelectList, b as Text, d as ProcessTerminal, f as Spacer, g as Editor, h as Input, m as Markdown, p as SettingsList, v as Container, w as matchesKey, x as getEditorKeybindings, y as TUI } from "./dist-DmzuSdk3.js";
@@ -4220,7 +4220,7 @@ function countArchivedDone(history) {
4220
4220
  return done;
4221
4221
  }
4222
4222
  function createEventHandlers(context) {
4223
- const { chatLog, tui, state, setActivityStatus, setCurrentActivity, refreshSessionInfo, loadHistory, isLocalRunId, forgetLocalRunId, clearLocalRunIds, turnTracker, onTurnFinal, resolveKoiLabel, scheduleRender, onTasksUpdate, onAgentCountChange, isFastLaneEnabled, onFastVoiceRelay } = context;
4223
+ const { chatLog, tui, state, setActivityStatus, setCurrentActivity, refreshSessionInfo, loadHistory, isLocalRunId, forgetLocalRunId, clearLocalRunIds, turnTracker, onTurnFinal, resolveKoiLabel, scheduleRender, onTasksUpdate, onAgentCountChange, isFastLaneEnabled, onFastVoiceRelay, onReplyVisual } = context;
4224
4224
  const requestRender = () => {
4225
4225
  if (scheduleRender) scheduleRender();
4226
4226
  else tui.requestRender();
@@ -4397,6 +4397,7 @@ function createEventHandlers(context) {
4397
4397
  });
4398
4398
  }
4399
4399
  if (!wasLocalRun && finalText.trim()) playAlertChime();
4400
+ if (finalText.trim()) onReplyVisual?.(finalText);
4400
4401
  const fastLaneOwnsVoice = isFastLaneEnabled?.() === true;
4401
4402
  if (state.speakMode && finalText.trim()) if (fastLaneOwnsVoice) onFastVoiceRelay?.(finalText);
4402
4403
  else speakChunks(splitSentences(finalText));
@@ -6251,6 +6252,21 @@ var ChatOverlay = class {
6251
6252
  * watcher (wired in tui.ts) builds the scene and presents it here —
6252
6253
  * the model can take the screen, restyle it, and animate at will.
6253
6254
  */
6255
+ function canvasStatePath() {
6256
+ return path.join(resolveStateDir(), "canvas.json");
6257
+ }
6258
+ function loadCanvasDefaultOn() {
6259
+ try {
6260
+ return JSON.parse(fs.readFileSync(canvasStatePath(), "utf8")).defaultOn !== false;
6261
+ } catch {
6262
+ return true;
6263
+ }
6264
+ }
6265
+ function saveCanvasDefaultOn(defaultOn) {
6266
+ try {
6267
+ fs.writeFileSync(canvasStatePath(), JSON.stringify({ defaultOn }, null, 2));
6268
+ } catch {}
6269
+ }
6254
6270
  var CanvasMode = class {
6255
6271
  constructor(deps) {
6256
6272
  this.engine = null;
@@ -6263,6 +6279,10 @@ var CanvasMode = class {
6263
6279
  isActive() {
6264
6280
  return this.engine !== null;
6265
6281
  }
6282
+ /** Label of the current scene ("pond", "auto", "presentation", "program"…). */
6283
+ getLabel() {
6284
+ return this.engine ? this.label : "";
6285
+ }
6266
6286
  /** Wrap a scene so the chat strip draws on top of it every frame. */
6267
6287
  withOverlay(scene) {
6268
6288
  const overlay = this.overlay;
@@ -6465,6 +6485,157 @@ function createScreenSyncWatcher(deps) {
6465
6485
  };
6466
6486
  }
6467
6487
 
6488
+ //#endregion
6489
+ //#region src/tui/canvas/auto-visual.ts
6490
+ /**
6491
+ * @module tui/canvas/auto-visual
6492
+ *
6493
+ * Every response gets something DYNAMIC to show. After each koi reply the
6494
+ * "visual cortex" (the fast model) turns the exchange into a scene spec —
6495
+ * chart for numbers, boxes for comparisons, big type + celebration for wins,
6496
+ * a mood effect for chit-chat — chosen by the model, always animated.
6497
+ *
6498
+ * Guarantees:
6499
+ * - ALWAYS something: when the model call fails (offline, key, parse) a
6500
+ * deterministic local visual is built from the reply text itself.
6501
+ * - ALWAYS dynamic: a generated spec with no animated layer gets a mood
6502
+ * effect appended (hash-picked, deterministic per reply).
6503
+ * - Never fights the koi: an explicit `screen`-tool presentation outranks
6504
+ * auto-visuals (enforced by the caller via the scene label).
6505
+ */
6506
+ const log = createSubsystemLogger("canvas");
6507
+ const GROQ_URL = "https://api.groq.com/openai/v1/chat/completions";
6508
+ const MODEL = "llama-3.3-70b-versatile";
6509
+ const MODEL_FALLBACK = "llama-3.1-8b-instant";
6510
+ const TIMEOUT_MS = 4e3;
6511
+ const ANIMATED_TYPES = new Set([
6512
+ "effect",
6513
+ "program",
6514
+ "video"
6515
+ ]);
6516
+ const EFFECTS = [
6517
+ "fireflies",
6518
+ "waves",
6519
+ "matrix"
6520
+ ];
6521
+ function hashText(text) {
6522
+ let h = 2166136261;
6523
+ for (let i = 0; i < text.length; i++) {
6524
+ h ^= text.charCodeAt(i);
6525
+ h = Math.imul(h, 16777619);
6526
+ }
6527
+ return h >>> 0;
6528
+ }
6529
+ /** A spec must move: append a deterministic mood effect when nothing animates. */
6530
+ function ensureAnimated(spec, seedText) {
6531
+ const layers = Array.isArray(spec.layers) ? [...spec.layers] : [];
6532
+ if (!layers.some((l) => ANIMATED_TYPES.has(String(l.type)))) {
6533
+ const effect = EFFECTS[hashText(seedText) % EFFECTS.length];
6534
+ layers.unshift({
6535
+ type: "effect",
6536
+ kind: effect,
6537
+ color: "#1E4258"
6538
+ });
6539
+ }
6540
+ return {
6541
+ ...spec,
6542
+ layers
6543
+ };
6544
+ }
6545
+ /** Deterministic local visual — the ALWAYS fallback, no model needed. */
6546
+ function fallbackVisual(replyText) {
6547
+ const flat = replyText.replace(/```[\s\S]*?```/g, " ").replace(/\s+/g, " ").trim();
6548
+ const headline = flat.split(" ").filter(Boolean).slice(0, 3).join(" ").slice(0, 16) || "KOI";
6549
+ const body = flat.slice(0, 200);
6550
+ return {
6551
+ bg: "#0A121C",
6552
+ layers: [
6553
+ {
6554
+ type: "effect",
6555
+ kind: EFFECTS[hashText(flat) % EFFECTS.length],
6556
+ color: "#16344A"
6557
+ },
6558
+ {
6559
+ type: "bigtext",
6560
+ text: headline,
6561
+ x: "center",
6562
+ y: 3,
6563
+ color: "#8AB4F8",
6564
+ scale: 1
6565
+ },
6566
+ {
6567
+ type: "text",
6568
+ text: body,
6569
+ x: 4,
6570
+ y: 12,
6571
+ color: "#9BA3B2"
6572
+ }
6573
+ ]
6574
+ };
6575
+ }
6576
+ const SYSTEM_PROMPT = [
6577
+ "You are Koi's visual cortex: after every reply, you choose what the terminal canvas should SHOW — maximally useful, always alive.",
6578
+ "Output ONLY JSON: {\"bg\":\"#0A121C\",\"layers\":[...]} with layer types:",
6579
+ "{\"type\":\"bigtext\",\"text\":\"SHORT\",\"x\":\"center\",\"y\":2,\"color\":\"#D97757\",\"scale\":1|2} — headlines, numbers, verdicts (keep ≤14 chars)",
6580
+ "{\"type\":\"text\",\"text\":\"line\\nline2\",\"x\":4,\"y\":12,\"color\":\"#9BA3B2\"} — supporting detail (≤4 short lines)",
6581
+ "{\"type\":\"box\",\"x\":2,\"y\":10,\"w\":40,\"h\":8,\"title\":\"…\"} — grouping/comparison",
6582
+ "{\"type\":\"chart\",\"kind\":\"spark|braille\",\"data\":[…numbers…],\"x\":4,\"y\":16,\"w\":50,\"h\":5,\"color\":\"#4EBA65\"} — ANY numbers in the exchange",
6583
+ "{\"type\":\"effect\",\"kind\":\"waves|matrix|fireflies\",\"color\":\"#1E4258\"} — mood/motion",
6584
+ "{\"type\":\"program\",\"source\":\"function update(dt,t,api){...} function draw(api){...}\"} — custom animation when nothing else fits (api: w,h,set,text,big,box,spark,line,rgb,hex,rand,state)",
6585
+ "Pick by content: numbers→chart with the REAL values; comparisons→boxes; success/celebration→bigtext + fireflies; errors/warnings→bigtext in #E5484D; casual talk→small headline + a calm effect; technical explanations→boxes/diagram-ish text.",
6586
+ "Mood matters: pick colors and effects that fit the tone. ALWAYS include at least one effect or program layer so the screen is alive. ≤6 layers. Canvas is ~110x35 cells; leave the bottom 6 rows empty (chat strip)."
6587
+ ].join("\n");
6588
+ /**
6589
+ * Generate the per-response visual. Never throws, never returns null —
6590
+ * falls back to the deterministic local visual.
6591
+ */
6592
+ async function generateResponseVisual(params) {
6593
+ const apiKey = params.apiKey ?? resolveEnvApiKey("groq")?.apiKey;
6594
+ const fetchImpl = params.fetchImpl ?? fetch;
6595
+ if (!apiKey) return ensureAnimated(fallbackVisual(params.replyText), params.replyText);
6596
+ const user = `user said: ${params.userText.slice(0, 600)}\n\nkoi replied: ${params.replyText.slice(0, 1500)}`;
6597
+ for (const model of [MODEL, MODEL_FALLBACK]) {
6598
+ const controller = new AbortController();
6599
+ const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
6600
+ try {
6601
+ const res = await fetchImpl(GROQ_URL, {
6602
+ method: "POST",
6603
+ headers: {
6604
+ "content-type": "application/json",
6605
+ authorization: `Bearer ${apiKey}`
6606
+ },
6607
+ body: JSON.stringify({
6608
+ model,
6609
+ temperature: .6,
6610
+ max_tokens: 700,
6611
+ response_format: { type: "json_object" },
6612
+ messages: [{
6613
+ role: "system",
6614
+ content: SYSTEM_PROMPT
6615
+ }, {
6616
+ role: "user",
6617
+ content: user
6618
+ }]
6619
+ }),
6620
+ signal: controller.signal
6621
+ });
6622
+ if (res.status === 429) continue;
6623
+ if (!res.ok) break;
6624
+ const match = ((await res.json()).choices?.[0]?.message?.content ?? "").match(/\{[\s\S]*\}/);
6625
+ if (!match) break;
6626
+ const parsed = JSON.parse(match[0]);
6627
+ if (!Array.isArray(parsed.layers) || parsed.layers.length === 0) break;
6628
+ return ensureAnimated(parsed, params.replyText);
6629
+ } catch (err) {
6630
+ log.debug(`auto-visual error on ${model}: ${String(err)}`);
6631
+ break;
6632
+ } finally {
6633
+ clearTimeout(timer);
6634
+ }
6635
+ }
6636
+ return ensureAnimated(fallbackVisual(params.replyText), params.replyText);
6637
+ }
6638
+
6468
6639
  //#endregion
6469
6640
  //#region src/tui/tui-local-shell.ts
6470
6641
  function createLocalShellRunner(deps) {
@@ -7657,7 +7828,8 @@ async function runTui(opts) {
7657
7828
  scheduleRender();
7658
7829
  },
7659
7830
  isFastLaneEnabled: () => fastMode,
7660
- onFastVoiceRelay: (finalText) => relayFinalToVoice(finalText)
7831
+ onFastVoiceRelay: (finalText) => relayFinalToVoice(finalText),
7832
+ onReplyVisual: (finalText) => presentAutoVisual(finalText)
7661
7833
  });
7662
7834
  const { runLocalShellLine } = createLocalShellRunner({
7663
7835
  chatLog,
@@ -7702,7 +7874,18 @@ async function runTui(opts) {
7702
7874
  triggerRelogin: () => triggerRelogin(),
7703
7875
  runLocalShell: (command) => runLocalShellLine(`!${command}`),
7704
7876
  openCanvas: (name) => {
7705
- const built = buildScene({ name: name || "pond" });
7877
+ const arg = (name ?? "").trim().toLowerCase();
7878
+ if (arg.startsWith("default")) {
7879
+ const value = arg.split(/\s+/)[1];
7880
+ if (value !== "on" && value !== "off") {
7881
+ chatLog.addSystem("usage: /canvas default on|off");
7882
+ return true;
7883
+ }
7884
+ saveCanvasDefaultOn(value === "on");
7885
+ chatLog.addSystem(value === "on" ? "canvas default on — new sessions boot into the visual terminal" : "canvas default off — new sessions boot into the classic chat");
7886
+ return true;
7887
+ }
7888
+ const built = buildScene({ name: arg || "pond" });
7706
7889
  if (!built) return false;
7707
7890
  canvasMode.enter(built.scene, built.label);
7708
7891
  return true;
@@ -7738,14 +7921,34 @@ async function runTui(opts) {
7738
7921
  speakFront(digest ?? fallback);
7739
7922
  })();
7740
7923
  };
7924
+ let lastUserText = "";
7925
+ let visualSeq = 0;
7926
+ const presentAutoVisual = (replyText) => {
7927
+ if (!canvasMode.isActive() || !replyText.trim()) return;
7928
+ const label = canvasMode.getLabel();
7929
+ if (label === "presentation" || label === "program") return;
7930
+ const seq = ++visualSeq;
7931
+ generateResponseVisual({
7932
+ userText: lastUserText,
7933
+ replyText
7934
+ }).then((spec) => {
7935
+ if (seq !== visualSeq || !canvasMode.isActive()) return;
7936
+ const current = canvasMode.getLabel();
7937
+ if (current === "presentation" || current === "program") return;
7938
+ const built = buildScene({ spec });
7939
+ if (built) canvasMode.enter(built.scene, "auto");
7940
+ });
7941
+ };
7741
7942
  let fastBubbleSeq = 0;
7742
7943
  const presentFastReply = (text) => {
7743
7944
  chatLog.finalizeAssistant(text, `fastlane-${++fastBubbleSeq}`);
7744
7945
  pushTranscript("assistant", text);
7745
7946
  speakFront(text);
7947
+ presentAutoVisual(text);
7746
7948
  tui.requestRender();
7747
7949
  };
7748
7950
  const sendMessageFast = async (value) => {
7951
+ lastUserText = value;
7749
7952
  if (!fastMode) {
7750
7953
  await sendMessage(value);
7751
7954
  return;
@@ -8094,6 +8297,10 @@ async function runTui(opts) {
8094
8297
  }
8095
8298
  setConnectionStatus(reconnected ? "gateway reconnected" : "gateway connected", 4e3);
8096
8299
  tui.requestRender();
8300
+ if (!reconnected && !autoMessage && process.stdout.isTTY && loadCanvasDefaultOn()) {
8301
+ const built = buildScene({ name: "pond" });
8302
+ if (built && !canvasMode.isActive()) canvasMode.enter(built.scene, built.label);
8303
+ }
8097
8304
  if (!autoMessageSent && autoMessage) {
8098
8305
  autoMessageSent = true;
8099
8306
  await sendMessage(autoMessage);
@@ -93,15 +93,15 @@ import "./service-CW9nUfWU.js";
93
93
  import "./systemd-fjt-WYE7.js";
94
94
  import "./diagnostics-DPRvn_ky.js";
95
95
  import "./channels-status-issues-D92ZMiSY.js";
96
- import { a as formatUpdateOneLiner, i as formatUpdateAvailableHint, r as ensureCompletionCacheExists, s as resolveUpdateAvailability, t as checkShellCompletionStatus } from "./doctor-completion-lahrpE_z.js";
97
- import "./register.subclis-9L79xJNr.js";
96
+ import { a as formatUpdateOneLiner, i as formatUpdateAvailableHint, r as ensureCompletionCacheExists, s as resolveUpdateAvailability, t as checkShellCompletionStatus } from "./doctor-completion-Bgky03RU.js";
97
+ import "./register.subclis-DtKT5IYt.js";
98
98
  import { t as formatHelpExamples } from "./help-format-VHofKIT0.js";
99
99
  import "./control-ui-assets-Dcc_8tht.js";
100
100
  import "./daemon-runtime-jkMiwykI.js";
101
101
  import "./systemd-linger-T7_vGBN4.js";
102
102
  import "./auth-health-DfT6NGrM.js";
103
- import { t as doctorCommand } from "./doctor-BfH7c1Hp.js";
104
- import { r as installCompletion } from "./completion-cli-DJhbwMcK.js";
103
+ import { t as doctorCommand } from "./doctor-avyHLn58.js";
104
+ import { r as installCompletion } from "./completion-cli-Cgn9V9Yi.js";
105
105
  import "./service-audit-B_swanYW.js";
106
106
  import "./shared-CsJmoyjd.js";
107
107
  import { r as runDaemonRestart } from "./daemon-cli-B_iflZzZ.js";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/bluebubbles",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI BlueBubbles channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/copilot-proxy",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Copilot Proxy provider plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/diagnostics-otel",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI diagnostics OpenTelemetry exporter",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/discord",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Discord channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/feishu",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Feishu/Lark channel plugin (community maintained by @m1heng)",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/google-antigravity-auth",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Google Antigravity OAuth provider plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/google-gemini-cli-auth",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Gemini CLI OAuth provider plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/googlechat",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Google Chat channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/imessage",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI iMessage channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/line",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI LINE channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/llm-task",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI JSON-only LLM task plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/lobster",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "Lobster workflow tool plugin (typed pipelines + resumable approvals)",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.3.382
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.381
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/matrix",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Matrix channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/mattermost",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Mattermost channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/memory-core",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI core memory search plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/memory-lancedb",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI LanceDB-backed long-term memory plugin with auto-recall/capture",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/minimax-portal-auth",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI MiniMax Portal OAuth provider plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.3.382
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.381
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/msteams",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Microsoft Teams channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/nextcloud-talk",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Nextcloud Talk channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.3.382
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.381
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/nostr",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Nostr channel plugin for NIP-04 encrypted DMs",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/open-prose",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "OpenProse VM skill pack plugin (slash command + telemetry).",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/signal",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Signal channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/slack",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Slack channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/telegram",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Telegram channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/tlon",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Tlon/Urbit channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.3.382
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.381
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/twitch",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Twitch channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.3.382
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.381
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/voice-call",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI voice-call plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/whatsapp",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI WhatsApp channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.3.382
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.381
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/zalo",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Zalo channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.3.382
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.381
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/zalouser",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SKYKOI Zalo Personal Account plugin via zca-cli",
5
5
  "type": "module",
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skykoi",
3
- "version": "2026.3.381",
3
+ "version": "2026.3.382",
4
4
  "description": "SkyKoi — Koi runtime. Multi-channel gateway CLI with RPC Koi.",
5
5
  "keywords": [
6
6
  "cli",