skykoi 2026.3.343 → 2026.3.345

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.343",
3
- "commit": "9a2ebed86b95822700229a347c86ac264ec7565a",
4
- "builtAt": "2026-06-19T18:29:33.014Z"
2
+ "version": "2026.3.345",
3
+ "commit": "8116fef3bce7d5d238e53eb9f3e71e3969d85ed4",
4
+ "builtAt": "2026-06-20T02:35:16.530Z"
5
5
  }
@@ -1 +1 @@
1
- b876b5b4bd72f5d5f952c6956fad8ef72b32edb1687e9929f9afe9d119e5e946
1
+ aff45c3f8d3e43f3eff24c96d7948d7225615c88aead1afe90c43cc44de810d5
@@ -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-BxaKP8it.js";
3
+ import { n as registerSubCliByName, t as getSubCliEntries } from "./register.subclis-DTvpFcjh.js";
4
4
  import path from "node:path";
5
5
  import os from "node:os";
6
6
  import fs from "node:fs/promises";
@@ -27,7 +27,7 @@ import { t as resolveChannelDefaultAccountId } from "./helpers-BJ0RdAWy.js";
27
27
  import { n as logConfigUpdated, t as formatConfigPath } from "./logging-BYKu4FCl.js";
28
28
  import { t as WizardCancelledError } from "./prompts-QLr0uHK3.js";
29
29
  import { t as createClackPrompter } from "./clack-prompter-t8CaZFBV.js";
30
- import { a as buildKoiSummaries, c as loadKoiIdentity, f as parseIdentityMarkdown, i as applyKoiConfig, l as pruneKoiConfig, n as statusCommand, o as findKoiEntryIndex, s as listKoiEntries, t as runOnboardingWizard, u as identityHasValues } from "./onboarding-cS6et69h.js";
30
+ import { a as buildKoiSummaries, c as loadKoiIdentity, f as parseIdentityMarkdown, i as applyKoiConfig, l as pruneKoiConfig, n as statusCommand, o as findKoiEntryIndex, s as listKoiEntries, t as runOnboardingWizard, u as identityHasValues } from "./onboarding-BTcl_hcR.js";
31
31
  import { d as applyAuthChoice, f as applyOpenAIConfig, h as promptAuthChoiceGrouped, m as applyGoogleGeminiModelDefault, p as upsertSharedEnvVar, u as warnIfModelConfigLooksOff } from "./onboard-skills-DqXAoYz9.js";
32
32
  import { $ as setOpenrouterApiKey, C as applyMoonshotConfig, D as applyOpenrouterConfig, F as applyVercelAiGatewayConfig, J as setGeminiApiKey, K as setAnthropicApiKey, L as applyXaiConfig, N as applyVeniceConfig, Q as setOpencodeZenApiKey, V as applyZaiConfig, X as setMinimaxApiKey, Y as setKimiCodingApiKey, Z as setMoonshotApiKey, at as setXiaomiApiKey, et as setQianfanApiKey, f as applyOpencodeZenConfig, ft as buildTokenProfileId, g as applyMinimaxConfig, it as setXaiApiKey, j as applySyntheticConfig, k as applyQianfanConfig, m as applyMinimaxApiConfig, nt as setVeniceApiKey, ot as setZaiApiKey, pt as validateAnthropicSetupToken, q as setCloudflareAiGatewayConfig, rt as setVercelAiGatewayApiKey, tt as setSyntheticApiKey, v as applyAuthProfileConfig, w as applyMoonshotConfigCn, x as applyKimiCodeConfig, y as applyCloudflareAiGatewayConfig, z as applyXiaomiConfig } from "./github-copilot-auth-BFYQmIBy.js";
33
33
  import { n as setupChannels } from "./onboard-channels-BLdxw-az.js";
@@ -35,7 +35,7 @@ import { i as healthCommand } from "./health-format-DYu9Xelz.js";
35
35
  import { t as renderTable } from "./table-DGEf0ecX.js";
36
36
  import { t as resolveGatewayService } from "./service-BNfl9qMX.js";
37
37
  import { r as isSystemdUserServiceAvailable } from "./systemd-CRc2L6q9.js";
38
- import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-BxaKP8it.js";
38
+ import { l as getVerboseFlag, o as getFlagValue, r as registerSubCliCommands, s as getPositiveIntFlagValue, u as hasFlag } from "./register.subclis-DTvpFcjh.js";
39
39
  import { n as callGatewayFromCli, t as addGatewayClientOptions } from "./gateway-rpc-CBIir0rS.js";
40
40
  import { t as formatHelpExamples } from "./help-format-D6QlSTzg.js";
41
41
  import { t as adminUnlockCommand } from "./admin-unlock-D9kdgQ8v.js";
@@ -45,8 +45,8 @@ 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-CjuJRw9Z.js";
46
46
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, r as isGatewayDaemonRuntime, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-jG1eA54U.js";
47
47
  import { n as ensureSystemdUserLingerNonInteractive } from "./systemd-linger-Qf-ZNSXE.js";
48
- import { t as loginCommand } from "./login-Bx9HuAKm.js";
49
- import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-CrFII2gr.js";
48
+ import { t as loginCommand } from "./login-Cv5_WI44.js";
49
+ import { n as loadAndMaybeMigrateDoctorConfig, t as doctorCommand } from "./doctor-B2DkrTbq.js";
50
50
  import { fileURLToPath } from "node:url";
51
51
  import fs from "node:fs";
52
52
  import path from "node:path";
@@ -3105,7 +3105,7 @@ function registerLoginCommand(program) {
3105
3105
  console.log(theme.muted(` user=${result.userId} org=${result.orgId}`));
3106
3106
  }
3107
3107
  if (opts.chat !== false && result.gatewayUrl && process.stdin.isTTY && process.stdout.isTTY) {
3108
- const { runTui } = await import("./tui-CvG10Z7n.js").then((n) => n.n);
3108
+ const { runTui } = await import("./tui-Bm7zX9r-.js").then((n) => n.n);
3109
3109
  console.log(theme.muted("\n Opening your koi chat…\n"));
3110
3110
  await runTui({
3111
3111
  url: result.gatewayUrl,
@@ -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-Bx9HuAKm.js").then((n) => n.n);
3133
+ const { readAuthFile } = await import("./login-Cv5_WI44.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`."));
@@ -34,7 +34,7 @@ import { a as repairLaunchAgentBootstrap, i as launchAgentPlistExists, n as isLa
34
34
  import { r as isSystemdUserServiceAvailable } from "./systemd-CRc2L6q9.js";
35
35
  import { t as readLastGatewayErrorLine } from "./diagnostics-BPo5b-50.js";
36
36
  import { t as collectChannelStatusIssues } from "./channels-status-issues-RnlrwtQu.js";
37
- import { n as doctorShellCompletion } from "./doctor-completion-CBjLKNei.js";
37
+ import { n as doctorShellCompletion } from "./doctor-completion-DmkLiMnl.js";
38
38
  import { n as resolveControlUiDistIndexHealth, r as resolveControlUiDistIndexPathForRoot } from "./control-ui-assets-CUfeis07.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-jG1eA54U.js";
40
40
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-Qf-ZNSXE.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-JXsKJ6Xp.js";
5
5
  import { c as compareSemverStrings, s as checkUpdateStatus } from "./update-runner--zLQ4p6m.js";
6
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-ktaDqW7j.js";
6
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-DokQhwv9.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-D0gM71s0.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
250
+ import("./run-main-Ch_wiCW0.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
  });
@@ -86,7 +86,7 @@ import { t as resolveChannelDefaultAccountId } from "./helpers-BJ0RdAWy.js";
86
86
  import "./logging-BYKu4FCl.js";
87
87
  import "./note-JXsKJ6Xp.js";
88
88
  import { t as WizardCancelledError } from "./prompts-QLr0uHK3.js";
89
- 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-cS6et69h.js";
89
+ 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-BTcl_hcR.js";
90
90
  import { n as installSkill } from "./onboard-skills-DqXAoYz9.js";
91
91
  import "./github-copilot-auth-BFYQmIBy.js";
92
92
  import "./onboard-channels-BLdxw-az.js";
@@ -105,18 +105,18 @@ import { p as resolveGatewayStateDir } from "./systemd-CRc2L6q9.js";
105
105
  import "./diagnostics-BPo5b-50.js";
106
106
  import "./node-service-WjDdCaA0.js";
107
107
  import "./channels-status-issues-RnlrwtQu.js";
108
- import "./doctor-completion-CBjLKNei.js";
109
- import "./register.subclis-BxaKP8it.js";
108
+ import "./doctor-completion-DmkLiMnl.js";
109
+ import "./register.subclis-DTvpFcjh.js";
110
110
  import { a as createOutboundSendDeps$1, i as resolveKoiOutboundTarget, r as resolveKoiDeliveryPlan, t as koiCommand } from "./koi-Dn4CqamU.js";
111
111
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-CUfeis07.js";
112
112
  import "./daemon-runtime-jG1eA54U.js";
113
113
  import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } from "./widearea-dns-D764X7td.js";
114
114
  import { n as discoverGatewayBeacons } from "./bonjour-discovery-Ci5LSWeP.js";
115
115
  import "./ensure-local-gateway-iBqdIUtF.js";
116
- import "./completion-cli-ktaDqW7j.js";
116
+ import "./completion-cli-DokQhwv9.js";
117
117
  import "./service-audit-C5l53T2M.js";
118
118
  import { i as shouldIncludeHook, n as loadWorkspaceHookEntries, r as resolveHookConfig } from "./hooks-status-7PLz1_ei.js";
119
- import "./tui-CvG10Z7n.js";
119
+ import "./tui-Bm7zX9r-.js";
120
120
  import { t as buildChannelAccountSnapshot } from "./status-nK1ROKw-.js";
121
121
  import "./shared-DhCLX1Xs.js";
122
122
  import { a as runDaemonStop, i as runDaemonStart, n as runDaemonStatus, o as runDaemonUninstall, r as runDaemonRestart, s as runDaemonInstall } from "./daemon-cli-C-PUA0DR.js";
package/dist/index.js CHANGED
@@ -73,11 +73,11 @@ import { t as isMainModule } from "./is-main-DZvllFzQ.js";
73
73
  import { t as ensureSKYKOICliOnPath } from "./path-env-C7V3KfE6.js";
74
74
  import { t as assertSupportedRuntime } from "./runtime-guard-DHvhwccg.js";
75
75
  import "./ports-aBOzofHh.js";
76
- import "./config-guard-BZzCwkmk.js";
76
+ import "./config-guard-BqxtCYkB.js";
77
77
  import "./logging-BYKu4FCl.js";
78
78
  import "./note-JXsKJ6Xp.js";
79
79
  import "./clack-prompter-t8CaZFBV.js";
80
- import "./onboarding-cS6et69h.js";
80
+ import "./onboarding-BTcl_hcR.js";
81
81
  import "./onboard-skills-DqXAoYz9.js";
82
82
  import "./github-copilot-auth-BFYQmIBy.js";
83
83
  import "./onboard-channels-BLdxw-az.js";
@@ -96,8 +96,8 @@ import "./systemd-CRc2L6q9.js";
96
96
  import "./diagnostics-BPo5b-50.js";
97
97
  import "./node-service-WjDdCaA0.js";
98
98
  import "./channels-status-issues-RnlrwtQu.js";
99
- import "./doctor-completion-CBjLKNei.js";
100
- import "./register.subclis-BxaKP8it.js";
99
+ import "./doctor-completion-DmkLiMnl.js";
100
+ import "./register.subclis-DTvpFcjh.js";
101
101
  import "./gateway-rpc-CBIir0rS.js";
102
102
  import "./help-format-D6QlSTzg.js";
103
103
  import "./admin-unlock-D9kdgQ8v.js";
@@ -110,15 +110,15 @@ import "./systemd-linger-Qf-ZNSXE.js";
110
110
  import "./widearea-dns-D764X7td.js";
111
111
  import "./bonjour-discovery-Ci5LSWeP.js";
112
112
  import "./ensure-local-gateway-iBqdIUtF.js";
113
- import "./login-Bx9HuAKm.js";
113
+ import "./login-Cv5_WI44.js";
114
114
  import "./auth-health-DmoN4lSG.js";
115
- import "./doctor-CrFII2gr.js";
116
- import "./completion-cli-ktaDqW7j.js";
115
+ import "./doctor-B2DkrTbq.js";
116
+ import "./completion-cli-DokQhwv9.js";
117
117
  import "./service-audit-C5l53T2M.js";
118
118
  import "./hooks-status-7PLz1_ei.js";
119
- import "./tui-CvG10Z7n.js";
119
+ import "./tui-Bm7zX9r-.js";
120
120
  import "./channel-options-dvFve-yx.js";
121
- import { n as buildProgram } from "./program-7RuJXS6i.js";
121
+ import { n as buildProgram } from "./program-BkfMHvks.js";
122
122
  import process from "node:process";
123
123
  import { fileURLToPath } from "node:url";
124
124
 
@@ -264,14 +264,42 @@ async function writeOnboardingDebug(outcome) {
264
264
  await writeFile(join(dir, "onboarding-debug.json"), JSON.stringify(snap, null, 2));
265
265
  } catch {}
266
266
  }
267
- /**
268
- * Instruction that proactively starts the device koi's deep onboarding pass. The
269
- * koi already knows HOW (its system prompt's "Onboarding & user dossier"
270
- * section) this just triggers it right after login, in a side session, so the
271
- * dossier is built BEFORE the user's first message and the koi knows them from
272
- * its very first reply (no investigating mid-conversation).
273
- */
274
- 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 AND a valid structured profile.json (REQUIRED — use the EXACT schema in your dossier instructions: identity, people[], business.ventures[]+team, projects[], voice, gaps; the website renders profile.json as my knowledge graph, so always set identity.name, fill every array you can, and never skip it or leave it empty): 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.";
267
+ const ONBOARDING_KICKOFF_BODY = "[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 AND a valid structured profile.json (REQUIRED — use the EXACT schema in your dossier instructions: identity, people[], business.ventures[]+team, projects[], voice, gaps; the website renders profile.json as my knowledge graph, so always set identity.name, fill every array you can, and never skip it or leave it empty): 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.";
268
+ /** Prepend what the account already knows about the human (P1 identity seed) so
269
+ * the koi never starts nameless or asks the user their own name — even on a fresh
270
+ * device with no local data to mine. It then verifies + deepens from there. */
271
+ function buildOnboardingKickoff(human, inheritedDossierMd) {
272
+ let head = "";
273
+ if (human && (human.name || human.email)) {
274
+ const facts = [human.name ? `name "${human.name}"` : "", human.email ? `email ${human.email}` : ""].filter(Boolean).join(", ");
275
+ head += `[setup] From your human's SkyKoi account you ALREADY know: ${facts}. Seed identity (name + email) from this immediately, treat it as verified, and NEVER ask the user their own name.\n\n`;
276
+ }
277
+ if (inheritedDossierMd && inheritedDossierMd.trim()) head += `[setup] Your other devices have already built this dossier for your human (from the account). START FROM IT as known truth, then VERIFY + DEEPEN it with what THIS device and connected accounts can see — re-verify anything time-sensitive before stating it. Inherited dossier (USER.md):\n\n--- BEGIN INHERITED DOSSIER ---\n${inheritedDossierMd}\n--- END INHERITED DOSSIER ---\n\n`;
278
+ return head + ONBOARDING_KICKOFF_BODY;
279
+ }
280
+ /** Best-effort: after onboarding builds/refines the dossier, push it to the
281
+ * account so the person's OTHER devices inherit it (P2). Reads the koi's own
282
+ * USER.md + profile.json via the gateway `profile.get` RPC. Never throws. */
283
+ async function uploadDossier(p) {
284
+ try {
285
+ if (!p.client) return;
286
+ const prof = await p.client.request("profile.get", {});
287
+ const dossierMd = typeof prof?.userMd === "string" && prof.userMd.trim() ? prof.userMd : void 0;
288
+ const dossier = prof?.profile ?? void 0;
289
+ if (dossier === void 0 && dossierMd === void 0) return;
290
+ await fetch(`${p.platformUrl}/api/koi/${encodeURIComponent(p.koiId)}/dossier`, {
291
+ method: "PUT",
292
+ headers: {
293
+ "content-type": "application/json",
294
+ Authorization: `Bearer ${p.cliToken}`
295
+ },
296
+ body: JSON.stringify({
297
+ dossier,
298
+ dossierMd
299
+ })
300
+ });
301
+ } catch {}
302
+ }
275
303
  /** A short, human "currently doing" phrase for an onboarding tool call. */
276
304
  function onboardingActivity(tool) {
277
305
  switch (tool) {
@@ -290,7 +318,8 @@ function onboardingActivity(tool) {
290
318
  * message — that made a simple "hi" crawl while the onboarding run competed with
291
319
  * it for the model. We show a clear, live indicator the whole time.
292
320
  */
293
- async function runOnboardingBeforeChat(wsUrl, token) {
321
+ async function runOnboardingBeforeChat(opts) {
322
+ const { wsUrl, token, human, inheritedDossierMd, platformUrl, cliToken, koiId } = opts;
294
323
  const onb = step("Getting to know you");
295
324
  let client = null;
296
325
  let runId = "";
@@ -323,7 +352,7 @@ async function runOnboardingBeforeChat(wsUrl, token) {
323
352
  try {
324
353
  runId = (await client.request("chat.send", {
325
354
  sessionKey: "koi:setup:onboarding",
326
- message: ONBOARDING_KICKOFF,
355
+ message: buildOnboardingKickoff(human, inheritedDossierMd),
327
356
  deliver: false,
328
357
  idempotencyKey: randomBytes(12).toString("hex")
329
358
  }))?.runId ?? "";
@@ -350,6 +379,12 @@ async function runOnboardingBeforeChat(wsUrl, token) {
350
379
  await writeOnboardingDebug(succeeded ? "completed" : "incomplete");
351
380
  if (succeeded) {
352
381
  await markOnboardingComplete();
382
+ await uploadDossier({
383
+ client,
384
+ platformUrl,
385
+ cliToken,
386
+ koiId
387
+ });
353
388
  onb.succeed("Got to know you — your people, your calendar, and what's live");
354
389
  } else onb.warn("Couldn't finish getting to know you yet — I'll pick it up next time you open koi");
355
390
  } catch {
@@ -388,20 +423,18 @@ async function writeAuthFile(data) {
388
423
  }
389
424
  async function openBrowser(url) {
390
425
  const { spawn } = await import("node:child_process");
391
- const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
392
- const args = process.platform === "win32" ? [
426
+ const child = spawn(process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open", process.platform === "win32" ? [
393
427
  "/c",
394
428
  "start",
395
429
  "",
396
430
  url
397
- ] : [url];
398
- try {
399
- spawn(cmd, args, {
400
- stdio: "ignore",
401
- detached: true,
402
- windowsHide: true
403
- }).unref();
404
- } catch {}
431
+ ] : [url], {
432
+ stdio: "ignore",
433
+ detached: true,
434
+ windowsHide: true
435
+ });
436
+ child.on("error", () => {});
437
+ child.unref();
405
438
  }
406
439
  /**
407
440
  * Claim THIS device to the user's koi: resolve their default koi + its gateway
@@ -483,7 +516,8 @@ async function claimDeviceToKoi(platformUrl, token) {
483
516
  });
484
517
  return {
485
518
  koiId: koi.id,
486
- koiName: koi.name
519
+ koiName: koi.name,
520
+ human: info.data?.human
487
521
  };
488
522
  }
489
523
  /**
@@ -675,7 +709,23 @@ async function claimAndFinish(platformUrl, token, base, doClaim) {
675
709
  if (ensure.ok) {
676
710
  online.succeed(`Online — reachable from your phone and ${theme.command("koi.skykoi.com")}`);
677
711
  await requestDevicePermissions();
678
- await runOnboardingBeforeChat(ensure.wsUrl, ensure.token);
712
+ let inheritedDossierMd;
713
+ try {
714
+ const dRes = await fetch(`${platformUrl}/api/koi/${encodeURIComponent(claim.koiId)}/dossier`, { headers: { Authorization: `Bearer ${token}` } });
715
+ if (dRes.ok) {
716
+ const d = (await dRes.json().catch(() => ({})))?.data;
717
+ if (typeof d?.dossierMd === "string" && d.dossierMd.trim()) inheritedDossierMd = d.dossierMd;
718
+ }
719
+ } catch {}
720
+ await runOnboardingBeforeChat({
721
+ wsUrl: ensure.wsUrl,
722
+ token: ensure.token,
723
+ human: claim.human,
724
+ inheritedDossierMd,
725
+ platformUrl,
726
+ cliToken: token,
727
+ koiId: claim.koiId
728
+ });
679
729
  } else if (ensure.wsUrl) {
680
730
  online.warn("Started — opening your chat; it'll connect as your koi finishes coming online");
681
731
  hint(ensure.error);
@@ -37,12 +37,12 @@ import { t as readLastGatewayErrorLine } from "./diagnostics-BPo5b-50.js";
37
37
  import { t as resolveNodeService } from "./node-service-WjDdCaA0.js";
38
38
  import { t as collectChannelStatusIssues } from "./channels-status-issues-RnlrwtQu.js";
39
39
  import { i as redactSecrets, n as formatDuration$1, r as formatGatewayAuthUsed, t as formatAge$1 } from "./format-BPATbSa4.js";
40
- import { a as formatUpdateOneLiner, i as formatUpdateAvailableHint, o as getUpdateCheckResult, r as ensureCompletionCacheExists, s as resolveUpdateAvailability, t as checkShellCompletionStatus } from "./doctor-completion-CBjLKNei.js";
40
+ import { a as formatUpdateOneLiner, i as formatUpdateAvailableHint, o as getUpdateCheckResult, r as ensureCompletionCacheExists, s as resolveUpdateAvailability, t as checkShellCompletionStatus } from "./doctor-completion-DmkLiMnl.js";
41
41
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-CUfeis07.js";
42
42
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-jG1eA54U.js";
43
- import { r as installCompletion } from "./completion-cli-ktaDqW7j.js";
43
+ import { r as installCompletion } from "./completion-cli-DokQhwv9.js";
44
44
  import { t as buildWorkspaceHookStatus } from "./hooks-status-7PLz1_ei.js";
45
- import { t as runTui } from "./tui-CvG10Z7n.js";
45
+ import { t as runTui } from "./tui-Bm7zX9r-.js";
46
46
  import fs from "node:fs";
47
47
  import path from "node:path";
48
48
  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-CBWcyyqn.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";
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$1, { EventEmitter, once } from "events";
36
+ import EventEmitter, { EventEmitter as EventEmitter$1, 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 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";
@@ -20541,7 +20541,7 @@ function loadPluginManifestRegistry(params) {
20541
20541
 
20542
20542
  //#endregion
20543
20543
  //#region src/plugins/schema-validator.ts
20544
- const ajv$1 = new AjvModule({
20544
+ const ajv$1 = new AjvPkg({
20545
20545
  allErrors: true,
20546
20546
  strict: false,
20547
20547
  removeAdditional: false
@@ -48187,7 +48187,7 @@ const PROTOCOL_VERSION = 3;
48187
48187
 
48188
48188
  //#endregion
48189
48189
  //#region src/gateway/protocol/index.ts
48190
- const ajv = new AjvModule({
48190
+ const ajv = new AjvPkg({
48191
48191
  allErrors: true,
48192
48192
  strict: false,
48193
48193
  removeAdditional: false
@@ -68060,7 +68060,7 @@ function enqueueSystemEvent(text, options) {
68060
68060
  const MODEL_CACHE = /* @__PURE__ */ new Map();
68061
68061
  (async () => {
68062
68062
  try {
68063
- const { discoverAuthStorage, discoverModels } = await import("./pi-model-discovery-CBWcyyqn.js").then((n) => n.t);
68063
+ const { discoverAuthStorage, discoverModels } = await import("./pi-model-discovery-szlzYGsC.js").then((n) => n.t);
68064
68064
  await ensureSKYKOIModelsJson(loadConfig());
68065
68065
  const koiDir = resolveSKYKOIKoiDir();
68066
68066
  const models = discoverModels(discoverAuthStorage(koiDir), koiDir).getAll();
@@ -228308,7 +228308,7 @@ const BUFFERABLE_EVENT_SET = new Set([
228308
228308
  * making the data processing more efficient.
228309
228309
  */
228310
228310
  const makeEventBuffer = (logger) => {
228311
- const ev = new EventEmitter$1();
228311
+ const ev = new EventEmitter();
228312
228312
  const historyCache = /* @__PURE__ */ new Set();
228313
228313
  let data = makeBufferData();
228314
228314
  let isBuffering = false;
@@ -233878,7 +233878,7 @@ var BinaryInfo = class {
233878
233878
 
233879
233879
  //#endregion
233880
233880
  //#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
233881
- var AbstractSocketClient = class extends EventEmitter {
233881
+ var AbstractSocketClient = class extends EventEmitter$1 {
233882
233882
  constructor(url, config) {
233883
233883
  super();
233884
233884
  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 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_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 = 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-DLPVdfTL.js";
8
- import { i as registerProgramCommands, n as PLUGIN_CLI_COMMANDS, t as ensureConfigReady } from "./config-guard-BZzCwkmk.js";
9
- import { a as getCommandPath, d as hasHelpOrVersion, l as getVerboseFlag } from "./register.subclis-BxaKP8it.js";
8
+ import { i as registerProgramCommands, n as PLUGIN_CLI_COMMANDS, t as ensureConfigReady } from "./config-guard-BqxtCYkB.js";
9
+ import { a as getCommandPath, d as hasHelpOrVersion, l as getVerboseFlag } from "./register.subclis-DTvpFcjh.js";
10
10
  import { t as ensurePluginRegistryLoaded } from "./plugin-registry-BuRdLnis.js";
11
- import { a as hasEmittedCliBanner, i as formatCliBannerLine, r as emitCliBanner } from "./tui-CvG10Z7n.js";
11
+ import { a as hasEmittedCliBanner, i as formatCliBannerLine, r as emitCliBanner } from "./tui-Bm7zX9r-.js";
12
12
  import { n as resolveCliChannelOptions } from "./channel-options-dvFve-yx.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-Bajz8N4e.js")).registerGatewayCli(program);
127
+ (await import("./gateway-cli-BCisy2BB.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-DcW9hiFW.js")).registerTuiCli(program);
197
+ (await import("./tui-cli-BMiFQoBr.js")).registerTuiCli(program);
198
198
  }
199
199
  },
200
200
  {
@@ -282,14 +282,14 @@ const entries = [
282
282
  name: "update",
283
283
  description: "CLI update helpers",
284
284
  register: async (program) => {
285
- (await import("./update-cli-BO095ruP.js")).registerUpdateCli(program);
285
+ (await import("./update-cli-ByallYT-.js")).registerUpdateCli(program);
286
286
  }
287
287
  },
288
288
  {
289
289
  name: "completion",
290
290
  description: "Generate shell completion script",
291
291
  register: async (program) => {
292
- (await import("./completion-cli-ktaDqW7j.js").then((n) => n.n)).registerCompletionCli(program);
292
+ (await import("./completion-cli-DokQhwv9.js").then((n) => n.n)).registerCompletionCli(program);
293
293
  }
294
294
  }
295
295
  ];
@@ -70,11 +70,11 @@ import "./deps-DMHxLgMp.js";
70
70
  import "./tailscale-CBmv5qCh.js";
71
71
  import { t as ensureSKYKOICliOnPath } from "./path-env-C7V3KfE6.js";
72
72
  import { t as assertSupportedRuntime } from "./runtime-guard-DHvhwccg.js";
73
- import { n as PLUGIN_CLI_COMMANDS, r as findRoutedCommand, t as ensureConfigReady } from "./config-guard-BZzCwkmk.js";
73
+ import { n as PLUGIN_CLI_COMMANDS, r as findRoutedCommand, t as ensureConfigReady } from "./config-guard-BqxtCYkB.js";
74
74
  import "./logging-BYKu4FCl.js";
75
75
  import "./note-JXsKJ6Xp.js";
76
76
  import "./clack-prompter-t8CaZFBV.js";
77
- import "./onboarding-cS6et69h.js";
77
+ import "./onboarding-BTcl_hcR.js";
78
78
  import "./onboard-skills-DqXAoYz9.js";
79
79
  import "./github-copilot-auth-BFYQmIBy.js";
80
80
  import "./onboard-channels-BLdxw-az.js";
@@ -93,8 +93,8 @@ import "./systemd-CRc2L6q9.js";
93
93
  import "./diagnostics-BPo5b-50.js";
94
94
  import "./node-service-WjDdCaA0.js";
95
95
  import "./channels-status-issues-RnlrwtQu.js";
96
- import "./doctor-completion-CBjLKNei.js";
97
- import { a as getCommandPath, c as getPrimaryCommand, d as hasHelpOrVersion } from "./register.subclis-BxaKP8it.js";
96
+ import "./doctor-completion-DmkLiMnl.js";
97
+ import { a as getCommandPath, c as getPrimaryCommand, d as hasHelpOrVersion } from "./register.subclis-DTvpFcjh.js";
98
98
  import "./gateway-rpc-CBIir0rS.js";
99
99
  import "./help-format-D6QlSTzg.js";
100
100
  import "./admin-unlock-D9kdgQ8v.js";
@@ -107,13 +107,13 @@ import "./systemd-linger-Qf-ZNSXE.js";
107
107
  import "./widearea-dns-D764X7td.js";
108
108
  import "./bonjour-discovery-Ci5LSWeP.js";
109
109
  import "./ensure-local-gateway-iBqdIUtF.js";
110
- import "./login-Bx9HuAKm.js";
110
+ import "./login-Cv5_WI44.js";
111
111
  import "./auth-health-DmoN4lSG.js";
112
- import "./doctor-CrFII2gr.js";
113
- import "./completion-cli-ktaDqW7j.js";
112
+ import "./doctor-B2DkrTbq.js";
113
+ import "./completion-cli-DokQhwv9.js";
114
114
  import "./service-audit-C5l53T2M.js";
115
115
  import "./hooks-status-7PLz1_ei.js";
116
- import { r as emitCliBanner } from "./tui-CvG10Z7n.js";
116
+ import { r as emitCliBanner } from "./tui-Bm7zX9r-.js";
117
117
  import process$1 from "node:process";
118
118
  import { fileURLToPath } from "node:url";
119
119
  import fs from "node:fs";
@@ -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-7RuJXS6i.js").then((n) => n.t);
170
+ const { buildProgram } = await import("./program-BkfMHvks.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-Bx9HuAKm.js").then((n) => n.n);
183
+ const { readAuthFile } = await import("./login-Cv5_WI44.js").then((n) => n.n);
184
184
  isLoggedIn = !!(await readAuthFile())?.token;
185
185
  } catch {}
186
186
  let defaultCommand = "tui";
@@ -200,7 +200,7 @@ async function runCli(argv = process$1.argv) {
200
200
  }
201
201
  const primary = getPrimaryCommand(parseArgv);
202
202
  if (primary) {
203
- const { registerSubCliByName } = await import("./register.subclis-BxaKP8it.js").then((n) => n.i);
203
+ const { registerSubCliByName } = await import("./register.subclis-DTvpFcjh.js").then((n) => n.i);
204
204
  await registerSubCliByName(program, primary);
205
205
  }
206
206
  if (!!primary && PLUGIN_CLI_COMMANDS.has(primary)) {
@@ -3455,7 +3455,7 @@ async function runTui(opts) {
3455
3455
  } catch {}
3456
3456
  process.stdout.write("\n Your koi lost its connection and couldn't get it back on its own.\n Signing you back in to bring it online…\n\n");
3457
3457
  try {
3458
- const { loginCommand } = await import("./login-Bx9HuAKm.js").then((n) => n.n);
3458
+ const { loginCommand } = await import("./login-Cv5_WI44.js").then((n) => n.n);
3459
3459
  const result = await loginCommand({});
3460
3460
  if (result?.ok) {
3461
3461
  process.stdout.write("\n All set — reopening your koi…\n\n");
@@ -48,7 +48,7 @@ import "./systemd-CRc2L6q9.js";
48
48
  import "./diagnostics-BPo5b-50.js";
49
49
  import "./daemon-runtime-jG1eA54U.js";
50
50
  import "./ensure-local-gateway-iBqdIUtF.js";
51
- import { t as runTui } from "./tui-CvG10Z7n.js";
51
+ import { t as runTui } from "./tui-Bm7zX9r-.js";
52
52
 
53
53
  //#region src/cli/tui-cli.ts
54
54
  function registerTuiCli(program) {
@@ -86,15 +86,15 @@ import "./service-BNfl9qMX.js";
86
86
  import "./systemd-CRc2L6q9.js";
87
87
  import "./diagnostics-BPo5b-50.js";
88
88
  import "./channels-status-issues-RnlrwtQu.js";
89
- import { a as formatUpdateOneLiner, i as formatUpdateAvailableHint, r as ensureCompletionCacheExists, s as resolveUpdateAvailability, t as checkShellCompletionStatus } from "./doctor-completion-CBjLKNei.js";
90
- import "./register.subclis-BxaKP8it.js";
89
+ import { a as formatUpdateOneLiner, i as formatUpdateAvailableHint, r as ensureCompletionCacheExists, s as resolveUpdateAvailability, t as checkShellCompletionStatus } from "./doctor-completion-DmkLiMnl.js";
90
+ import "./register.subclis-DTvpFcjh.js";
91
91
  import { t as formatHelpExamples } from "./help-format-D6QlSTzg.js";
92
92
  import "./control-ui-assets-CUfeis07.js";
93
93
  import "./daemon-runtime-jG1eA54U.js";
94
94
  import "./systemd-linger-Qf-ZNSXE.js";
95
95
  import "./auth-health-DmoN4lSG.js";
96
- import { t as doctorCommand } from "./doctor-CrFII2gr.js";
97
- import { r as installCompletion } from "./completion-cli-ktaDqW7j.js";
96
+ import { t as doctorCommand } from "./doctor-B2DkrTbq.js";
97
+ import { r as installCompletion } from "./completion-cli-DokQhwv9.js";
98
98
  import "./service-audit-C5l53T2M.js";
99
99
  import "./shared-DhCLX1Xs.js";
100
100
  import { r as runDaemonRestart } from "./daemon-cli-C-PUA0DR.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skykoi",
3
- "version": "2026.3.343",
3
+ "version": "2026.3.345",
4
4
  "description": "SkyKoi — Koi runtime. Multi-channel gateway CLI with RPC Koi.",
5
5
  "keywords": [
6
6
  "cli",