pybao-cli 1.3.3

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 (185) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +440 -0
  3. package/README.zh-CN.md +338 -0
  4. package/cli-acp.js +82 -0
  5. package/cli.js +105 -0
  6. package/dist/REPL-WPV32MTF.js +42 -0
  7. package/dist/REPL-WPV32MTF.js.map +7 -0
  8. package/dist/acp-75HO2LBV.js +1357 -0
  9. package/dist/acp-75HO2LBV.js.map +7 -0
  10. package/dist/agentsValidate-6Z57ARKC.js +373 -0
  11. package/dist/agentsValidate-6Z57ARKC.js.map +7 -0
  12. package/dist/ask-NXXXCGY4.js +125 -0
  13. package/dist/ask-NXXXCGY4.js.map +7 -0
  14. package/dist/autoUpdater-PJMGNPUG.js +17 -0
  15. package/dist/autoUpdater-PJMGNPUG.js.map +7 -0
  16. package/dist/chunk-27GYWUY2.js +72 -0
  17. package/dist/chunk-27GYWUY2.js.map +7 -0
  18. package/dist/chunk-3DFBSQIT.js +23 -0
  19. package/dist/chunk-3DFBSQIT.js.map +7 -0
  20. package/dist/chunk-3KNGJX7Q.js +794 -0
  21. package/dist/chunk-3KNGJX7Q.js.map +7 -0
  22. package/dist/chunk-3PDD7M4T.js +164 -0
  23. package/dist/chunk-3PDD7M4T.js.map +7 -0
  24. package/dist/chunk-3ZNSAB7B.js +515 -0
  25. package/dist/chunk-3ZNSAB7B.js.map +7 -0
  26. package/dist/chunk-4SNFQYCY.js +511 -0
  27. package/dist/chunk-4SNFQYCY.js.map +7 -0
  28. package/dist/chunk-4XPNRLJG.js +1609 -0
  29. package/dist/chunk-4XPNRLJG.js.map +7 -0
  30. package/dist/chunk-5P7HBXTD.js +12 -0
  31. package/dist/chunk-5P7HBXTD.js.map +7 -0
  32. package/dist/chunk-6RZIUY5K.js +191 -0
  33. package/dist/chunk-6RZIUY5K.js.map +7 -0
  34. package/dist/chunk-6WELHKDA.js +240 -0
  35. package/dist/chunk-6WELHKDA.js.map +7 -0
  36. package/dist/chunk-7AAE6EO2.js +145 -0
  37. package/dist/chunk-7AAE6EO2.js.map +7 -0
  38. package/dist/chunk-A3BVXXA3.js +47 -0
  39. package/dist/chunk-A3BVXXA3.js.map +7 -0
  40. package/dist/chunk-A6PUMROK.js +152 -0
  41. package/dist/chunk-A6PUMROK.js.map +7 -0
  42. package/dist/chunk-BH3Y62E3.js +11 -0
  43. package/dist/chunk-BH3Y62E3.js.map +7 -0
  44. package/dist/chunk-BJSWTHRM.js +16 -0
  45. package/dist/chunk-BJSWTHRM.js.map +7 -0
  46. package/dist/chunk-BQA2EOUU.js +124 -0
  47. package/dist/chunk-BQA2EOUU.js.map +7 -0
  48. package/dist/chunk-CZZKRPE2.js +19 -0
  49. package/dist/chunk-CZZKRPE2.js.map +7 -0
  50. package/dist/chunk-ERMQRV55.js +24 -0
  51. package/dist/chunk-ERMQRV55.js.map +7 -0
  52. package/dist/chunk-HB2P6645.js +34 -0
  53. package/dist/chunk-HB2P6645.js.map +7 -0
  54. package/dist/chunk-HIRIJ2LQ.js +1256 -0
  55. package/dist/chunk-HIRIJ2LQ.js.map +7 -0
  56. package/dist/chunk-ICTEVBLN.js +735 -0
  57. package/dist/chunk-ICTEVBLN.js.map +7 -0
  58. package/dist/chunk-JKGOGSFT.js +128 -0
  59. package/dist/chunk-JKGOGSFT.js.map +7 -0
  60. package/dist/chunk-JZDE77EH.js +836 -0
  61. package/dist/chunk-JZDE77EH.js.map +7 -0
  62. package/dist/chunk-M624LT6O.js +17 -0
  63. package/dist/chunk-M624LT6O.js.map +7 -0
  64. package/dist/chunk-OMELVAJD.js +96 -0
  65. package/dist/chunk-OMELVAJD.js.map +7 -0
  66. package/dist/chunk-OUXHGDLH.js +95 -0
  67. package/dist/chunk-OUXHGDLH.js.map +7 -0
  68. package/dist/chunk-PCXUZ6AT.js +249 -0
  69. package/dist/chunk-PCXUZ6AT.js.map +7 -0
  70. package/dist/chunk-Q24ZGKIE.js +1097 -0
  71. package/dist/chunk-Q24ZGKIE.js.map +7 -0
  72. package/dist/chunk-QBHEERCF.js +30254 -0
  73. package/dist/chunk-QBHEERCF.js.map +7 -0
  74. package/dist/chunk-QIHB5PYM.js +472 -0
  75. package/dist/chunk-QIHB5PYM.js.map +7 -0
  76. package/dist/chunk-RQVLBMP7.js +24 -0
  77. package/dist/chunk-RQVLBMP7.js.map +7 -0
  78. package/dist/chunk-SWYJOV5E.js +490 -0
  79. package/dist/chunk-SWYJOV5E.js.map +7 -0
  80. package/dist/chunk-T6GVXTNQ.js +21 -0
  81. package/dist/chunk-T6GVXTNQ.js.map +7 -0
  82. package/dist/chunk-T7GPUZVK.js +766 -0
  83. package/dist/chunk-T7GPUZVK.js.map +7 -0
  84. package/dist/chunk-TXFCNQDE.js +2934 -0
  85. package/dist/chunk-TXFCNQDE.js.map +7 -0
  86. package/dist/chunk-UNNVICVU.js +95 -0
  87. package/dist/chunk-UNNVICVU.js.map +7 -0
  88. package/dist/chunk-UUNVJZWA.js +515 -0
  89. package/dist/chunk-UUNVJZWA.js.map +7 -0
  90. package/dist/chunk-VRGR4ZTQ.js +49 -0
  91. package/dist/chunk-VRGR4ZTQ.js.map +7 -0
  92. package/dist/chunk-VTVTEE5N.js +2613 -0
  93. package/dist/chunk-VTVTEE5N.js.map +7 -0
  94. package/dist/chunk-WPTPPOYN.js +936 -0
  95. package/dist/chunk-WPTPPOYN.js.map +7 -0
  96. package/dist/chunk-XXFY63TM.js +196 -0
  97. package/dist/chunk-XXFY63TM.js.map +7 -0
  98. package/dist/chunk-Z3HMXDXP.js +654 -0
  99. package/dist/chunk-Z3HMXDXP.js.map +7 -0
  100. package/dist/chunk-ZJGXEWKF.js +138 -0
  101. package/dist/chunk-ZJGXEWKF.js.map +7 -0
  102. package/dist/cli-RFYBXM7F.js +3917 -0
  103. package/dist/cli-RFYBXM7F.js.map +7 -0
  104. package/dist/commands-YOXMODDO.js +46 -0
  105. package/dist/commands-YOXMODDO.js.map +7 -0
  106. package/dist/config-5OPX3H2K.js +81 -0
  107. package/dist/config-5OPX3H2K.js.map +7 -0
  108. package/dist/context-THRRBPFP.js +30 -0
  109. package/dist/context-THRRBPFP.js.map +7 -0
  110. package/dist/costTracker-ELNBZ2DN.js +19 -0
  111. package/dist/costTracker-ELNBZ2DN.js.map +7 -0
  112. package/dist/customCommands-4XOZH44N.js +25 -0
  113. package/dist/customCommands-4XOZH44N.js.map +7 -0
  114. package/dist/env-EL4KBHMB.js +22 -0
  115. package/dist/env-EL4KBHMB.js.map +7 -0
  116. package/dist/index.js +34 -0
  117. package/dist/index.js.map +7 -0
  118. package/dist/kodeAgentSessionId-PROTVRBR.js +13 -0
  119. package/dist/kodeAgentSessionId-PROTVRBR.js.map +7 -0
  120. package/dist/kodeAgentSessionLoad-UMPV7MC3.js +18 -0
  121. package/dist/kodeAgentSessionLoad-UMPV7MC3.js.map +7 -0
  122. package/dist/kodeAgentSessionResume-YJS4FVQM.js +16 -0
  123. package/dist/kodeAgentSessionResume-YJS4FVQM.js.map +7 -0
  124. package/dist/kodeAgentStreamJson-3T26CHCP.js +13 -0
  125. package/dist/kodeAgentStreamJson-3T26CHCP.js.map +7 -0
  126. package/dist/kodeAgentStreamJsonSession-BZS2VDCY.js +131 -0
  127. package/dist/kodeAgentStreamJsonSession-BZS2VDCY.js.map +7 -0
  128. package/dist/kodeAgentStructuredStdio-TNB6U6SP.js +10 -0
  129. package/dist/kodeAgentStructuredStdio-TNB6U6SP.js.map +7 -0
  130. package/dist/kodeHooks-VUAWIY2D.js +36 -0
  131. package/dist/kodeHooks-VUAWIY2D.js.map +7 -0
  132. package/dist/llm-A3BCM4Q2.js +3118 -0
  133. package/dist/llm-A3BCM4Q2.js.map +7 -0
  134. package/dist/llmLazy-ZJSRLZVD.js +15 -0
  135. package/dist/llmLazy-ZJSRLZVD.js.map +7 -0
  136. package/dist/loader-HZQBWO74.js +28 -0
  137. package/dist/loader-HZQBWO74.js.map +7 -0
  138. package/dist/mcp-XKOJ55B2.js +49 -0
  139. package/dist/mcp-XKOJ55B2.js.map +7 -0
  140. package/dist/mentionProcessor-ANYU5MLF.js +211 -0
  141. package/dist/mentionProcessor-ANYU5MLF.js.map +7 -0
  142. package/dist/messages-75DL5XBP.js +63 -0
  143. package/dist/messages-75DL5XBP.js.map +7 -0
  144. package/dist/model-OPJGJZRC.js +30 -0
  145. package/dist/model-OPJGJZRC.js.map +7 -0
  146. package/dist/openai-DT54BAFP.js +29 -0
  147. package/dist/openai-DT54BAFP.js.map +7 -0
  148. package/dist/outputStyles-TPFVI52O.js +28 -0
  149. package/dist/outputStyles-TPFVI52O.js.map +7 -0
  150. package/dist/package.json +4 -0
  151. package/dist/pluginRuntime-W74PYSZ4.js +218 -0
  152. package/dist/pluginRuntime-W74PYSZ4.js.map +7 -0
  153. package/dist/pluginValidation-FALYRVI2.js +17 -0
  154. package/dist/pluginValidation-FALYRVI2.js.map +7 -0
  155. package/dist/prompts-J4TPRMJ3.js +48 -0
  156. package/dist/prompts-J4TPRMJ3.js.map +7 -0
  157. package/dist/query-K3QKBVDN.js +50 -0
  158. package/dist/query-K3QKBVDN.js.map +7 -0
  159. package/dist/responsesStreaming-HMB74TRD.js +10 -0
  160. package/dist/responsesStreaming-HMB74TRD.js.map +7 -0
  161. package/dist/ripgrep-XJGSUBG7.js +17 -0
  162. package/dist/ripgrep-XJGSUBG7.js.map +7 -0
  163. package/dist/skillMarketplace-AUGKNCPW.js +37 -0
  164. package/dist/skillMarketplace-AUGKNCPW.js.map +7 -0
  165. package/dist/state-DQYRXKTG.js +16 -0
  166. package/dist/state-DQYRXKTG.js.map +7 -0
  167. package/dist/theme-MS5HDUBJ.js +14 -0
  168. package/dist/theme-MS5HDUBJ.js.map +7 -0
  169. package/dist/toolPermissionContext-GYD5LYFK.js +17 -0
  170. package/dist/toolPermissionContext-GYD5LYFK.js.map +7 -0
  171. package/dist/toolPermissionSettings-4MPZVYDR.js +18 -0
  172. package/dist/toolPermissionSettings-4MPZVYDR.js.map +7 -0
  173. package/dist/tools-QW6SIJLJ.js +47 -0
  174. package/dist/tools-QW6SIJLJ.js.map +7 -0
  175. package/dist/userInput-F2PGBRFU.js +311 -0
  176. package/dist/userInput-F2PGBRFU.js.map +7 -0
  177. package/dist/uuid-GYYCQ6QK.js +9 -0
  178. package/dist/uuid-GYYCQ6QK.js.map +7 -0
  179. package/dist/yoga.wasm +0 -0
  180. package/package.json +136 -0
  181. package/scripts/binary-utils.cjs +62 -0
  182. package/scripts/cli-acp-wrapper.cjs +82 -0
  183. package/scripts/cli-wrapper.cjs +105 -0
  184. package/scripts/postinstall.js +144 -0
  185. package/yoga.wasm +0 -0
@@ -0,0 +1,240 @@
1
+ import { createRequire as __pybCreateRequire } from "node:module";
2
+ const require = __pybCreateRequire(import.meta.url);
3
+ import {
4
+ getKodeAgentSessionId
5
+ } from "./chunk-T6GVXTNQ.js";
6
+ import {
7
+ PLAN_SLUG_ADJECTIVES,
8
+ PLAN_SLUG_NOUNS,
9
+ PLAN_SLUG_VERBS,
10
+ getCwd,
11
+ getKodeBaseDir
12
+ } from "./chunk-TXFCNQDE.js";
13
+ import {
14
+ MACRO
15
+ } from "./chunk-A6PUMROK.js";
16
+
17
+ // src/utils/protocol/kodeAgentSessionLog.ts
18
+ import { execFileSync } from "child_process";
19
+ import {
20
+ appendFileSync,
21
+ existsSync,
22
+ mkdirSync,
23
+ readFileSync,
24
+ statSync,
25
+ writeFileSync
26
+ } from "fs";
27
+ import { randomBytes } from "crypto";
28
+ import { dirname, join } from "path";
29
+ function getSessionStoreBaseDir() {
30
+ return getKodeBaseDir();
31
+ }
32
+ function sanitizeProjectNameForSessionStore(cwd) {
33
+ return cwd.replace(/[^a-zA-Z0-9]/g, "-");
34
+ }
35
+ function getSessionProjectsDir() {
36
+ return join(getSessionStoreBaseDir(), "projects");
37
+ }
38
+ function getSessionProjectDir(cwd) {
39
+ return join(getSessionProjectsDir(), sanitizeProjectNameForSessionStore(cwd));
40
+ }
41
+ function getSessionLogFilePath(args) {
42
+ return join(getSessionProjectDir(args.cwd), `${args.sessionId}.jsonl`);
43
+ }
44
+ function getAgentLogFilePath(args) {
45
+ return join(getSessionProjectDir(args.cwd), `agent-${args.agentId}.jsonl`);
46
+ }
47
+ function safeMkdir(dir) {
48
+ if (existsSync(dir)) return;
49
+ mkdirSync(dir, { recursive: true });
50
+ }
51
+ function safeEnsureFile(path) {
52
+ safeMkdir(dirname(path));
53
+ if (!existsSync(path)) writeFileSync(path, "", "utf8");
54
+ }
55
+ function safeAppendJsonl(path, record) {
56
+ try {
57
+ safeEnsureFile(path);
58
+ appendFileSync(path, JSON.stringify(record) + "\n", "utf8");
59
+ } catch {
60
+ }
61
+ }
62
+ var lastUuidByFile = /* @__PURE__ */ new Map();
63
+ var snapshotWrittenByFile = /* @__PURE__ */ new Set();
64
+ var slugBySessionId = /* @__PURE__ */ new Map();
65
+ var currentSessionCustomTitle = null;
66
+ var currentSessionTag = null;
67
+ function safeReadLastPersistedInfo(filePath) {
68
+ try {
69
+ if (!existsSync(filePath)) return { uuid: null, slug: null };
70
+ const content = readFileSync(filePath, "utf8");
71
+ const lines = content.split("\n");
72
+ let lastSlug = null;
73
+ for (let i = lines.length - 1; i >= 0; i--) {
74
+ const line = lines[i]?.trim();
75
+ if (!line) continue;
76
+ let parsed;
77
+ try {
78
+ parsed = JSON.parse(line);
79
+ } catch {
80
+ continue;
81
+ }
82
+ if (!parsed || typeof parsed !== "object") continue;
83
+ if (!lastSlug && typeof parsed.slug === "string" && parsed.slug.trim()) {
84
+ lastSlug = parsed.slug.trim();
85
+ }
86
+ if (typeof parsed.uuid === "string" && parsed.uuid) {
87
+ return { uuid: parsed.uuid, slug: lastSlug };
88
+ }
89
+ }
90
+ return { uuid: null, slug: lastSlug };
91
+ } catch {
92
+ return { uuid: null, slug: null };
93
+ }
94
+ }
95
+ function pickIndex(length) {
96
+ return randomBytes(4).readUInt32BE(0) % length;
97
+ }
98
+ function pickWord(words) {
99
+ return words[pickIndex(words.length)];
100
+ }
101
+ function generateSessionSlug() {
102
+ const adjective = pickWord(PLAN_SLUG_ADJECTIVES);
103
+ const verb = pickWord(PLAN_SLUG_VERBS);
104
+ const noun = pickWord(PLAN_SLUG_NOUNS);
105
+ return `${adjective}-${verb}-${noun}`;
106
+ }
107
+ function getOrCreateSessionSlug(sessionId) {
108
+ const existing = slugBySessionId.get(sessionId);
109
+ if (existing) return existing;
110
+ const slug = generateSessionSlug();
111
+ slugBySessionId.set(sessionId, slug);
112
+ return slug;
113
+ }
114
+ var gitBranchCache = null;
115
+ function getGitBranchBestEffort(cwd) {
116
+ if (gitBranchCache && gitBranchCache.cwd === cwd) return gitBranchCache.value;
117
+ let value;
118
+ try {
119
+ const stdout = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
120
+ cwd,
121
+ stdio: ["ignore", "pipe", "ignore"],
122
+ timeout: 750
123
+ });
124
+ const branch = stdout.toString("utf8").trim();
125
+ value = branch || void 0;
126
+ } catch {
127
+ value = void 0;
128
+ }
129
+ gitBranchCache = { cwd, value };
130
+ return value;
131
+ }
132
+ function ensureFileHistorySnapshot(filePath, firstMessageUuid) {
133
+ if (snapshotWrittenByFile.has(filePath)) return;
134
+ try {
135
+ safeEnsureFile(filePath);
136
+ const size = statSync(filePath).size;
137
+ if (size > 0) {
138
+ snapshotWrittenByFile.add(filePath);
139
+ return;
140
+ }
141
+ } catch {
142
+ }
143
+ const now = (/* @__PURE__ */ new Date()).toISOString();
144
+ safeAppendJsonl(filePath, {
145
+ type: "file-history-snapshot",
146
+ messageId: firstMessageUuid,
147
+ snapshot: {
148
+ messageId: firstMessageUuid,
149
+ trackedFileBackups: {},
150
+ timestamp: now
151
+ },
152
+ isSnapshotUpdate: false
153
+ });
154
+ snapshotWrittenByFile.add(filePath);
155
+ }
156
+ function resolvePersistTarget(toolUseContext) {
157
+ const agentId = toolUseContext.agentId;
158
+ if (agentId && agentId !== "main") return { kind: "agent", agentId };
159
+ return { kind: "session", sessionId: getKodeAgentSessionId() };
160
+ }
161
+ function appendSessionJsonlFromMessage(args) {
162
+ const { message, toolUseContext } = args;
163
+ if (message.type !== "user" && message.type !== "assistant") return;
164
+ const cwd = getCwd();
165
+ const userType = (process.env.USER_TYPE ?? "external").trim() || "external";
166
+ const sessionId = getKodeAgentSessionId();
167
+ const agentId = (toolUseContext.agentId ?? "main").trim() || "main";
168
+ const isSidechain = agentId !== "main";
169
+ const gitBranch = getGitBranchBestEffort(cwd);
170
+ const target = resolvePersistTarget(toolUseContext);
171
+ const filePath = target.kind === "agent" ? getAgentLogFilePath({ cwd, agentId: target.agentId }) : getSessionLogFilePath({ cwd, sessionId: target.sessionId });
172
+ if (!lastUuidByFile.has(filePath)) {
173
+ const info = safeReadLastPersistedInfo(filePath);
174
+ lastUuidByFile.set(filePath, info.uuid);
175
+ if (info.slug) slugBySessionId.set(sessionId, info.slug);
176
+ }
177
+ const previousUuid = lastUuidByFile.get(filePath) ?? null;
178
+ const slug = getOrCreateSessionSlug(sessionId);
179
+ if (target.kind === "session") {
180
+ ensureFileHistorySnapshot(filePath, message.uuid);
181
+ }
182
+ const base = {
183
+ parentUuid: previousUuid,
184
+ logicalParentUuid: void 0,
185
+ isSidechain,
186
+ userType,
187
+ cwd,
188
+ sessionId,
189
+ version: MACRO.VERSION,
190
+ ...gitBranch ? { gitBranch } : {},
191
+ agentId,
192
+ slug,
193
+ uuid: message.uuid,
194
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
195
+ };
196
+ const record = message.type === "user" ? {
197
+ ...base,
198
+ type: "user",
199
+ message: message.message,
200
+ ...message.toolUseResult?.data !== void 0 ? { toolUseResult: message.toolUseResult.data } : {}
201
+ } : {
202
+ ...base,
203
+ type: "assistant",
204
+ message: message.message,
205
+ ...typeof message.requestId === "string" ? { requestId: String(message.requestId) } : {},
206
+ ...message.isApiErrorMessage ? { isApiErrorMessage: true } : {}
207
+ };
208
+ safeAppendJsonl(filePath, record);
209
+ lastUuidByFile.set(filePath, message.uuid);
210
+ }
211
+ function appendSessionCustomTitleRecord(args) {
212
+ const cwd = getCwd();
213
+ safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {
214
+ type: "custom-title",
215
+ sessionId: args.sessionId,
216
+ customTitle: args.customTitle
217
+ });
218
+ if (args.sessionId === getKodeAgentSessionId()) {
219
+ currentSessionCustomTitle = args.customTitle;
220
+ }
221
+ }
222
+ function appendSessionTagRecord(args) {
223
+ const cwd = getCwd();
224
+ safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {
225
+ type: "tag",
226
+ sessionId: args.sessionId,
227
+ tag: args.tag
228
+ });
229
+ if (args.sessionId === getKodeAgentSessionId()) {
230
+ currentSessionTag = args.tag;
231
+ }
232
+ }
233
+
234
+ export {
235
+ getSessionProjectsDir,
236
+ getSessionProjectDir,
237
+ appendSessionJsonlFromMessage,
238
+ appendSessionCustomTitleRecord,
239
+ appendSessionTagRecord
240
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/protocol/kodeAgentSessionLog.ts"],
4
+ "sourcesContent": ["import { execFileSync } from 'child_process'\nimport {\n appendFileSync,\n existsSync,\n mkdirSync,\n readFileSync,\n statSync,\n writeFileSync,\n} from 'fs'\nimport { randomBytes } from 'crypto'\nimport { dirname, join } from 'path'\nimport type { Message } from '@query'\nimport { MACRO } from '@constants/macros'\nimport { getCwd } from '@utils/state'\nimport { getKodeAgentSessionId } from './kodeAgentSessionId'\nimport { getKodeBaseDir } from '@utils/config/env'\nimport {\n PLAN_SLUG_ADJECTIVES,\n PLAN_SLUG_NOUNS,\n PLAN_SLUG_VERBS,\n} from '@utils/plan/planSlugWords'\n\ntype PersistTarget =\n | { kind: 'session'; sessionId: string }\n | { kind: 'agent'; agentId: string }\n\ntype JsonlEnvelopeBase = {\n cwd: string\n sessionId: string\n version: string\n gitBranch?: string\n userType: string\n isSidechain: boolean\n parentUuid: string | null\n logicalParentUuid?: string\n agentId: string\n slug: string\n uuid: string\n timestamp: string\n}\n\ntype SessionJsonlEntry =\n | (JsonlEnvelopeBase & {\n type: 'user'\n message: any\n toolUseResult?: any\n })\n | (JsonlEnvelopeBase & {\n type: 'assistant'\n message: any\n requestId?: string\n isApiErrorMessage?: boolean\n })\n | { type: 'summary'; summary: string; leafUuid: string }\n | { type: 'custom-title'; sessionId: string; customTitle: string }\n | { type: 'tag'; sessionId: string; tag: string }\n | {\n type: 'file-history-snapshot'\n messageId: string\n snapshot: {\n messageId: string\n trackedFileBackups: Record<string, unknown>\n timestamp: string\n }\n isSnapshotUpdate: boolean\n }\n\nfunction getSessionStoreBaseDir(): string {\n return getKodeBaseDir()\n}\n\nexport function sanitizeProjectNameForSessionStore(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nexport function getSessionProjectsDir(): string {\n return join(getSessionStoreBaseDir(), 'projects')\n}\n\nexport function getSessionProjectDir(cwd: string): string {\n return join(getSessionProjectsDir(), sanitizeProjectNameForSessionStore(cwd))\n}\n\nexport function getSessionLogFilePath(args: {\n cwd: string\n sessionId: string\n}): string {\n return join(getSessionProjectDir(args.cwd), `${args.sessionId}.jsonl`)\n}\n\nexport function getAgentLogFilePath(args: {\n cwd: string\n agentId: string\n}): string {\n return join(getSessionProjectDir(args.cwd), `agent-${args.agentId}.jsonl`)\n}\n\nfunction safeMkdir(dir: string): void {\n if (existsSync(dir)) return\n mkdirSync(dir, { recursive: true })\n}\n\nfunction safeEnsureFile(path: string): void {\n safeMkdir(dirname(path))\n if (!existsSync(path)) writeFileSync(path, '', 'utf8')\n}\n\nfunction safeAppendJsonl(path: string, record: unknown): void {\n try {\n safeEnsureFile(path)\n appendFileSync(path, JSON.stringify(record) + '\\n', 'utf8')\n } catch {\n }\n}\n\nconst lastUuidByFile = new Map<string, string | null>()\nconst snapshotWrittenByFile = new Set<string>()\nconst slugBySessionId = new Map<string, string>()\nlet currentSessionCustomTitle: string | null = null\nlet currentSessionTag: string | null = null\n\ntype LastPersistedInfo = { uuid: string | null; slug: string | null }\n\nfunction safeReadLastPersistedInfo(filePath: string): LastPersistedInfo {\n try {\n if (!existsSync(filePath)) return { uuid: null, slug: null }\n const content = readFileSync(filePath, 'utf8')\n const lines = content.split('\\n')\n\n let lastSlug: string | null = null\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]?.trim()\n if (!line) continue\n let parsed: any\n try {\n parsed = JSON.parse(line)\n } catch {\n continue\n }\n if (!parsed || typeof parsed !== 'object') continue\n\n if (!lastSlug && typeof parsed.slug === 'string' && parsed.slug.trim()) {\n lastSlug = parsed.slug.trim()\n }\n\n if (typeof parsed.uuid === 'string' && parsed.uuid) {\n return { uuid: parsed.uuid, slug: lastSlug }\n }\n }\n\n return { uuid: null, slug: lastSlug }\n } catch {\n return { uuid: null, slug: null }\n }\n}\n\nfunction pickIndex(length: number): number {\n return randomBytes(4).readUInt32BE(0) % length\n}\n\nfunction pickWord(words: readonly string[]): string {\n return words[pickIndex(words.length)]!\n}\n\nfunction generateSessionSlug(): string {\n const adjective = pickWord(PLAN_SLUG_ADJECTIVES)\n const verb = pickWord(PLAN_SLUG_VERBS)\n const noun = pickWord(PLAN_SLUG_NOUNS)\n return `${adjective}-${verb}-${noun}`\n}\n\nfunction getOrCreateSessionSlug(sessionId: string): string {\n const existing = slugBySessionId.get(sessionId)\n if (existing) return existing\n const slug = generateSessionSlug()\n slugBySessionId.set(sessionId, slug)\n return slug\n}\n\ntype GitBranchCacheEntry = { cwd: string; value: string | undefined }\nlet gitBranchCache: GitBranchCacheEntry | null = null\n\nfunction getGitBranchBestEffort(cwd: string): string | undefined {\n if (gitBranchCache && gitBranchCache.cwd === cwd) return gitBranchCache.value\n\n let value: string | undefined\n try {\n const stdout = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {\n cwd,\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 750,\n })\n const branch = stdout.toString('utf8').trim()\n value = branch || undefined\n } catch {\n value = undefined\n }\n\n gitBranchCache = { cwd, value }\n return value\n}\n\nfunction ensureFileHistorySnapshot(\n filePath: string,\n firstMessageUuid: string,\n): void {\n if (snapshotWrittenByFile.has(filePath)) return\n\n try {\n safeEnsureFile(filePath)\n const size = statSync(filePath).size\n if (size > 0) {\n snapshotWrittenByFile.add(filePath)\n return\n }\n } catch {\n }\n\n const now = new Date().toISOString()\n safeAppendJsonl(filePath, {\n type: 'file-history-snapshot',\n messageId: firstMessageUuid,\n snapshot: {\n messageId: firstMessageUuid,\n trackedFileBackups: {},\n timestamp: now,\n },\n isSnapshotUpdate: false,\n } satisfies SessionJsonlEntry)\n\n snapshotWrittenByFile.add(filePath)\n}\n\nfunction resolvePersistTarget(toolUseContext: {\n agentId?: string\n}): PersistTarget {\n const agentId = toolUseContext.agentId\n if (agentId && agentId !== 'main') return { kind: 'agent', agentId }\n return { kind: 'session', sessionId: getKodeAgentSessionId() }\n}\n\nexport function appendSessionJsonlFromMessage(args: {\n message: Message\n toolUseContext: { agentId?: string }\n}): void {\n const { message, toolUseContext } = args\n if (message.type !== 'user' && message.type !== 'assistant') return\n\n const cwd = getCwd()\n const userType = (process.env.USER_TYPE ?? 'external').trim() || 'external'\n const sessionId = getKodeAgentSessionId()\n const agentId = (toolUseContext.agentId ?? 'main').trim() || 'main'\n const isSidechain = agentId !== 'main'\n const gitBranch = getGitBranchBestEffort(cwd)\n\n const target = resolvePersistTarget(toolUseContext)\n const filePath =\n target.kind === 'agent'\n ? getAgentLogFilePath({ cwd, agentId: target.agentId })\n : getSessionLogFilePath({ cwd, sessionId: target.sessionId })\n\n if (!lastUuidByFile.has(filePath)) {\n const info = safeReadLastPersistedInfo(filePath)\n lastUuidByFile.set(filePath, info.uuid)\n if (info.slug) slugBySessionId.set(sessionId, info.slug)\n }\n const previousUuid = lastUuidByFile.get(filePath) ?? null\n\n const slug = getOrCreateSessionSlug(sessionId)\n\n if (target.kind === 'session') {\n ensureFileHistorySnapshot(filePath, message.uuid)\n }\n\n const base: JsonlEnvelopeBase = {\n parentUuid: previousUuid,\n logicalParentUuid: undefined,\n isSidechain,\n userType,\n cwd,\n sessionId,\n version: MACRO.VERSION,\n ...(gitBranch ? { gitBranch } : {}),\n agentId,\n slug,\n uuid: message.uuid,\n timestamp: new Date().toISOString(),\n }\n\n const record: SessionJsonlEntry =\n message.type === 'user'\n ? {\n ...base,\n type: 'user',\n message: message.message,\n ...(message.toolUseResult?.data !== undefined\n ? { toolUseResult: message.toolUseResult.data }\n : {}),\n }\n : {\n ...base,\n type: 'assistant',\n message: message.message,\n ...(typeof (message as any).requestId === 'string'\n ? { requestId: String((message as any).requestId) }\n : {}),\n ...(message.isApiErrorMessage ? { isApiErrorMessage: true } : {}),\n }\n\n safeAppendJsonl(filePath, record)\n lastUuidByFile.set(filePath, message.uuid)\n}\n\nexport function appendSessionSummaryRecord(args: {\n summary: string\n leafUuid: string\n sessionId?: string\n}): void {\n const sessionId = args.sessionId ?? getKodeAgentSessionId()\n const cwd = getCwd()\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId }), {\n type: 'summary',\n summary: args.summary,\n leafUuid: args.leafUuid,\n } satisfies SessionJsonlEntry)\n}\n\nexport function appendSessionCustomTitleRecord(args: {\n sessionId: string\n customTitle: string\n}): void {\n const cwd = getCwd()\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {\n type: 'custom-title',\n sessionId: args.sessionId,\n customTitle: args.customTitle,\n } satisfies SessionJsonlEntry)\n if (args.sessionId === getKodeAgentSessionId()) {\n currentSessionCustomTitle = args.customTitle\n }\n}\n\nexport function appendSessionTagRecord(args: {\n sessionId: string\n tag: string\n}): void {\n const cwd = getCwd()\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {\n type: 'tag',\n sessionId: args.sessionId,\n tag: args.tag,\n } satisfies SessionJsonlEntry)\n if (args.sessionId === getKodeAgentSessionId()) {\n currentSessionTag = args.tag\n }\n}\n\nexport function getCurrentSessionCustomTitle(): string | null {\n return currentSessionCustomTitle\n}\n\nexport function getCurrentSessionTag(): string | null {\n return currentSessionTag\n}\n\nexport function resetSessionJsonlStateForTests(): void {\n lastUuidByFile.clear()\n snapshotWrittenByFile.clear()\n slugBySessionId.clear()\n gitBranchCache = null\n currentSessionCustomTitle = null\n currentSessionTag = null\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,145 @@
1
+ import { createRequire as __pybCreateRequire } from "node:module";
2
+ const require = __pybCreateRequire(import.meta.url);
3
+ import {
4
+ getCwd,
5
+ logError
6
+ } from "./chunk-TXFCNQDE.js";
7
+
8
+ // src/utils/config/settingsFiles.ts
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
10
+ import { homedir } from "os";
11
+ import { dirname, join, resolve } from "path";
12
+ function normalizeOverride(value) {
13
+ if (typeof value !== "string") return null;
14
+ const trimmed = value.trim();
15
+ return trimmed ? resolve(trimmed) : null;
16
+ }
17
+ function dedupeStrings(values) {
18
+ const out = [];
19
+ const seen = /* @__PURE__ */ new Set();
20
+ for (const value of values) {
21
+ if (!value) continue;
22
+ if (seen.has(value)) continue;
23
+ seen.add(value);
24
+ out.push(value);
25
+ }
26
+ return out;
27
+ }
28
+ function getDefaultHomeDir() {
29
+ const envHome = typeof process.env.HOME === "string" ? process.env.HOME : typeof process.env.USERPROFILE === "string" ? process.env.USERPROFILE : "";
30
+ const trimmed = envHome.trim();
31
+ if (trimmed) return trimmed;
32
+ return homedir();
33
+ }
34
+ function getUserKodeBaseDir(options) {
35
+ const respectEnvOverride = options?.respectEnvOverride ?? true;
36
+ if (respectEnvOverride) {
37
+ const override = normalizeOverride(
38
+ process.env.KODE_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR
39
+ );
40
+ if (override) return override;
41
+ }
42
+ const home = options?.homeDir ?? getDefaultHomeDir();
43
+ return join(home, ".kode");
44
+ }
45
+ function getUserLegacyBaseDir(options) {
46
+ const respectEnvOverride = options?.respectEnvOverride ?? true;
47
+ if (respectEnvOverride) {
48
+ const override = normalizeOverride(process.env.CLAUDE_CONFIG_DIR);
49
+ if (override) return override;
50
+ }
51
+ const home = options?.homeDir ?? getDefaultHomeDir();
52
+ return join(home, ".claude");
53
+ }
54
+ function getSettingsFileCandidates(options) {
55
+ const projectDir = options.projectDir ?? getCwd();
56
+ const homeDir = options.homeDir ?? getDefaultHomeDir();
57
+ const respectEnvOverride = options.homeDir === void 0;
58
+ switch (options.destination) {
59
+ case "localSettings": {
60
+ const primary = join(projectDir, ".kode", "settings.local.json");
61
+ const legacy = [join(projectDir, ".claude", "settings.local.json")];
62
+ return { primary, legacy };
63
+ }
64
+ case "projectSettings": {
65
+ const primary = join(projectDir, ".kode", "settings.json");
66
+ const legacy = [join(projectDir, ".claude", "settings.json")];
67
+ return { primary, legacy };
68
+ }
69
+ case "userSettings": {
70
+ const primary = join(
71
+ getUserKodeBaseDir({ homeDir, respectEnvOverride }),
72
+ "settings.json"
73
+ );
74
+ const legacy = dedupeStrings([
75
+ join(
76
+ getUserLegacyBaseDir({ homeDir, respectEnvOverride }),
77
+ "settings.json"
78
+ ),
79
+ join(homeDir, ".claude", "settings.json")
80
+ ]);
81
+ return { primary, legacy };
82
+ }
83
+ default:
84
+ return null;
85
+ }
86
+ }
87
+ function readSettingsFile(filePath) {
88
+ if (!existsSync(filePath)) return null;
89
+ try {
90
+ const raw = readFileSync(filePath, "utf-8");
91
+ const parsed = JSON.parse(raw);
92
+ if (!parsed || typeof parsed !== "object") return null;
93
+ return parsed;
94
+ } catch (error) {
95
+ logError(error);
96
+ return null;
97
+ }
98
+ }
99
+ function writeSettingsFile(filePath, settings) {
100
+ mkdirSync(dirname(filePath), { recursive: true });
101
+ writeFileSync(filePath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
102
+ }
103
+ function loadSettingsWithLegacyFallback(options) {
104
+ const candidates = getSettingsFileCandidates(options);
105
+ if (!candidates) return { settings: null, usedPath: null };
106
+ const primarySettings = readSettingsFile(candidates.primary);
107
+ if (primarySettings)
108
+ return { settings: primarySettings, usedPath: candidates.primary };
109
+ for (const legacyPath of candidates.legacy) {
110
+ const legacySettings = readSettingsFile(legacyPath);
111
+ if (!legacySettings) continue;
112
+ if (options.migrateToPrimary && legacyPath !== candidates.primary) {
113
+ try {
114
+ if (!existsSync(candidates.primary)) {
115
+ writeSettingsFile(candidates.primary, legacySettings);
116
+ }
117
+ } catch (error) {
118
+ logError(error);
119
+ }
120
+ }
121
+ return { settings: legacySettings, usedPath: legacyPath };
122
+ }
123
+ return { settings: null, usedPath: null };
124
+ }
125
+ function saveSettingsToPrimaryAndSyncLegacy(options) {
126
+ const candidates = getSettingsFileCandidates(options);
127
+ if (!candidates) return;
128
+ writeSettingsFile(candidates.primary, options.settings);
129
+ if (!options.syncLegacyIfExists) return;
130
+ for (const legacyPath of candidates.legacy) {
131
+ if (legacyPath === candidates.primary) continue;
132
+ if (!existsSync(legacyPath)) continue;
133
+ try {
134
+ writeSettingsFile(legacyPath, options.settings);
135
+ } catch (error) {
136
+ logError(error);
137
+ }
138
+ }
139
+ }
140
+
141
+ export {
142
+ getSettingsFileCandidates,
143
+ loadSettingsWithLegacyFallback,
144
+ saveSettingsToPrimaryAndSyncLegacy
145
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/config/settingsFiles.ts"],
4
+ "sourcesContent": ["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { homedir } from 'os'\nimport { dirname, join, resolve } from 'path'\nimport { getCwd } from '@utils/state'\nimport { logError } from '@utils/log'\n\nexport type SettingsDestination =\n | 'localSettings'\n | 'projectSettings'\n | 'userSettings'\n\nexport type SettingsFile = {\n [key: string]: unknown\n}\n\nfunction normalizeOverride(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed ? resolve(trimmed) : null\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n const out: string[] = []\n const seen = new Set<string>()\n for (const value of values) {\n if (!value) continue\n if (seen.has(value)) continue\n seen.add(value)\n out.push(value)\n }\n return out\n}\n\nfunction getDefaultHomeDir(): string {\n const envHome =\n typeof process.env.HOME === 'string'\n ? process.env.HOME\n : typeof process.env.USERPROFILE === 'string'\n ? process.env.USERPROFILE\n : ''\n const trimmed = envHome.trim()\n if (trimmed) return trimmed\n return homedir()\n}\n\nfunction getUserKodeBaseDir(options?: {\n homeDir?: string\n respectEnvOverride?: boolean\n}): string {\n const respectEnvOverride = options?.respectEnvOverride ?? true\n if (respectEnvOverride) {\n const override = normalizeOverride(\n process.env.KODE_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR,\n )\n if (override) return override\n }\n const home = options?.homeDir ?? getDefaultHomeDir()\n return join(home, '.kode')\n}\n\nfunction getUserLegacyBaseDir(options?: {\n homeDir?: string\n respectEnvOverride?: boolean\n}): string {\n const respectEnvOverride = options?.respectEnvOverride ?? true\n if (respectEnvOverride) {\n const override = normalizeOverride(process.env.CLAUDE_CONFIG_DIR)\n if (override) return override\n }\n const home = options?.homeDir ?? getDefaultHomeDir()\n return join(home, '.claude')\n}\n\nexport function getSettingsFileCandidates(options: {\n destination: SettingsDestination\n projectDir?: string\n homeDir?: string\n}): { primary: string; legacy: string[] } | null {\n const projectDir = options.projectDir ?? getCwd()\n const homeDir = options.homeDir ?? getDefaultHomeDir()\n const respectEnvOverride = options.homeDir === undefined\n\n switch (options.destination) {\n case 'localSettings': {\n const primary = join(projectDir, '.kode', 'settings.local.json')\n const legacy = [join(projectDir, '.claude', 'settings.local.json')]\n return { primary, legacy }\n }\n case 'projectSettings': {\n const primary = join(projectDir, '.kode', 'settings.json')\n const legacy = [join(projectDir, '.claude', 'settings.json')]\n return { primary, legacy }\n }\n case 'userSettings': {\n const primary = join(\n getUserKodeBaseDir({ homeDir, respectEnvOverride }),\n 'settings.json',\n )\n const legacy = dedupeStrings([\n join(\n getUserLegacyBaseDir({ homeDir, respectEnvOverride }),\n 'settings.json',\n ),\n join(homeDir, '.claude', 'settings.json'),\n ])\n return { primary, legacy }\n }\n default:\n return null\n }\n}\n\nexport function readSettingsFile(filePath: string): SettingsFile | null {\n if (!existsSync(filePath)) return null\n try {\n const raw = readFileSync(filePath, 'utf-8')\n const parsed = JSON.parse(raw)\n if (!parsed || typeof parsed !== 'object') return null\n return parsed as SettingsFile\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function writeSettingsFile(\n filePath: string,\n settings: SettingsFile,\n): void {\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, JSON.stringify(settings, null, 2) + '\\n', 'utf-8')\n}\n\nexport function loadSettingsWithLegacyFallback(options: {\n destination: SettingsDestination\n projectDir?: string\n homeDir?: string\n migrateToPrimary?: boolean\n}): { settings: SettingsFile | null; usedPath: string | null } {\n const candidates = getSettingsFileCandidates(options)\n if (!candidates) return { settings: null, usedPath: null }\n\n const primarySettings = readSettingsFile(candidates.primary)\n if (primarySettings)\n return { settings: primarySettings, usedPath: candidates.primary }\n\n for (const legacyPath of candidates.legacy) {\n const legacySettings = readSettingsFile(legacyPath)\n if (!legacySettings) continue\n\n if (options.migrateToPrimary && legacyPath !== candidates.primary) {\n try {\n if (!existsSync(candidates.primary)) {\n writeSettingsFile(candidates.primary, legacySettings)\n }\n } catch (error) {\n logError(error)\n }\n }\n\n return { settings: legacySettings, usedPath: legacyPath }\n }\n\n return { settings: null, usedPath: null }\n}\n\nexport function saveSettingsToPrimaryAndSyncLegacy(options: {\n destination: SettingsDestination\n settings: SettingsFile\n projectDir?: string\n homeDir?: string\n syncLegacyIfExists?: boolean\n}): void {\n const candidates = getSettingsFileCandidates(options)\n if (!candidates) return\n\n writeSettingsFile(candidates.primary, options.settings)\n\n if (!options.syncLegacyIfExists) return\n for (const legacyPath of candidates.legacy) {\n if (legacyPath === candidates.primary) continue\n if (!existsSync(legacyPath)) continue\n try {\n writeSettingsFile(legacyPath, options.settings)\n } catch (error) {\n logError(error)\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,47 @@
1
+ import { createRequire as __pybCreateRequire } from "node:module";
2
+ const require = __pybCreateRequire(import.meta.url);
3
+
4
+ // src/utils/config/settingSources.ts
5
+ var CLI_TO_SETTING_SOURCE = {
6
+ user: "userSettings",
7
+ project: "projectSettings",
8
+ local: "localSettings"
9
+ };
10
+ var enabledSettingSources = new Set(
11
+ Object.values(CLI_TO_SETTING_SOURCE)
12
+ );
13
+ function setEnabledSettingSourcesFromCli(sources) {
14
+ if (sources === void 0) return;
15
+ const trimmed = sources.trim();
16
+ if (!trimmed) {
17
+ throw new Error(
18
+ `Invalid --setting-sources value: ${JSON.stringify(sources)}. Expected a comma-separated list of: user, project, local.`
19
+ );
20
+ }
21
+ const parts = trimmed.split(",").map((p) => p.trim()).filter(Boolean);
22
+ const next = /* @__PURE__ */ new Set();
23
+ const unknown = [];
24
+ for (const part of parts) {
25
+ const key = part.toLowerCase();
26
+ const mapped = CLI_TO_SETTING_SOURCE[key];
27
+ if (!mapped) {
28
+ unknown.push(part);
29
+ continue;
30
+ }
31
+ next.add(mapped);
32
+ }
33
+ if (unknown.length > 0) {
34
+ throw new Error(
35
+ `Unknown setting source(s): ${unknown.join(", ")}. Expected: user, project, local.`
36
+ );
37
+ }
38
+ enabledSettingSources = next;
39
+ }
40
+ function isSettingSourceEnabled(source) {
41
+ return enabledSettingSources.has(source);
42
+ }
43
+
44
+ export {
45
+ setEnabledSettingSourcesFromCli,
46
+ isSettingSourceEnabled
47
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/config/settingSources.ts"],
4
+ "sourcesContent": ["export type SettingSource = 'userSettings' | 'projectSettings' | 'localSettings'\n\nconst CLI_TO_SETTING_SOURCE: Record<string, SettingSource> = {\n user: 'userSettings',\n project: 'projectSettings',\n local: 'localSettings',\n}\n\nlet enabledSettingSources: Set<SettingSource> = new Set(\n Object.values(CLI_TO_SETTING_SOURCE),\n)\n\nexport function setEnabledSettingSourcesFromCli(\n sources: string | undefined,\n): void {\n if (sources === undefined) return\n\n const trimmed = sources.trim()\n if (!trimmed) {\n throw new Error(\n `Invalid --setting-sources value: ${JSON.stringify(sources)}. Expected a comma-separated list of: user, project, local.`,\n )\n }\n\n const parts = trimmed\n .split(',')\n .map(p => p.trim())\n .filter(Boolean)\n\n const next = new Set<SettingSource>()\n const unknown: string[] = []\n\n for (const part of parts) {\n const key = part.toLowerCase()\n const mapped = CLI_TO_SETTING_SOURCE[key]\n if (!mapped) {\n unknown.push(part)\n continue\n }\n next.add(mapped)\n }\n\n if (unknown.length > 0) {\n throw new Error(\n `Unknown setting source(s): ${unknown.join(', ')}. Expected: user, project, local.`,\n )\n }\n\n enabledSettingSources = next\n}\n\nexport function isSettingSourceEnabled(source: SettingSource): boolean {\n return enabledSettingSources.has(source)\n}\n\nexport function __resetSettingSourcesForTests(): void {\n enabledSettingSources = new Set(Object.values(CLI_TO_SETTING_SOURCE))\n}\n\n"],
5
+ "mappings": ";;;;AAEA,IAAM,wBAAuD;AAAA,EAC3D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT;AAEA,IAAI,wBAA4C,IAAI;AAAA,EAClD,OAAO,OAAO,qBAAqB;AACrC;AAEO,SAAS,gCACd,SACM;AACN,MAAI,YAAY,OAAW;AAE3B,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR,oCAAoC,KAAK,UAAU,OAAO,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,QAAQ,QACX,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AAEjB,QAAM,OAAO,oBAAI,IAAmB;AACpC,QAAM,UAAoB,CAAC;AAE3B,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,SAAS,sBAAsB,GAAG;AACxC,QAAI,CAAC,QAAQ;AACX,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AACA,SAAK,IAAI,MAAM;AAAA,EACjB;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,8BAA8B,QAAQ,KAAK,IAAI,CAAC;AAAA,IAClD;AAAA,EACF;AAEA,0BAAwB;AAC1B;AAEO,SAAS,uBAAuB,QAAgC;AACrE,SAAO,sBAAsB,IAAI,MAAM;AACzC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,152 @@
1
+ import { createRequire as __pybCreateRequire } from "node:module";
2
+ const require = __pybCreateRequire(import.meta.url);
3
+
4
+ // package.json
5
+ var package_default = {
6
+ name: "pybao-cli",
7
+ version: "1.3.3",
8
+ bin: {
9
+ pyb: "cli.js",
10
+ "pyb-acp": "cli-acp.js"
11
+ },
12
+ engines: {
13
+ node: ">=20.18.1"
14
+ },
15
+ main: "cli.js",
16
+ author: "PYB-XC",
17
+ license: "MIT",
18
+ description: "PYB-CLI - Minimal AI Agent with multi-model support and CLI interface",
19
+ keywords: [
20
+ "ai",
21
+ "agent",
22
+ "minimal",
23
+ "claude"
24
+ ],
25
+ homepage: "https://github.com/pyb-xc/pyb-ts",
26
+ repository: {
27
+ type: "git",
28
+ url: "git+https://github.com/pyb-xc/pyb-ts.git"
29
+ },
30
+ bugs: {
31
+ url: "https://github.com/pyb-xc/pyb-ts/issues"
32
+ },
33
+ files: [
34
+ "cli.js",
35
+ "cli-acp.js",
36
+ "yoga.wasm",
37
+ "dist/**/*",
38
+ "scripts/binary-utils.cjs",
39
+ "scripts/cli-wrapper.cjs",
40
+ "scripts/cli-acp-wrapper.cjs",
41
+ "scripts/postinstall.js",
42
+ ".npmrc"
43
+ ],
44
+ scripts: {
45
+ dev: "bun run ./src/entrypoints/cli.tsx --verbose",
46
+ "build:npm": "bun run scripts/build.mjs",
47
+ build: "bun run build:npm",
48
+ "build:binary": "bun run scripts/build-binary.mjs",
49
+ clean: "bun run scripts/clean.mjs",
50
+ prepublishOnly: "bun run build:npm && bun run scripts/prepublish-check.js",
51
+ postinstall: "node scripts/postinstall.js || true",
52
+ format: 'prettier --write "src/**/*.{ts,tsx,js,jsx,json}" "tests/**/*.{ts,tsx,js,jsx,json}"',
53
+ "format:check": 'prettier --check "src/**/*.{ts,tsx,js,jsx,json}" "tests/**/*.{ts,tsx,js,jsx,json}"',
54
+ lint: "eslint . --ext .ts,.tsx,.js --max-warnings 0",
55
+ "lint:fix": "eslint . --ext .ts,.tsx,.js --fix",
56
+ test: "bun test",
57
+ "test:unit": "bun test tests/unit",
58
+ "test:integration": "bun test tests/integration",
59
+ "test:e2e": "bun test tests/e2e",
60
+ typecheck: "tsc --noEmit",
61
+ prepare: "bun run scripts/install-hooks.mjs",
62
+ "publish:dev": "bun run scripts/publish-dev.js",
63
+ "publish:release": "bun run scripts/publish-release.js",
64
+ "bench:startup": "bun run scripts/bench-startup.mjs",
65
+ "parity:reference": "bun run scripts/reference-parity-check.mjs"
66
+ },
67
+ dependencies: {
68
+ "@anthropic-ai/bedrock-sdk": "^0.12.6",
69
+ "@anthropic-ai/sdk": "^0.39.0",
70
+ "@anthropic-ai/vertex-sdk": "^0.7.0",
71
+ "@aws-sdk/client-bedrock-runtime": "3.797.0",
72
+ "@commander-js/extra-typings": "^13.1.0",
73
+ "@inkjs/ui": "^2.0.0",
74
+ "@modelcontextprotocol/sdk": "^1.15.1",
75
+ "@types/lodash-es": "^4.17.12",
76
+ "@types/react": "^19.1.8",
77
+ "@vscode/ripgrep": "^1.17.0",
78
+ ajv: "^8.17.1",
79
+ "ansi-escapes": "^7.0.0",
80
+ chalk: "^5.4.1",
81
+ "cli-highlight": "^2.1.11",
82
+ "cli-table3": "^0.6.5",
83
+ commander: "^13.1.0",
84
+ debug: "^4.4.1",
85
+ diff: "^7.0.0",
86
+ dotenv: "^16.6.1",
87
+ "env-paths": "^3.0.0",
88
+ fflate: "^0.8.2",
89
+ figures: "^6.1.0",
90
+ glob: "^11.0.3",
91
+ "gray-matter": "^4.0.3",
92
+ "highlight.js": "^11.11.1",
93
+ ignore: "^7.0.5",
94
+ ink: "5.2.1",
95
+ "ink-link": "^4.1.0",
96
+ "ink-select-input": "^6.2.0",
97
+ "ink-text-input": "^6.0.0",
98
+ "js-yaml": "^4.1.1",
99
+ "lodash-es": "^4.17.21",
100
+ "lru-cache": "^11.1.0",
101
+ marked: "^15.0.12",
102
+ minimatch: "^10.1.1",
103
+ nanoid: "^5.1.5",
104
+ "node-fetch": "^3.3.2",
105
+ "node-html-parser": "^7.0.1",
106
+ openai: "4.104.0",
107
+ react: "18.3.1",
108
+ semver: "^7.7.2",
109
+ "shell-quote": "^1.8.3",
110
+ "spawn-rx": "^5.1.2",
111
+ "string-width": "^7.2.0",
112
+ "strip-ansi": "^7.1.0",
113
+ tsx: "^4.20.3",
114
+ turndown: "^7.2.0",
115
+ undici: "^7.11.0",
116
+ which: "^6.0.0",
117
+ "wrap-ansi": "^9.0.0",
118
+ zod: "^3.25.76",
119
+ "zod-to-json-schema": "^3.24.6"
120
+ },
121
+ devDependencies: {
122
+ "@types/bun": "latest",
123
+ "@types/jest": "^30.0.0",
124
+ "@types/node": "^24.1.0",
125
+ "@types/which": "^3.0.4",
126
+ "@typescript-eslint/eslint-plugin": "^8.50.1",
127
+ "@typescript-eslint/parser": "^8.50.1",
128
+ "bun-types": "latest",
129
+ esbuild: "^0.25.9",
130
+ eslint: "8.57.0",
131
+ "eslint-plugin-react-hooks": "^7.0.1",
132
+ prettier: "^3.6.2",
133
+ "react-devtools-core": "^7.0.1",
134
+ typescript: "^5.9.2"
135
+ },
136
+ overrides: {
137
+ "@aws-sdk/client-bedrock-runtime": "3.797.0",
138
+ "@smithy/smithy-client": "2.5.1"
139
+ }
140
+ };
141
+
142
+ // src/constants/macros.ts
143
+ var MACRO = {
144
+ VERSION: package_default.version,
145
+ README_URL: "https://github.com/shareAI-lab/kode#readme",
146
+ PACKAGE_URL: "@shareai-lab/kode",
147
+ ISSUES_EXPLAINER: "report the issue at https://github.com/shareAI-lab/kode/issues"
148
+ };
149
+
150
+ export {
151
+ MACRO
152
+ };