@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,73 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildKimiLocalConfig } from "./build-config.js";
3
+ function makeValues(overrides = {}) {
4
+ return {
5
+ adapterType: "kimi_local",
6
+ cwd: "",
7
+ instructionsFilePath: "",
8
+ promptTemplate: "",
9
+ model: "",
10
+ thinkingEffort: "",
11
+ chrome: false,
12
+ dangerouslySkipPermissions: true,
13
+ search: false,
14
+ fastMode: false,
15
+ dangerouslyBypassSandbox: false,
16
+ command: "",
17
+ args: "",
18
+ extraArgs: "",
19
+ envVars: "",
20
+ envBindings: {},
21
+ url: "",
22
+ bootstrapPrompt: "",
23
+ payloadTemplateJson: "",
24
+ workspaceStrategyType: "project_primary",
25
+ workspaceBaseRef: "",
26
+ workspaceBranchTemplate: "",
27
+ worktreeParentDir: "",
28
+ runtimeServicesJson: "",
29
+ maxTurnsPerRun: 1000,
30
+ heartbeatEnabled: false,
31
+ intervalSec: 300,
32
+ ...overrides,
33
+ };
34
+ }
35
+ describe("buildKimiLocalConfig", () => {
36
+ it("defaults the model to kimi-code/kimi-for-coding when unset", () => {
37
+ const config = buildKimiLocalConfig(makeValues());
38
+ expect(config.model).toBe("kimi-code/kimi-for-coding");
39
+ expect(config.timeoutSec).toBe(0);
40
+ expect(config.graceSec).toBe(15);
41
+ });
42
+ it("persists an explicit model and command", () => {
43
+ const config = buildKimiLocalConfig(makeValues({
44
+ model: "kimi-code/k3",
45
+ command: "/usr/local/bin/kimi",
46
+ }));
47
+ expect(config.model).toBe("kimi-code/k3");
48
+ expect(config.command).toBe("/usr/local/bin/kimi");
49
+ });
50
+ it("persists cwd, instructionsFilePath, and extra args", () => {
51
+ const config = buildKimiLocalConfig(makeValues({
52
+ cwd: "/tmp/project",
53
+ instructionsFilePath: "/tmp/project/AGENTS.md",
54
+ extraArgs: "--add-dir /tmp/other, --plan",
55
+ }));
56
+ expect(config.cwd).toBe("/tmp/project");
57
+ expect(config.instructionsFilePath).toBe("/tmp/project/AGENTS.md");
58
+ expect(config.extraArgs).toEqual(["--add-dir /tmp/other", "--plan"]);
59
+ });
60
+ it("merges legacy env vars with secret bindings", () => {
61
+ const config = buildKimiLocalConfig(makeValues({
62
+ envVars: "KIMI_MODEL_NAME=kimi-code/k3\n# comment\nINVALID LINE",
63
+ envBindings: {
64
+ KIMI_MODEL_API_KEY: { type: "secret_ref", secretId: "secret-1" },
65
+ },
66
+ }));
67
+ expect(config.env).toEqual({
68
+ KIMI_MODEL_NAME: { type: "plain", value: "kimi-code/k3" },
69
+ KIMI_MODEL_API_KEY: { type: "secret_ref", secretId: "secret-1" },
70
+ });
71
+ });
72
+ });
73
+ //# sourceMappingURL=build-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.test.js","sourceRoot":"","sources":["../../src/ui/build-config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { parseKimiStdoutLine } from "./parse-stdout.js";
2
+ export { buildKimiLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseKimiStdoutLine } from "./parse-stdout.js";
2
+ export { buildKimiLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { TranscriptEntry } from "@tickernelz/paperclip-pro-adapter-utils";
2
+ /**
3
+ * Map one `kimi -p ... --output-format stream-json` stdout line to transcript
4
+ * entries. Verified shapes (kimi 0.27.0): assistant content, assistant
5
+ * tool_calls (arguments is a JSON-encoded string), tool results, and a
6
+ * trailing meta session.resume_hint event.
7
+ */
8
+ export declare function parseKimiStdoutLine(line: string, ts: string): TranscriptEntry[];
9
+ //# sourceMappingURL=parse-stdout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAyC/E;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE,CAkE/E"}
@@ -0,0 +1,110 @@
1
+ import { parseAcpxStdoutLine } from "@tickernelz/paperclip-pro-adapter-utils/acpx-engine/ui";
2
+ function safeJsonParse(text) {
3
+ try {
4
+ return JSON.parse(text);
5
+ }
6
+ catch {
7
+ return null;
8
+ }
9
+ }
10
+ function asRecord(value) {
11
+ if (typeof value !== "object" || value === null || Array.isArray(value))
12
+ return null;
13
+ return value;
14
+ }
15
+ function asString(value, fallback = "") {
16
+ return typeof value === "string" ? value : fallback;
17
+ }
18
+ function stringifyUnknown(value) {
19
+ if (typeof value === "string")
20
+ return value;
21
+ if (value === null || value === undefined)
22
+ return "";
23
+ try {
24
+ return JSON.stringify(value, null, 2);
25
+ }
26
+ catch {
27
+ return String(value);
28
+ }
29
+ }
30
+ function parseToolCallArguments(value) {
31
+ if (typeof value !== "string")
32
+ return value ?? {};
33
+ const trimmed = value.trim();
34
+ if (!trimmed)
35
+ return {};
36
+ try {
37
+ return JSON.parse(trimmed);
38
+ }
39
+ catch {
40
+ return value;
41
+ }
42
+ }
43
+ /**
44
+ * Map one `kimi -p ... --output-format stream-json` stdout line to transcript
45
+ * entries. Verified shapes (kimi 0.27.0): assistant content, assistant
46
+ * tool_calls (arguments is a JSON-encoded string), tool results, and a
47
+ * trailing meta session.resume_hint event.
48
+ */
49
+ export function parseKimiStdoutLine(line, ts) {
50
+ const parsed = asRecord(safeJsonParse(line));
51
+ if (!parsed) {
52
+ return [{ kind: "stdout", ts, text: line }];
53
+ }
54
+ // ACP-lane runs emit acpx.* events (streaming text deltas, tool-call status
55
+ // lifecycle); delegate those to the shared acpx transcript parser.
56
+ if (asString(parsed.type).startsWith("acpx.")) {
57
+ return parseAcpxStdoutLine(line, ts);
58
+ }
59
+ const role = asString(parsed.role).trim().toLowerCase();
60
+ if (role === "assistant") {
61
+ const entries = [];
62
+ const content = asString(parsed.content).trim();
63
+ if (content)
64
+ entries.push({ kind: "assistant", ts, text: content });
65
+ const toolCalls = Array.isArray(parsed.tool_calls) ? parsed.tool_calls : [];
66
+ for (const callRaw of toolCalls) {
67
+ const call = asRecord(callRaw);
68
+ if (!call)
69
+ continue;
70
+ const fn = asRecord(call.function);
71
+ const name = asString(fn?.name, asString(call.name, "tool")).trim() || "tool";
72
+ entries.push({
73
+ kind: "tool_call",
74
+ ts,
75
+ name,
76
+ input: parseToolCallArguments(fn?.arguments ?? call.arguments),
77
+ toolUseId: asString(call.id).trim() || undefined,
78
+ });
79
+ }
80
+ return entries;
81
+ }
82
+ if (role === "tool") {
83
+ const toolUseId = asString(parsed.tool_call_id).trim() || "tool_result";
84
+ const content = asString(parsed.content) || stringifyUnknown(parsed.content);
85
+ return [{
86
+ kind: "tool_result",
87
+ ts,
88
+ toolUseId,
89
+ content,
90
+ isError: false,
91
+ }];
92
+ }
93
+ if (role === "meta") {
94
+ const type = asString(parsed.type).trim();
95
+ if (type === "session.resume_hint") {
96
+ const sessionId = asString(parsed.session_id).trim();
97
+ return sessionId ? [{ kind: "system", ts, text: `session: ${sessionId}` }] : [];
98
+ }
99
+ return [];
100
+ }
101
+ if (role === "error" || asString(parsed.type).trim().toLowerCase() === "error") {
102
+ const text = asString(parsed.content) ||
103
+ asString(parsed.message) ||
104
+ asString(parsed.error) ||
105
+ "Kimi error";
106
+ return [{ kind: "stderr", ts, text }];
107
+ }
108
+ return [{ kind: "stdout", ts, text: line }];
109
+ }
110
+ //# sourceMappingURL=parse-stdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-stdout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.test.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseKimiStdoutLine } from "./parse-stdout.js";
3
+ const ts = "2026-07-19T00:00:00.000Z";
4
+ describe("parseKimiStdoutLine ACP delegation", () => {
5
+ it("delegates acpx.* events to the shared acpx transcript parser", () => {
6
+ const line = JSON.stringify({ type: "acpx.tool_call", name: "Terminal", status: "pending", text: "Terminal (pending)" });
7
+ const entries = parseKimiStdoutLine(line, ts);
8
+ // The shared parser produces a structured entry, not the raw stdout fallback.
9
+ expect(entries.length).toBeGreaterThan(0);
10
+ expect(entries.every((e) => e.kind !== "stdout")).toBe(true);
11
+ });
12
+ it("still parses native kimi role events (no acpx type)", () => {
13
+ const line = JSON.stringify({ role: "assistant", content: "hi" });
14
+ expect(parseKimiStdoutLine(line, ts)).toEqual([{ kind: "assistant", ts, text: "hi" }]);
15
+ });
16
+ });
17
+ describe("parseKimiStdoutLine", () => {
18
+ it("renders assistant content as an assistant transcript entry", () => {
19
+ const line = JSON.stringify({
20
+ role: "assistant",
21
+ content: "PAPERCLIP_ADAPTER_TEST_OK",
22
+ });
23
+ expect(parseKimiStdoutLine(line, ts)).toEqual([
24
+ { kind: "assistant", ts, text: "PAPERCLIP_ADAPTER_TEST_OK" },
25
+ ]);
26
+ });
27
+ it("renders assistant tool_calls with parsed arguments", () => {
28
+ const line = JSON.stringify({
29
+ role: "assistant",
30
+ tool_calls: [{
31
+ type: "function",
32
+ id: "tool_8c1OWyRBe68OMTbWY6NqnkMm",
33
+ function: { name: "Read", arguments: "{\"path\":\"probe.txt\"}" },
34
+ }],
35
+ });
36
+ expect(parseKimiStdoutLine(line, ts)).toEqual([
37
+ {
38
+ kind: "tool_call",
39
+ ts,
40
+ name: "Read",
41
+ input: { path: "probe.txt" },
42
+ toolUseId: "tool_8c1OWyRBe68OMTbWY6NqnkMm",
43
+ },
44
+ ]);
45
+ });
46
+ it("renders tool results as tool_result entries", () => {
47
+ const line = JSON.stringify({
48
+ role: "tool",
49
+ tool_call_id: "tool_8c1OWyRBe68OMTbWY6NqnkMm",
50
+ content: "1\thello paperclip",
51
+ });
52
+ expect(parseKimiStdoutLine(line, ts)).toEqual([
53
+ {
54
+ kind: "tool_result",
55
+ ts,
56
+ toolUseId: "tool_8c1OWyRBe68OMTbWY6NqnkMm",
57
+ content: "1\thello paperclip",
58
+ isError: false,
59
+ },
60
+ ]);
61
+ });
62
+ it("surfaces the meta session resume hint as session info", () => {
63
+ const line = JSON.stringify({
64
+ role: "meta",
65
+ type: "session.resume_hint",
66
+ session_id: "session_769ddab9-0a25-4edd-99f4-cdfebdc90879",
67
+ command: "kimi -r session_769ddab9-0a25-4edd-99f4-cdfebdc90879",
68
+ content: "To resume this session: kimi -r session_769ddab9-0a25-4edd-99f4-cdfebdc90879",
69
+ });
70
+ expect(parseKimiStdoutLine(line, ts)).toEqual([
71
+ { kind: "system", ts, text: "session: session_769ddab9-0a25-4edd-99f4-cdfebdc90879" },
72
+ ]);
73
+ });
74
+ it("ignores unrecognized meta lines", () => {
75
+ const line = JSON.stringify({ role: "meta", type: "progress", content: "working" });
76
+ expect(parseKimiStdoutLine(line, ts)).toEqual([]);
77
+ });
78
+ it("passes non-JSON lines through as stdout", () => {
79
+ expect(parseKimiStdoutLine("plain output line", ts)).toEqual([
80
+ { kind: "stdout", ts, text: "plain output line" },
81
+ ]);
82
+ });
83
+ });
84
+ //# sourceMappingURL=parse-stdout.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.test.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@tickernelz/paperclip-pro-adapter-kimi-local",
3
+ "version": "2026.925.0",
4
+ "license": "MIT",
5
+ "homepage": "https://github.com/tickernelz/paperclip-pro",
6
+ "bugs": {
7
+ "url": "https://github.com/tickernelz/paperclip-pro/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/tickernelz/paperclip-pro",
12
+ "directory": "packages/adapters/kimi-local"
13
+ },
14
+ "type": "module",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./server": {
21
+ "types": "./dist/server/index.d.ts",
22
+ "import": "./dist/server/index.js"
23
+ },
24
+ "./ui": {
25
+ "types": "./dist/ui/index.d.ts",
26
+ "import": "./dist/ui/index.js"
27
+ },
28
+ "./cli": {
29
+ "types": "./dist/cli/index.d.ts",
30
+ "import": "./dist/cli/index.js"
31
+ }
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "files": [
37
+ "dist"
38
+ ],
39
+ "dependencies": {
40
+ "@tickernelz/paperclip-pro-adapter-utils": "2026.925.0",
41
+ "picocolors": "^1.1.1"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^24.0.0",
45
+ "typescript": "^7.0.2"
46
+ },
47
+ "engines": {
48
+ "node": ">=24.11.0"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc",
52
+ "clean": "rm -rf dist",
53
+ "typecheck": "tsc --noEmit"
54
+ },
55
+ "main": "./dist/index.js",
56
+ "types": "./dist/index.d.ts"
57
+ }