skykoi 2026.3.322 → 2026.3.323

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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026.3.322",
3
- "commit": "4c86728d713b5016154a2c2fbb8c444587122943",
4
- "builtAt": "2026-06-10T23:15:15.749Z"
2
+ "version": "2026.3.323",
3
+ "commit": "5545b740e1134b4ee4975c088a2b62d2c96ff47e",
4
+ "builtAt": "2026-06-10T23:31:24.558Z"
5
5
  }
@@ -1 +1 @@
1
- 528642731a4d18853c4833293879873c7c6e02f8d93d658d2edb8789c8de897b
1
+ e0a033dc0b04c859d18a66e5821f24fb654db9fcde5bc1db855acbf5f68d4a91
@@ -45,7 +45,7 @@ import { n as parsePositiveIntOrUndefined, t as collectOption } from "./helpers-
45
45
  import { i as CONFIGURE_WIZARD_SECTIONS, n as configureCommand, r as configureCommandWithSections } from "./configure-V-VbLiFS.js";
46
46
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, r as isGatewayDaemonRuntime, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-C0hdddbl.js";
47
47
  import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-D0-vL3BB.js";
48
- import { t as loginCommand } from "./login-DSLXYQoj.js";
48
+ import { t as loginCommand } from "./login-DsYTd0xk.js";
49
49
  import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-CklTiiy_.js";
50
50
  import { fileURLToPath } from "node:url";
51
51
  import fs from "node:fs";
@@ -3130,7 +3130,7 @@ function registerLoginCommand(program) {
3130
3130
  }
3131
3131
  });
3132
3132
  program.command("whoami").description("Show the currently-logged-in SkyKoi account").action(async () => {
3133
- const { readAuthFile } = await import("./login-DSLXYQoj.js").then((n) => n.n);
3133
+ const { readAuthFile } = await import("./login-DsYTd0xk.js").then((n) => n.n);
3134
3134
  const auth = await readAuthFile();
3135
3135
  if (!auth) {
3136
3136
  console.log(theme.muted("Not logged in. Run `skykoi login`."));
package/dist/entry.js CHANGED
@@ -246,7 +246,7 @@ if (!ensureExperimentalWarningSuppressed()) {
246
246
  applyCliProfileEnv({ profile: parsed.profile });
247
247
  process$1.argv = parsed.argv;
248
248
  }
249
- import("./run-main-CuN_uXfK.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
249
+ import("./run-main-DAsXmgV2.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
250
250
  console.error("[SKYKOI] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
251
251
  process$1.exitCode = 1;
252
252
  });
package/dist/index.js CHANGED
@@ -73,7 +73,7 @@ import { t as isMainModule } from "./is-main-9SjMCZPE.js";
73
73
  import { t as ensureSKYKOICliOnPath } from "./path-env-DLiKMTfX.js";
74
74
  import { t as assertSupportedRuntime } from "./runtime-guard-Btp4Sks0.js";
75
75
  import "./ports-DhfotU6w.js";
76
- import "./config-guard-BxHHy89v.js";
76
+ import "./config-guard-caTN4hCN.js";
77
77
  import "./logging-CSvbGeqF.js";
78
78
  import "./note-DdyFyHLV.js";
79
79
  import "./clack-prompter-CCgKKgnN.js";
@@ -110,7 +110,7 @@ import "./systemd-linger-D0-vL3BB.js";
110
110
  import "./widearea-dns-BVskGRhX.js";
111
111
  import "./bonjour-discovery-BSmFpe9M.js";
112
112
  import "./ensure-local-gateway-06rDlz6H.js";
113
- import "./login-DSLXYQoj.js";
113
+ import "./login-DsYTd0xk.js";
114
114
  import "./auth-health-ByU4kcC7.js";
115
115
  import "./doctor-CklTiiy_.js";
116
116
  import "./completion-cli-DakqzHY-.js";
@@ -118,7 +118,7 @@ import "./service-audit-D5t50LVL.js";
118
118
  import "./hooks-status-CxWUG7p9.js";
119
119
  import "./tui-Bz7_HqnH.js";
120
120
  import "./channel-options-JS7VgLec.js";
121
- import { n as buildProgram } from "./program-DZwcD2lz.js";
121
+ import { n as buildProgram } from "./program-CdowGQCF.js";
122
122
  import process from "node:process";
123
123
  import { fileURLToPath } from "node:url";
124
124
 
@@ -2,7 +2,9 @@ import { r as __exportAll } from "./chunk-D_gEzPfs.js";
2
2
  import { n as isRich, r as theme } from "./theme-C5EwWDWE.js";
3
3
  import { b as sleep } from "./utils-D019Z2NU.js";
4
4
  import { o as loadConfig, u as writeConfigFile } from "./config-Dbvct-5Z.js";
5
- import { n as callGateway } from "./call-B5ldOL7t.js";
5
+ import { h as GATEWAY_CLIENT_NAMES, m as GATEWAY_CLIENT_MODES } from "./message-channel-CaDAAMe0.js";
6
+ import { r as loadOrCreateDeviceIdentity } from "./device-identity-CpMBJtRJ.js";
7
+ import { Ot as PROTOCOL_VERSION, n as GatewayClient } from "./client-BM6xyPUD.js";
6
8
  import { t as ensureLocalGatewayRunning } from "./ensure-local-gateway-06rDlz6H.js";
7
9
  import { existsSync } from "node:fs";
8
10
  import path, { join } from "node:path";
@@ -232,23 +234,86 @@ var login_exports = /* @__PURE__ */ __exportAll({
232
234
  * its very first reply (no investigating mid-conversation).
233
235
  */
234
236
  const ONBOARDING_KICKOFF = "[setup] Run your full onboarding NOW, silently in the background, per your Onboarding & user dossier instructions. Investigate this computer and build the complete USER.md + profile.json: identity; the people who matter (rank by real two-way message volume, then READ each top person's recent thread); the user's voice/writing style (global + per-person); their business/ventures and team; and their current headspace from recent browser/search activity. Do NOT message me about it — just build the dossier so you already know me when I first message you. This is the initial setup pass; keep refining it each session.";
235
- /** Fire the onboarding pass on the device koi (best-effort, returns once the
236
- * gateway accepts the run — the investigation then continues in the background). */
237
- async function kickoffOnboarding(wsUrl, token) {
237
+ /** A short, human "currently doing" phrase for an onboarding tool call. */
238
+ function onboardingActivity(tool) {
239
+ switch (tool) {
240
+ case "exec":
241
+ case "run_code":
242
+ case "bash": return "reading your computer";
243
+ case "email": return "skimming your inbox";
244
+ case "memory_get":
245
+ case "memory_search": return "organizing what I learn";
246
+ default: return "getting the picture";
247
+ }
248
+ }
249
+ /**
250
+ * Run the onboarding pass and BLOCK until it finishes (capped), so the chat opens
251
+ * already knowing the user. The koi must NEVER investigate DURING the first
252
+ * message — that made a simple "hi" crawl while the onboarding run competed with
253
+ * it for the model. We show a clear, live indicator the whole time.
254
+ */
255
+ async function runOnboardingBeforeChat(wsUrl, token) {
256
+ const onb = step("Getting to know you");
257
+ let client = null;
258
+ let runId = "";
259
+ let sent = false;
238
260
  try {
239
- await callGateway({
240
- url: wsUrl,
241
- token,
242
- method: "chat.send",
243
- params: {
244
- sessionKey: "koi:setup:onboarding",
245
- message: ONBOARDING_KICKOFF,
246
- deliver: false,
247
- idempotencyKey: randomBytes(12).toString("hex")
248
- },
249
- timeoutMs: 8e3
261
+ await new Promise((resolve) => {
262
+ let settled = false;
263
+ const finish = () => {
264
+ if (settled) return;
265
+ settled = true;
266
+ resolve();
267
+ };
268
+ client = new GatewayClient({
269
+ url: wsUrl,
270
+ token,
271
+ instanceId: randomBytes(8).toString("hex"),
272
+ clientName: GATEWAY_CLIENT_NAMES.CLI,
273
+ clientVersion: "login",
274
+ mode: GATEWAY_CLIENT_MODES.CLI,
275
+ role: "operator",
276
+ scopes: ["operator.admin"],
277
+ deviceIdentity: loadOrCreateDeviceIdentity(),
278
+ minProtocol: PROTOCOL_VERSION,
279
+ maxProtocol: PROTOCOL_VERSION,
280
+ onHelloOk: async () => {
281
+ if (sent) return;
282
+ sent = true;
283
+ try {
284
+ runId = (await client.request("chat.send", {
285
+ sessionKey: "koi:setup:onboarding",
286
+ message: ONBOARDING_KICKOFF,
287
+ deliver: false,
288
+ idempotencyKey: randomBytes(12).toString("hex")
289
+ }))?.runId ?? "";
290
+ } catch {
291
+ finish();
292
+ }
293
+ },
294
+ onEvent: (evt) => {
295
+ const payload = evt.payload;
296
+ if (!payload || !runId || payload.runId !== runId) return;
297
+ if (evt.event === "chat") {
298
+ const state = payload.state;
299
+ if (state === "final" || state === "error" || state === "aborted") finish();
300
+ } else if (evt.event === "koi" && payload.stream === "tool") {
301
+ const data = payload.data;
302
+ if (data?.phase === "start" && typeof data.name === "string") onb.update(`Getting to know you · ${onboardingActivity(data.name)}`);
303
+ }
304
+ }
305
+ });
306
+ client.start();
307
+ setTimeout(finish, 240 * 1e3).unref?.();
250
308
  });
251
- } catch {}
309
+ onb.succeed("Got to know you — your people, your calendar, and what's live");
310
+ } catch {
311
+ onb.warn("Couldn't finish getting to know you — it'll keep learning in the background");
312
+ } finally {
313
+ try {
314
+ client?.stop();
315
+ } catch {}
316
+ }
252
317
  }
253
318
  const DEFAULT_PLATFORM_URL = "https://www.skykoi.com";
254
319
  function resolvePlatformUrl(opt) {
@@ -496,7 +561,7 @@ async function claimAndFinish(platformUrl, token, base, doClaim) {
496
561
  if (ensure.ok) {
497
562
  online.succeed(`Online — reachable from your phone and ${theme.command("koi.skykoi.com")}`);
498
563
  await requestDevicePermissions();
499
- await kickoffOnboarding(ensure.wsUrl, ensure.token);
564
+ await runOnboardingBeforeChat(ensure.wsUrl, ensure.token);
500
565
  } else if (ensure.wsUrl) {
501
566
  online.warn("Started — opening your chat; it'll connect as your koi finishes coming online");
502
567
  hint(ensure.error);
@@ -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-szlzYGsC.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-CBWcyyqn.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";
@@ -33,7 +33,7 @@ import { exec as exec$1 } from "child_process";
33
33
  import { createReadStream as createReadStream$1, createWriteStream as createWriteStream$1, promises as promises$1 } from "fs";
34
34
  import { Readable, Transform } from "stream";
35
35
  import { platform, release, tmpdir as tmpdir$1 } from "os";
36
- import EventEmitter, { EventEmitter as EventEmitter$1, once } from "events";
36
+ import EventEmitter$1, { EventEmitter, once } from "events";
37
37
  import { promisify as promisify$1 } from "util";
38
38
  import { join as join$1 } from "path";
39
39
  import * as Crypto from "crypto";
@@ -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 AjvPkg from "ajv";
45
+ import AjvModule from "ajv";
46
46
  import lockfile from "proper-lockfile";
47
47
  import { URL as URL$1 } from "url";
48
48
  import "yaml";
@@ -20537,7 +20537,7 @@ function loadPluginManifestRegistry(params) {
20537
20537
 
20538
20538
  //#endregion
20539
20539
  //#region src/plugins/schema-validator.ts
20540
- const ajv$1 = new AjvPkg({
20540
+ const ajv$1 = new AjvModule({
20541
20541
  allErrors: true,
20542
20542
  strict: false,
20543
20543
  removeAdditional: false
@@ -48183,7 +48183,7 @@ const PROTOCOL_VERSION = 3;
48183
48183
 
48184
48184
  //#endregion
48185
48185
  //#region src/gateway/protocol/index.ts
48186
- const ajv = new AjvPkg({
48186
+ const ajv = new AjvModule({
48187
48187
  allErrors: true,
48188
48188
  strict: false,
48189
48189
  removeAdditional: false
@@ -68061,7 +68061,7 @@ function enqueueSystemEvent(text, options) {
68061
68061
  const MODEL_CACHE = /* @__PURE__ */ new Map();
68062
68062
  (async () => {
68063
68063
  try {
68064
- const { discoverAuthStorage, discoverModels } = await import("./pi-model-discovery-szlzYGsC.js").then((n) => n.t);
68064
+ const { discoverAuthStorage, discoverModels } = await import("./pi-model-discovery-CBWcyyqn.js").then((n) => n.t);
68065
68065
  await ensureSKYKOIModelsJson(loadConfig());
68066
68066
  const koiDir = resolveSKYKOIKoiDir();
68067
68067
  const models = discoverModels(discoverAuthStorage(koiDir), koiDir).getAll();
@@ -228309,7 +228309,7 @@ const BUFFERABLE_EVENT_SET = new Set([
228309
228309
  * making the data processing more efficient.
228310
228310
  */
228311
228311
  const makeEventBuffer = (logger) => {
228312
- const ev = new EventEmitter();
228312
+ const ev = new EventEmitter$1();
228313
228313
  const historyCache = /* @__PURE__ */ new Set();
228314
228314
  let data = makeBufferData();
228315
228315
  let isBuffering = false;
@@ -233879,7 +233879,7 @@ var BinaryInfo = class {
233879
233879
 
233880
233880
  //#endregion
233881
233881
  //#region node_modules/.pnpm/@whiskeysockets+baileys@7.0.0-rc.9_audio-decode@2.2.3_sharp@0.34.5/node_modules/@whiskeysockets/baileys/lib/Socket/Client/types.js
233882
- var AbstractSocketClient = class extends EventEmitter$1 {
233882
+ var AbstractSocketClient = class extends EventEmitter {
233883
233883
  constructor(url, config) {
233884
233884
  super();
233885
233885
  this.url = url;
@@ -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 AjvPkg from "ajv";
37
+ import AjvModule 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_ws@8.19.0_zod@4.3.6/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 = AjvPkg.default || AjvPkg;
59702
+ const Ajv$1 = AjvModule.default || AjvModule;
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 = AjvPkg.default || AjvPkg;
174029
+ const Ajv = AjvModule.default || AjvModule;
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,7 +5,7 @@ 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-BupJpVpQ.js";
8
- import { r as registerProgramCommands, t as ensureConfigReady } from "./config-guard-BxHHy89v.js";
8
+ import { r as registerProgramCommands, t as ensureConfigReady } from "./config-guard-caTN4hCN.js";
9
9
  import { a as getCommandPath, d as hasHelpOrVersion, l as getVerboseFlag } from "./register.subclis-ApB1MXdA.js";
10
10
  import { t as ensurePluginRegistryLoaded } from "./plugin-registry-DS-O7coN.js";
11
11
  import { a as hasEmittedCliBanner, i as formatCliBannerLine, r as emitCliBanner } from "./tui-Bz7_HqnH.js";
@@ -70,7 +70,7 @@ import "./deps-DqgDwRMZ.js";
70
70
  import "./tailscale-BHvmy4HA.js";
71
71
  import { t as ensureSKYKOICliOnPath } from "./path-env-DLiKMTfX.js";
72
72
  import { t as assertSupportedRuntime } from "./runtime-guard-Btp4Sks0.js";
73
- import { n as findRoutedCommand, t as ensureConfigReady } from "./config-guard-BxHHy89v.js";
73
+ import { n as findRoutedCommand, t as ensureConfigReady } from "./config-guard-caTN4hCN.js";
74
74
  import "./logging-CSvbGeqF.js";
75
75
  import "./note-DdyFyHLV.js";
76
76
  import "./clack-prompter-CCgKKgnN.js";
@@ -107,7 +107,7 @@ import "./systemd-linger-D0-vL3BB.js";
107
107
  import "./widearea-dns-BVskGRhX.js";
108
108
  import "./bonjour-discovery-BSmFpe9M.js";
109
109
  import "./ensure-local-gateway-06rDlz6H.js";
110
- import "./login-DSLXYQoj.js";
110
+ import "./login-DsYTd0xk.js";
111
111
  import "./auth-health-ByU4kcC7.js";
112
112
  import "./doctor-CklTiiy_.js";
113
113
  import "./completion-cli-DakqzHY-.js";
@@ -167,7 +167,7 @@ async function runCli(argv = process$1.argv) {
167
167
  assertSupportedRuntime();
168
168
  if (await tryRouteCli(normalizedArgv)) return;
169
169
  enableConsoleCapture();
170
- const { buildProgram } = await import("./program-DZwcD2lz.js").then((n) => n.t);
170
+ const { buildProgram } = await import("./program-CdowGQCF.js").then((n) => n.t);
171
171
  const program = buildProgram();
172
172
  installUnhandledRejectionHandler();
173
173
  process$1.on("uncaughtException", (error) => {
@@ -180,7 +180,7 @@ async function runCli(argv = process$1.argv) {
180
180
  if (!hasAnyArg && !wantsHelpOrVersion) {
181
181
  let isLoggedIn = false;
182
182
  try {
183
- const { readAuthFile } = await import("./login-DSLXYQoj.js").then((n) => n.n);
183
+ const { readAuthFile } = await import("./login-DsYTd0xk.js").then((n) => n.n);
184
184
  isLoggedIn = !!(await readAuthFile())?.token;
185
185
  } catch {}
186
186
  let defaultCommand = "tui";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skykoi",
3
- "version": "2026.3.322",
3
+ "version": "2026.3.323",
4
4
  "description": "SkyKoi — Koi runtime. Multi-channel gateway CLI with RPC Koi.",
5
5
  "keywords": [
6
6
  "cli",