@tickernelz/paperclip-pro-adapter-kimi-local 2026.925.0

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 (86) hide show
  1. package/LICENSE +22 -0
  2. package/dist/cli/format-event.d.ts +2 -0
  3. package/dist/cli/format-event.d.ts.map +1 -0
  4. package/dist/cli/format-event.js +95 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +2 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/index.d.ts +30 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +82 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/server/acp.d.ts +19 -0
  15. package/dist/server/acp.d.ts.map +1 -0
  16. package/dist/server/acp.js +316 -0
  17. package/dist/server/acp.js.map +1 -0
  18. package/dist/server/acp.test.d.ts +2 -0
  19. package/dist/server/acp.test.d.ts.map +1 -0
  20. package/dist/server/acp.test.js +57 -0
  21. package/dist/server/acp.test.js.map +1 -0
  22. package/dist/server/engine-availability.test.d.ts +2 -0
  23. package/dist/server/engine-availability.test.d.ts.map +1 -0
  24. package/dist/server/engine-availability.test.js +41 -0
  25. package/dist/server/engine-availability.test.js.map +1 -0
  26. package/dist/server/execute.acp-failure.test.d.ts +2 -0
  27. package/dist/server/execute.acp-failure.test.d.ts.map +1 -0
  28. package/dist/server/execute.acp-failure.test.js +22 -0
  29. package/dist/server/execute.acp-failure.test.js.map +1 -0
  30. package/dist/server/execute.d.ts +3 -0
  31. package/dist/server/execute.d.ts.map +1 -0
  32. package/dist/server/execute.js +630 -0
  33. package/dist/server/execute.js.map +1 -0
  34. package/dist/server/execute.test.d.ts +2 -0
  35. package/dist/server/execute.test.d.ts.map +1 -0
  36. package/dist/server/execute.test.js +354 -0
  37. package/dist/server/execute.test.js.map +1 -0
  38. package/dist/server/index.d.ts +8 -0
  39. package/dist/server/index.d.ts.map +1 -0
  40. package/dist/server/index.js +66 -0
  41. package/dist/server/index.js.map +1 -0
  42. package/dist/server/parse.d.ts +66 -0
  43. package/dist/server/parse.d.ts.map +1 -0
  44. package/dist/server/parse.js +194 -0
  45. package/dist/server/parse.js.map +1 -0
  46. package/dist/server/parse.test.d.ts +2 -0
  47. package/dist/server/parse.test.d.ts.map +1 -0
  48. package/dist/server/parse.test.js +155 -0
  49. package/dist/server/parse.test.js.map +1 -0
  50. package/dist/server/skills.d.ts +4 -0
  51. package/dist/server/skills.d.ts.map +1 -0
  52. package/dist/server/skills.js +73 -0
  53. package/dist/server/skills.js.map +1 -0
  54. package/dist/server/test.d.ts +3 -0
  55. package/dist/server/test.d.ts.map +1 -0
  56. package/dist/server/test.js +306 -0
  57. package/dist/server/test.js.map +1 -0
  58. package/dist/server/test.test.d.ts +2 -0
  59. package/dist/server/test.test.d.ts.map +1 -0
  60. package/dist/server/test.test.js +126 -0
  61. package/dist/server/test.test.js.map +1 -0
  62. package/dist/server/utils.d.ts +2 -0
  63. package/dist/server/utils.d.ts.map +1 -0
  64. package/dist/server/utils.js +7 -0
  65. package/dist/server/utils.js.map +1 -0
  66. package/dist/ui/build-config.d.ts +3 -0
  67. package/dist/ui/build-config.d.ts.map +1 -0
  68. package/dist/ui/build-config.js +79 -0
  69. package/dist/ui/build-config.js.map +1 -0
  70. package/dist/ui/build-config.test.d.ts +2 -0
  71. package/dist/ui/build-config.test.d.ts.map +1 -0
  72. package/dist/ui/build-config.test.js +73 -0
  73. package/dist/ui/build-config.test.js.map +1 -0
  74. package/dist/ui/index.d.ts +3 -0
  75. package/dist/ui/index.d.ts.map +1 -0
  76. package/dist/ui/index.js +3 -0
  77. package/dist/ui/index.js.map +1 -0
  78. package/dist/ui/parse-stdout.d.ts +9 -0
  79. package/dist/ui/parse-stdout.d.ts.map +1 -0
  80. package/dist/ui/parse-stdout.js +110 -0
  81. package/dist/ui/parse-stdout.js.map +1 -0
  82. package/dist/ui/parse-stdout.test.d.ts +2 -0
  83. package/dist/ui/parse-stdout.test.d.ts.map +1 -0
  84. package/dist/ui/parse-stdout.test.js +84 -0
  85. package/dist/ui/parse-stdout.test.js.map +1 -0
  86. package/package.json +57 -0
@@ -0,0 +1,306 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { asNumber, asString, asStringArray, ensurePathInEnv, parseObject, } from "@tickernelz/paperclip-pro-adapter-utils/server-utils";
5
+ import { ensureAdapterExecutionTargetCommandResolvable, maybeRunSandboxInstallCommand, ensureAdapterExecutionTargetDirectory, runAdapterExecutionTargetProcess, describeAdapterExecutionTarget, resolveAdapterExecutionTargetCwd, } from "@tickernelz/paperclip-pro-adapter-utils/execution-target";
6
+ import { SANDBOX_INSTALL_COMMAND } from "../index.js";
7
+ import { resolveKimiExecutionEngineForRun, testKimiAcpEnvironment } from "./acp.js";
8
+ import { detectKimiAuthRequired, parseKimiJsonl } from "./parse.js";
9
+ import { firstNonEmptyLine } from "./utils.js";
10
+ function summarizeStatus(checks) {
11
+ if (checks.some((check) => check.level === "error"))
12
+ return "fail";
13
+ if (checks.some((check) => check.level === "warn"))
14
+ return "warn";
15
+ return "pass";
16
+ }
17
+ function isNonEmpty(value) {
18
+ return typeof value === "string" && value.trim().length > 0;
19
+ }
20
+ function commandLooksLike(command, expected) {
21
+ const base = path.basename(command).toLowerCase();
22
+ return base === expected || base === `${expected}.cmd` || base === `${expected}.exe`;
23
+ }
24
+ function summarizeProbeDetail(stdout, stderr, parsedError) {
25
+ const raw = parsedError?.trim() || firstNonEmptyLine(stderr) || firstNonEmptyLine(stdout);
26
+ if (!raw)
27
+ return null;
28
+ const clean = raw.replace(/\s+/g, " ").trim();
29
+ const max = 240;
30
+ return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;
31
+ }
32
+ async function pathExists(candidate) {
33
+ return fs.access(candidate).then(() => true).catch(() => false);
34
+ }
35
+ /**
36
+ * config.toml exists on any configured install and is not by itself proof of
37
+ * auth material. Only treat it as such when a [providers.*] table carries a
38
+ * non-empty api_key (direct API-key auth) — the OAuth dirs are checked
39
+ * separately.
40
+ */
41
+ const PROVIDERS_TABLE_RE = /^\s*\[providers\.[^\]]+\]/m;
42
+ const PROVIDER_API_KEY_RE = /^\s*api_key\s*=\s*"[^"]+"/m;
43
+ async function configTomlHasProviderKey(configPath) {
44
+ try {
45
+ const contents = await fs.readFile(configPath, "utf8");
46
+ return PROVIDERS_TABLE_RE.test(contents) && PROVIDER_API_KEY_RE.test(contents);
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ /**
53
+ * Detect Kimi authentication material on the local host: OAuth credentials
54
+ * under $KIMI_CODE_HOME (default ~/.kimi-code) or a config.toml with a keyed
55
+ * provider, plus the KIMI_MODEL_NAME + KIMI_MODEL_API_KEY env pair (config
56
+ * env or server env).
57
+ */
58
+ async function detectLocalKimiAuth(env) {
59
+ if ((isNonEmpty(env.KIMI_MODEL_NAME) || isNonEmpty(process.env.KIMI_MODEL_NAME)) &&
60
+ (isNonEmpty(env.KIMI_MODEL_API_KEY) || isNonEmpty(process.env.KIMI_MODEL_API_KEY))) {
61
+ return "KIMI_MODEL_NAME + KIMI_MODEL_API_KEY environment";
62
+ }
63
+ const kimiCodeHome = (isNonEmpty(env.KIMI_CODE_HOME) && env.KIMI_CODE_HOME.trim()) ||
64
+ (isNonEmpty(process.env.KIMI_CODE_HOME) && process.env.KIMI_CODE_HOME.trim()) ||
65
+ path.join(os.homedir(), ".kimi-code");
66
+ for (const candidate of [path.join(kimiCodeHome, "credentials"), path.join(kimiCodeHome, "oauth")]) {
67
+ if (await pathExists(candidate)) {
68
+ return `${candidate} (kimi login OAuth)`;
69
+ }
70
+ }
71
+ const configPath = path.join(kimiCodeHome, "config.toml");
72
+ if (await configTomlHasProviderKey(configPath)) {
73
+ return `${configPath} ([providers.*] api_key)`;
74
+ }
75
+ return null;
76
+ }
77
+ export async function testEnvironment(ctx) {
78
+ const engineSelection = await resolveKimiExecutionEngineForRun({
79
+ config: parseObject(ctx.config),
80
+ executionTarget: ctx.executionTarget,
81
+ });
82
+ if (engineSelection.unavailableReason) {
83
+ return {
84
+ adapterType: "kimi_local",
85
+ status: "fail",
86
+ checks: [{
87
+ code: "adapter_engine_unavailable",
88
+ level: "error",
89
+ message: engineSelection.unavailableReason,
90
+ }],
91
+ testedAt: new Date().toISOString(),
92
+ };
93
+ }
94
+ if (engineSelection.engine === "acp") {
95
+ return testKimiAcpEnvironment(ctx);
96
+ }
97
+ const checks = [];
98
+ const config = parseObject(ctx.config);
99
+ const command = asString(config.command, "kimi");
100
+ const target = ctx.executionTarget ?? null;
101
+ const targetIsRemote = target?.kind === "remote";
102
+ const cwd = resolveAdapterExecutionTargetCwd(target, asString(config.cwd, ""), process.cwd());
103
+ const targetLabel = targetIsRemote
104
+ ? ctx.environmentName ?? describeAdapterExecutionTarget(target)
105
+ : null;
106
+ const runId = `kimi-envtest-${Date.now()}-${Math.random().toString(16).slice(2)}`;
107
+ if (targetLabel) {
108
+ checks.push({
109
+ code: "kimi_environment_target",
110
+ level: "info",
111
+ message: `Probing inside environment: ${targetLabel}`,
112
+ });
113
+ }
114
+ try {
115
+ await ensureAdapterExecutionTargetDirectory(runId, target, cwd, {
116
+ cwd,
117
+ env: {},
118
+ createIfMissing: true,
119
+ });
120
+ checks.push({
121
+ code: "kimi_cwd_valid",
122
+ level: "info",
123
+ message: `Working directory is valid: ${cwd}`,
124
+ });
125
+ }
126
+ catch (err) {
127
+ checks.push({
128
+ code: "kimi_cwd_invalid",
129
+ level: "error",
130
+ message: err instanceof Error ? err.message : "Invalid working directory",
131
+ detail: cwd,
132
+ });
133
+ }
134
+ const envConfig = parseObject(config.env);
135
+ const env = {};
136
+ for (const [key, value] of Object.entries(envConfig)) {
137
+ if (typeof value === "string")
138
+ env[key] = value;
139
+ }
140
+ const runtimeEnv = ensurePathInEnv({ ...process.env, ...env });
141
+ const installCheck = await maybeRunSandboxInstallCommand({
142
+ runId,
143
+ target,
144
+ adapterKey: "kimi",
145
+ installCommand: SANDBOX_INSTALL_COMMAND,
146
+ detectCommand: command,
147
+ env,
148
+ });
149
+ if (installCheck)
150
+ checks.push(installCheck);
151
+ try {
152
+ await ensureAdapterExecutionTargetCommandResolvable(command, target, cwd, runtimeEnv);
153
+ checks.push({
154
+ code: "kimi_command_resolvable",
155
+ level: "info",
156
+ message: `Command is executable: ${command}`,
157
+ });
158
+ }
159
+ catch (err) {
160
+ checks.push({
161
+ code: "kimi_command_unresolvable",
162
+ level: "error",
163
+ message: err instanceof Error ? err.message : "Command is not executable",
164
+ detail: command,
165
+ });
166
+ }
167
+ const canRunProbe = checks.every((check) => check.code !== "kimi_cwd_invalid" && check.code !== "kimi_command_unresolvable");
168
+ if (canRunProbe && commandLooksLike(command, "kimi")) {
169
+ const versionProbe = await runAdapterExecutionTargetProcess(runId, target, command, ["--version"], {
170
+ cwd,
171
+ env,
172
+ timeoutSec: 15,
173
+ graceSec: 5,
174
+ onLog: async () => { },
175
+ });
176
+ const versionLine = firstNonEmptyLine(versionProbe.stdout) || firstNonEmptyLine(versionProbe.stderr);
177
+ if (!versionProbe.timedOut && (versionProbe.exitCode ?? 1) === 0) {
178
+ checks.push({
179
+ code: "kimi_version_detected",
180
+ level: "info",
181
+ message: `Kimi CLI detected${versionLine ? `: ${versionLine.replace(/\s+/g, " ").trim().slice(0, 120)}` : "."}`,
182
+ });
183
+ }
184
+ else {
185
+ checks.push({
186
+ code: "kimi_version_probe_failed",
187
+ level: "warn",
188
+ message: versionProbe.timedOut
189
+ ? "`kimi --version` timed out."
190
+ : "`kimi --version` did not exit cleanly.",
191
+ ...(versionLine ? { detail: versionLine } : {}),
192
+ });
193
+ }
194
+ }
195
+ const authSource = targetIsRemote
196
+ ? ((isNonEmpty(env.KIMI_MODEL_NAME) && isNonEmpty(env.KIMI_MODEL_API_KEY))
197
+ ? "KIMI_MODEL_NAME + KIMI_MODEL_API_KEY adapter env"
198
+ : null)
199
+ : await detectLocalKimiAuth(env);
200
+ if (authSource) {
201
+ checks.push({
202
+ code: "kimi_auth_detected",
203
+ level: "info",
204
+ message: "Kimi authentication material detected.",
205
+ detail: `Source: ${authSource}.`,
206
+ });
207
+ }
208
+ else {
209
+ checks.push({
210
+ code: "kimi_auth_missing",
211
+ level: "warn",
212
+ message: "No Kimi authentication detected.",
213
+ hint: "Run `kimi login` (OAuth device flow) on the target host, or set KIMI_MODEL_NAME + KIMI_MODEL_API_KEY in the adapter env.",
214
+ });
215
+ }
216
+ if (canRunProbe) {
217
+ if (!commandLooksLike(command, "kimi")) {
218
+ checks.push({
219
+ code: "kimi_hello_probe_skipped_custom_command",
220
+ level: "info",
221
+ message: "Skipped hello probe because command is not `kimi`.",
222
+ detail: command,
223
+ hint: "Use the `kimi` CLI command to run the automatic installation and auth probe.",
224
+ });
225
+ }
226
+ else {
227
+ const model = asString(config.model, "").trim();
228
+ const helloProbeTimeoutSec = Math.max(1, asNumber(config.helloProbeTimeoutSec, 60));
229
+ const extraArgs = (() => {
230
+ const fromExtraArgs = asStringArray(config.extraArgs);
231
+ if (fromExtraArgs.length > 0)
232
+ return fromExtraArgs;
233
+ return asStringArray(config.args);
234
+ })();
235
+ const args = ["--output-format", "stream-json"];
236
+ if (model)
237
+ args.push("-m", model);
238
+ if (extraArgs.length > 0)
239
+ args.push(...extraArgs);
240
+ args.push("-p", "Respond with hello.");
241
+ const probe = await runAdapterExecutionTargetProcess(runId, target, command, args, {
242
+ cwd,
243
+ env,
244
+ timeoutSec: helloProbeTimeoutSec,
245
+ graceSec: 5,
246
+ onLog: async () => { },
247
+ });
248
+ const parsed = parseKimiJsonl(probe.stdout);
249
+ const detail = summarizeProbeDetail(probe.stdout, probe.stderr, parsed.errorMessage);
250
+ const authMeta = detectKimiAuthRequired({
251
+ stdout: probe.stdout,
252
+ stderr: probe.stderr,
253
+ });
254
+ if (probe.timedOut) {
255
+ checks.push({
256
+ code: "kimi_hello_probe_timed_out",
257
+ level: "warn",
258
+ message: "Kimi hello probe timed out.",
259
+ hint: "Retry the probe. If this persists, verify Kimi can run `kimi -p \"Respond with hello.\"` from this directory manually.",
260
+ });
261
+ }
262
+ else if ((probe.exitCode ?? 1) === 0) {
263
+ const summary = parsed.summary.trim();
264
+ const hasHello = /\bhello\b/i.test(summary);
265
+ checks.push({
266
+ code: hasHello ? "kimi_hello_probe_passed" : "kimi_hello_probe_unexpected_output",
267
+ level: hasHello ? "info" : "warn",
268
+ message: hasHello
269
+ ? "Kimi hello probe succeeded."
270
+ : "Kimi probe ran but did not return `hello` as expected.",
271
+ ...(summary ? { detail: summary.replace(/\s+/g, " ").trim().slice(0, 240) } : {}),
272
+ ...(hasHello
273
+ ? {}
274
+ : {
275
+ hint: "Try `kimi -p \"Respond with hello.\" --output-format stream-json` manually to inspect full output.",
276
+ }),
277
+ });
278
+ }
279
+ else if (authMeta.requiresAuth) {
280
+ checks.push({
281
+ code: "kimi_hello_probe_auth_required",
282
+ level: "warn",
283
+ message: "Kimi CLI is installed, but authentication is not ready.",
284
+ ...(detail ? { detail } : {}),
285
+ hint: "Run `kimi login` or configure KIMI_MODEL_NAME + KIMI_MODEL_API_KEY in adapter env/shell, then retry the probe.",
286
+ });
287
+ }
288
+ else {
289
+ checks.push({
290
+ code: "kimi_hello_probe_failed",
291
+ level: "error",
292
+ message: "Kimi hello probe failed.",
293
+ ...(detail ? { detail } : {}),
294
+ hint: "Run `kimi -p \"Respond with hello.\" --output-format stream-json` manually in this working directory to debug.",
295
+ });
296
+ }
297
+ }
298
+ }
299
+ return {
300
+ adapterType: ctx.adapterType,
301
+ status: summarizeStatus(checks),
302
+ checks,
303
+ testedAt: new Date().toISOString(),
304
+ };
305
+ }
306
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.test.d.ts","sourceRoot":"","sources":["../../src/server/test.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
1
+ import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
2
+ const ensureDirectoryMock = vi.hoisted(() => vi.fn(async () => { }));
3
+ const ensureCommandMock = vi.hoisted(() => vi.fn(async () => { }));
4
+ const maybeInstallMock = vi.hoisted(() => vi.fn(async () => null));
5
+ const runProcessMock = vi.hoisted(() => vi.fn());
6
+ vi.mock("@tickernelz/paperclip-pro-adapter-utils/execution-target", () => ({
7
+ describeAdapterExecutionTarget: () => "local",
8
+ ensureAdapterExecutionTargetCommandResolvable: ensureCommandMock,
9
+ ensureAdapterExecutionTargetDirectory: ensureDirectoryMock,
10
+ maybeRunSandboxInstallCommand: maybeInstallMock,
11
+ resolveAdapterExecutionTargetCwd: (_target, configuredCwd, fallbackCwd) => configuredCwd || fallbackCwd,
12
+ runAdapterExecutionTargetProcess: runProcessMock,
13
+ }));
14
+ import { testEnvironment } from "./test.js";
15
+ describe("kimi_local testEnvironment", () => {
16
+ beforeEach(() => {
17
+ ensureDirectoryMock.mockClear();
18
+ ensureCommandMock.mockClear();
19
+ maybeInstallMock.mockClear();
20
+ runProcessMock.mockReset();
21
+ // Keep auth detection deterministic on hosts that really have kimi set up.
22
+ vi.stubEnv("KIMI_MODEL_NAME", "");
23
+ vi.stubEnv("KIMI_MODEL_API_KEY", "");
24
+ vi.stubEnv("KIMI_CODE_HOME", "");
25
+ });
26
+ afterEach(() => {
27
+ vi.unstubAllEnvs();
28
+ });
29
+ it("reports a healthy host with a working version and hello probe", async () => {
30
+ runProcessMock
31
+ .mockResolvedValueOnce({
32
+ exitCode: 0,
33
+ signal: null,
34
+ timedOut: false,
35
+ stdout: "kimi 0.27.0\n",
36
+ stderr: "",
37
+ })
38
+ .mockResolvedValueOnce({
39
+ exitCode: 0,
40
+ signal: null,
41
+ timedOut: false,
42
+ stdout: [
43
+ JSON.stringify({ role: "assistant", content: "hello" }),
44
+ JSON.stringify({ role: "meta", type: "session.resume_hint", session_id: "session_1" }),
45
+ ].join("\n"),
46
+ stderr: "",
47
+ });
48
+ const result = await testEnvironment({
49
+ companyId: "company-1",
50
+ adapterType: "kimi_local",
51
+ config: {
52
+ engine: "cli",
53
+ command: "kimi",
54
+ cwd: "/tmp/project",
55
+ env: {
56
+ KIMI_MODEL_NAME: "kimi-code/kimi-for-coding",
57
+ KIMI_MODEL_API_KEY: "test-key",
58
+ },
59
+ },
60
+ });
61
+ expect(result.status).toBe("pass");
62
+ expect(result.checks.map((check) => check.code)).toEqual(expect.arrayContaining([
63
+ "kimi_command_resolvable",
64
+ "kimi_version_detected",
65
+ "kimi_auth_detected",
66
+ "kimi_hello_probe_passed",
67
+ ]));
68
+ expect(runProcessMock).toHaveBeenNthCalledWith(1, expect.any(String), null, "kimi", ["--version"], expect.any(Object));
69
+ expect(runProcessMock).toHaveBeenNthCalledWith(2, expect.any(String), null, "kimi", expect.arrayContaining([
70
+ "--output-format",
71
+ "stream-json",
72
+ "-p",
73
+ "Respond with hello.",
74
+ ]), expect.any(Object));
75
+ });
76
+ it("passes -m to the hello probe when a model is configured", async () => {
77
+ runProcessMock
78
+ .mockResolvedValueOnce({ exitCode: 0, signal: null, timedOut: false, stdout: "kimi 0.27.0\n", stderr: "" })
79
+ .mockResolvedValueOnce({
80
+ exitCode: 0,
81
+ signal: null,
82
+ timedOut: false,
83
+ stdout: JSON.stringify({ role: "assistant", content: "hello" }),
84
+ stderr: "",
85
+ });
86
+ await testEnvironment({
87
+ companyId: "company-1",
88
+ adapterType: "kimi_local",
89
+ config: {
90
+ engine: "cli",
91
+ command: "kimi",
92
+ cwd: "/tmp/project",
93
+ model: "kimi-code/k3",
94
+ env: { KIMI_MODEL_NAME: "kimi-code/k3", KIMI_MODEL_API_KEY: "test-key" },
95
+ },
96
+ });
97
+ expect(runProcessMock).toHaveBeenNthCalledWith(2, expect.any(String), null, "kimi", expect.arrayContaining(["-m", "kimi-code/k3"]), expect.any(Object));
98
+ });
99
+ it("downgrades missing auth and auth probe failures to warnings", async () => {
100
+ runProcessMock
101
+ .mockResolvedValueOnce({ exitCode: 0, signal: null, timedOut: false, stdout: "kimi 0.27.0\n", stderr: "" })
102
+ .mockResolvedValueOnce({
103
+ exitCode: 1,
104
+ signal: null,
105
+ timedOut: false,
106
+ stdout: "",
107
+ stderr: "Not authenticated. Run `kimi login` to authenticate with a device code.",
108
+ });
109
+ const result = await testEnvironment({
110
+ companyId: "company-1",
111
+ adapterType: "kimi_local",
112
+ config: {
113
+ engine: "cli",
114
+ command: "kimi",
115
+ cwd: "/tmp/project",
116
+ env: { KIMI_CODE_HOME: "/nonexistent-kimi-home-for-test" },
117
+ },
118
+ });
119
+ expect(result.status).toBe("warn");
120
+ expect(result.checks.map((check) => check.code)).toEqual(expect.arrayContaining([
121
+ "kimi_auth_missing",
122
+ "kimi_hello_probe_auth_required",
123
+ ]));
124
+ });
125
+ });
126
+ //# sourceMappingURL=test.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.test.js","sourceRoot":"","sources":["../../src/server/test.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEzE,MAAM,mBAAmB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC;AACpE,MAAM,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC;AAClE,MAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AACnE,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAEjD,EAAE,CAAC,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE,CAAC,CAAC;IACzE,8BAA8B,EAAE,GAAG,EAAE,CAAC,OAAO;IAC7C,6CAA6C,EAAE,iBAAiB;IAChE,qCAAqC,EAAE,mBAAmB;IAC1D,6BAA6B,EAAE,gBAAgB;IAC/C,gCAAgC,EAAE,CAAC,OAAgB,EAAE,aAAqB,EAAE,WAAmB,EAAE,EAAE,CACjG,aAAa,IAAI,WAAW;IAC9B,gCAAgC,EAAE,cAAc;CACjD,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,UAAU,CAAC,GAAG,EAAE;QACd,mBAAmB,CAAC,SAAS,EAAE,CAAC;QAChC,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAC9B,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC7B,cAAc,CAAC,SAAS,EAAE,CAAC;QAC3B,2EAA2E;QAC3E,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAClC,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACrC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,cAAc;aACX,qBAAqB,CAAC;YACrB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE,EAAE;SACX,CAAC;aACD,qBAAqB,CAAC;YACrB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE;gBACN,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;gBACvD,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;aACvF,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QAEL,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE;gBACN,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,cAAc;gBACnB,GAAG,EAAE;oBACH,eAAe,EAAE,2BAA2B;oBAC5C,kBAAkB,EAAE,UAAU;iBAC/B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAuB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CACxE,MAAM,CAAC,eAAe,CAAC;YACrB,yBAAyB;YACzB,uBAAuB;YACvB,oBAAoB;YACpB,yBAAyB;SAC1B,CAAC,CACH,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,CAAC,uBAAuB,CAC5C,CAAC,EACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,IAAI,EACJ,MAAM,EACN,CAAC,WAAW,CAAC,EACb,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,CAAC,uBAAuB,CAC5C,CAAC,EACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,IAAI,EACJ,MAAM,EACN,MAAM,CAAC,eAAe,CAAC;YACrB,iBAAiB;YACjB,aAAa;YACb,IAAI;YACJ,qBAAqB;SACtB,CAAC,EACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,cAAc;aACX,qBAAqB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aAC1G,qBAAqB,CAAC;YACrB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YAC/D,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QAEL,MAAM,eAAe,CAAC;YACpB,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE;gBACN,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,cAAc;gBACnB,KAAK,EAAE,cAAc;gBACrB,GAAG,EAAE,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE;aACzE;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,cAAc,CAAC,CAAC,uBAAuB,CAC5C,CAAC,EACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,IAAI,EACJ,MAAM,EACN,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,EAC9C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,cAAc;aACX,qBAAqB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aAC1G,qBAAqB,CAAC;YACrB,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,yEAAyE;SAClF,CAAC,CAAC;QAEL,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,SAAS,EAAE,WAAW;YACtB,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE;gBACN,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,cAAc;gBACnB,GAAG,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE;aAC3D;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAuB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CACxE,MAAM,CAAC,eAAe,CAAC;YACrB,mBAAmB;YACnB,gCAAgC;SACjC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function firstNonEmptyLine(text: string): string;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD"}
@@ -0,0 +1,7 @@
1
+ export function firstNonEmptyLine(text) {
2
+ return (text
3
+ .split(/\r?\n/)
4
+ .map((line) => line.trim())
5
+ .find(Boolean) ?? "");
6
+ }
7
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,CACL,IAAI;SACD,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CreateConfigValues } from "@tickernelz/paperclip-pro-adapter-utils";
2
+ export declare function buildKimiLocalConfig(v: CreateConfigValues): Record<string, unknown>;
3
+ //# sourceMappingURL=build-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAqDlF,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBnF"}
@@ -0,0 +1,79 @@
1
+ import { DEFAULT_KIMI_LOCAL_MODEL } from "../index.js";
2
+ function parseCommaArgs(value) {
3
+ return value
4
+ .split(",")
5
+ .map((item) => item.trim())
6
+ .filter(Boolean);
7
+ }
8
+ function parseEnvVars(text) {
9
+ const env = {};
10
+ for (const line of text.split(/\r?\n/)) {
11
+ const trimmed = line.trim();
12
+ if (!trimmed || trimmed.startsWith("#"))
13
+ continue;
14
+ const eq = trimmed.indexOf("=");
15
+ if (eq <= 0)
16
+ continue;
17
+ const key = trimmed.slice(0, eq).trim();
18
+ const value = trimmed.slice(eq + 1);
19
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
20
+ continue;
21
+ env[key] = value;
22
+ }
23
+ return env;
24
+ }
25
+ function parseEnvBindings(bindings) {
26
+ if (typeof bindings !== "object" || bindings === null || Array.isArray(bindings))
27
+ return {};
28
+ const env = {};
29
+ for (const [key, raw] of Object.entries(bindings)) {
30
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
31
+ continue;
32
+ if (typeof raw === "string") {
33
+ env[key] = { type: "plain", value: raw };
34
+ continue;
35
+ }
36
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
37
+ continue;
38
+ const rec = raw;
39
+ if (rec.type === "plain" && typeof rec.value === "string") {
40
+ env[key] = { type: "plain", value: rec.value };
41
+ continue;
42
+ }
43
+ if (rec.type === "secret_ref" && typeof rec.secretId === "string") {
44
+ env[key] = {
45
+ type: "secret_ref",
46
+ secretId: rec.secretId,
47
+ ...(typeof rec.version === "number" || rec.version === "latest"
48
+ ? { version: rec.version }
49
+ : {}),
50
+ };
51
+ }
52
+ }
53
+ return env;
54
+ }
55
+ export function buildKimiLocalConfig(v) {
56
+ const ac = {};
57
+ if (v.cwd)
58
+ ac.cwd = v.cwd;
59
+ if (v.instructionsFilePath)
60
+ ac.instructionsFilePath = v.instructionsFilePath;
61
+ ac.model = v.model || DEFAULT_KIMI_LOCAL_MODEL;
62
+ ac.timeoutSec = 0;
63
+ ac.graceSec = 15;
64
+ const env = parseEnvBindings(v.envBindings);
65
+ const legacy = parseEnvVars(v.envVars);
66
+ for (const [key, value] of Object.entries(legacy)) {
67
+ if (!Object.prototype.hasOwnProperty.call(env, key)) {
68
+ env[key] = { type: "plain", value };
69
+ }
70
+ }
71
+ if (Object.keys(env).length > 0)
72
+ ac.env = env;
73
+ if (v.command)
74
+ ac.command = v.command;
75
+ if (v.extraArgs)
76
+ ac.extraArgs = parseCommaArgs(v.extraArgs);
77
+ return ac;
78
+ }
79
+ //# sourceMappingURL=build-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.js","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.test.d.ts","sourceRoot":"","sources":["../../src/ui/build-config.test.ts"],"names":[],"mappings":""}