@jingyi0605/codingns 0.1.4 → 0.1.5

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 (209) hide show
  1. package/dist/public/assets/{TerminalPage-4ulgBhv9.js → TerminalPage-4p6EBqrR.js} +1 -1
  2. package/dist/public/assets/gemini-D4G1NbrE.png +0 -0
  3. package/dist/public/assets/index-CxeghocY.css +1 -0
  4. package/dist/public/assets/index-DXusStl0.js +108 -0
  5. package/dist/public/assets/kimi-BWNNSh7e.png +0 -0
  6. package/dist/public/index.html +2 -2
  7. package/dist/server/config/env.d.ts +6 -0
  8. package/dist/server/config/env.js +145 -0
  9. package/dist/server/config/env.js.map +1 -1
  10. package/dist/server/config/opencode-system-probe-helper-process.d.ts +24 -0
  11. package/dist/server/config/opencode-system-probe-helper-process.js +70 -5
  12. package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -1
  13. package/dist/server/modules/butler/butler-action-context-service.d.ts +30 -0
  14. package/dist/server/modules/butler/butler-action-context-service.js +108 -0
  15. package/dist/server/modules/butler/butler-action-context-service.js.map +1 -0
  16. package/dist/server/modules/butler/butler-auth-service.d.ts +17 -0
  17. package/dist/server/modules/butler/butler-auth-service.js +91 -0
  18. package/dist/server/modules/butler/butler-auth-service.js.map +1 -0
  19. package/dist/server/modules/butler/butler-control-action-service.d.ts +65 -0
  20. package/dist/server/modules/butler/butler-control-action-service.js +296 -0
  21. package/dist/server/modules/butler/butler-control-action-service.js.map +1 -0
  22. package/dist/server/modules/butler/butler-control-session-service.d.ts +55 -0
  23. package/dist/server/modules/butler/butler-control-session-service.js +367 -0
  24. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -0
  25. package/dist/server/modules/butler/butler-controller.d.ts +367 -0
  26. package/dist/server/modules/butler/butler-controller.js +475 -0
  27. package/dist/server/modules/butler/butler-controller.js.map +1 -0
  28. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.d.ts +34 -0
  29. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js +77 -0
  30. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js.map +1 -0
  31. package/dist/server/modules/butler/butler-follow-up-scheduler.d.ts +23 -0
  32. package/dist/server/modules/butler/butler-follow-up-scheduler.js +57 -0
  33. package/dist/server/modules/butler/butler-follow-up-scheduler.js.map +1 -0
  34. package/dist/server/modules/butler/butler-follow-up-service.d.ts +86 -0
  35. package/dist/server/modules/butler/butler-follow-up-service.js +948 -0
  36. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -0
  37. package/dist/server/modules/butler/butler-inbox-service.d.ts +35 -0
  38. package/dist/server/modules/butler/butler-inbox-service.js +136 -0
  39. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -0
  40. package/dist/server/modules/butler/butler-notification-service.d.ts +12 -0
  41. package/dist/server/modules/butler/butler-notification-service.js +45 -0
  42. package/dist/server/modules/butler/butler-notification-service.js.map +1 -0
  43. package/dist/server/modules/butler/butler-profile-service.d.ts +26 -0
  44. package/dist/server/modules/butler/butler-profile-service.js +529 -0
  45. package/dist/server/modules/butler/butler-profile-service.js.map +1 -0
  46. package/dist/server/modules/butler/butler-project-service.d.ts +48 -0
  47. package/dist/server/modules/butler/butler-project-service.js +253 -0
  48. package/dist/server/modules/butler/butler-project-service.js.map +1 -0
  49. package/dist/server/modules/butler/butler-session-service.d.ts +79 -0
  50. package/dist/server/modules/butler/butler-session-service.js +503 -0
  51. package/dist/server/modules/butler/butler-session-service.js.map +1 -0
  52. package/dist/server/modules/butler/butler-session-summary-service.d.ts +55 -0
  53. package/dist/server/modules/butler/butler-session-summary-service.js +382 -0
  54. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -0
  55. package/dist/server/modules/butler/context-aggregator.d.ts +187 -0
  56. package/dist/server/modules/butler/context-aggregator.js +807 -0
  57. package/dist/server/modules/butler/context-aggregator.js.map +1 -0
  58. package/dist/server/modules/butler/instruction-adapter.d.ts +28 -0
  59. package/dist/server/modules/butler/instruction-adapter.js +101 -0
  60. package/dist/server/modules/butler/instruction-adapter.js.map +1 -0
  61. package/dist/server/modules/butler/patrol-execution-service.d.ts +47 -0
  62. package/dist/server/modules/butler/patrol-execution-service.js +347 -0
  63. package/dist/server/modules/butler/patrol-execution-service.js.map +1 -0
  64. package/dist/server/modules/butler/patrol-plan-service.d.ts +54 -0
  65. package/dist/server/modules/butler/patrol-plan-service.js +272 -0
  66. package/dist/server/modules/butler/patrol-plan-service.js.map +1 -0
  67. package/dist/server/modules/butler/patrol-run-service.d.ts +60 -0
  68. package/dist/server/modules/butler/patrol-run-service.js +185 -0
  69. package/dist/server/modules/butler/patrol-run-service.js.map +1 -0
  70. package/dist/server/modules/butler/patrol-scheduler.d.ts +36 -0
  71. package/dist/server/modules/butler/patrol-scheduler.js +99 -0
  72. package/dist/server/modules/butler/patrol-scheduler.js.map +1 -0
  73. package/dist/server/modules/butler/project-memory-service.d.ts +30 -0
  74. package/dist/server/modules/butler/project-memory-service.js +103 -0
  75. package/dist/server/modules/butler/project-memory-service.js.map +1 -0
  76. package/dist/server/modules/butler/provider-adapter-registry.d.ts +61 -0
  77. package/dist/server/modules/butler/provider-adapter-registry.js +430 -0
  78. package/dist/server/modules/butler/provider-adapter-registry.js.map +1 -0
  79. package/dist/server/modules/butler/session-summary-instruction-adapter.d.ts +28 -0
  80. package/dist/server/modules/butler/session-summary-instruction-adapter.js +79 -0
  81. package/dist/server/modules/butler/session-summary-instruction-adapter.js.map +1 -0
  82. package/dist/server/modules/butler/session-summary-scheduler.d.ts +23 -0
  83. package/dist/server/modules/butler/session-summary-scheduler.js +57 -0
  84. package/dist/server/modules/butler/session-summary-scheduler.js.map +1 -0
  85. package/dist/server/modules/butler/verification-run-service.d.ts +73 -0
  86. package/dist/server/modules/butler/verification-run-service.js +633 -0
  87. package/dist/server/modules/butler/verification-run-service.js.map +1 -0
  88. package/dist/server/modules/preferences/profile-service.js +8 -2
  89. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  90. package/dist/server/modules/sessions/claude-runtime-helper-process.js +1 -1
  91. package/dist/server/modules/sessions/claude-runtime-helper-process.js.map +1 -1
  92. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +5 -1
  93. package/dist/server/modules/sessions/codex-app-server-helper-client.js +10 -2
  94. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  95. package/dist/server/modules/sessions/session-controller.d.ts +3 -1
  96. package/dist/server/modules/sessions/session-controller.js +11 -2
  97. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  98. package/dist/server/modules/sessions/session-history-service.d.ts +14 -1
  99. package/dist/server/modules/sessions/session-history-service.js +291 -30
  100. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  101. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +25 -2
  102. package/dist/server/modules/sessions/session-live-runtime-service.js +526 -158
  103. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  104. package/dist/server/modules/sessions/session-provider-error-mapper.js +28 -0
  105. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  106. package/dist/server/modules/workbench/workbench-service.d.ts +7 -1
  107. package/dist/server/modules/workbench/workbench-service.js +31 -7
  108. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  109. package/dist/server/routes/butler.d.ts +3 -0
  110. package/dist/server/routes/butler.js +54 -0
  111. package/dist/server/routes/butler.js.map +1 -0
  112. package/dist/server/server/create-server.d.ts +61 -0
  113. package/dist/server/server/create-server.js +148 -4
  114. package/dist/server/server/create-server.js.map +1 -1
  115. package/dist/server/storage/repositories/butler-control-event-repository.d.ts +8 -0
  116. package/dist/server/storage/repositories/butler-control-event-repository.js +78 -0
  117. package/dist/server/storage/repositories/butler-control-event-repository.js.map +1 -0
  118. package/dist/server/storage/repositories/butler-control-session-repository.d.ts +11 -0
  119. package/dist/server/storage/repositories/butler-control-session-repository.js +86 -0
  120. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -0
  121. package/dist/server/storage/repositories/butler-follow-up-task-repository.d.ts +16 -0
  122. package/dist/server/storage/repositories/butler-follow-up-task-repository.js +252 -0
  123. package/dist/server/storage/repositories/butler-follow-up-task-repository.js.map +1 -0
  124. package/dist/server/storage/repositories/butler-inbox-item-repository.d.ts +15 -0
  125. package/dist/server/storage/repositories/butler-inbox-item-repository.js +111 -0
  126. package/dist/server/storage/repositories/butler-inbox-item-repository.js.map +1 -0
  127. package/dist/server/storage/repositories/butler-notification-archive-repository.d.ts +9 -0
  128. package/dist/server/storage/repositories/butler-notification-archive-repository.js +48 -0
  129. package/dist/server/storage/repositories/butler-notification-archive-repository.js.map +1 -0
  130. package/dist/server/storage/repositories/butler-profile-repository.d.ts +9 -0
  131. package/dist/server/storage/repositories/butler-profile-repository.js +86 -0
  132. package/dist/server/storage/repositories/butler-profile-repository.js.map +1 -0
  133. package/dist/server/storage/repositories/butler-project-repository.d.ts +14 -0
  134. package/dist/server/storage/repositories/butler-project-repository.js +140 -0
  135. package/dist/server/storage/repositories/butler-project-repository.js.map +1 -0
  136. package/dist/server/storage/repositories/butler-session-repository.d.ts +11 -0
  137. package/dist/server/storage/repositories/butler-session-repository.js +106 -0
  138. package/dist/server/storage/repositories/butler-session-repository.js.map +1 -0
  139. package/dist/server/storage/repositories/butler-session-summary-state-repository.d.ts +8 -0
  140. package/dist/server/storage/repositories/butler-session-summary-state-repository.js +62 -0
  141. package/dist/server/storage/repositories/butler-session-summary-state-repository.js.map +1 -0
  142. package/dist/server/storage/repositories/patrol-plan-repository.d.ts +27 -0
  143. package/dist/server/storage/repositories/patrol-plan-repository.js +119 -0
  144. package/dist/server/storage/repositories/patrol-plan-repository.js.map +1 -0
  145. package/dist/server/storage/repositories/patrol-run-repository.d.ts +28 -0
  146. package/dist/server/storage/repositories/patrol-run-repository.js +121 -0
  147. package/dist/server/storage/repositories/patrol-run-repository.js.map +1 -0
  148. package/dist/server/storage/repositories/project-memory-repository.d.ts +15 -0
  149. package/dist/server/storage/repositories/project-memory-repository.js +150 -0
  150. package/dist/server/storage/repositories/project-memory-repository.js.map +1 -0
  151. package/dist/server/storage/repositories/session-checkpoint-repository.d.ts +9 -0
  152. package/dist/server/storage/repositories/session-checkpoint-repository.js +72 -0
  153. package/dist/server/storage/repositories/session-checkpoint-repository.js.map +1 -0
  154. package/dist/server/storage/repositories/session-message-origin-repository.d.ts +10 -0
  155. package/dist/server/storage/repositories/session-message-origin-repository.js +93 -0
  156. package/dist/server/storage/repositories/session-message-origin-repository.js.map +1 -0
  157. package/dist/server/storage/repositories/verification-run-repository.d.ts +29 -0
  158. package/dist/server/storage/repositories/verification-run-repository.js +125 -0
  159. package/dist/server/storage/repositories/verification-run-repository.js.map +1 -0
  160. package/dist/server/storage/sqlite/client.js +39 -0
  161. package/dist/server/storage/sqlite/client.js.map +1 -1
  162. package/dist/server/storage/sqlite/schema.sql +324 -0
  163. package/dist/server/types/domain.d.ts +261 -1
  164. package/dist/server/ws/ws-server.d.ts +2 -1
  165. package/dist/server/ws/ws-server.js +2 -1
  166. package/dist/server/ws/ws-server.js.map +1 -1
  167. package/node_modules/@codingns/session-sync-core/dist/index.d.ts +4 -0
  168. package/node_modules/@codingns/session-sync-core/dist/index.js +4 -0
  169. package/node_modules/@codingns/session-sync-core/dist/index.js.map +1 -1
  170. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.d.ts +18 -0
  171. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js +659 -0
  172. package/node_modules/@codingns/session-sync-core/dist/kimi-message-normalizer.js.map +1 -0
  173. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.d.ts +11 -0
  174. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js +72 -0
  175. package/node_modules/@codingns/session-sync-core/dist/kimi-shared.js.map +1 -0
  176. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +8 -0
  177. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +89 -0
  178. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -1
  179. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +4 -1
  180. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  181. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +41 -0
  182. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +1086 -0
  183. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -0
  184. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +29 -0
  185. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +578 -0
  186. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +1 -0
  187. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +2 -1
  188. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  189. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js +30 -2
  190. package/node_modules/@codingns/session-sync-core/dist/providers/utils.js.map +1 -1
  191. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.d.ts +2 -0
  192. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +43 -5
  193. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
  194. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +2 -0
  195. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +320 -69
  196. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  197. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.d.ts +21 -0
  198. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js +537 -0
  199. package/node_modules/@codingns/session-sync-core/dist/runtime/gemini-runtime.js.map +1 -0
  200. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.d.ts +38 -0
  201. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js +911 -0
  202. package/node_modules/@codingns/session-sync-core/dist/runtime/kimi-runtime.js.map +1 -0
  203. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.d.ts +6 -0
  204. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js +9 -0
  205. package/node_modules/@codingns/session-sync-core/dist/sqlite/node-sqlite.js.map +1 -0
  206. package/node_modules/@codingns/session-sync-core/package.json +8 -0
  207. package/package.json +1 -1
  208. package/dist/public/assets/index-C5lu52cQ.css +0 -1
  209. package/dist/public/assets/index-WpdUo_Vs.js +0 -108
@@ -0,0 +1,659 @@
1
+ import { ensureText, extractTextBlocks } from "./providers/utils.js";
2
+ import { buildApplyPatchFromStructuredFileTool } from "./patch-builder.js";
3
+ const KIMI_CONTROL_TEXT_LINES = new Set([
4
+ "turnbegin",
5
+ "turnend",
6
+ "stepbegin",
7
+ "stepend",
8
+ "stepinterrupted",
9
+ "contentpart",
10
+ "statusupdate",
11
+ "metadata",
12
+ "_usage",
13
+ "_checkpoint"
14
+ ]);
15
+ const KIMI_STATUS_TOKEN_PATTERN = /^chatcmpl[-_a-z0-9]+$/i;
16
+ export function buildKimiMessageRawRef(sessionId, source, lineNumber, partIndex) {
17
+ const suffix = partIndex === undefined ? "" : `&part=${partIndex}`;
18
+ return `kimi://session/${encodeURIComponent(sessionId)}/${source}#line=${lineNumber}${suffix}`;
19
+ }
20
+ export function readKimiPath(value, path) {
21
+ let current = value;
22
+ for (const key of path) {
23
+ if (!current || typeof current !== "object") {
24
+ return undefined;
25
+ }
26
+ current = current[key];
27
+ }
28
+ return current;
29
+ }
30
+ export function readKimiFirstNonEmptyString(record, paths) {
31
+ if (!record) {
32
+ return null;
33
+ }
34
+ for (const path of paths) {
35
+ const value = readKimiPath(record, path);
36
+ if (typeof value === "string" && value.trim()) {
37
+ return value.trim();
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ export function readKimiFirstPresentValue(record, paths) {
43
+ if (!record) {
44
+ return null;
45
+ }
46
+ for (const path of paths) {
47
+ const value = readKimiPath(record, path);
48
+ if (value === undefined || value === null) {
49
+ continue;
50
+ }
51
+ if (typeof value === "string" && !value.trim()) {
52
+ continue;
53
+ }
54
+ return value;
55
+ }
56
+ return null;
57
+ }
58
+ export function resolveKimiMessageRole(record) {
59
+ const rawRole = readKimiFirstNonEmptyString(record, [
60
+ ["role"],
61
+ ["message", "role"],
62
+ ["message", "payload", "role"],
63
+ ["payload", "role"],
64
+ ["event", "role"],
65
+ ["author", "role"],
66
+ ["speaker"]
67
+ ]) ?? "";
68
+ const normalized = rawRole.trim().toLowerCase();
69
+ if (normalized === "user" || normalized === "human") {
70
+ return "user";
71
+ }
72
+ if (normalized === "assistant" || normalized === "ai" || normalized === "model") {
73
+ return "assistant";
74
+ }
75
+ if (normalized === "tool") {
76
+ return "tool";
77
+ }
78
+ if (normalized === "system" || normalized.includes("system")) {
79
+ return "system";
80
+ }
81
+ const rawType = readKimiMessageType(record);
82
+ if (rawType === "user" || rawType === "assistant" || rawType === "tool" || rawType === "system") {
83
+ return rawType;
84
+ }
85
+ return "assistant";
86
+ }
87
+ export function extractKimiMessageBlocks(record) {
88
+ const directCandidates = [
89
+ record.content,
90
+ record.tool_calls,
91
+ readKimiPath(record, ["message", "content"]),
92
+ readKimiPath(record, ["message", "payload"]),
93
+ readKimiPath(record, ["message", "payload", "content"]),
94
+ readKimiPath(record, ["message", "payload", "text"]),
95
+ readKimiPath(record, ["message", "payload", "tool_calls"]),
96
+ readKimiPath(record, ["payload", "content"]),
97
+ readKimiPath(record, ["payload"]),
98
+ readKimiPath(record, ["payload", "text"]),
99
+ readKimiPath(record, ["event", "content"]),
100
+ readKimiPath(record, ["data", "content"]),
101
+ record.parts,
102
+ readKimiPath(record, ["delta", "content"]),
103
+ record.tool,
104
+ record.toolCall,
105
+ record.tool_call,
106
+ record.function_call,
107
+ record.toolResult,
108
+ record.tool_result,
109
+ record.function_result
110
+ ];
111
+ for (const candidate of directCandidates) {
112
+ if (Array.isArray(candidate) && candidate.length > 0) {
113
+ return candidate;
114
+ }
115
+ if (candidate && typeof candidate === "object") {
116
+ return [candidate];
117
+ }
118
+ }
119
+ return [];
120
+ }
121
+ export function looksLikeKimiMessagePayload(payload, wireType = "") {
122
+ return (wireType.includes("message") ||
123
+ wireType.includes("text") ||
124
+ wireType.includes("delta") ||
125
+ wireType.includes("think") ||
126
+ wireType.includes("tool") ||
127
+ wireType.includes("function") ||
128
+ extractKimiMessageBlocks(payload).length > 0 ||
129
+ looksLikeSelfContainedKimiBlock(payload) ||
130
+ readKimiPath(payload, ["text"]) !== undefined ||
131
+ readKimiPath(payload, ["message"]) !== undefined);
132
+ }
133
+ export function normalizeKimiMessageRecord(record) {
134
+ if (isKimiInternalRecord(record)) {
135
+ return [];
136
+ }
137
+ const fallbackRole = resolveKimiMessageRole(record);
138
+ if (looksLikeSelfContainedKimiBlock(record)) {
139
+ const normalized = normalizeKimiMessageBlock(record, fallbackRole);
140
+ if (normalized) {
141
+ return [
142
+ {
143
+ ...normalized,
144
+ partIndex: 0
145
+ }
146
+ ];
147
+ }
148
+ }
149
+ const blocks = extractKimiMessageBlocks(record);
150
+ if (blocks.length > 0) {
151
+ const normalizedBlocks = blocks
152
+ .map((block, blockIndex) => {
153
+ const normalized = normalizeKimiMessageBlock(block, fallbackRole);
154
+ if (!normalized) {
155
+ return null;
156
+ }
157
+ return {
158
+ ...normalized,
159
+ partIndex: blockIndex
160
+ };
161
+ })
162
+ .filter((block) => block !== null);
163
+ if (normalizedBlocks.length > 0) {
164
+ return normalizedBlocks;
165
+ }
166
+ }
167
+ const fallbackText = extractKimiFallbackMessageText(record).trim();
168
+ if (!fallbackText) {
169
+ return [];
170
+ }
171
+ return [
172
+ {
173
+ role: fallbackRole,
174
+ kind: inferKimiFallbackMessageKind(record),
175
+ content: fallbackText,
176
+ toolCall: null,
177
+ partIndex: null
178
+ }
179
+ ];
180
+ }
181
+ function isKimiInternalRecord(record) {
182
+ const rawRole = (readKimiFirstNonEmptyString(record, [
183
+ ["role"],
184
+ ["message", "role"],
185
+ ["message", "payload", "role"],
186
+ ["payload", "role"]
187
+ ]) ?? "").trim().toLowerCase();
188
+ if (rawRole.startsWith("_")) {
189
+ return true;
190
+ }
191
+ const rawType = readKimiMessageType(record);
192
+ return (rawType === "metadata"
193
+ || rawType === "statusupdate"
194
+ || rawType === "turnbegin"
195
+ || rawType === "stepend"
196
+ || rawType === "stepbegin"
197
+ || rawType === "stepinterrupted"
198
+ || rawType === "turnend"
199
+ || (rawType === "contentpart" && !hasKimiDisplayPayload(record)));
200
+ }
201
+ function normalizeKimiMessageBlock(block, fallbackRole) {
202
+ if (typeof block === "string") {
203
+ const content = sanitizeKimiDisplayText(block);
204
+ if (!content) {
205
+ return null;
206
+ }
207
+ return {
208
+ role: fallbackRole,
209
+ kind: "text",
210
+ content,
211
+ toolCall: null
212
+ };
213
+ }
214
+ if (!block || typeof block !== "object") {
215
+ return null;
216
+ }
217
+ const record = block;
218
+ const rawType = readKimiMessageType(record);
219
+ if (rawType.includes("think") || rawType.includes("reason")) {
220
+ const content = sanitizeKimiDisplayText(extractKimiTextContent(record));
221
+ if (!content) {
222
+ return null;
223
+ }
224
+ return {
225
+ role: "assistant",
226
+ kind: "thinking",
227
+ content,
228
+ toolCall: null
229
+ };
230
+ }
231
+ if (rawType.includes("tool_call") ||
232
+ rawType.includes("toolcall") ||
233
+ rawType.includes("tool-use") ||
234
+ rawType.includes("tool_use") ||
235
+ rawType.includes("function_call") ||
236
+ hasKimiToolCallShape(record)) {
237
+ const callId = readKimiFirstNonEmptyString(record, [
238
+ ["id"],
239
+ ["callId"],
240
+ ["call_id"],
241
+ ["tool_use_id"],
242
+ ["payload", "id"],
243
+ ["message", "payload", "id"],
244
+ ["tool_call", "id"],
245
+ ["function_call", "id"],
246
+ ["tool_calls", "0", "id"]
247
+ ]) ??
248
+ "kimi-tool-call";
249
+ const name = readKimiFirstNonEmptyString(record, [
250
+ ["name"],
251
+ ["tool", "name"],
252
+ ["function", "name"],
253
+ ["payload", "function", "name"],
254
+ ["message", "payload", "function", "name"],
255
+ ["tool_call", "name"],
256
+ ["function_call", "name"],
257
+ ["tool_calls", "0", "function", "name"]
258
+ ]) ??
259
+ "unknown_tool";
260
+ const patchText = buildKimiApplyPatchFromToolRecord(record);
261
+ const input = extractKimiFallbackMessageText(readKimiPath(record, ["arguments"]) ??
262
+ readKimiPath(record, ["input"]) ??
263
+ readKimiPath(record, ["params"]) ??
264
+ readKimiPath(record, ["payload", "function", "arguments"]) ??
265
+ readKimiPath(record, ["message", "payload", "function", "arguments"]) ??
266
+ readKimiPath(record, ["tool_call", "arguments"]) ??
267
+ readKimiPath(record, ["tool_call", "input"]) ??
268
+ readKimiPath(record, ["function_call", "arguments"]) ??
269
+ readKimiPath(record, ["function_call", "input"]) ??
270
+ readKimiPath(record, ["tool_calls", "0", "function", "arguments"]));
271
+ const output = extractKimiFallbackMessageText(readKimiPath(record, ["output"]) ??
272
+ readKimiPath(record, ["result"]) ??
273
+ readKimiPath(record, ["payload", "output"]) ??
274
+ readKimiPath(record, ["message", "payload", "output"]) ??
275
+ readKimiPath(record, ["tool_call", "output"]) ??
276
+ readKimiPath(record, ["function_call", "output"]));
277
+ return {
278
+ role: patchText ? "tool" : "assistant",
279
+ kind: "tool_call",
280
+ content: patchText || output || input || name,
281
+ toolCall: {
282
+ callId,
283
+ name: patchText ? "apply_patch" : name,
284
+ input: patchText || input,
285
+ output: output || null,
286
+ error: null,
287
+ status: output ? "completed" : "running"
288
+ }
289
+ };
290
+ }
291
+ if (rawType.includes("tool_result") ||
292
+ rawType.includes("toolresult") ||
293
+ rawType.includes("tool-output") ||
294
+ rawType.includes("tool_output") ||
295
+ rawType.includes("function_result") ||
296
+ hasKimiToolResultShape(record)) {
297
+ const callId = readKimiFirstNonEmptyString(record, [
298
+ ["tool_use_id"],
299
+ ["callId"],
300
+ ["call_id"],
301
+ ["id"],
302
+ ["tool_call_id"],
303
+ ["payload", "tool_call_id"],
304
+ ["message", "payload", "tool_call_id"],
305
+ ["tool_result", "call_id"],
306
+ ["function_result", "call_id"]
307
+ ]) ??
308
+ "kimi-tool-call";
309
+ const output = sanitizeKimiToolResultText(extractKimiFallbackMessageText(readKimiPath(record, ["output"]) ??
310
+ readKimiPath(record, ["result"]) ??
311
+ readKimiPath(record, ["content"]) ??
312
+ readKimiPath(record, ["payload", "return_value", "output"]) ??
313
+ readKimiPath(record, ["message", "payload", "return_value", "output"]) ??
314
+ readKimiPath(record, ["payload", "display"]) ??
315
+ readKimiPath(record, ["message", "payload", "display"]) ??
316
+ readKimiPath(record, ["tool_result", "output"]) ??
317
+ readKimiPath(record, ["function_result", "output"])));
318
+ const isError = readKimiFirstPresentValue(record, [
319
+ ["payload", "return_value", "is_error"],
320
+ ["message", "payload", "return_value", "is_error"]
321
+ ]) === true;
322
+ const messageText = readKimiFirstNonEmptyString(record, [
323
+ ["payload", "return_value", "message"],
324
+ ["message", "payload", "return_value", "message"],
325
+ ["error"],
326
+ ["failure"],
327
+ ["tool_result", "error"],
328
+ ["function_result", "error"]
329
+ ]) ?? null;
330
+ const error = isError
331
+ ? messageText ?? "KIMI_TOOL_RESULT_FAILED"
332
+ : null;
333
+ return {
334
+ role: "tool",
335
+ kind: "tool_result",
336
+ content: output || messageText || error || "",
337
+ toolCall: {
338
+ callId,
339
+ name: readKimiFirstNonEmptyString(record, [
340
+ ["name"],
341
+ ["tool", "name"],
342
+ ["payload", "function", "name"],
343
+ ["message", "payload", "function", "name"],
344
+ ["tool_result", "name"],
345
+ ["function_result", "name"]
346
+ ]) ?? "tool_result",
347
+ input: "",
348
+ output: output || null,
349
+ error,
350
+ status: isError || error ? "failed" : "completed"
351
+ }
352
+ };
353
+ }
354
+ const content = sanitizeKimiDisplayText(extractKimiTextContent(record));
355
+ if (!content) {
356
+ return null;
357
+ }
358
+ return {
359
+ role: fallbackRole,
360
+ kind: "text",
361
+ content,
362
+ toolCall: null
363
+ };
364
+ }
365
+ function readKimiMessageType(record) {
366
+ return (readKimiFirstNonEmptyString(record, [
367
+ ["type"],
368
+ ["kind"],
369
+ ["eventType"],
370
+ ["name"],
371
+ ["message", "type"],
372
+ ["message", "payload", "type"],
373
+ ["payload", "type"],
374
+ ["tool_call", "type"],
375
+ ["tool_result", "type"],
376
+ ["function_call", "type"],
377
+ ["function_result", "type"]
378
+ ]) ?? "")
379
+ .trim()
380
+ .toLowerCase();
381
+ }
382
+ function looksLikeSelfContainedKimiBlock(record) {
383
+ const rawType = readKimiMessageType(record);
384
+ if (rawType.includes("think") ||
385
+ rawType.includes("reason") ||
386
+ rawType.includes("toolcall") ||
387
+ rawType.includes("toolresult") ||
388
+ rawType.includes("tool") ||
389
+ rawType.includes("function")) {
390
+ return true;
391
+ }
392
+ return hasKimiToolCallShape(record) || hasKimiToolResultShape(record);
393
+ }
394
+ function extractKimiFallbackMessageText(value) {
395
+ if (typeof value === "string") {
396
+ return sanitizeKimiDisplayText(value);
397
+ }
398
+ if (value === undefined || value === null) {
399
+ return "";
400
+ }
401
+ return sanitizeKimiDisplayText(extractKimiTextContent(value) || ensureText(value));
402
+ }
403
+ function hasKimiDisplayPayload(record) {
404
+ return extractKimiTextContent(record).trim().length > 0;
405
+ }
406
+ function extractKimiTextContent(value) {
407
+ if (typeof value === "string") {
408
+ return value;
409
+ }
410
+ if (!value || typeof value !== "object") {
411
+ return extractTextBlocks(value);
412
+ }
413
+ const record = value;
414
+ const directValue = readKimiFirstPresentValue(record, [
415
+ ["text"],
416
+ ["content"],
417
+ ["message", "payload"],
418
+ ["message", "payload", "text"],
419
+ ["message", "payload", "content"],
420
+ ["payload"],
421
+ ["payload", "text"],
422
+ ["payload", "content"],
423
+ ["delta"],
424
+ ["delta", "text"],
425
+ ["delta", "content"]
426
+ ]);
427
+ if (directValue !== null) {
428
+ const extracted = extractTextBlocks(directValue);
429
+ if (extracted.trim().length > 0) {
430
+ return extracted;
431
+ }
432
+ }
433
+ return extractTextBlocks(value);
434
+ }
435
+ function sanitizeKimiToolResultText(value) {
436
+ const stripped = value.replace(/<system>[\s\S]*?<\/system>\s*/gi, "").trim();
437
+ return stripped || value.trim();
438
+ }
439
+ function buildKimiApplyPatchFromToolRecord(record) {
440
+ const candidates = [
441
+ toKimiRecord(readKimiPath(record, ["payload", "function", "arguments"])),
442
+ toKimiRecord(readKimiPath(record, ["message", "payload", "function", "arguments"])),
443
+ toKimiRecord(readKimiPath(record, ["tool_calls", "0", "function", "arguments"])),
444
+ toKimiRecord(readKimiPath(record, ["arguments"])),
445
+ toKimiRecord(readKimiPath(record, ["input"])),
446
+ toKimiRecord(readKimiPath(record, ["params"]))
447
+ ];
448
+ for (const candidate of candidates) {
449
+ if (!candidate) {
450
+ continue;
451
+ }
452
+ const patchText = buildApplyPatchFromStructuredFileTool(candidate);
453
+ if (patchText) {
454
+ return patchText;
455
+ }
456
+ }
457
+ return null;
458
+ }
459
+ function toKimiRecord(value) {
460
+ if (!value) {
461
+ return null;
462
+ }
463
+ if (typeof value === "string") {
464
+ try {
465
+ const parsed = JSON.parse(value);
466
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
467
+ ? parsed
468
+ : null;
469
+ }
470
+ catch {
471
+ return null;
472
+ }
473
+ }
474
+ return typeof value === "object" && !Array.isArray(value)
475
+ ? value
476
+ : null;
477
+ }
478
+ function inferKimiFallbackMessageKind(record) {
479
+ const rawType = ensureText(record.type).toLowerCase();
480
+ if (rawType.includes("think") || rawType.includes("reason")) {
481
+ return "thinking";
482
+ }
483
+ return "text";
484
+ }
485
+ function hasKimiToolCallShape(record) {
486
+ return (typeof readKimiPath(record, ["tool_calls"]) !== "undefined" ||
487
+ typeof readKimiPath(record, ["arguments"]) !== "undefined" ||
488
+ typeof readKimiPath(record, ["input"]) !== "undefined" ||
489
+ typeof readKimiPath(record, ["payload", "function"]) !== "undefined" ||
490
+ typeof readKimiPath(record, ["message", "payload", "function"]) !== "undefined" ||
491
+ typeof readKimiPath(record, ["tool_call"]) !== "undefined" ||
492
+ typeof readKimiPath(record, ["function_call"]) !== "undefined");
493
+ }
494
+ function hasKimiToolResultShape(record) {
495
+ return (typeof readKimiPath(record, ["tool_call_id"]) !== "undefined" ||
496
+ typeof readKimiPath(record, ["output"]) !== "undefined" ||
497
+ typeof readKimiPath(record, ["result"]) !== "undefined" ||
498
+ typeof readKimiPath(record, ["payload", "return_value"]) !== "undefined" ||
499
+ typeof readKimiPath(record, ["message", "payload", "return_value"]) !== "undefined" ||
500
+ typeof readKimiPath(record, ["tool_result"]) !== "undefined" ||
501
+ typeof readKimiPath(record, ["function_result"]) !== "undefined");
502
+ }
503
+ export function sanitizeKimiPlainTextLine(line) {
504
+ const normalized = line.trim().toLowerCase();
505
+ if (KIMI_CONTROL_TEXT_LINES.has(normalized) || KIMI_STATUS_TOKEN_PATTERN.test(line.trim())) {
506
+ return "";
507
+ }
508
+ return line.trim();
509
+ }
510
+ export function extractKimiDisplayTextSegments(value) {
511
+ const stripped = stripKimiSystemReminderBlocks(value);
512
+ const lines = stripped.replace(/\r\n/g, "\n").split("\n");
513
+ const transcriptSegments = extractKimiTranscriptSegments(lines);
514
+ if (transcriptSegments !== null) {
515
+ return transcriptSegments;
516
+ }
517
+ const fallback = sanitizeKimiDisplayTextLines(lines);
518
+ return fallback ? [fallback] : [];
519
+ }
520
+ function sanitizeKimiDisplayText(value) {
521
+ return extractKimiDisplayTextSegments(value)
522
+ .join("\n\n")
523
+ .replace(/\n{3,}/g, "\n\n")
524
+ .trim();
525
+ }
526
+ function stripKimiSystemReminderBlocks(value) {
527
+ return value.replace(/<system-reminder\b[^>]*>[\s\S]*?<\/system-reminder>/gi, "");
528
+ }
529
+ function extractKimiTranscriptSegments(lines) {
530
+ const hasContentPart = lines.some((line) => line.trim().toLowerCase() === "contentpart");
531
+ if (!hasContentPart) {
532
+ return null;
533
+ }
534
+ const segments = [];
535
+ const currentLines = [];
536
+ let capturing = false;
537
+ let skipNextStatusToken = false;
538
+ const flushCurrentSegment = () => {
539
+ const content = normalizeKimiTranscriptSegment(currentLines.join("\n"));
540
+ currentLines.length = 0;
541
+ if (!content) {
542
+ return;
543
+ }
544
+ segments.push(content);
545
+ };
546
+ for (const line of lines) {
547
+ const trimmed = line.trim();
548
+ const normalized = trimmed.toLowerCase();
549
+ if (skipNextStatusToken) {
550
+ if (!trimmed) {
551
+ continue;
552
+ }
553
+ if (KIMI_STATUS_TOKEN_PATTERN.test(trimmed)) {
554
+ skipNextStatusToken = false;
555
+ continue;
556
+ }
557
+ skipNextStatusToken = false;
558
+ }
559
+ if (normalized === "contentpart") {
560
+ flushCurrentSegment();
561
+ capturing = true;
562
+ continue;
563
+ }
564
+ if (KIMI_CONTROL_TEXT_LINES.has(normalized)) {
565
+ if (normalized === "statusupdate") {
566
+ skipNextStatusToken = true;
567
+ }
568
+ flushCurrentSegment();
569
+ capturing = false;
570
+ continue;
571
+ }
572
+ if (KIMI_STATUS_TOKEN_PATTERN.test(trimmed)) {
573
+ flushCurrentSegment();
574
+ capturing = false;
575
+ continue;
576
+ }
577
+ if (!capturing) {
578
+ continue;
579
+ }
580
+ if (!trimmed) {
581
+ if (currentLines.length > 0 && currentLines.at(-1) !== "") {
582
+ currentLines.push("");
583
+ }
584
+ continue;
585
+ }
586
+ currentLines.push(line.trimEnd());
587
+ }
588
+ flushCurrentSegment();
589
+ return collapseKimiTranscriptSegments(segments);
590
+ }
591
+ function collapseKimiTranscriptSegments(segments) {
592
+ const collapsed = [];
593
+ for (const segment of segments) {
594
+ const normalizedSegment = normalizeKimiTranscriptSegment(segment);
595
+ if (!normalizedSegment) {
596
+ continue;
597
+ }
598
+ const previous = collapsed.at(-1);
599
+ if (!previous) {
600
+ collapsed.push(normalizedSegment);
601
+ continue;
602
+ }
603
+ const comparablePrevious = normalizeComparableKimiTranscriptText(previous);
604
+ const comparableCurrent = normalizeComparableKimiTranscriptText(normalizedSegment);
605
+ if (!comparableCurrent || comparableCurrent === comparablePrevious) {
606
+ continue;
607
+ }
608
+ if (comparableCurrent.includes(comparablePrevious)) {
609
+ collapsed[collapsed.length - 1] = normalizedSegment;
610
+ continue;
611
+ }
612
+ if (comparablePrevious.includes(comparableCurrent)) {
613
+ continue;
614
+ }
615
+ collapsed.push(normalizedSegment);
616
+ }
617
+ return collapsed;
618
+ }
619
+ function normalizeComparableKimiTranscriptText(value) {
620
+ return value
621
+ .trim()
622
+ .toLowerCase()
623
+ .replace(/\s+/g, " ");
624
+ }
625
+ function normalizeKimiTranscriptSegment(value) {
626
+ return value
627
+ .replace(/\n{3,}/g, "\n\n")
628
+ .trim();
629
+ }
630
+ function sanitizeKimiDisplayTextLines(lines) {
631
+ const keptLines = [];
632
+ let skipNextStatusToken = false;
633
+ for (const line of lines) {
634
+ const trimmed = line.trim();
635
+ const normalized = trimmed.toLowerCase();
636
+ if (skipNextStatusToken) {
637
+ if (!trimmed) {
638
+ continue;
639
+ }
640
+ if (KIMI_STATUS_TOKEN_PATTERN.test(trimmed)) {
641
+ skipNextStatusToken = false;
642
+ continue;
643
+ }
644
+ skipNextStatusToken = false;
645
+ }
646
+ if (KIMI_CONTROL_TEXT_LINES.has(normalized)) {
647
+ if (normalized === "statusupdate") {
648
+ skipNextStatusToken = true;
649
+ }
650
+ continue;
651
+ }
652
+ keptLines.push(line);
653
+ }
654
+ return keptLines
655
+ .join("\n")
656
+ .replace(/\n{3,}/g, "\n\n")
657
+ .trim();
658
+ }
659
+ //# sourceMappingURL=kimi-message-normalizer.js.map