skykoi 2026.3.380 → 2026.3.381

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 (56) 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-Cfip458C.js → completion-cli-DJhbwMcK.js} +1 -1
  4. package/dist/{config-guard-v9v1pT6m.js → config-guard-Q3Pl253R.js} +4 -4
  5. package/dist/{doctor-CJujJmCX.js → doctor-BfH7c1Hp.js} +1 -1
  6. package/dist/{doctor-completion-D-na5SuC.js → doctor-completion-lahrpE_z.js} +1 -1
  7. package/dist/entry.js +1 -1
  8. package/dist/{gateway-cli-D1Vd7gJU.js → gateway-cli-s90jfqW_.js} +5 -5
  9. package/dist/index.js +8 -8
  10. package/dist/{onboarding-YoKrr8S1.js → onboarding-f7KcL7qR.js} +3 -3
  11. package/dist/plugin-sdk/index.js +5 -5
  12. package/dist/plugin-sdk/{pi-model-discovery-lynj0LAO.js → pi-model-discovery-ClImJtLC.js} +3 -3
  13. package/dist/{program-L-wrMwW8.js → program-DSIl6v9h.js} +3 -3
  14. package/dist/{register.subclis-DmQzWagl.js → register.subclis-9L79xJNr.js} +4 -4
  15. package/dist/{run-main-DUIUN49w.js → run-main-qyMlhjLF.js} +9 -9
  16. package/dist/{tui-BE4qiT6o.js → tui-DC1slGZV.js} +179 -34
  17. package/dist/{tui-cli-Da1h8hbA.js → tui-cli-juhjLupf.js} +1 -1
  18. package/dist/{update-cli-C9mUm5mZ.js → update-cli-BNyQj6jL.js} +4 -4
  19. package/extensions/bluebubbles/package.json +1 -1
  20. package/extensions/copilot-proxy/package.json +1 -1
  21. package/extensions/diagnostics-otel/package.json +1 -1
  22. package/extensions/discord/package.json +1 -1
  23. package/extensions/feishu/package.json +1 -1
  24. package/extensions/google-antigravity-auth/package.json +1 -1
  25. package/extensions/google-gemini-cli-auth/package.json +1 -1
  26. package/extensions/googlechat/package.json +1 -1
  27. package/extensions/imessage/package.json +1 -1
  28. package/extensions/line/package.json +1 -1
  29. package/extensions/llm-task/package.json +1 -1
  30. package/extensions/lobster/package.json +1 -1
  31. package/extensions/matrix/CHANGELOG.md +5 -0
  32. package/extensions/matrix/package.json +1 -1
  33. package/extensions/mattermost/package.json +1 -1
  34. package/extensions/memory-core/package.json +1 -1
  35. package/extensions/memory-lancedb/package.json +1 -1
  36. package/extensions/minimax-portal-auth/package.json +1 -1
  37. package/extensions/msteams/CHANGELOG.md +5 -0
  38. package/extensions/msteams/package.json +1 -1
  39. package/extensions/nextcloud-talk/package.json +1 -1
  40. package/extensions/nostr/CHANGELOG.md +5 -0
  41. package/extensions/nostr/package.json +1 -1
  42. package/extensions/open-prose/package.json +1 -1
  43. package/extensions/signal/package.json +1 -1
  44. package/extensions/slack/package.json +1 -1
  45. package/extensions/telegram/package.json +1 -1
  46. package/extensions/tlon/package.json +1 -1
  47. package/extensions/twitch/CHANGELOG.md +5 -0
  48. package/extensions/twitch/package.json +1 -1
  49. package/extensions/voice-call/CHANGELOG.md +5 -0
  50. package/extensions/voice-call/package.json +1 -1
  51. package/extensions/whatsapp/package.json +1 -1
  52. package/extensions/zalo/CHANGELOG.md +5 -0
  53. package/extensions/zalo/package.json +1 -1
  54. package/extensions/zalouser/CHANGELOG.md +5 -0
  55. package/extensions/zalouser/package.json +1 -1
  56. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.3.380",
3
- "commit": "d1ff3945bd9625818ae99bf4fcbcfbbc2b4eb3ef",
4
- "builtAt": "2026-07-04T00:11:44.829Z"
2
+ "version": "2026.3.381",
3
+ "commit": "24563d534b1eb61172d758368466cfedf458d6df",
4
+ "builtAt": "2026-07-04T00:29:09.829Z"
5
5
  }
@@ -1 +1 @@
1
- d2c0125eec3e11791e7bc5ee8a0afaca7733e1d965e63c7a16256841cf730ce1
1
+ 955f41785c6bd32b8d2f3d1941eb6494ab2ab1fde4ffeb85b8957775fbada3b0
@@ -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-DmQzWagl.js";
3
+ import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-9L79xJNr.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-YoKrr8S1.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";
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-DmQzWagl.js";
39
+ import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-9L79xJNr.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-CJujJmCX.js";
50
+ import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-BfH7c1Hp.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-BE4qiT6o.js").then((n) => n.n);
3109
+ const { runTui } = await import("./tui-DC1slGZV.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-D-na5SuC.js";
37
+ import { n as doctorShellCompletion } from "./doctor-completion-lahrpE_z.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-Cfip458C.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";
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-DUIUN49w.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
250
+ import("./run-main-qyMlhjLF.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-YoKrr8S1.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";
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-D-na5SuC.js";
117
- import "./register.subclis-DmQzWagl.js";
116
+ import "./doctor-completion-lahrpE_z.js";
117
+ import "./register.subclis-9L79xJNr.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-Cfip458C.js";
124
+ import "./completion-cli-DJhbwMcK.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-BE4qiT6o.js";
127
+ import "./tui-DC1slGZV.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-v9v1pT6m.js";
83
+ import "./config-guard-Q3Pl253R.js";
84
84
  import "./logging-CE47aZcO.js";
85
85
  import "./note-BDX6ZDm1.js";
86
86
  import "./clack-prompter-BbdTlNx8.js";
87
- import "./onboarding-YoKrr8S1.js";
87
+ import "./onboarding-f7KcL7qR.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-D-na5SuC.js";
107
- import "./register.subclis-DmQzWagl.js";
106
+ import "./doctor-completion-lahrpE_z.js";
107
+ import "./register.subclis-9L79xJNr.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-CJujJmCX.js";
124
- import "./completion-cli-Cfip458C.js";
123
+ import "./doctor-BfH7c1Hp.js";
124
+ import "./completion-cli-DJhbwMcK.js";
125
125
  import "./service-audit-B_swanYW.js";
126
126
  import "./hooks-status-CJBhXrQP.js";
127
- import "./tui-BE4qiT6o.js";
127
+ import "./tui-DC1slGZV.js";
128
128
  import "./channel-options-BI4411cy.js";
129
- import { n as buildProgram } from "./program-L-wrMwW8.js";
129
+ import { n as buildProgram } from "./program-DSIl6v9h.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-D-na5SuC.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";
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-Cfip458C.js";
44
+ import { r as installCompletion } from "./completion-cli-DJhbwMcK.js";
45
45
  import { t as buildWorkspaceHookStatus } from "./hooks-status-CJBhXrQP.js";
46
- import { t as runTui } from "./tui-BE4qiT6o.js";
46
+ import { t as runTui } from "./tui-DC1slGZV.js";
47
47
  import fs from "node:fs";
48
48
  import path from "node:path";
49
49
  import os from "node:os";
@@ -1,5 +1,5 @@
1
1
  import { a as __toCommonJS, i as __require, o as __toESM, r as __exportAll, t as __commonJSMin } from "./chunk-D_gEzPfs.js";
2
- import { a as require_jws, i as require_dist_cjs$1, n as LRUCache$1, o as require_safe_buffer, r as getOAuthProviders, s as getEnvApiKey } from "./pi-model-discovery-lynj0LAO.js";
2
+ import { a as require_jws, i as require_dist_cjs$1, n as LRUCache$1, o as require_safe_buffer, r as getOAuthProviders, s as getEnvApiKey } from "./pi-model-discovery-ClImJtLC.js";
3
3
  import { t as require_dist_cjs$2 } from "./dist-cjs-B9iGzXDA.js";
4
4
  import { C as require_dist_cjs$3, E as init_dist_es$1, M as require_dist_cjs$13, N as require_dist_cjs$12, T as dist_es_exports$1, a as require_dist_cjs$5, c as require_dist_cjs$17, d as require_dist_cjs$15, f as dist_es_exports, h as protocols_exports, i as require_dist_cjs$7, j as require_dist_cjs$14, l as require_dist_cjs$16, m as init_protocols, n as require_dist_cjs$10, o as require_dist_cjs$8, p as init_dist_es, r as require_dist_cjs$9, s as require_dist_cjs$11, t as require_dist_cjs$18, u as require_dist_cjs$6, w as require_dist_cjs$4 } from "./dist-cjs-Cpdu8jQP.js";
5
5
  import { C as schema_exports, N as require_dist_cjs$21, P as require_dist_cjs$19, S as init_schema, t as require_dist_cjs$20 } from "./dist-cjs-BVSr8ctW.js";
@@ -42,7 +42,7 @@ import { mkdir, readFile, stat as stat$1, unlink, writeFile } from "fs/promises"
42
42
  import { Readable as Readable$1 } from "node:stream";
43
43
  import { pipeline as pipeline$1 } from "node:stream/promises";
44
44
  import WebSocket, { WebSocket as WebSocket$1 } from "ws";
45
- import AjvModule from "ajv";
45
+ import AjvPkg from "ajv";
46
46
  import lockfile from "proper-lockfile";
47
47
  import { URL as URL$1 } from "url";
48
48
  import "yaml";
@@ -20603,7 +20603,7 @@ function loadPluginManifestRegistry(params) {
20603
20603
 
20604
20604
  //#endregion
20605
20605
  //#region src/plugins/schema-validator.ts
20606
- const ajv$1 = new AjvModule({
20606
+ const ajv$1 = new AjvPkg({
20607
20607
  allErrors: true,
20608
20608
  strict: false,
20609
20609
  removeAdditional: false
@@ -48250,7 +48250,7 @@ const PROTOCOL_VERSION = 3;
48250
48250
 
48251
48251
  //#endregion
48252
48252
  //#region src/gateway/protocol/index.ts
48253
- const ajv = new AjvModule({
48253
+ const ajv = new AjvPkg({
48254
48254
  allErrors: true,
48255
48255
  strict: false,
48256
48256
  removeAdditional: false
@@ -68123,7 +68123,7 @@ function enqueueSystemEvent(text, options) {
68123
68123
  const MODEL_CACHE = /* @__PURE__ */ new Map();
68124
68124
  (async () => {
68125
68125
  try {
68126
- const { discoverAuthStorage, discoverModels } = await import("./pi-model-discovery-lynj0LAO.js").then((n) => n.t);
68126
+ const { discoverAuthStorage, discoverModels } = await import("./pi-model-discovery-ClImJtLC.js").then((n) => n.t);
68127
68127
  await ensureSKYKOIModelsJson(loadConfig());
68128
68128
  const koiDir = resolveSKYKOIKoiDir();
68129
68129
  const models = discoverModels(discoverAuthStorage(koiDir), koiDir).getAll();
@@ -34,7 +34,7 @@ import { access, mkdir, readFile, stat as stat$1, writeFile } from "fs/promises"
34
34
  import Stream, { Readable as Readable$1 } from "node:stream";
35
35
  import { finished } from "node:stream/promises";
36
36
  import * as NodeWs from "ws";
37
- import AjvModule from "ajv";
37
+ import AjvPkg from "ajv";
38
38
  import lockfile from "proper-lockfile";
39
39
  import { fileURLToPath as fileURLToPath$1 } from "url";
40
40
  import { TypeCompiler } from "@sinclair/typebox/compiler";
@@ -59699,7 +59699,7 @@ var require_dist$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
59699
59699
  //#endregion
59700
59700
  //#region node_modules/.pnpm/@mariozechner+pi-ai@0.52.8_patch_hash=f41b8429247a07c256a366fc8eddb44710b4e74212f25ffaf_aba27699dbfe3dddaa7a3984ad46615e/node_modules/@mariozechner/pi-ai/dist/utils/validation.js
59701
59701
  var import_dist$1 = /* @__PURE__ */ __toESM(require_dist$1(), 1);
59702
- const Ajv$1 = AjvModule.default || AjvModule;
59702
+ const Ajv$1 = AjvPkg.default || AjvPkg;
59703
59703
  const addFormats = import_dist$1.default.default || import_dist$1.default;
59704
59704
  const isBrowserExtension = typeof globalThis !== "undefined" && globalThis.chrome?.runtime?.id !== void 0;
59705
59705
  let ajv = null;
@@ -174026,7 +174026,7 @@ var AuthStorage = class {
174026
174026
  /**
174027
174027
  * Model registry - manages built-in and custom models, provides API key resolution.
174028
174028
  */
174029
- const Ajv = AjvModule.default || AjvModule;
174029
+ const Ajv = AjvPkg.default || AjvPkg;
174030
174030
  const OpenRouterRoutingSchema = Type.Object({
174031
174031
  only: Type.Optional(Type.Array(Type.String())),
174032
174032
  order: Type.Optional(Type.Array(Type.String()))
@@ -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-v9v1pT6m.js";
9
- import { a as getCommandPath, d as hasHelpOrVersion, l as getVerboseFlag } from "./register.subclis-DmQzWagl.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";
10
10
  import { t as ensurePluginRegistryLoaded } from "./plugin-registry-Ct2B6APr.js";
11
- import { a as hasEmittedCliBanner, i as formatCliBannerLine, r as emitCliBanner } from "./tui-BE4qiT6o.js";
11
+ import { a as hasEmittedCliBanner, i as formatCliBannerLine, r as emitCliBanner } from "./tui-DC1slGZV.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-D1Vd7gJU.js")).registerGatewayCli(program);
127
+ (await import("./gateway-cli-s90jfqW_.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-Da1h8hbA.js")).registerTuiCli(program);
197
+ (await import("./tui-cli-juhjLupf.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-C9mUm5mZ.js")).registerUpdateCli(program);
313
+ (await import("./update-cli-BNyQj6jL.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-Cfip458C.js").then((n) => n.n)).registerCompletionCli(program);
320
+ (await import("./completion-cli-DJhbwMcK.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-v9v1pT6m.js";
80
+ import { n as PLUGIN_CLI_COMMANDS, r as findRoutedCommand, t as ensureConfigReady } from "./config-guard-Q3Pl253R.js";
81
81
  import "./logging-CE47aZcO.js";
82
82
  import "./note-BDX6ZDm1.js";
83
83
  import "./clack-prompter-BbdTlNx8.js";
84
- import "./onboarding-YoKrr8S1.js";
84
+ import "./onboarding-f7KcL7qR.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-D-na5SuC.js";
104
- import { a as getCommandPath, c as getPrimaryCommand, d as hasHelpOrVersion } from "./register.subclis-DmQzWagl.js";
103
+ import "./doctor-completion-lahrpE_z.js";
104
+ import { a as getCommandPath, c as getPrimaryCommand, d as hasHelpOrVersion } from "./register.subclis-9L79xJNr.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-CJujJmCX.js";
121
- import "./completion-cli-Cfip458C.js";
120
+ import "./doctor-BfH7c1Hp.js";
121
+ import "./completion-cli-DJhbwMcK.js";
122
122
  import "./service-audit-B_swanYW.js";
123
123
  import "./hooks-status-CJBhXrQP.js";
124
- import { r as emitCliBanner } from "./tui-BE4qiT6o.js";
124
+ import { r as emitCliBanner } from "./tui-DC1slGZV.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-L-wrMwW8.js").then((n) => n.t);
178
+ const { buildProgram } = await import("./program-DSIl6v9h.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-DmQzWagl.js").then((n) => n.i);
211
+ const { registerSubCliByName } = await import("./register.subclis-9L79xJNr.js").then((n) => n.i);
212
212
  await registerSubCliByName(program, primary);
213
213
  }
214
214
  if (!!primary && PLUGIN_CLI_COMMANDS.has(primary)) {
@@ -5874,10 +5874,10 @@ function createProgramScene(source) {
5874
5874
  const INK = hexColor("#0A121C");
5875
5875
  const WATER_DEEP = hexColor("#06202E");
5876
5876
  const WATER = hexColor("#0A2A3C");
5877
- const ACCENT = hexColor("#8AB4F8");
5878
- const ORANGE = hexColor("#D97757");
5879
- const WHITE = hexColor("#E8E3D5");
5880
- const DIM = hexColor("#5B6472");
5877
+ const ACCENT$1 = hexColor("#8AB4F8");
5878
+ const ORANGE$1 = hexColor("#D97757");
5879
+ const WHITE$1 = hexColor("#E8E3D5");
5880
+ const DIM$1 = hexColor("#5B6472");
5881
5881
  const GREEN = hexColor("#4EBA65");
5882
5882
  function mulberry32(seed) {
5883
5883
  let a = seed >>> 0;
@@ -5896,7 +5896,7 @@ function createPondScene() {
5896
5896
  y: 6 + i * 5 + rand() * 3,
5897
5897
  vx: (rand() > .5 ? 1 : -1) * (4 + rand() * 5),
5898
5898
  phase: rand() * Math.PI * 2,
5899
- hue: i % 2 === 0 ? ORANGE : WHITE,
5899
+ hue: i % 2 === 0 ? ORANGE$1 : WHITE$1,
5900
5900
  size: 5 + Math.floor(rand() * 3)
5901
5901
  }));
5902
5902
  const ripples = [];
@@ -5949,14 +5949,14 @@ function createPondScene() {
5949
5949
  const bx = f.x - dir * s * 1.4;
5950
5950
  const by = f.y + Math.sin(t * 4 + f.phase + s * .8) * .9;
5951
5951
  const ch = s === 0 ? dir > 0 ? "◗" : "◖" : s === f.size - 1 ? dir > 0 ? "≺" : "≻" : "▬";
5952
- grid.set(bx | 0, by | 0, ch, s === 0 ? f.hue : s % 2 ? f.hue : WHITE, -2);
5952
+ grid.set(bx | 0, by | 0, ch, s === 0 ? f.hue : s % 2 ? f.hue : WHITE$1, -2);
5953
5953
  }
5954
5954
  }
5955
5955
  const now = /* @__PURE__ */ new Date();
5956
5956
  const clock = `${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
5957
- drawBigText(grid, (w - bigTextSize(clock, 1).w) / 2 | 0, 1, clock, ACCENT);
5958
- drawText(grid, 2, h - 2, "koi canvas · pond", DIM, -2);
5959
- drawText(grid, w - 22, h - 2, "esc to return · q quit", DIM, -2);
5957
+ drawBigText(grid, (w - bigTextSize(clock, 1).w) / 2 | 0, 1, clock, ACCENT$1);
5958
+ drawText(grid, 2, h - 2, "koi canvas · pond", DIM$1, -2);
5959
+ drawText(grid, w - 22, h - 2, "esc to return · q quit", DIM$1, -2);
5960
5960
  }
5961
5961
  };
5962
5962
  }
@@ -6006,27 +6006,27 @@ function createMonitorScene() {
6006
6006
  draw(grid, t) {
6007
6007
  const { w, h } = grid;
6008
6008
  for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) grid.set(x, y, " ", -1, INK);
6009
- drawBigText(grid, 2, 1, "LIVE", ORANGE);
6010
- drawText(grid, 2, 9, `Watching this machine in real time`, DIM, -2);
6009
+ drawBigText(grid, 2, 1, "LIVE", ORANGE$1);
6010
+ drawText(grid, 2, 9, `Watching this machine in real time`, DIM$1, -2);
6011
6011
  const colW = Math.min(56, w - 4);
6012
- drawBox(grid, 2, 11, colW, 6, DIM, { title: "focus" });
6013
- drawText(grid, 4, 13, `app ${app || "…"}`.slice(0, colW - 4), WHITE, -2);
6014
- drawText(grid, 4, 14, `window ${title || "…"}`.slice(0, colW - 4), DIM, -2);
6015
- drawText(grid, 4, 15, `battery ${battery || "…"}`.slice(0, colW - 4), DIM, -2);
6016
- drawBox(grid, 2, 18, colW, 6, DIM, { title: "microphone" });
6017
- drawText(grid, 4, 20, "level", DIM, -2);
6012
+ drawBox(grid, 2, 11, colW, 6, DIM$1, { title: "focus" });
6013
+ drawText(grid, 4, 13, `app ${app || "…"}`.slice(0, colW - 4), WHITE$1, -2);
6014
+ drawText(grid, 4, 14, `window ${title || "…"}`.slice(0, colW - 4), DIM$1, -2);
6015
+ drawText(grid, 4, 15, `battery ${battery || "…"}`.slice(0, colW - 4), DIM$1, -2);
6016
+ drawBox(grid, 2, 18, colW, 6, DIM$1, { title: "microphone" });
6017
+ drawText(grid, 4, 20, "level", DIM$1, -2);
6018
6018
  drawBarMeter(grid, 11, 20, colW - 12, Math.min(1, micRms * 14), GREEN, hexColor("#22303E"));
6019
- drawText(grid, 4, 21, "5 min", DIM, -2);
6020
- drawSparkline(grid, 11, 21, colW - 12, micHistory, ACCENT, { min: 0 });
6021
- drawBraillePlot(grid, 11, 22, colW - 12, 1, micHistory.length > 1 ? micHistory : [0, 0], DIM);
6019
+ drawText(grid, 4, 21, "5 min", DIM$1, -2);
6020
+ drawSparkline(grid, 11, 21, colW - 12, micHistory, ACCENT$1, { min: 0 });
6021
+ drawBraillePlot(grid, 11, 22, colW - 12, 1, micHistory.length > 1 ? micHistory : [0, 0], DIM$1);
6022
6022
  const ty = 25;
6023
- drawBox(grid, 2, ty, w - 4, Math.max(4, h - ty - 2), DIM, { title: "room · live transcript" });
6023
+ drawBox(grid, 2, ty, w - 4, Math.max(4, h - ty - 2), DIM$1, { title: "room · live transcript" });
6024
6024
  for (const [i, lineEntry] of transcript.slice(-(h - ty - 4)).entries()) {
6025
6025
  const who = lineEntry.who === "you" ? "you " : "device ";
6026
- drawText(grid, 4, ty + 1 + i, `${who} ${lineEntry.text}`.slice(0, w - 8), lineEntry.who === "you" ? WHITE : DIM, -2);
6026
+ drawText(grid, 4, ty + 1 + i, `${who} ${lineEntry.text}`.slice(0, w - 8), lineEntry.who === "you" ? WHITE$1 : DIM$1, -2);
6027
6027
  }
6028
6028
  grid.set(w - 4, 1, "●", t * 2 % 1 < .5 ? GREEN : hexColor("#1E4258"), -2);
6029
- drawText(grid, 2, h - 1, "esc to return · q quit", DIM, -2);
6029
+ drawText(grid, 2, h - 1, "esc to return · q quit", DIM$1, -2);
6030
6030
  }
6031
6031
  };
6032
6032
  }
@@ -6056,15 +6056,15 @@ function createSpecScene(spec) {
6056
6056
  const text = String(layer.text ?? "");
6057
6057
  const scale = Number(layer.scale ?? 1);
6058
6058
  const size = bigTextSize(text, scale);
6059
- drawBigText(grid, resolveX(layer.x, grid.w, size.w), Number(layer.y ?? 1), text, layer.color ? hexColor(String(layer.color)) : WHITE, { scale });
6059
+ drawBigText(grid, resolveX(layer.x, grid.w, size.w), Number(layer.y ?? 1), text, layer.color ? hexColor(String(layer.color)) : WHITE$1, { scale });
6060
6060
  } else if (type === "text") {
6061
6061
  const text = String(layer.text ?? "");
6062
- for (const [li, lineText] of text.split("\n").entries()) drawText(grid, resolveX(layer.x, grid.w, lineText.length), Number(layer.y ?? 0) + li, lineText, layer.color ? hexColor(String(layer.color)) : WHITE, -2);
6063
- } else if (type === "box") drawBox(grid, Number(layer.x ?? 0), Number(layer.y ?? 0), Number(layer.w ?? 10), Number(layer.h ?? 5), layer.color ? hexColor(String(layer.color)) : DIM, { title: layer.title ? String(layer.title) : void 0 });
6062
+ for (const [li, lineText] of text.split("\n").entries()) drawText(grid, resolveX(layer.x, grid.w, lineText.length), Number(layer.y ?? 0) + li, lineText, layer.color ? hexColor(String(layer.color)) : WHITE$1, -2);
6063
+ } else if (type === "box") drawBox(grid, Number(layer.x ?? 0), Number(layer.y ?? 0), Number(layer.w ?? 10), Number(layer.h ?? 5), layer.color ? hexColor(String(layer.color)) : DIM$1, { title: layer.title ? String(layer.title) : void 0 });
6064
6064
  else if (type === "chart") {
6065
6065
  const data = (Array.isArray(layer.data) ? layer.data : []).map(Number);
6066
- if (String(layer.kind) === "braille") drawBraillePlot(grid, Number(layer.x ?? 0), Number(layer.y ?? 0), Number(layer.w ?? 30), Number(layer.h ?? 6), data, layer.color ? hexColor(String(layer.color)) : ACCENT);
6067
- else drawSparkline(grid, Number(layer.x ?? 0), Number(layer.y ?? 0), Number(layer.w ?? 30), data, layer.color ? hexColor(String(layer.color)) : ACCENT);
6066
+ if (String(layer.kind) === "braille") drawBraillePlot(grid, Number(layer.x ?? 0), Number(layer.y ?? 0), Number(layer.w ?? 30), Number(layer.h ?? 6), data, layer.color ? hexColor(String(layer.color)) : ACCENT$1);
6067
+ else drawSparkline(grid, Number(layer.x ?? 0), Number(layer.y ?? 0), Number(layer.w ?? 30), data, layer.color ? hexColor(String(layer.color)) : ACCENT$1);
6068
6068
  } else if (type === "image" || type === "video") {
6069
6069
  const d = media.get(i);
6070
6070
  if (d && d.frames.length > 0) {
@@ -6079,12 +6079,12 @@ function createSpecScene(spec) {
6079
6079
  frame = d.frames[fi];
6080
6080
  }
6081
6081
  drawImageHalfBlocks(grid, Number(layer.x ?? 0), Number(layer.y ?? 0), frame);
6082
- } else drawText(grid, Number(layer.x ?? 0), Number(layer.y ?? 0), "· loading media ·", DIM, -2);
6082
+ } else drawText(grid, Number(layer.x ?? 0), Number(layer.y ?? 0), "· loading media ·", DIM$1, -2);
6083
6083
  } else if (type === "program") programs.get(i)?.draw(grid, t);
6084
6084
  else if (type === "effect") drawEffect(grid, String(layer.kind ?? "waves"), t, layer);
6085
6085
  } catch {}
6086
6086
  }
6087
- drawText(grid, 2, grid.h - 1, "esc to return · q quit", DIM, -2);
6087
+ drawText(grid, 2, grid.h - 1, "esc to return · q quit", DIM$1, -2);
6088
6088
  },
6089
6089
  dispose() {
6090
6090
  for (const p of programs.values()) p.dispose();
@@ -6123,6 +6123,119 @@ function drawEffect(grid, kind, t, layer) {
6123
6123
  }
6124
6124
  }
6125
6125
 
6126
+ //#endregion
6127
+ //#region src/tui/canvas/chat-overlay.ts
6128
+ /**
6129
+ * @module tui/canvas/chat-overlay
6130
+ *
6131
+ * The conversation never stops while the canvas is up: a chat strip overlays
6132
+ * the bottom of every scene — a prompt line you type into (submits through the
6133
+ * exact same fast-lane path as the normal chat), the koi's latest reply above
6134
+ * it, and a live busy indicator while it works. Esc clears the input; esc on
6135
+ * an empty input leaves the canvas.
6136
+ */
6137
+ const STRIP_BG = hexColor("#0D1826");
6138
+ const DIVIDER = hexColor("#22303E");
6139
+ const DIM = hexColor("#5B6472");
6140
+ const WHITE = hexColor("#E8E3D5");
6141
+ const ACCENT = hexColor("#8AB4F8");
6142
+ const ORANGE = hexColor("#D97757");
6143
+ const SPINNER = [
6144
+ "·",
6145
+ "✢",
6146
+ "✳",
6147
+ "✶",
6148
+ "✻",
6149
+ "✽"
6150
+ ];
6151
+ /** Rows the overlay claims at the bottom of the canvas. */
6152
+ const OVERLAY_ROWS = 5;
6153
+ var ChatOverlay = class {
6154
+ constructor(deps) {
6155
+ this.buffer = "";
6156
+ this.replyAtSubmit = null;
6157
+ this.sentText = "";
6158
+ this.deps = deps;
6159
+ }
6160
+ hasText() {
6161
+ return this.buffer.length > 0;
6162
+ }
6163
+ clear() {
6164
+ this.buffer = "";
6165
+ }
6166
+ /**
6167
+ * Consume a key chunk. Returns true when handled (printables, editing,
6168
+ * enter); escape sequences and unhandled controls return false so the
6169
+ * caller can route them (arrows → scene, bare esc → clear/exit).
6170
+ */
6171
+ handleKey(key) {
6172
+ if (key === "\r" || key === "\n") {
6173
+ const text = this.buffer.trim();
6174
+ this.buffer = "";
6175
+ if (text) {
6176
+ this.sentText = text;
6177
+ this.replyAtSubmit = this.deps.lastReply();
6178
+ this.deps.submit(text);
6179
+ }
6180
+ return true;
6181
+ }
6182
+ if (key === "" || key === "\b") {
6183
+ this.buffer = this.buffer.slice(0, -1);
6184
+ return true;
6185
+ }
6186
+ if (key === "") {
6187
+ this.buffer = "";
6188
+ return true;
6189
+ }
6190
+ if (key.startsWith("\x1B")) return false;
6191
+ const printable = key.replace(/[\x00-\x1f]/g, "");
6192
+ if (printable) {
6193
+ this.buffer += printable;
6194
+ return true;
6195
+ }
6196
+ return false;
6197
+ }
6198
+ draw(grid, t) {
6199
+ const { w, h } = grid;
6200
+ const top = h - OVERLAY_ROWS;
6201
+ if (top < 1) return;
6202
+ for (let y = top; y < h; y++) for (let x = 0; x < w; x++) grid.set(x, y, " ", -1, STRIP_BG);
6203
+ for (let x = 0; x < w; x++) grid.set(x, top, "─", DIVIDER, STRIP_BG);
6204
+ const busy = this.deps.busyLabel();
6205
+ if (busy) {
6206
+ const glyph = SPINNER[Math.floor(t * 8) % SPINNER.length];
6207
+ drawText(grid, 2, top, ` ${glyph} ${busy}… `, ORANGE, STRIP_BG);
6208
+ }
6209
+ const reply = this.deps.lastReply();
6210
+ const answered = this.replyAtSubmit !== null && reply !== this.replyAtSubmit;
6211
+ let zone = [];
6212
+ if (this.sentText && !answered) zone = [{
6213
+ text: `you ${this.sentText}`,
6214
+ fg: DIM
6215
+ }];
6216
+ else if (reply.trim()) {
6217
+ const flat = reply.replace(/```[\s\S]*?```/g, " [code] ").replace(/\s+/g, " ").trim();
6218
+ const width = Math.max(10, w - 10);
6219
+ const lines = [];
6220
+ for (let i = 0; i < flat.length && lines.length < 2; i += width) lines.push(flat.slice(i, i + width));
6221
+ if (flat.length > width * 2 && lines.length === 2) lines[1] = `${lines[1].slice(0, width - 1)}…`;
6222
+ zone = lines.map((text, i) => ({
6223
+ text: i === 0 ? `koi ${text}` : ` ${text}`,
6224
+ fg: i === 0 ? WHITE : DIM
6225
+ }));
6226
+ }
6227
+ for (const [i, line] of zone.entries()) drawText(grid, 2, top + 1 + i, line.text.slice(0, w - 4), line.fg, STRIP_BG);
6228
+ const prompt = "> ";
6229
+ const maxInput = Math.max(4, w - 2 - 4);
6230
+ const shown = this.buffer.length > maxInput ? `…${this.buffer.slice(-(maxInput - 1))}` : this.buffer;
6231
+ drawText(grid, 2, h - 2, prompt, ACCENT, STRIP_BG);
6232
+ drawText(grid, 4, h - 2, shown, WHITE, STRIP_BG);
6233
+ const cursorOn = t % 1 < .55;
6234
+ grid.set(4 + shown.length, h - 2, cursorOn ? "▌" : " ", ACCENT, STRIP_BG);
6235
+ drawText(grid, 2, h - 1, "type to chat · enter send · esc clears (empty esc leaves)", DIM, STRIP_BG);
6236
+ }
6237
+ };
6238
+
6126
6239
  //#endregion
6127
6240
  //#region src/tui/canvas/canvas-mode.ts
6128
6241
  /**
@@ -6141,6 +6254,7 @@ function drawEffect(grid, kind, t, layer) {
6141
6254
  var CanvasMode = class {
6142
6255
  constructor(deps) {
6143
6256
  this.engine = null;
6257
+ this.overlay = null;
6144
6258
  this.label = "";
6145
6259
  this.keyListener = null;
6146
6260
  this.resizeListener = null;
@@ -6149,26 +6263,49 @@ var CanvasMode = class {
6149
6263
  isActive() {
6150
6264
  return this.engine !== null;
6151
6265
  }
6266
+ /** Wrap a scene so the chat strip draws on top of it every frame. */
6267
+ withOverlay(scene) {
6268
+ const overlay = this.overlay;
6269
+ if (!overlay) return scene;
6270
+ return {
6271
+ update: (dt, t) => scene.update(dt, t),
6272
+ draw: (grid, t) => {
6273
+ scene.draw(grid, t);
6274
+ overlay.draw(grid, t);
6275
+ },
6276
+ onKey: scene.onKey,
6277
+ dispose: scene.dispose
6278
+ };
6279
+ }
6152
6280
  /** Enter (or, when already active, switch scenes in place). */
6153
6281
  enter(scene, label) {
6154
6282
  this.label = label;
6155
6283
  if (this.engine) {
6156
- this.engine.setScene(scene);
6284
+ this.engine.setScene(this.withOverlay(scene));
6157
6285
  return;
6158
6286
  }
6159
6287
  this.deps.suspendTui();
6160
6288
  process.stdout.write("\x1B[?1049h\x1B[?25l\x1B[2J");
6161
6289
  if (process.stdin.isTTY) process.stdin.setRawMode?.(true);
6162
6290
  process.stdin.resume();
6163
- this.engine = new CanvasEngine(process.stdout.columns || 80, process.stdout.rows || 24, (s) => process.stdout.write(s));
6164
- this.engine.setScene(scene);
6291
+ const cols = process.stdout.columns || 80;
6292
+ const rows = process.stdout.rows || 24;
6293
+ this.overlay = this.deps.chat ? new ChatOverlay(this.deps.chat) : null;
6294
+ this.engine = new CanvasEngine(cols, rows, (s) => process.stdout.write(s));
6295
+ this.engine.setScene(this.withOverlay(scene));
6165
6296
  this.engine.start();
6166
6297
  this.keyListener = (buf) => {
6167
6298
  const key = buf.toString("utf8");
6168
- if (key === "\x1B" || key === "q" || key === "Q" || key === "") {
6299
+ if (key === "") {
6169
6300
  this.exit();
6170
6301
  return;
6171
6302
  }
6303
+ if (key === "\x1B") {
6304
+ if (this.overlay?.hasText()) this.overlay.clear();
6305
+ else this.exit();
6306
+ return;
6307
+ }
6308
+ if (this.overlay?.handleKey(key)) return;
6172
6309
  this.engine?.handleKey(key);
6173
6310
  };
6174
6311
  process.stdin.on("data", this.keyListener);
@@ -6181,6 +6318,7 @@ var CanvasMode = class {
6181
6318
  if (!this.engine) return;
6182
6319
  this.engine.stop();
6183
6320
  this.engine = null;
6321
+ this.overlay = null;
6184
6322
  if (this.keyListener) {
6185
6323
  process.stdin.removeListener("data", this.keyListener);
6186
6324
  this.keyListener = null;
@@ -7757,6 +7895,13 @@ async function runTui(opts) {
7757
7895
  screenSync.noteManualExit();
7758
7896
  chatLog.addSystem(`canvas closed (${label})`);
7759
7897
  tui.requestRender();
7898
+ },
7899
+ chat: {
7900
+ submit: (text) => {
7901
+ sendMessageFast(text);
7902
+ },
7903
+ lastReply: () => chatLog.lastAssistantText,
7904
+ busyLabel: () => busyStates.has(activityStatus) ? currentActivity || activityStatus : null
7760
7905
  }
7761
7906
  });
7762
7907
  const screenSync = createScreenSyncWatcher({
@@ -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-BE4qiT6o.js";
55
+ import { t as runTui } from "./tui-DC1slGZV.js";
56
56
 
57
57
  //#region src/cli/tui-cli.ts
58
58
  function registerTuiCli(program) {
@@ -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-D-na5SuC.js";
97
- import "./register.subclis-DmQzWagl.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";
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-CJujJmCX.js";
104
- import { r as installCompletion } from "./completion-cli-Cfip458C.js";
103
+ import { t as doctorCommand } from "./doctor-BfH7c1Hp.js";
104
+ import { r as installCompletion } from "./completion-cli-DJhbwMcK.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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.381
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.380
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/matrix",
3
- "version": "2026.3.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.381
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.380
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/msteams",
3
- "version": "2026.3.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.381
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.380
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/nostr",
3
- "version": "2026.3.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.381
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.380
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/twitch",
3
- "version": "2026.3.380",
3
+ "version": "2026.3.381",
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.381
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.380
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/voice-call",
3
- "version": "2026.3.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
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.381
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.380
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/zalo",
3
- "version": "2026.3.380",
3
+ "version": "2026.3.381",
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.381
4
+
5
+ ### Changes
6
+ - Version alignment with core SKYKOI release numbers.
7
+
3
8
  ## 2026.3.380
4
9
 
5
10
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@SKYKOI/zalouser",
3
- "version": "2026.3.380",
3
+ "version": "2026.3.381",
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.380",
3
+ "version": "2026.3.381",
4
4
  "description": "SkyKoi — Koi runtime. Multi-channel gateway CLI with RPC Koi.",
5
5
  "keywords": [
6
6
  "cli",