skykoi 2026.3.269 → 2026.3.271

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 (51) hide show
  1. package/dist/{archive-DWubuYhj.js → archive-C_bUVOGc.js} +1 -1
  2. package/dist/{bonjour-discovery-DmkS5JkQ.js → bonjour-discovery-cnMfrXln.js} +1 -1
  3. package/dist/build-info.json +3 -3
  4. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  5. package/dist/{channel-options-vC0scakt.js → channel-options-Cg41WKAu.js} +1 -1
  6. package/dist/{channels-cli-B9azrEo1.js → channels-cli-DKfkY0Uc.js} +6 -6
  7. package/dist/cli/daemon-cli.js +1 -1
  8. package/dist/{cli-Dsfr60zC.js → cli-BSRa5s2p.js} +1 -1
  9. package/dist/{completion-cli-CLsNQlJq.js → completion-cli-C_bj3WcN.js} +1 -1
  10. package/dist/{config-guard-DFPXxhoK.js → config-guard-CBPYgoqj.js} +297 -17
  11. package/dist/{configure-DfMyIRIK.js → configure-Ct-pyNZR.js} +5 -5
  12. package/dist/{cron-cli-DX-jyUlc.js → cron-cli-_UjEtRij.js} +1 -1
  13. package/dist/{daemon-cli-DiPNXaXq.js → daemon-cli-BmaCmxw7.js} +2 -2
  14. package/dist/{deps-paNJoEvZ.js → deps-DPkF3sdv.js} +1 -1
  15. package/dist/{dns-cli-BNKjP3mP.js → dns-cli-CVVLxo5W.js} +1 -1
  16. package/dist/{doctor-DAvgdUEr.js → doctor-C5qcB9rr.js} +4 -4
  17. package/dist/entry.js +1 -1
  18. package/dist/extension-api.js +1 -1
  19. package/dist/{gateway-cli-CEs64KLs.js → gateway-cli-DVav6fZl.js} +18 -18
  20. package/dist/{github-copilot-auth-AFd71js0.js → github-copilot-auth-BJd-EBdp.js} +1 -1
  21. package/dist/{health-format-vlLr0K9x.js → health-format-UnPlsTlL.js} +1 -1
  22. package/dist/{hooks-cli-BJa06Zy1.js → hooks-cli-C2El6eFe.js} +3 -3
  23. package/dist/index.js +22 -22
  24. package/dist/{installs-DiD9Mnzj.js → installs-DOkBkcN3.js} +1 -1
  25. package/dist/{koi-ovyRvCBs.js → koi-e2TPdC5T.js} +2 -2
  26. package/dist/{login-Cm1KQyo6.js → login-CLGP4l3Z.js} +1 -1
  27. package/dist/{models-cli-xhWlwY4W.js → models-cli-CDlbUs4J.js} +2 -2
  28. package/dist/{onboard-channels-CxWdKszM.js → onboard-channels-DU4BqOIO.js} +2 -2
  29. package/dist/{onboard-skills-fQFkrNCl.js → onboard-skills-Bzimpz3N.js} +5 -5
  30. package/dist/{onboarding-CgMOhQUQ.js → onboarding-CAs9lSaY.js} +7 -7
  31. package/dist/{plugin-registry-z55ZNwzE.js → plugin-registry-DXbWc1Tm.js} +1 -1
  32. package/dist/plugin-sdk/index.js +1453 -362
  33. package/dist/{plugins-cli-BtCuw8v8.js → plugins-cli-3Fe3Io3A.js} +5 -5
  34. package/dist/{program-CbjeKFtp.js → program-DBOO8rqS.js} +4 -4
  35. package/dist/{register.subclis-DbvVpZCt.js → register.subclis-BxQVZtpO.js} +13 -13
  36. package/dist/{reply-aKX1fMlK.js → reply-KDYLY2Pp.js} +1922 -594
  37. package/dist/{run-main-C-n5fQS0.js → run-main-02yIaTRK.js} +31 -24
  38. package/dist/{server-node-events-C9voh22o.js → server-node-events-BZb6jKLo.js} +3 -3
  39. package/dist/{status-CF4hgoFL.js → status-BLQ_POvM.js} +1 -1
  40. package/dist/{update-cY5pcwgC.js → update-CbCh68o6.js} +1 -1
  41. package/dist/{update-cli-DZ_92pP0.js → update-cli-OuCE60yz.js} +12 -12
  42. package/dist/{update-runner-BbwlulGR.js → update-runner-U7UxeeeT.js} +3 -3
  43. package/extensions/memory-lancedb/node_modules/.bin/openai +2 -2
  44. package/package.json +10 -9
  45. package/extensions/diagnostics-otel/node_modules/.bin/acorn +0 -21
  46. package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +0 -21
  47. package/extensions/nostr/node_modules/.bin/tsc +0 -21
  48. package/extensions/nostr/node_modules/.bin/tsserver +0 -21
  49. /package/dist/{helpers-BbqByYKs.js → helpers-btYENKQf.js} +0 -0
  50. /package/dist/{systemd-linger-BGJktKDW.js → systemd-linger-blVsJyEr.js} +0 -0
  51. /package/dist/{widearea-dns-CPh_9Wfa.js → widearea-dns-B62LOarH.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { i as __require, o as __toESM, t as __commonJSMin } from "./chunk-D_gEzPfs.js";
2
- import { Ct as require_inherits } from "./reply-aKX1fMlK.js";
2
+ import { Ct as require_inherits } from "./reply-KDYLY2Pp.js";
3
3
  import path from "node:path";
4
4
  import fs from "node:fs/promises";
5
5
  import * as tar from "tar";
@@ -1,6 +1,6 @@
1
1
  import { r as __exportAll } from "./chunk-D_gEzPfs.js";
2
2
  import { t as runCommandWithTimeout } from "./exec-BE7MIgZB.js";
3
- import { n as resolveWideAreaDiscoveryDomain } from "./widearea-dns-CPh_9Wfa.js";
3
+ import { n as resolveWideAreaDiscoveryDomain } from "./widearea-dns-B62LOarH.js";
4
4
 
5
5
  //#region src/infra/bonjour-discovery.ts
6
6
  var bonjour_discovery_exports = /* @__PURE__ */ __exportAll({ discoverGatewayBeacons: () => discoverGatewayBeacons });
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.3.269",
3
- "commit": "05146f087e7851ab9be34ab8368dd70d23e70f9a",
4
- "builtAt": "2026-05-13T21:26:50.673Z"
2
+ "version": "2026.3.271",
3
+ "commit": "705c19bcd636dcdad4bf22cbbd1dea6dd40b6d51",
4
+ "builtAt": "2026-05-14T19:21:04.095Z"
5
5
  }
@@ -1 +1 @@
1
- fd46c589dad66d8a46645ba520b3367c005c7ac4d4f184856f14eafcdd722737
1
+ f668339b33b0267f2dfdf2d9bb6ac6a28e88aa17391f8e5072bf7558812c0e0f
@@ -2,7 +2,7 @@ import { M as CHAT_CHANNEL_ORDER } from "./subsystem-RXphV8Xh.js";
2
2
  import { t as isTruthyEnvValue } from "./env-BA3nu3t6.js";
3
3
  import { n as listChannelPlugins } from "./plugins-D6P_BD0C.js";
4
4
  import { i as listChannelPluginCatalogEntries } from "./plugin-auto-enable-Bx_BHwcy.js";
5
- import { t as ensurePluginRegistryLoaded } from "./plugin-registry-z55ZNwzE.js";
5
+ import { t as ensurePluginRegistryLoaded } from "./plugin-registry-DXbWc1Tm.js";
6
6
 
7
7
  //#region src/cli/channel-options.ts
8
8
  function dedupe(values) {
@@ -1,5 +1,5 @@
1
1
  import "./pi-embedded-helpers-BaaFO_NG.js";
2
- import { Cn as fetchChannelPermissionsDiscord, In as createSlackWebClient, Sn as parseDiscordTarget, vt as loadProviderUsageSummary, yt as formatUsageReportLines } from "./reply-aKX1fMlK.js";
2
+ import { Cn as fetchChannelPermissionsDiscord, In as createSlackWebClient, Sn as parseDiscordTarget, vt as loadProviderUsageSummary, yt as formatUsageReportLines } from "./reply-KDYLY2Pp.js";
3
3
  import { N as DEFAULT_CHAT_CHANNEL, O as getResolvedLoggerSettings, T as theme, c as defaultRuntime, p as danger, y as setVerbose } from "./subsystem-RXphV8Xh.js";
4
4
  import "./paths-VdmjGGyc.js";
5
5
  import { c as normalizeAccountId, t as DEFAULT_ACCOUNT_ID } from "./session-key-DvA8Pdt6.js";
@@ -66,14 +66,14 @@ import "./event-log-DjIKl_l7.js";
66
66
  import { t as resolveChannelDefaultAccountId } from "./helpers-Bd67GvKn.js";
67
67
  import "./note-CSp5eHqT.js";
68
68
  import { t as createClackPrompter } from "./clack-prompter-9RonoVi0.js";
69
- import { i as reloadOnboardingPluginRegistry, n as setupChannels, r as ensureOnboardingPluginInstalled } from "./onboard-channels-CxWdKszM.js";
69
+ import { i as reloadOnboardingPluginRegistry, n as setupChannels, r as ensureOnboardingPluginInstalled } from "./onboard-channels-DU4BqOIO.js";
70
70
  import { i as listChannelPluginCatalogEntries } from "./plugin-auto-enable-Bx_BHwcy.js";
71
- import "./archive-DWubuYhj.js";
71
+ import "./archive-C_bUVOGc.js";
72
72
  import "./skill-scanner-XSqJHIlH.js";
73
- import "./installs-DiD9Mnzj.js";
73
+ import "./installs-DOkBkcN3.js";
74
74
  import { t as collectChannelStatusIssues } from "./channels-status-issues-DpPqStch.js";
75
- import { n as hasExplicitOptions } from "./plugin-registry-z55ZNwzE.js";
76
- import { t as formatCliChannelOptions } from "./channel-options-vC0scakt.js";
75
+ import { n as hasExplicitOptions } from "./plugin-registry-DXbWc1Tm.js";
76
+ import { t as formatCliChannelOptions } from "./channel-options-Cg41WKAu.js";
77
77
  import { t as buildChannelAccountSnapshot } from "./status-B1DCoVQ3.js";
78
78
  import { t as parseLogLine } from "./parse-log-line-CVYzLRZv.js";
79
79
  import fs from "node:fs/promises";
@@ -1,2 +1,2 @@
1
1
  // Legacy shim for pre-tsdown update-cli imports.
2
- export { registerDaemonCli, runDaemonInstall, runDaemonRestart, runDaemonStart, runDaemonStatus, runDaemonStop, runDaemonUninstall } from "../daemon-cli-DiPNXaXq.js";
2
+ export { registerDaemonCli, runDaemonInstall, runDaemonRestart, runDaemonStart, runDaemonStatus, runDaemonStop, runDaemonUninstall } from "../daemon-cli-BmaCmxw7.js";
@@ -1,5 +1,5 @@
1
1
  import "./pi-embedded-helpers-BaaFO_NG.js";
2
- import { _t as loadSKYKOIPlugins } from "./reply-aKX1fMlK.js";
2
+ import { _t as loadSKYKOIPlugins } from "./reply-KDYLY2Pp.js";
3
3
  import { t as createSubsystemLogger } from "./subsystem-RXphV8Xh.js";
4
4
  import "./paths-VdmjGGyc.js";
5
5
  import "./utils-rBzA-VDv.js";
@@ -1,6 +1,6 @@
1
1
  import { r as __exportAll } from "./chunk-D_gEzPfs.js";
2
2
  import { g as resolveStateDir } from "./paths-VdmjGGyc.js";
3
- import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-DbvVpZCt.js";
3
+ import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-BxQVZtpO.js";
4
4
  import path from "node:path";
5
5
  import os from "node:os";
6
6
  import fs from "node:fs/promises";
@@ -1,4 +1,4 @@
1
- import { At as formatControlUiSshHint, Et as applyWizardMetadata, Ft as openUrl, Ht as waitForGatewayReachable, Mt as handleReset, Nt as moveToTrash, Ot as detectBrowserOpenSupport, P as runMessageAction, Rt as randomToken, Tt as DEFAULT_WORKSPACE, U as CHANNEL_MESSAGE_ACTION_NAMES, V as formatTargetDisplay, an as registerMemoryCli, ft as CHANNEL_TARGETS_DESCRIPTION, kt as ensureWorkspaceAndSessions, on as runMemoryStatus, pt as CHANNEL_TARGET_DESCRIPTION, vr as lookupContextTokens, zt as resolveControlUiLinks } from "./reply-aKX1fMlK.js";
1
+ import { At as formatControlUiSshHint, Et as applyWizardMetadata, Ft as openUrl, Ht as waitForGatewayReachable, Mt as handleReset, Nt as moveToTrash, Ot as detectBrowserOpenSupport, P as runMessageAction, Rt as randomToken, Tt as DEFAULT_WORKSPACE, U as CHANNEL_MESSAGE_ACTION_NAMES, V as formatTargetDisplay, an as registerMemoryCli, ft as CHANNEL_TARGETS_DESCRIPTION, kt as ensureWorkspaceAndSessions, on as runMemoryStatus, pt as CHANNEL_TARGET_DESCRIPTION, vr as lookupContextTokens, zt as resolveControlUiLinks } from "./reply-KDYLY2Pp.js";
2
2
  import { B as normalizeChatChannelId, C as colorize, I as getChatChannelMeta, N as DEFAULT_CHAT_CHANNEL, T as theme, c as defaultRuntime, l as restoreTerminalState, m as info, p as danger, w as isRich, y as setVerbose } from "./subsystem-RXphV8Xh.js";
3
3
  import { g as resolveStateDir, i as isNixMode, m as resolveOAuthDir, o as resolveConfigPath, r as STATE_DIR, t as CONFIG_PATH, u as resolveGatewayPort } from "./paths-VdmjGGyc.js";
4
4
  import { l as normalizeKoiId, n as DEFAULT_KOI_ID, t as DEFAULT_ACCOUNT_ID } from "./session-key-DvA8Pdt6.js";
@@ -19,35 +19,36 @@ import { t as formatDocsLink } from "./links-D-ozFGY4.js";
19
19
  import { n as runCommandWithRuntime } from "./cli-utils-BjM5oE0K.js";
20
20
  import { n as withProgress } from "./progress-aeJDq1bY.js";
21
21
  import { n as stylePromptMessage, r as stylePromptTitle, t as stylePromptHint } from "./prompt-style-CVuim3sP.js";
22
- import { t as createDefaultDeps } from "./deps-paNJoEvZ.js";
22
+ import { t as createDefaultDeps } from "./deps-DPkF3sdv.js";
23
23
  import { a as gatewayInstallErrorHint, g as assertSupportedRuntime, i as buildGatewayInstallPlan, r as isGatewayDaemonRuntime, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-Ct4U4ixT.js";
24
24
  import { t as resolveChannelDefaultAccountId } from "./helpers-Bd67GvKn.js";
25
25
  import { n as logConfigUpdated, t as formatConfigPath } from "./logging-BWWKm3m3.js";
26
26
  import { t as WizardCancelledError } from "./prompts-0EnaVIOe.js";
27
27
  import { t as createClackPrompter } from "./clack-prompter-9RonoVi0.js";
28
- 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-CgMOhQUQ.js";
29
- import { d as applyAuthChoice, f as applyOpenAIConfig, h as promptAuthChoiceGrouped, m as applyGoogleGeminiModelDefault, p as upsertSharedEnvVar, u as warnIfModelConfigLooksOff } from "./onboard-skills-fQFkrNCl.js";
30
- 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-AFd71js0.js";
31
- import { n as setupChannels } from "./onboard-channels-CxWdKszM.js";
32
- import { l as healthCommand } from "./health-format-vlLr0K9x.js";
28
+ 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-CAs9lSaY.js";
29
+ import { d as applyAuthChoice, f as applyOpenAIConfig, h as promptAuthChoiceGrouped, m as applyGoogleGeminiModelDefault, p as upsertSharedEnvVar, u as warnIfModelConfigLooksOff } from "./onboard-skills-Bzimpz3N.js";
30
+ 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-BJd-EBdp.js";
31
+ import { n as setupChannels } from "./onboard-channels-DU4BqOIO.js";
32
+ import { l as healthCommand } from "./health-format-UnPlsTlL.js";
33
33
  import { t as renderTable } from "./table-BcCXbKbR.js";
34
34
  import { t as resolveGatewayService } from "./service-CsKcTbqE.js";
35
35
  import { r as isSystemdUserServiceAvailable } from "./systemd-DvZErSyI.js";
36
- import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-DbvVpZCt.js";
36
+ import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-BxQVZtpO.js";
37
37
  import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-CxxLj5l6.js";
38
38
  import { t as formatHelpExamples } from "./help-format-D_sjxIrE.js";
39
- import { a as createOutboundSendDeps, n as resolveSessionKeyForRequest, t as koiCommand } from "./koi-ovyRvCBs.js";
40
- import { n as hasExplicitOptions, t as ensurePluginRegistryLoaded } from "./plugin-registry-z55ZNwzE.js";
41
- import { n as parsePositiveIntOrUndefined, t as collectOption } from "./helpers-BbqByYKs.js";
42
- import { i as CONFIGURE_WIZARD_SECTIONS, n as configureCommand, r as configureCommandWithSections } from "./configure-DfMyIRIK.js";
43
- import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-BGJktKDW.js";
44
- import { t as loginCommand } from "./login-Cm1KQyo6.js";
45
- import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-DAvgdUEr.js";
39
+ import { r as readAuthFile, t as loginCommand } from "./login-CLGP4l3Z.js";
40
+ import { a as createOutboundSendDeps, n as resolveSessionKeyForRequest, t as koiCommand } from "./koi-e2TPdC5T.js";
41
+ import { n as hasExplicitOptions, t as ensurePluginRegistryLoaded } from "./plugin-registry-DXbWc1Tm.js";
42
+ import { n as parsePositiveIntOrUndefined, t as collectOption } from "./helpers-btYENKQf.js";
43
+ import { i as CONFIGURE_WIZARD_SECTIONS, n as configureCommand, r as configureCommandWithSections } from "./configure-Ct-pyNZR.js";
44
+ import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-blVsJyEr.js";
45
+ import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-C5qcB9rr.js";
46
46
  import { fileURLToPath } from "node:url";
47
47
  import fs from "node:fs";
48
48
  import path from "node:path";
49
49
  import JSON5 from "json5";
50
50
  import fs$1 from "node:fs/promises";
51
+ import { createInterface } from "node:readline";
51
52
  import { cancel, confirm, isCancel, multiselect, select } from "@clack/prompts";
52
53
 
53
54
  //#region src/commands/kois.bindings.ts
@@ -2793,7 +2794,7 @@ async function loadValidConfig() {
2793
2794
  }
2794
2795
  function registerConfigCli(program) {
2795
2796
  const cmd = program.command("config").description("Config helpers (get/set/unset). Run without subcommand for the wizard.").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/config", "docs.skykoi.com/cli/config")}\n`).option("--section <section>", "Configure wizard sections (repeatable). Use with no subcommand.", (value, previous) => [...previous, value], []).action(async (opts) => {
2796
- const { CONFIGURE_WIZARD_SECTIONS, configureCommand, configureCommandWithSections } = await import("./configure-DfMyIRIK.js").then((n) => n.t);
2797
+ const { CONFIGURE_WIZARD_SECTIONS, configureCommand, configureCommandWithSections } = await import("./configure-Ct-pyNZR.js").then((n) => n.t);
2797
2798
  const sections = Array.isArray(opts.section) ? opts.section.map((value) => typeof value === "string" ? value.trim() : "").filter(Boolean) : [];
2798
2799
  if (sections.length === 0) {
2799
2800
  await configureCommand(defaultRuntime);
@@ -2864,6 +2865,281 @@ function registerConfigCli(program) {
2864
2865
  });
2865
2866
  }
2866
2867
 
2868
+ //#endregion
2869
+ //#region src/commands/platform-chat.ts
2870
+ /**
2871
+ * `skykoi chat` — message a PLATFORM koi from the terminal.
2872
+ *
2873
+ * Differs from `skykoi koi -m` (which talks to the local gateway):
2874
+ * this command uses the saved CLI token in ~/.skykoi/auth.json to
2875
+ * hit the platform's HTTP API directly. No local gateway needed.
2876
+ * The user logs in once with `skykoi login`, then `skykoi chat` Just
2877
+ * Works.
2878
+ *
2879
+ * Modes:
2880
+ *
2881
+ * skykoi chat # interactive REPL (default)
2882
+ * skykoi chat -m "hello" # one-shot, prints reply
2883
+ * skykoi chat --koi <id> -m "..." # target a specific koi
2884
+ * skykoi chat --list # just list kois and exit
2885
+ *
2886
+ * Koi selection precedence:
2887
+ * 1. --koi <id> flag
2888
+ * 2. SKYKOI_KOI_ID env var
2889
+ * 3. saved 'lastKoiId' in auth.json (set on first successful chat)
2890
+ * 4. interactive picker if stdin is a TTY
2891
+ * 5. error otherwise
2892
+ */
2893
+ async function fetchJson(url, init) {
2894
+ let res;
2895
+ try {
2896
+ res = await fetch(url, init);
2897
+ } catch (err) {
2898
+ return {
2899
+ ok: false,
2900
+ error: err?.message ?? "network error",
2901
+ status: 0
2902
+ };
2903
+ }
2904
+ if (!res.ok) return {
2905
+ ok: false,
2906
+ error: (await res.text().catch(() => "")).slice(0, 300) || res.statusText,
2907
+ status: res.status
2908
+ };
2909
+ const data = await res.json().catch(() => null);
2910
+ if (data === null) return {
2911
+ ok: false,
2912
+ error: "non-JSON response",
2913
+ status: res.status
2914
+ };
2915
+ return {
2916
+ ok: true,
2917
+ data
2918
+ };
2919
+ }
2920
+ async function pickKoiInteractive(kois) {
2921
+ if (kois.length === 0) return null;
2922
+ if (kois.length === 1) return kois[0];
2923
+ if (!process.stdin.isTTY) return kois[0];
2924
+ console.log("\n Available kois:");
2925
+ kois.forEach((k, i) => {
2926
+ const last = k.lastUserActivity ? `, last used ${new Date(k.lastUserActivity).toLocaleString()}` : "";
2927
+ console.log(` ${i + 1}. ${k.name} (${k.id}) — ${k.status}${last}`);
2928
+ });
2929
+ console.log("");
2930
+ const rl = createInterface({
2931
+ input: process.stdin,
2932
+ output: process.stdout
2933
+ });
2934
+ const answer = await new Promise((resolve) => {
2935
+ rl.question(` Pick [1-${kois.length}, default 1]: `, (a) => resolve(a));
2936
+ });
2937
+ rl.close();
2938
+ const trimmed = answer.trim();
2939
+ if (!trimmed) return kois[0];
2940
+ const n = parseInt(trimmed, 10);
2941
+ if (Number.isNaN(n) || n < 1 || n > kois.length) {
2942
+ console.log(" Invalid choice; defaulting to first koi.");
2943
+ return kois[0];
2944
+ }
2945
+ return kois[n - 1];
2946
+ }
2947
+ /**
2948
+ * Stream one chat turn from the platform's SSE endpoint and render
2949
+ * deltas to stdout as they arrive.
2950
+ */
2951
+ async function streamChatTurn(args) {
2952
+ const res = await fetch(`${args.platformUrl}/api/koi/${args.koiId}/chat`, {
2953
+ method: "POST",
2954
+ headers: {
2955
+ "Content-Type": "application/json",
2956
+ Accept: "text/event-stream",
2957
+ Authorization: `Bearer ${args.token}`
2958
+ },
2959
+ body: JSON.stringify({
2960
+ message: args.message,
2961
+ stream: true
2962
+ })
2963
+ }).catch((err) => ({
2964
+ ok: false,
2965
+ status: 0,
2966
+ body: null,
2967
+ statusText: err?.message ?? "network error"
2968
+ }));
2969
+ if (!("ok" in res) || !res.ok) return {
2970
+ ok: false,
2971
+ error: `chat request failed (${res?.status ?? "?"})`
2972
+ };
2973
+ const body = res.body;
2974
+ if (!body) return {
2975
+ ok: false,
2976
+ error: "no response body"
2977
+ };
2978
+ const reader = body.getReader();
2979
+ const decoder = new TextDecoder();
2980
+ let buffer = "";
2981
+ let currentEvent = null;
2982
+ let printedAny = false;
2983
+ while (true) {
2984
+ const { value, done } = await reader.read();
2985
+ if (done) break;
2986
+ buffer += decoder.decode(value, { stream: true });
2987
+ for (;;) {
2988
+ const lineEnd = buffer.indexOf("\n");
2989
+ if (lineEnd === -1) break;
2990
+ const line = buffer.slice(0, lineEnd).replace(/\r$/, "");
2991
+ buffer = buffer.slice(lineEnd + 1);
2992
+ if (!line) {
2993
+ currentEvent = null;
2994
+ continue;
2995
+ }
2996
+ if (line.startsWith("event:")) {
2997
+ currentEvent = line.slice(6).trim();
2998
+ continue;
2999
+ }
3000
+ if (line.startsWith("data:")) {
3001
+ const rawData = line.slice(5).trim();
3002
+ try {
3003
+ const payload = JSON.parse(rawData);
3004
+ const kind = currentEvent ?? "data";
3005
+ if (kind === "delta") {
3006
+ const text = payload.text ?? "";
3007
+ if (text) {
3008
+ process.stdout.write(text);
3009
+ printedAny = true;
3010
+ }
3011
+ } else if (kind === "tool") {
3012
+ const status = payload.status ?? "";
3013
+ const name = payload.name ?? "";
3014
+ const desc = payload.description ?? "";
3015
+ if (status === "running") {
3016
+ const label = desc || name;
3017
+ if (label) process.stderr.write(`\n · ${label}…\n`);
3018
+ }
3019
+ } else if (kind === "done") {
3020
+ const content = payload.content ?? "";
3021
+ if (!printedAny && content) process.stdout.write(content);
3022
+ process.stdout.write("\n");
3023
+ } else if (kind === "error") {
3024
+ const msg = payload.message ?? "unknown error";
3025
+ process.stderr.write(`\n ! ${msg}\n`);
3026
+ }
3027
+ } catch {}
3028
+ continue;
3029
+ }
3030
+ }
3031
+ }
3032
+ return { ok: true };
3033
+ }
3034
+ async function platformChatCommand(opts) {
3035
+ const auth = await readAuthFile();
3036
+ if (!auth) return {
3037
+ ok: false,
3038
+ error: "Not logged in. Run `skykoi login` first."
3039
+ };
3040
+ const platformUrl = auth.platformUrl.replace(/\/$/, "");
3041
+ const headers = { Authorization: `Bearer ${auth.token}` };
3042
+ const listRes = await fetchJson(`${platformUrl}/api/kois`, { headers });
3043
+ if (!listRes.ok) {
3044
+ if (listRes.status === 401 || listRes.status === 403) return {
3045
+ ok: false,
3046
+ error: "Token rejected. Run `skykoi login` to refresh."
3047
+ };
3048
+ return {
3049
+ ok: false,
3050
+ error: `Failed to list kois: ${listRes.error}`
3051
+ };
3052
+ }
3053
+ const kois = listRes.data.kois;
3054
+ if (opts.list) {
3055
+ if (opts.json) {
3056
+ process.stdout.write(JSON.stringify(kois, null, 2) + "\n");
3057
+ return { ok: true };
3058
+ }
3059
+ if (kois.length === 0) {
3060
+ console.log("(no kois — create one on the dashboard)");
3061
+ return { ok: true };
3062
+ }
3063
+ for (const k of kois) console.log(`${k.id}\t${k.status}\t${k.name}`);
3064
+ return { ok: true };
3065
+ }
3066
+ if (kois.length === 0) return {
3067
+ ok: false,
3068
+ error: "No kois yet. Create one on https://www.skykoi.com first."
3069
+ };
3070
+ let chosen = null;
3071
+ const wantId = opts.koi || process.env.SKYKOI_KOI_ID;
3072
+ if (wantId) {
3073
+ chosen = kois.find((k) => k.id === wantId) ?? null;
3074
+ if (!chosen) return {
3075
+ ok: false,
3076
+ error: `Koi ${wantId} not found in your account. Run \`skykoi chat --list\` to see options.`
3077
+ };
3078
+ } else chosen = await pickKoiInteractive(kois);
3079
+ if (!chosen) return {
3080
+ ok: false,
3081
+ error: "No koi selected."
3082
+ };
3083
+ if (opts.message && opts.message.trim()) {
3084
+ process.stdout.write(`> ${opts.message}\n\n`);
3085
+ const res = await streamChatTurn({
3086
+ platformUrl,
3087
+ token: auth.token,
3088
+ koiId: chosen.id,
3089
+ message: opts.message
3090
+ });
3091
+ return res.ok ? { ok: true } : {
3092
+ ok: false,
3093
+ error: res.error
3094
+ };
3095
+ }
3096
+ if (!process.stdin.isTTY) return {
3097
+ ok: false,
3098
+ error: "No --message provided and stdin isn't a TTY. Run `skykoi chat -m \"...\"` or open in a real terminal."
3099
+ };
3100
+ console.log(`\n Chatting with ${chosen.name} (${chosen.id})`);
3101
+ console.log(" Type your message. Empty line or Ctrl-C to exit.\n");
3102
+ const rl = createInterface({
3103
+ input: process.stdin,
3104
+ output: process.stdout,
3105
+ terminal: true
3106
+ });
3107
+ const ask = () => new Promise((resolve) => {
3108
+ rl.question("> ", (line) => resolve(line));
3109
+ });
3110
+ while (true) {
3111
+ const line = await ask().catch(() => "");
3112
+ if (!line.trim()) break;
3113
+ process.stdout.write("\n");
3114
+ await streamChatTurn({
3115
+ platformUrl,
3116
+ token: auth.token,
3117
+ koiId: chosen.id,
3118
+ message: line
3119
+ });
3120
+ process.stdout.write("\n");
3121
+ }
3122
+ rl.close();
3123
+ return { ok: true };
3124
+ }
3125
+
3126
+ //#endregion
3127
+ //#region src/cli/program/register.chat.ts
3128
+ function registerChatCommand(program) {
3129
+ program.command("chat").description("Message your platform koi from the terminal (uses the saved login token)").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/chat", "docs.skykoi.com/cli/chat")}\n`).option("-m, --message <text>", "Send a single message and print the reply (one-shot mode)").option("--koi <id>", "Target a specific koi by id (default: last-used or interactive picker)").option("--list", "Just list your kois and exit").option("--json", "When listing, output JSON").action(async (opts) => {
3130
+ const result = await platformChatCommand({
3131
+ message: opts.message,
3132
+ koi: opts.koi,
3133
+ list: opts.list,
3134
+ json: opts.json
3135
+ });
3136
+ if (!result.ok) {
3137
+ console.error(theme.error(`✗ ${result.error || "chat failed"}`));
3138
+ process.exit(1);
3139
+ }
3140
+ });
3141
+ }
3142
+
2867
3143
  //#endregion
2868
3144
  //#region src/commands/koi-via-gateway.ts
2869
3145
  function parseTimeoutSeconds(opts) {
@@ -3107,7 +3383,7 @@ function registerLoginCommand(program) {
3107
3383
  }
3108
3384
  });
3109
3385
  program.command("whoami").description("Show the currently-logged-in SkyKoi account").action(async () => {
3110
- const { readAuthFile } = await import("./login-Cm1KQyo6.js").then((n) => n.n);
3386
+ const { readAuthFile } = await import("./login-CLGP4l3Z.js").then((n) => n.n);
3111
3387
  const auth = await readAuthFile();
3112
3388
  if (!auth) {
3113
3389
  console.log(theme.muted("Not logged in. Run `skykoi login`."));
@@ -5410,6 +5686,10 @@ const commandRegistry = [
5410
5686
  id: "login",
5411
5687
  register: ({ program }) => registerLoginCommand(program)
5412
5688
  },
5689
+ {
5690
+ id: "chat",
5691
+ register: ({ program }) => registerChatCommand(program)
5692
+ },
5413
5693
  {
5414
5694
  id: "setup",
5415
5695
  register: ({ program }) => registerSetupCommand(program)
@@ -1,5 +1,5 @@
1
1
  import { r as __exportAll } from "./chunk-D_gEzPfs.js";
2
- import { Et as applyWizardMetadata, Ht as waitForGatewayReachable, It as printWizardHeader, Lt as probeGatewayReachable, Pt as normalizeGatewayTokenInput, Rt as randomToken, Tt as DEFAULT_WORKSPACE, Vt as summarizeExistingConfig, jt as guardCancel, kt as ensureWorkspaceAndSessions, zt as resolveControlUiLinks } from "./reply-aKX1fMlK.js";
2
+ import { Et as applyWizardMetadata, Ht as waitForGatewayReachable, It as printWizardHeader, Lt as probeGatewayReachable, Pt as normalizeGatewayTokenInput, Rt as randomToken, Tt as DEFAULT_WORKSPACE, Vt as summarizeExistingConfig, jt as guardCancel, kt as ensureWorkspaceAndSessions, zt as resolveControlUiLinks } from "./reply-KDYLY2Pp.js";
3
3
  import { c as defaultRuntime } from "./subsystem-RXphV8Xh.js";
4
4
  import { t as CONFIG_PATH, u as resolveGatewayPort } from "./paths-VdmjGGyc.js";
5
5
  import { h as resolveUserPath, y as shortenHomePath } from "./utils-rBzA-VDv.js";
@@ -15,11 +15,11 @@ import { n as logConfigUpdated } from "./logging-BWWKm3m3.js";
15
15
  import { t as note$1 } from "./note-CSp5eHqT.js";
16
16
  import { t as WizardCancelledError } from "./prompts-0EnaVIOe.js";
17
17
  import { t as createClackPrompter } from "./clack-prompter-9RonoVi0.js";
18
- import { a as applyModelFallbacksFromSelection, c as promptModelAllowlist, d as applyAuthChoice, h as promptAuthChoiceGrouped, i as applyModelAllowlist, l as resolvePreferredProviderForAuthChoice, o as applyPrimaryModel, r as promptRemoteGatewayConfig, s as promptDefaultModel, t as setupSkills } from "./onboard-skills-fQFkrNCl.js";
19
- import { n as setupChannels, t as noteChannelStatus } from "./onboard-channels-CxWdKszM.js";
20
- import { l as healthCommand, n as ensureControlUiAssetsBuilt, t as formatHealthCheckFailure } from "./health-format-vlLr0K9x.js";
18
+ import { a as applyModelFallbacksFromSelection, c as promptModelAllowlist, d as applyAuthChoice, h as promptAuthChoiceGrouped, i as applyModelAllowlist, l as resolvePreferredProviderForAuthChoice, o as applyPrimaryModel, r as promptRemoteGatewayConfig, s as promptDefaultModel, t as setupSkills } from "./onboard-skills-Bzimpz3N.js";
19
+ import { n as setupChannels, t as noteChannelStatus } from "./onboard-channels-DU4BqOIO.js";
20
+ import { l as healthCommand, n as ensureControlUiAssetsBuilt, t as formatHealthCheckFailure } from "./health-format-UnPlsTlL.js";
21
21
  import { t as resolveGatewayService } from "./service-CsKcTbqE.js";
22
- import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-BGJktKDW.js";
22
+ import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-blVsJyEr.js";
23
23
  import { confirm, intro, outro, select, text } from "@clack/prompts";
24
24
 
25
25
  //#region src/commands/configure.shared.ts
@@ -23,7 +23,7 @@ import { t as formatDocsLink } from "./links-D-ozFGY4.js";
23
23
  import "./progress-aeJDq1bY.js";
24
24
  import { t as parseAbsoluteTimeMs } from "./parse-B5EluDjJ.js";
25
25
  import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-CxxLj5l6.js";
26
- import { n as parsePositiveIntOrUndefined } from "./helpers-BbqByYKs.js";
26
+ import { n as parsePositiveIntOrUndefined } from "./helpers-btYENKQf.js";
27
27
 
28
28
  //#region src/cli/cron-cli/shared.ts
29
29
  const getCronChannelOptions = () => ["last", ...listChannelPlugins().map((plugin) => plugin.id)].join("|");
@@ -1,5 +1,5 @@
1
1
  import { r as __exportAll } from "./chunk-D_gEzPfs.js";
2
- import { zt as resolveControlUiLinks } from "./reply-aKX1fMlK.js";
2
+ import { zt as resolveControlUiLinks } from "./reply-KDYLY2Pp.js";
3
3
  import { C as colorize, O as getResolvedLoggerSettings, T as theme, c as defaultRuntime, w as isRich } from "./subsystem-RXphV8Xh.js";
4
4
  import { d as resolveIsNixMode, g as resolveStateDir, o as resolveConfigPath, u as resolveGatewayPort } from "./paths-VdmjGGyc.js";
5
5
  import { y as shortenHomePath } from "./utils-rBzA-VDv.js";
@@ -14,7 +14,7 @@ import { n as callGateway } from "./call-Bos6YLrN.js";
14
14
  import { t as formatDocsLink } from "./links-D-ozFGY4.js";
15
15
  import { n as withProgress } from "./progress-aeJDq1bY.js";
16
16
  import { d as resolveGatewaySystemdServiceName, l as resolveGatewayLaunchAgentLabel } from "./constants-BhdMO-tw.js";
17
- import { t as createDefaultDeps } from "./deps-paNJoEvZ.js";
17
+ import { t as createDefaultDeps } from "./deps-DPkF3sdv.js";
18
18
  import { i as buildGatewayInstallPlan, r as isGatewayDaemonRuntime, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-Ct4U4ixT.js";
19
19
  import { o as resolveGatewayLogPaths, t as resolveGatewayService } from "./service-CsKcTbqE.js";
20
20
  import { r as isSystemdUserServiceAvailable } from "./systemd-DvZErSyI.js";
@@ -1,4 +1,4 @@
1
- import { Fn as sendMessageSlack, Nn as sendMessageWhatsApp, bn as sendMessageDiscord, wt as sendMessageIMessage, yn as sendMessageTelegram } from "./reply-aKX1fMlK.js";
1
+ import { Fn as sendMessageSlack, Nn as sendMessageWhatsApp, bn as sendMessageDiscord, wt as sendMessageIMessage, yn as sendMessageTelegram } from "./reply-KDYLY2Pp.js";
2
2
  import { b as sendMessageSignal } from "./deliver-D6EteaM6.js";
3
3
 
4
4
  //#region src/cli/deps.ts
@@ -14,7 +14,7 @@ import "./manifest-registry-BfJkwq3e.js";
14
14
  import { n as pickPrimaryTailnetIPv6, t as pickPrimaryTailnetIPv4 } from "./tailnet-CUHhVH39.js";
15
15
  import { t as formatDocsLink } from "./links-D-ozFGY4.js";
16
16
  import { t as renderTable } from "./table-BcCXbKbR.js";
17
- import { n as resolveWideAreaDiscoveryDomain, t as getWideAreaZonePath } from "./widearea-dns-CPh_9Wfa.js";
17
+ import { n as resolveWideAreaDiscoveryDomain, t as getWideAreaZonePath } from "./widearea-dns-B62LOarH.js";
18
18
  import fs from "node:fs";
19
19
  import path from "node:path";
20
20
  import { spawnSync } from "node:child_process";
@@ -1,4 +1,4 @@
1
- import { Er as loadModelCatalog, Et as applyWizardMetadata, It as printWizardHeader, Rt as randomToken, _t as loadSKYKOIPlugins, jt as guardCancel } from "./reply-aKX1fMlK.js";
1
+ import { Er as loadModelCatalog, Et as applyWizardMetadata, It as printWizardHeader, Rt as randomToken, _t as loadSKYKOIPlugins, jt as guardCancel } from "./reply-KDYLY2Pp.js";
2
2
  import { O as getResolvedLoggerSettings, c as defaultRuntime } from "./subsystem-RXphV8Xh.js";
3
3
  import { d as resolveIsNixMode, f as resolveLegacyStateDirs, g as resolveStateDir, m as resolveOAuthDir, p as resolveNewStateDir, t as CONFIG_PATH, u as resolveGatewayPort } from "./paths-VdmjGGyc.js";
4
4
  import { a as buildKoiMainSessionKey, l as normalizeKoiId, r as DEFAULT_MAIN_KEY, t as DEFAULT_ACCOUNT_ID } from "./session-key-DvA8Pdt6.js";
@@ -26,15 +26,15 @@ import { t as resolveChannelDefaultAccountId } from "./helpers-Bd67GvKn.js";
26
26
  import { n as logConfigUpdated } from "./logging-BWWKm3m3.js";
27
27
  import { t as note$1 } from "./note-CSp5eHqT.js";
28
28
  import { t as applyPluginAutoEnable } from "./plugin-auto-enable-Bx_BHwcy.js";
29
- import { i as resolveControlUiDistIndexPathForRoot, l as healthCommand, r as resolveControlUiDistIndexHealth, t as formatHealthCheckFailure } from "./health-format-vlLr0K9x.js";
30
- import { c as doctorShellCompletion, t as runGatewayUpdate } from "./update-runner-BbwlulGR.js";
29
+ import { i as resolveControlUiDistIndexPathForRoot, l as healthCommand, r as resolveControlUiDistIndexHealth, t as formatHealthCheckFailure } from "./health-format-UnPlsTlL.js";
30
+ import { c as doctorShellCompletion, t as runGatewayUpdate } from "./update-runner-U7UxeeeT.js";
31
31
  import { i as resolveGatewayAuth } from "./auth-BzM5UpTJ.js";
32
32
  import { t as buildWorkspaceSkillStatus } from "./skills-status-Co9ln7Nd.js";
33
33
  import { a as repairLaunchAgentBootstrap, i as launchAgentPlistExists, n as isLaunchAgentListed, o as resolveGatewayLogPaths, r as isLaunchAgentLoaded, t as resolveGatewayService } from "./service-CsKcTbqE.js";
34
34
  import { r as isSystemdUserServiceAvailable } from "./systemd-DvZErSyI.js";
35
35
  import { a as renderGatewayServiceCleanupHints, i as findExtraGatewayServices, n as auditGatewayServiceConfig, o as readLastGatewayErrorLine, r as needsNodeRuntimeMigration, t as SERVICE_AUDIT_CODES } from "./service-audit-DMmKqL8q.js";
36
36
  import { t as collectChannelStatusIssues } from "./channels-status-issues-DpPqStch.js";
37
- import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-BGJktKDW.js";
37
+ import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-blVsJyEr.js";
38
38
  import { n as buildAuthHealthSummary, r as formatRemainingShort, t as DEFAULT_OAUTH_WARN_MS } from "./auth-health-BC19VMJe.js";
39
39
  import { n as renderSystemdUnavailableHints, t as isSystemdUnavailableDetail } from "./systemd-hints-DpSjggO1.js";
40
40
  import fs from "node:fs";
package/dist/entry.js CHANGED
@@ -244,7 +244,7 @@ if (!ensureExperimentalWarningSuppressed()) {
244
244
  applyCliProfileEnv({ profile: parsed.profile });
245
245
  process$1.argv = parsed.argv;
246
246
  }
247
- import("./run-main-C-n5fQS0.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
247
+ import("./run-main-02yIaTRK.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
248
248
  console.error("[SKYKOI] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
249
249
  process$1.exitCode = 1;
250
250
  });
@@ -1,5 +1,5 @@
1
1
  import "./pi-embedded-helpers-BaaFO_NG.js";
2
- import { Vr as resolveKoiTimeoutMs, c as runEmbeddedPiKoi, zn as resolveKoiIdentity } from "./reply-aKX1fMlK.js";
2
+ import { Vr as resolveKoiTimeoutMs, c as runEmbeddedPiKoi, zn as resolveKoiIdentity } from "./reply-KDYLY2Pp.js";
3
3
  import "./subsystem-RXphV8Xh.js";
4
4
  import "./paths-VdmjGGyc.js";
5
5
  import "./utils-rBzA-VDv.js";