@danya-ai/cli 0.1.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 (184) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +336 -0
  3. package/cli-acp.js +82 -0
  4. package/cli.js +105 -0
  5. package/dist/REPL-EYUOXCEC.js +42 -0
  6. package/dist/REPL-EYUOXCEC.js.map +7 -0
  7. package/dist/acp-S5WNCLMD.js +1372 -0
  8. package/dist/acp-S5WNCLMD.js.map +7 -0
  9. package/dist/agentsValidate-RQ2QDGNY.js +373 -0
  10. package/dist/agentsValidate-RQ2QDGNY.js.map +7 -0
  11. package/dist/ask-TX526UBD.js +129 -0
  12. package/dist/ask-TX526UBD.js.map +7 -0
  13. package/dist/autoUpdater-63RAZ24N.js +17 -0
  14. package/dist/autoUpdater-63RAZ24N.js.map +7 -0
  15. package/dist/chunk-2VQWLLDU.js +16 -0
  16. package/dist/chunk-2VQWLLDU.js.map +7 -0
  17. package/dist/chunk-4CLHMO4I.js +656 -0
  18. package/dist/chunk-4CLHMO4I.js.map +7 -0
  19. package/dist/chunk-4ZNNWJZU.js +5696 -0
  20. package/dist/chunk-4ZNNWJZU.js.map +7 -0
  21. package/dist/chunk-66EZC7Y7.js +149 -0
  22. package/dist/chunk-66EZC7Y7.js.map +7 -0
  23. package/dist/chunk-6EPQRP3S.js +96 -0
  24. package/dist/chunk-6EPQRP3S.js.map +7 -0
  25. package/dist/chunk-77IRSDFR.js +195 -0
  26. package/dist/chunk-77IRSDFR.js.map +7 -0
  27. package/dist/chunk-7RZNLBEK.js +136 -0
  28. package/dist/chunk-7RZNLBEK.js.map +7 -0
  29. package/dist/chunk-BNBV2FXC.js +19 -0
  30. package/dist/chunk-BNBV2FXC.js.map +7 -0
  31. package/dist/chunk-CQCREBDO.js +248 -0
  32. package/dist/chunk-CQCREBDO.js.map +7 -0
  33. package/dist/chunk-D77XS6TB.js +74 -0
  34. package/dist/chunk-D77XS6TB.js.map +7 -0
  35. package/dist/chunk-DHYBJN3V.js +474 -0
  36. package/dist/chunk-DHYBJN3V.js.map +7 -0
  37. package/dist/chunk-DLSLSLTR.js +842 -0
  38. package/dist/chunk-DLSLSLTR.js.map +7 -0
  39. package/dist/chunk-ELAE6Z4H.js +514 -0
  40. package/dist/chunk-ELAE6Z4H.js.map +7 -0
  41. package/dist/chunk-ELZQD7ZR.js +531 -0
  42. package/dist/chunk-ELZQD7ZR.js.map +7 -0
  43. package/dist/chunk-F6DEGMX6.js +31269 -0
  44. package/dist/chunk-F6DEGMX6.js.map +7 -0
  45. package/dist/chunk-GDF2AON2.js +124 -0
  46. package/dist/chunk-GDF2AON2.js.map +7 -0
  47. package/dist/chunk-H7BGBV4P.js +498 -0
  48. package/dist/chunk-H7BGBV4P.js.map +7 -0
  49. package/dist/chunk-HIIHGKXP.js +24 -0
  50. package/dist/chunk-HIIHGKXP.js.map +7 -0
  51. package/dist/chunk-HJCCXED7.js +17 -0
  52. package/dist/chunk-HJCCXED7.js.map +7 -0
  53. package/dist/chunk-IQ6VZB2Y.js +139 -0
  54. package/dist/chunk-IQ6VZB2Y.js.map +7 -0
  55. package/dist/chunk-J4D7AELD.js +518 -0
  56. package/dist/chunk-J4D7AELD.js.map +7 -0
  57. package/dist/chunk-JVGG2YQR.js +23 -0
  58. package/dist/chunk-JVGG2YQR.js.map +7 -0
  59. package/dist/chunk-LGEK2NV7.js +939 -0
  60. package/dist/chunk-LGEK2NV7.js.map +7 -0
  61. package/dist/chunk-LWXT5RGE.js +95 -0
  62. package/dist/chunk-LWXT5RGE.js.map +7 -0
  63. package/dist/chunk-M3TKNAUR.js +35 -0
  64. package/dist/chunk-M3TKNAUR.js.map +7 -0
  65. package/dist/chunk-MRFO7QO5.js +170 -0
  66. package/dist/chunk-MRFO7QO5.js.map +7 -0
  67. package/dist/chunk-MVN3DHQF.js +95 -0
  68. package/dist/chunk-MVN3DHQF.js.map +7 -0
  69. package/dist/chunk-O25PXGOC.js +772 -0
  70. package/dist/chunk-O25PXGOC.js.map +7 -0
  71. package/dist/chunk-OBGVKM3N.js +1618 -0
  72. package/dist/chunk-OBGVKM3N.js.map +7 -0
  73. package/dist/chunk-OV5HJXXQ.js +198 -0
  74. package/dist/chunk-OV5HJXXQ.js.map +7 -0
  75. package/dist/chunk-P5VWDMRD.js +249 -0
  76. package/dist/chunk-P5VWDMRD.js.map +7 -0
  77. package/dist/chunk-PDSAJX7G.js +49 -0
  78. package/dist/chunk-PDSAJX7G.js.map +7 -0
  79. package/dist/chunk-RHNEZOPO.js +739 -0
  80. package/dist/chunk-RHNEZOPO.js.map +7 -0
  81. package/dist/chunk-SQGAHZPM.js +3004 -0
  82. package/dist/chunk-SQGAHZPM.js.map +7 -0
  83. package/dist/chunk-U7Z4MXY4.js +21 -0
  84. package/dist/chunk-U7Z4MXY4.js.map +7 -0
  85. package/dist/chunk-UNCTVIS7.js +146 -0
  86. package/dist/chunk-UNCTVIS7.js.map +7 -0
  87. package/dist/chunk-VMEOI6MH.js +1103 -0
  88. package/dist/chunk-VMEOI6MH.js.map +7 -0
  89. package/dist/chunk-WAY3DKFO.js +47 -0
  90. package/dist/chunk-WAY3DKFO.js.map +7 -0
  91. package/dist/chunk-XEYEKVFT.js +24 -0
  92. package/dist/chunk-XEYEKVFT.js.map +7 -0
  93. package/dist/chunk-Y4BQ36T4.js +796 -0
  94. package/dist/chunk-Y4BQ36T4.js.map +7 -0
  95. package/dist/chunk-Y5LQPJWK.js +12 -0
  96. package/dist/chunk-Y5LQPJWK.js.map +7 -0
  97. package/dist/chunk-YIJWUNWF.js +1260 -0
  98. package/dist/chunk-YIJWUNWF.js.map +7 -0
  99. package/dist/chunk-YMIWYEZ7.js +34 -0
  100. package/dist/chunk-YMIWYEZ7.js.map +7 -0
  101. package/dist/cli-PQNZWJX4.js +3952 -0
  102. package/dist/cli-PQNZWJX4.js.map +7 -0
  103. package/dist/commands-HOBCZ3VQ.js +46 -0
  104. package/dist/commands-HOBCZ3VQ.js.map +7 -0
  105. package/dist/config-MLH7ZTFA.js +81 -0
  106. package/dist/config-MLH7ZTFA.js.map +7 -0
  107. package/dist/context-FZ6G4J63.js +30 -0
  108. package/dist/context-FZ6G4J63.js.map +7 -0
  109. package/dist/costTracker-5WKZXN5S.js +19 -0
  110. package/dist/costTracker-5WKZXN5S.js.map +7 -0
  111. package/dist/customCommands-EB4MMZSS.js +25 -0
  112. package/dist/customCommands-EB4MMZSS.js.map +7 -0
  113. package/dist/env-VMEIP4EW.js +28 -0
  114. package/dist/env-VMEIP4EW.js.map +7 -0
  115. package/dist/index.js +36 -0
  116. package/dist/index.js.map +7 -0
  117. package/dist/kodeAgentSessionId-WUT74FSH.js +16 -0
  118. package/dist/kodeAgentSessionId-WUT74FSH.js.map +7 -0
  119. package/dist/kodeAgentSessionLoad-KR4JSD6D.js +21 -0
  120. package/dist/kodeAgentSessionLoad-KR4JSD6D.js.map +7 -0
  121. package/dist/kodeAgentSessionResume-BCD6UV74.js +18 -0
  122. package/dist/kodeAgentSessionResume-BCD6UV74.js.map +7 -0
  123. package/dist/kodeAgentStreamJson-EDHHWNNX.js +15 -0
  124. package/dist/kodeAgentStreamJson-EDHHWNNX.js.map +7 -0
  125. package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js +133 -0
  126. package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js.map +7 -0
  127. package/dist/kodeAgentStructuredStdio-UA5P5UNU.js +11 -0
  128. package/dist/kodeAgentStructuredStdio-UA5P5UNU.js.map +7 -0
  129. package/dist/kodeHooks-EHM6GSIQ.js +37 -0
  130. package/dist/kodeHooks-EHM6GSIQ.js.map +7 -0
  131. package/dist/llm-SJXCV7DA.js +3138 -0
  132. package/dist/llm-SJXCV7DA.js.map +7 -0
  133. package/dist/llmLazy-2QYJVD6K.js +15 -0
  134. package/dist/llmLazy-2QYJVD6K.js.map +7 -0
  135. package/dist/loader-LJX77EFL.js +28 -0
  136. package/dist/loader-LJX77EFL.js.map +7 -0
  137. package/dist/mcp-DOROSLPN.js +49 -0
  138. package/dist/mcp-DOROSLPN.js.map +7 -0
  139. package/dist/mentionProcessor-5UZRHCGH.js +215 -0
  140. package/dist/mentionProcessor-5UZRHCGH.js.map +7 -0
  141. package/dist/messages-N5KBI53P.js +65 -0
  142. package/dist/messages-N5KBI53P.js.map +7 -0
  143. package/dist/model-HPLBR53R.js +30 -0
  144. package/dist/model-HPLBR53R.js.map +7 -0
  145. package/dist/openai-YP4OJYKF.js +29 -0
  146. package/dist/openai-YP4OJYKF.js.map +7 -0
  147. package/dist/outputStyles-NNALI5D7.js +28 -0
  148. package/dist/outputStyles-NNALI5D7.js.map +7 -0
  149. package/dist/package.json +4 -0
  150. package/dist/pluginRuntime-JYYI5BSQ.js +220 -0
  151. package/dist/pluginRuntime-JYYI5BSQ.js.map +7 -0
  152. package/dist/pluginValidation-JWUFPZUE.js +17 -0
  153. package/dist/pluginValidation-JWUFPZUE.js.map +7 -0
  154. package/dist/prompts-B2SS7CWI.js +50 -0
  155. package/dist/prompts-B2SS7CWI.js.map +7 -0
  156. package/dist/query-HIK457UU.js +50 -0
  157. package/dist/query-HIK457UU.js.map +7 -0
  158. package/dist/responsesStreaming-L2BSN37C.js +10 -0
  159. package/dist/responsesStreaming-L2BSN37C.js.map +7 -0
  160. package/dist/ripgrep-GCKI4UTL.js +17 -0
  161. package/dist/ripgrep-GCKI4UTL.js.map +7 -0
  162. package/dist/skillMarketplace-PCTUUX46.js +37 -0
  163. package/dist/skillMarketplace-PCTUUX46.js.map +7 -0
  164. package/dist/state-XJICGOUA.js +18 -0
  165. package/dist/state-XJICGOUA.js.map +7 -0
  166. package/dist/theme-DP7O4SGH.js +14 -0
  167. package/dist/theme-DP7O4SGH.js.map +7 -0
  168. package/dist/toolPermissionContext-DHAGUPEW.js +17 -0
  169. package/dist/toolPermissionContext-DHAGUPEW.js.map +7 -0
  170. package/dist/toolPermissionSettings-PT65MQIQ.js +18 -0
  171. package/dist/toolPermissionSettings-PT65MQIQ.js.map +7 -0
  172. package/dist/tools-BHW37PCF.js +47 -0
  173. package/dist/tools-BHW37PCF.js.map +7 -0
  174. package/dist/userInput-XDRYT5TI.js +316 -0
  175. package/dist/userInput-XDRYT5TI.js.map +7 -0
  176. package/dist/uuid-QUYJMIUV.js +9 -0
  177. package/dist/uuid-QUYJMIUV.js.map +7 -0
  178. package/dist/yoga.wasm +0 -0
  179. package/package.json +115 -0
  180. package/scripts/binary-utils.cjs +62 -0
  181. package/scripts/cli-acp-wrapper.cjs +82 -0
  182. package/scripts/cli-wrapper.cjs +105 -0
  183. package/scripts/postinstall.js +144 -0
  184. package/yoga.wasm +0 -0
@@ -0,0 +1,149 @@
1
+ import { createRequire as __kodeCreateRequire } from "node:module";
2
+ const require = __kodeCreateRequire(import.meta.url);
3
+ import {
4
+ getCwd,
5
+ init_log,
6
+ init_state,
7
+ logError
8
+ } from "./chunk-SQGAHZPM.js";
9
+
10
+ // src/utils/config/settingsFiles.ts
11
+ init_state();
12
+ init_log();
13
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
14
+ import { homedir } from "os";
15
+ import { dirname, join, resolve } from "path";
16
+ function normalizeOverride(value) {
17
+ if (typeof value !== "string") return null;
18
+ const trimmed = value.trim();
19
+ return trimmed ? resolve(trimmed) : null;
20
+ }
21
+ function dedupeStrings(values) {
22
+ const out = [];
23
+ const seen = /* @__PURE__ */ new Set();
24
+ for (const value of values) {
25
+ if (!value) continue;
26
+ if (seen.has(value)) continue;
27
+ seen.add(value);
28
+ out.push(value);
29
+ }
30
+ return out;
31
+ }
32
+ function getDefaultHomeDir() {
33
+ const envHome = typeof process.env.HOME === "string" ? process.env.HOME : typeof process.env.USERPROFILE === "string" ? process.env.USERPROFILE : "";
34
+ const trimmed = envHome.trim();
35
+ if (trimmed) return trimmed;
36
+ return homedir();
37
+ }
38
+ function getUserDanyaBaseDir(options) {
39
+ const respectEnvOverride = options?.respectEnvOverride ?? true;
40
+ if (respectEnvOverride) {
41
+ const override = normalizeOverride(
42
+ process.env.DANYA_CONFIG_DIR ?? process.env.KODE_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR
43
+ );
44
+ if (override) return override;
45
+ }
46
+ const home = options?.homeDir ?? getDefaultHomeDir();
47
+ return join(home, ".danya");
48
+ }
49
+ function getUserLegacyBaseDir(options) {
50
+ const respectEnvOverride = options?.respectEnvOverride ?? true;
51
+ if (respectEnvOverride) {
52
+ const override = normalizeOverride(process.env.CLAUDE_CONFIG_DIR);
53
+ if (override) return override;
54
+ }
55
+ const home = options?.homeDir ?? getDefaultHomeDir();
56
+ return join(home, ".claude");
57
+ }
58
+ function getSettingsFileCandidates(options) {
59
+ const projectDir = options.projectDir ?? getCwd();
60
+ const homeDir = options.homeDir ?? getDefaultHomeDir();
61
+ const respectEnvOverride = options.homeDir === void 0;
62
+ switch (options.destination) {
63
+ case "localSettings": {
64
+ const primary = join(projectDir, ".danya", "settings.local.json");
65
+ const legacy = [join(projectDir, ".kode", "settings.local.json"), join(projectDir, ".claude", "settings.local.json")];
66
+ return { primary, legacy };
67
+ }
68
+ case "projectSettings": {
69
+ const primary = join(projectDir, ".danya", "settings.json");
70
+ const legacy = [join(projectDir, ".kode", "settings.json"), join(projectDir, ".claude", "settings.json")];
71
+ return { primary, legacy };
72
+ }
73
+ case "userSettings": {
74
+ const primary = join(
75
+ getUserDanyaBaseDir({ homeDir, respectEnvOverride }),
76
+ "settings.json"
77
+ );
78
+ const legacy = dedupeStrings([
79
+ join(
80
+ getUserLegacyBaseDir({ homeDir, respectEnvOverride }),
81
+ "settings.json"
82
+ ),
83
+ join(homeDir, ".claude", "settings.json")
84
+ ]);
85
+ return { primary, legacy };
86
+ }
87
+ default:
88
+ return null;
89
+ }
90
+ }
91
+ function readSettingsFile(filePath) {
92
+ if (!existsSync(filePath)) return null;
93
+ try {
94
+ const raw = readFileSync(filePath, "utf-8");
95
+ const parsed = JSON.parse(raw);
96
+ if (!parsed || typeof parsed !== "object") return null;
97
+ return parsed;
98
+ } catch (error) {
99
+ logError(error);
100
+ return null;
101
+ }
102
+ }
103
+ function writeSettingsFile(filePath, settings) {
104
+ mkdirSync(dirname(filePath), { recursive: true });
105
+ writeFileSync(filePath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
106
+ }
107
+ function loadSettingsWithLegacyFallback(options) {
108
+ const candidates = getSettingsFileCandidates(options);
109
+ if (!candidates) return { settings: null, usedPath: null };
110
+ const primarySettings = readSettingsFile(candidates.primary);
111
+ if (primarySettings)
112
+ return { settings: primarySettings, usedPath: candidates.primary };
113
+ for (const legacyPath of candidates.legacy) {
114
+ const legacySettings = readSettingsFile(legacyPath);
115
+ if (!legacySettings) continue;
116
+ if (options.migrateToPrimary && legacyPath !== candidates.primary) {
117
+ try {
118
+ if (!existsSync(candidates.primary)) {
119
+ writeSettingsFile(candidates.primary, legacySettings);
120
+ }
121
+ } catch (error) {
122
+ logError(error);
123
+ }
124
+ }
125
+ return { settings: legacySettings, usedPath: legacyPath };
126
+ }
127
+ return { settings: null, usedPath: null };
128
+ }
129
+ function saveSettingsToPrimaryAndSyncLegacy(options) {
130
+ const candidates = getSettingsFileCandidates(options);
131
+ if (!candidates) return;
132
+ writeSettingsFile(candidates.primary, options.settings);
133
+ if (!options.syncLegacyIfExists) return;
134
+ for (const legacyPath of candidates.legacy) {
135
+ if (legacyPath === candidates.primary) continue;
136
+ if (!existsSync(legacyPath)) continue;
137
+ try {
138
+ writeSettingsFile(legacyPath, options.settings);
139
+ } catch (error) {
140
+ logError(error);
141
+ }
142
+ }
143
+ }
144
+
145
+ export {
146
+ getSettingsFileCandidates,
147
+ loadSettingsWithLegacyFallback,
148
+ saveSettingsToPrimaryAndSyncLegacy
149
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/config/settingsFiles.ts"],
4
+ "sourcesContent": ["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\r\nimport { homedir } from 'os'\r\nimport { dirname, join, resolve } from 'path'\r\nimport { getCwd } from '@utils/state'\r\nimport { logError } from '@utils/log'\r\n\r\nexport type SettingsDestination =\r\n | 'localSettings'\r\n | 'projectSettings'\r\n | 'userSettings'\r\n\r\nexport type SettingsFile = {\r\n [key: string]: unknown\r\n}\r\n\r\nfunction normalizeOverride(value: unknown): string | null {\r\n if (typeof value !== 'string') return null\r\n const trimmed = value.trim()\r\n return trimmed ? resolve(trimmed) : null\r\n}\r\n\r\nfunction dedupeStrings(values: string[]): string[] {\r\n const out: string[] = []\r\n const seen = new Set<string>()\r\n for (const value of values) {\r\n if (!value) continue\r\n if (seen.has(value)) continue\r\n seen.add(value)\r\n out.push(value)\r\n }\r\n return out\r\n}\r\n\r\nfunction getDefaultHomeDir(): string {\r\n const envHome =\r\n typeof process.env.HOME === 'string'\r\n ? process.env.HOME\r\n : typeof process.env.USERPROFILE === 'string'\r\n ? process.env.USERPROFILE\r\n : ''\r\n const trimmed = envHome.trim()\r\n if (trimmed) return trimmed\r\n return homedir()\r\n}\r\n\r\nfunction getUserDanyaBaseDir(options?: {\r\n homeDir?: string\r\n respectEnvOverride?: boolean\r\n}): string {\r\n const respectEnvOverride = options?.respectEnvOverride ?? true\r\n if (respectEnvOverride) {\r\n const override = normalizeOverride(\r\n process.env.DANYA_CONFIG_DIR ?? process.env.KODE_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR,\r\n )\r\n if (override) return override\r\n }\r\n const home = options?.homeDir ?? getDefaultHomeDir()\r\n return join(home, '.danya')\r\n}\r\n\r\nfunction getUserLegacyBaseDir(options?: {\r\n homeDir?: string\r\n respectEnvOverride?: boolean\r\n}): string {\r\n const respectEnvOverride = options?.respectEnvOverride ?? true\r\n if (respectEnvOverride) {\r\n const override = normalizeOverride(process.env.CLAUDE_CONFIG_DIR)\r\n if (override) return override\r\n }\r\n const home = options?.homeDir ?? getDefaultHomeDir()\r\n return join(home, '.claude')\r\n}\r\n\r\nexport function getSettingsFileCandidates(options: {\r\n destination: SettingsDestination\r\n projectDir?: string\r\n homeDir?: string\r\n}): { primary: string; legacy: string[] } | null {\r\n const projectDir = options.projectDir ?? getCwd()\r\n const homeDir = options.homeDir ?? getDefaultHomeDir()\r\n const respectEnvOverride = options.homeDir === undefined\r\n\r\n switch (options.destination) {\r\n case 'localSettings': {\r\n const primary = join(projectDir, '.danya', 'settings.local.json')\r\n const legacy = [join(projectDir, '.kode', 'settings.local.json'), join(projectDir, '.claude', 'settings.local.json')]\r\n return { primary, legacy }\r\n }\r\n case 'projectSettings': {\r\n const primary = join(projectDir, '.danya', 'settings.json')\r\n const legacy = [join(projectDir, '.kode', 'settings.json'), join(projectDir, '.claude', 'settings.json')]\r\n return { primary, legacy }\r\n }\r\n case 'userSettings': {\r\n const primary = join(\r\n getUserDanyaBaseDir({ homeDir, respectEnvOverride }),\r\n 'settings.json',\r\n )\r\n const legacy = dedupeStrings([\r\n join(\r\n getUserLegacyBaseDir({ homeDir, respectEnvOverride }),\r\n 'settings.json',\r\n ),\r\n join(homeDir, '.claude', 'settings.json'),\r\n ])\r\n return { primary, legacy }\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nexport function readSettingsFile(filePath: string): SettingsFile | null {\r\n if (!existsSync(filePath)) return null\r\n try {\r\n const raw = readFileSync(filePath, 'utf-8')\r\n const parsed = JSON.parse(raw)\r\n if (!parsed || typeof parsed !== 'object') return null\r\n return parsed as SettingsFile\r\n } catch (error) {\r\n logError(error)\r\n return null\r\n }\r\n}\r\n\r\nexport function writeSettingsFile(\r\n filePath: string,\r\n settings: SettingsFile,\r\n): void {\r\n mkdirSync(dirname(filePath), { recursive: true })\r\n writeFileSync(filePath, JSON.stringify(settings, null, 2) + '\\n', 'utf-8')\r\n}\r\n\r\nexport function loadSettingsWithLegacyFallback(options: {\r\n destination: SettingsDestination\r\n projectDir?: string\r\n homeDir?: string\r\n migrateToPrimary?: boolean\r\n}): { settings: SettingsFile | null; usedPath: string | null } {\r\n const candidates = getSettingsFileCandidates(options)\r\n if (!candidates) return { settings: null, usedPath: null }\r\n\r\n const primarySettings = readSettingsFile(candidates.primary)\r\n if (primarySettings)\r\n return { settings: primarySettings, usedPath: candidates.primary }\r\n\r\n for (const legacyPath of candidates.legacy) {\r\n const legacySettings = readSettingsFile(legacyPath)\r\n if (!legacySettings) continue\r\n\r\n if (options.migrateToPrimary && legacyPath !== candidates.primary) {\r\n try {\r\n if (!existsSync(candidates.primary)) {\r\n writeSettingsFile(candidates.primary, legacySettings)\r\n }\r\n } catch (error) {\r\n logError(error)\r\n }\r\n }\r\n\r\n return { settings: legacySettings, usedPath: legacyPath }\r\n }\r\n\r\n return { settings: null, usedPath: null }\r\n}\r\n\r\nexport function saveSettingsToPrimaryAndSyncLegacy(options: {\r\n destination: SettingsDestination\r\n settings: SettingsFile\r\n projectDir?: string\r\n homeDir?: string\r\n syncLegacyIfExists?: boolean\r\n}): void {\r\n const candidates = getSettingsFileCandidates(options)\r\n if (!candidates) return\r\n\r\n writeSettingsFile(candidates.primary, options.settings)\r\n\r\n if (!options.syncLegacyIfExists) return\r\n for (const legacyPath of candidates.legacy) {\r\n if (legacyPath === candidates.primary) continue\r\n if (!existsSync(legacyPath)) continue\r\n try {\r\n writeSettingsFile(legacyPath, options.settings)\r\n } catch (error) {\r\n logError(error)\r\n }\r\n }\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,96 @@
1
+ import { createRequire as __kodeCreateRequire } from "node:module";
2
+ const require = __kodeCreateRequire(import.meta.url);
3
+ import {
4
+ setRequestStatus
5
+ } from "./chunk-JVGG2YQR.js";
6
+
7
+ // src/services/ai/adapters/responsesStreaming.ts
8
+ async function processResponsesStream(stream, startTime, fallbackResponseId) {
9
+ const contentBlocks = [];
10
+ const usage = {
11
+ prompt_tokens: 0,
12
+ completion_tokens: 0
13
+ };
14
+ let responseId = fallbackResponseId;
15
+ const pendingToolCalls = [];
16
+ let hasMarkedStreaming = false;
17
+ for await (const event of stream) {
18
+ if (event.type === "message_start") {
19
+ responseId = event.responseId || responseId;
20
+ continue;
21
+ }
22
+ if (event.type === "text_delta") {
23
+ if (!hasMarkedStreaming) {
24
+ setRequestStatus({ kind: "streaming" });
25
+ hasMarkedStreaming = true;
26
+ }
27
+ const last = contentBlocks[contentBlocks.length - 1];
28
+ if (!last || last.type !== "text") {
29
+ contentBlocks.push({ type: "text", text: event.delta, citations: [] });
30
+ } else {
31
+ last.text += event.delta;
32
+ }
33
+ continue;
34
+ }
35
+ if (event.type === "tool_request") {
36
+ setRequestStatus({ kind: "tool", detail: event.tool?.name });
37
+ pendingToolCalls.push(event.tool);
38
+ continue;
39
+ }
40
+ if (event.type === "usage") {
41
+ usage.prompt_tokens = event.usage.input;
42
+ usage.completion_tokens = event.usage.output;
43
+ usage.promptTokens = event.usage.input;
44
+ usage.completionTokens = event.usage.output;
45
+ usage.totalTokens = event.usage.total ?? event.usage.input + event.usage.output;
46
+ if (event.usage.reasoning !== void 0) {
47
+ usage.reasoningTokens = event.usage.reasoning;
48
+ }
49
+ continue;
50
+ }
51
+ }
52
+ for (const toolCall of pendingToolCalls) {
53
+ let toolArgs = {};
54
+ try {
55
+ toolArgs = toolCall.input ? JSON.parse(toolCall.input) : {};
56
+ } catch {
57
+ }
58
+ contentBlocks.push({
59
+ type: "tool_use",
60
+ id: toolCall.id,
61
+ name: toolCall.name,
62
+ input: toolArgs
63
+ });
64
+ }
65
+ const assistantMessage = {
66
+ type: "assistant",
67
+ message: {
68
+ role: "assistant",
69
+ content: contentBlocks,
70
+ usage: {
71
+ input_tokens: usage.prompt_tokens ?? 0,
72
+ output_tokens: usage.completion_tokens ?? 0,
73
+ prompt_tokens: usage.prompt_tokens ?? 0,
74
+ completion_tokens: usage.completion_tokens ?? 0,
75
+ totalTokens: usage.totalTokens ?? (usage.prompt_tokens || 0) + (usage.completion_tokens || 0),
76
+ reasoningTokens: usage.reasoningTokens
77
+ }
78
+ },
79
+ costUSD: 0,
80
+ durationMs: Date.now() - startTime,
81
+ uuid: `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,
82
+ responseId
83
+ };
84
+ return {
85
+ assistantMessage,
86
+ rawResponse: {
87
+ id: responseId,
88
+ content: contentBlocks,
89
+ usage
90
+ }
91
+ };
92
+ }
93
+
94
+ export {
95
+ processResponsesStream
96
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/services/ai/adapters/responsesStreaming.ts"],
4
+ "sourcesContent": ["import { StreamingEvent } from './base'\r\nimport { AssistantMessage } from '@query'\r\nimport { setRequestStatus } from '@utils/session/requestStatus'\r\n\r\nexport async function processResponsesStream(\r\n stream: AsyncGenerator<StreamingEvent>,\r\n startTime: number,\r\n fallbackResponseId: string,\r\n): Promise<{ assistantMessage: AssistantMessage; rawResponse: any }> {\r\n const contentBlocks: any[] = []\r\n const usage: any = {\r\n prompt_tokens: 0,\r\n completion_tokens: 0,\r\n }\r\n\r\n let responseId = fallbackResponseId\r\n const pendingToolCalls: any[] = []\r\n let hasMarkedStreaming = false\r\n\r\n for await (const event of stream) {\r\n if (event.type === 'message_start') {\r\n responseId = event.responseId || responseId\r\n continue\r\n }\r\n\r\n if (event.type === 'text_delta') {\r\n if (!hasMarkedStreaming) {\r\n setRequestStatus({ kind: 'streaming' })\r\n hasMarkedStreaming = true\r\n }\r\n const last = contentBlocks[contentBlocks.length - 1]\r\n if (!last || last.type !== 'text') {\r\n contentBlocks.push({ type: 'text', text: event.delta, citations: [] })\r\n } else {\r\n last.text += event.delta\r\n }\r\n continue\r\n }\r\n\r\n if (event.type === 'tool_request') {\r\n setRequestStatus({ kind: 'tool', detail: event.tool?.name })\r\n pendingToolCalls.push(event.tool)\r\n continue\r\n }\r\n\r\n if (event.type === 'usage') {\r\n usage.prompt_tokens = event.usage.input\r\n usage.completion_tokens = event.usage.output\r\n usage.promptTokens = event.usage.input\r\n usage.completionTokens = event.usage.output\r\n usage.totalTokens =\r\n event.usage.total ?? event.usage.input + event.usage.output\r\n if (event.usage.reasoning !== undefined) {\r\n usage.reasoningTokens = event.usage.reasoning\r\n }\r\n continue\r\n }\r\n }\r\n\r\n for (const toolCall of pendingToolCalls) {\r\n let toolArgs = {}\r\n try {\r\n toolArgs = toolCall.input ? JSON.parse(toolCall.input) : {}\r\n } catch {}\r\n\r\n contentBlocks.push({\r\n type: 'tool_use',\r\n id: toolCall.id,\r\n name: toolCall.name,\r\n input: toolArgs,\r\n })\r\n }\r\n\r\n const assistantMessage: AssistantMessage = {\r\n type: 'assistant',\r\n message: {\r\n role: 'assistant',\r\n content: contentBlocks,\r\n usage: {\r\n input_tokens: usage.prompt_tokens ?? 0,\r\n output_tokens: usage.completion_tokens ?? 0,\r\n prompt_tokens: usage.prompt_tokens ?? 0,\r\n completion_tokens: usage.completion_tokens ?? 0,\r\n totalTokens:\r\n usage.totalTokens ??\r\n (usage.prompt_tokens || 0) + (usage.completion_tokens || 0),\r\n reasoningTokens: usage.reasoningTokens,\r\n },\r\n },\r\n costUSD: 0,\r\n durationMs: Date.now() - startTime,\r\n uuid: `${Date.now()}-${Math.random().toString(36).slice(2, 11)}` as any,\r\n responseId,\r\n }\r\n\r\n return {\r\n assistantMessage,\r\n rawResponse: {\r\n id: responseId,\r\n content: contentBlocks,\r\n usage,\r\n },\r\n }\r\n}\r\n"],
5
+ "mappings": ";;;;;;;AAIA,eAAsB,uBACpB,QACA,WACA,oBACmE;AACnE,QAAM,gBAAuB,CAAC;AAC9B,QAAM,QAAa;AAAA,IACjB,eAAe;AAAA,IACf,mBAAmB;AAAA,EACrB;AAEA,MAAI,aAAa;AACjB,QAAM,mBAA0B,CAAC;AACjC,MAAI,qBAAqB;AAEzB,mBAAiB,SAAS,QAAQ;AAChC,QAAI,MAAM,SAAS,iBAAiB;AAClC,mBAAa,MAAM,cAAc;AACjC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,cAAc;AAC/B,UAAI,CAAC,oBAAoB;AACvB,yBAAiB,EAAE,MAAM,YAAY,CAAC;AACtC,6BAAqB;AAAA,MACvB;AACA,YAAM,OAAO,cAAc,cAAc,SAAS,CAAC;AACnD,UAAI,CAAC,QAAQ,KAAK,SAAS,QAAQ;AACjC,sBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,OAAO,WAAW,CAAC,EAAE,CAAC;AAAA,MACvE,OAAO;AACL,aAAK,QAAQ,MAAM;AAAA,MACrB;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,gBAAgB;AACjC,uBAAiB,EAAE,MAAM,QAAQ,QAAQ,MAAM,MAAM,KAAK,CAAC;AAC3D,uBAAiB,KAAK,MAAM,IAAI;AAChC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,gBAAgB,MAAM,MAAM;AAClC,YAAM,oBAAoB,MAAM,MAAM;AACtC,YAAM,eAAe,MAAM,MAAM;AACjC,YAAM,mBAAmB,MAAM,MAAM;AACrC,YAAM,cACJ,MAAM,MAAM,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM;AACvD,UAAI,MAAM,MAAM,cAAc,QAAW;AACvC,cAAM,kBAAkB,MAAM,MAAM;AAAA,MACtC;AACA;AAAA,IACF;AAAA,EACF;AAEA,aAAW,YAAY,kBAAkB;AACvC,QAAI,WAAW,CAAC;AAChB,QAAI;AACF,iBAAW,SAAS,QAAQ,KAAK,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,IAC5D,QAAQ;AAAA,IAAC;AAET,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,IAAI,SAAS;AAAA,MACb,MAAM,SAAS;AAAA,MACf,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,mBAAqC;AAAA,IACzC,MAAM;AAAA,IACN,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,QACL,cAAc,MAAM,iBAAiB;AAAA,QACrC,eAAe,MAAM,qBAAqB;AAAA,QAC1C,eAAe,MAAM,iBAAiB;AAAA,QACtC,mBAAmB,MAAM,qBAAqB;AAAA,QAC9C,aACE,MAAM,gBACL,MAAM,iBAAiB,MAAM,MAAM,qBAAqB;AAAA,QAC3D,iBAAiB,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,YAAY,KAAK,IAAI,IAAI;AAAA,IACzB,MAAM,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,MACX,IAAI;AAAA,MACJ,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,195 @@
1
+ import { createRequire as __kodeCreateRequire } from "node:module";
2
+ const require = __kodeCreateRequire(import.meta.url);
3
+ import {
4
+ getSettingsFileCandidates,
5
+ loadSettingsWithLegacyFallback,
6
+ saveSettingsToPrimaryAndSyncLegacy
7
+ } from "./chunk-66EZC7Y7.js";
8
+ import {
9
+ createDefaultToolPermissionContext,
10
+ isPersistableToolPermissionDestination
11
+ } from "./chunk-MVN3DHQF.js";
12
+ import {
13
+ getCurrentProjectConfig
14
+ } from "./chunk-DLSLSLTR.js";
15
+ import {
16
+ getCwd,
17
+ init_log,
18
+ init_state,
19
+ logError
20
+ } from "./chunk-SQGAHZPM.js";
21
+
22
+ // src/utils/permissions/toolPermissionSettings.ts
23
+ init_state();
24
+ init_log();
25
+ function uniqueStrings(value) {
26
+ if (!Array.isArray(value)) return [];
27
+ const out = [];
28
+ const seen = /* @__PURE__ */ new Set();
29
+ for (const item of value) {
30
+ if (typeof item !== "string") continue;
31
+ if (seen.has(item)) continue;
32
+ seen.add(item);
33
+ out.push(item);
34
+ }
35
+ return out;
36
+ }
37
+ function getPrimarySettingsFilePathForDestination(options) {
38
+ const candidates = getSettingsFileCandidates({
39
+ destination: options.destination,
40
+ projectDir: options.projectDir,
41
+ homeDir: options.homeDir
42
+ });
43
+ return candidates?.primary ?? null;
44
+ }
45
+ function loadToolPermissionContextFromDisk(options) {
46
+ const projectDir = options?.projectDir ?? getCwd();
47
+ const homeDir = options?.homeDir;
48
+ const includeDanyaProjectConfig = options?.includeDanyaProjectConfig ?? true;
49
+ const base = createDefaultToolPermissionContext({
50
+ isBypassPermissionsModeAvailable: options?.isBypassPermissionsModeAvailable ?? false
51
+ });
52
+ const destinations = [
53
+ "userSettings",
54
+ "projectSettings",
55
+ "localSettings"
56
+ ];
57
+ for (const destination of destinations) {
58
+ const settings = loadSettingsWithLegacyFallback({
59
+ destination,
60
+ projectDir,
61
+ homeDir,
62
+ migrateToPrimary: true
63
+ }).settings;
64
+ const perms = settings?.permissions;
65
+ const allow = uniqueStrings(perms?.allow);
66
+ const deny = uniqueStrings(perms?.deny);
67
+ const ask = uniqueStrings(perms?.ask);
68
+ const additionalDirectories = uniqueStrings(perms?.additionalDirectories);
69
+ if (allow.length > 0) base.alwaysAllowRules[destination] = allow;
70
+ if (deny.length > 0) base.alwaysDenyRules[destination] = deny;
71
+ if (ask.length > 0) base.alwaysAskRules[destination] = ask;
72
+ for (const dir of additionalDirectories) {
73
+ base.additionalWorkingDirectories.set(dir, {
74
+ path: dir,
75
+ source: destination
76
+ });
77
+ }
78
+ }
79
+ if (includeDanyaProjectConfig) {
80
+ try {
81
+ const cfg = getCurrentProjectConfig();
82
+ const allow = Array.isArray(cfg.allowedTools) ? cfg.allowedTools : [];
83
+ const deny = Array.isArray(cfg.deniedTools) ? cfg.deniedTools : [];
84
+ const ask = Array.isArray(cfg.askedTools) ? cfg.askedTools : [];
85
+ if (allow.length > 0) {
86
+ const prev = base.alwaysAllowRules.localSettings ?? [];
87
+ base.alwaysAllowRules.localSettings = [.../* @__PURE__ */ new Set([...prev, ...allow])];
88
+ }
89
+ if (deny.length > 0) {
90
+ const prev = base.alwaysDenyRules.localSettings ?? [];
91
+ base.alwaysDenyRules.localSettings = [.../* @__PURE__ */ new Set([...prev, ...deny])];
92
+ }
93
+ if (ask.length > 0) {
94
+ const prev = base.alwaysAskRules.localSettings ?? [];
95
+ base.alwaysAskRules.localSettings = [.../* @__PURE__ */ new Set([...prev, ...ask])];
96
+ }
97
+ } catch (error) {
98
+ logError(error);
99
+ }
100
+ }
101
+ return base;
102
+ }
103
+ function getOrCreatePermissions(settings) {
104
+ const existing = settings.permissions;
105
+ if (existing && typeof existing === "object") {
106
+ return existing;
107
+ }
108
+ settings.permissions = {};
109
+ return settings.permissions;
110
+ }
111
+ function behaviorKey(behavior) {
112
+ switch (behavior) {
113
+ case "allow":
114
+ return "allow";
115
+ case "deny":
116
+ return "deny";
117
+ case "ask":
118
+ return "ask";
119
+ }
120
+ }
121
+ function persistToolPermissionUpdateToDisk(options) {
122
+ const update = options.update;
123
+ if (!isPersistableToolPermissionDestination(update.destination)) {
124
+ return { persisted: false };
125
+ }
126
+ if (update.type === "setMode") {
127
+ return { persisted: false };
128
+ }
129
+ const filePath = getPrimarySettingsFilePathForDestination({
130
+ destination: update.destination,
131
+ projectDir: options.projectDir,
132
+ homeDir: options.homeDir
133
+ });
134
+ if (!filePath) return { persisted: false };
135
+ const existing = loadSettingsWithLegacyFallback({
136
+ destination: update.destination,
137
+ projectDir: options.projectDir,
138
+ homeDir: options.homeDir,
139
+ migrateToPrimary: true
140
+ }).settings ?? {};
141
+ const permissions = getOrCreatePermissions(existing);
142
+ try {
143
+ switch (update.type) {
144
+ case "addRules":
145
+ case "replaceRules":
146
+ case "removeRules": {
147
+ const key = behaviorKey(update.behavior);
148
+ const current = uniqueStrings(permissions[key]);
149
+ if (update.type === "addRules") {
150
+ const merged = [.../* @__PURE__ */ new Set([...current, ...update.rules])];
151
+ permissions[key] = merged;
152
+ } else if (update.type === "replaceRules") {
153
+ permissions[key] = uniqueStrings(update.rules);
154
+ } else {
155
+ const toRemove = new Set(update.rules);
156
+ permissions[key] = current.filter((rule) => !toRemove.has(rule));
157
+ }
158
+ break;
159
+ }
160
+ case "addDirectories":
161
+ case "removeDirectories": {
162
+ const current = uniqueStrings(permissions.additionalDirectories);
163
+ if (update.type === "addDirectories") {
164
+ permissions.additionalDirectories = [
165
+ .../* @__PURE__ */ new Set([...current, ...update.directories])
166
+ ];
167
+ } else {
168
+ const toRemove = new Set(update.directories);
169
+ permissions.additionalDirectories = current.filter(
170
+ (dir) => !toRemove.has(dir)
171
+ );
172
+ }
173
+ break;
174
+ }
175
+ default:
176
+ return { persisted: false };
177
+ }
178
+ saveSettingsToPrimaryAndSyncLegacy({
179
+ destination: update.destination,
180
+ projectDir: options.projectDir,
181
+ homeDir: options.homeDir,
182
+ settings: existing,
183
+ syncLegacyIfExists: true
184
+ });
185
+ return { persisted: true };
186
+ } catch (error) {
187
+ logError(error);
188
+ return { persisted: false };
189
+ }
190
+ }
191
+
192
+ export {
193
+ loadToolPermissionContextFromDisk,
194
+ persistToolPermissionUpdateToDisk
195
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/permissions/toolPermissionSettings.ts"],
4
+ "sourcesContent": ["import type {\r\n ToolPermissionContext,\r\n ToolPermissionContextUpdate,\r\n ToolPermissionRuleBehavior,\r\n ToolPermissionUpdateDestination,\r\n} from '@kode-types/toolPermissionContext'\r\nimport {\r\n createDefaultToolPermissionContext,\r\n isPersistableToolPermissionDestination,\r\n} from '@kode-types/toolPermissionContext'\r\nimport { getCurrentProjectConfig } from '@utils/config'\r\nimport { getCwd } from '@utils/state'\r\nimport { logError } from '@utils/log'\r\nimport {\r\n getSettingsFileCandidates,\r\n loadSettingsWithLegacyFallback,\r\n saveSettingsToPrimaryAndSyncLegacy,\r\n type SettingsFile,\r\n} from '@utils/config/settingsFiles'\r\n\r\ntype SettingsPermissions = {\r\n allow?: unknown\r\n deny?: unknown\r\n ask?: unknown\r\n additionalDirectories?: unknown\r\n}\r\n\r\ntype SettingsFileWithPermissions = {\r\n permissions?: SettingsPermissions\r\n [key: string]: unknown\r\n}\r\n\r\nfunction uniqueStrings(value: unknown): string[] {\r\n if (!Array.isArray(value)) return []\r\n const out: string[] = []\r\n const seen = new Set<string>()\r\n for (const item of value) {\r\n if (typeof item !== 'string') continue\r\n if (seen.has(item)) continue\r\n seen.add(item)\r\n out.push(item)\r\n }\r\n return out\r\n}\r\n\r\nfunction getPrimarySettingsFilePathForDestination(options: {\r\n destination: ToolPermissionUpdateDestination\r\n projectDir?: string\r\n homeDir?: string\r\n}): string | null {\r\n const candidates = getSettingsFileCandidates({\r\n destination: options.destination as any,\r\n projectDir: options.projectDir,\r\n homeDir: options.homeDir,\r\n })\r\n return candidates?.primary ?? null\r\n}\r\n\r\nexport function loadToolPermissionContextFromDisk(options?: {\r\n projectDir?: string\r\n homeDir?: string\r\n includeDanyaProjectConfig?: boolean\r\n isBypassPermissionsModeAvailable?: boolean\r\n}): ToolPermissionContext {\r\n const projectDir = options?.projectDir ?? getCwd()\r\n const homeDir = options?.homeDir\r\n const includeDanyaProjectConfig = options?.includeDanyaProjectConfig ?? true\r\n\r\n const base = createDefaultToolPermissionContext({\r\n isBypassPermissionsModeAvailable:\r\n options?.isBypassPermissionsModeAvailable ?? false,\r\n })\r\n\r\n const destinations: ToolPermissionUpdateDestination[] = [\r\n 'userSettings',\r\n 'projectSettings',\r\n 'localSettings',\r\n ]\r\n\r\n for (const destination of destinations) {\r\n const settings = loadSettingsWithLegacyFallback({\r\n destination: destination as any,\r\n projectDir,\r\n homeDir,\r\n migrateToPrimary: true,\r\n }).settings as SettingsFileWithPermissions | null\r\n const perms = settings?.permissions\r\n const allow = uniqueStrings(perms?.allow)\r\n const deny = uniqueStrings(perms?.deny)\r\n const ask = uniqueStrings(perms?.ask)\r\n const additionalDirectories = uniqueStrings(perms?.additionalDirectories)\r\n\r\n if (allow.length > 0) base.alwaysAllowRules[destination] = allow\r\n if (deny.length > 0) base.alwaysDenyRules[destination] = deny\r\n if (ask.length > 0) base.alwaysAskRules[destination] = ask\r\n\r\n for (const dir of additionalDirectories) {\r\n base.additionalWorkingDirectories.set(dir, {\r\n path: dir,\r\n source: destination,\r\n })\r\n }\r\n }\r\n\r\n if (includeDanyaProjectConfig) {\r\n try {\r\n const cfg = getCurrentProjectConfig()\r\n const allow = Array.isArray(cfg.allowedTools) ? cfg.allowedTools : []\r\n const deny = Array.isArray((cfg as any).deniedTools)\r\n ? (cfg as any).deniedTools\r\n : []\r\n const ask = Array.isArray((cfg as any).askedTools)\r\n ? (cfg as any).askedTools\r\n : []\r\n\r\n if (allow.length > 0) {\r\n const prev = base.alwaysAllowRules.localSettings ?? []\r\n base.alwaysAllowRules.localSettings = [...new Set([...prev, ...allow])]\r\n }\r\n if (deny.length > 0) {\r\n const prev = base.alwaysDenyRules.localSettings ?? []\r\n base.alwaysDenyRules.localSettings = [...new Set([...prev, ...deny])]\r\n }\r\n if (ask.length > 0) {\r\n const prev = base.alwaysAskRules.localSettings ?? []\r\n base.alwaysAskRules.localSettings = [...new Set([...prev, ...ask])]\r\n }\r\n } catch (error) {\r\n logError(error)\r\n }\r\n }\r\n\r\n return base\r\n}\r\n\r\nfunction getOrCreatePermissions(\r\n settings: SettingsFileWithPermissions,\r\n): Required<SettingsFileWithPermissions>['permissions'] {\r\n const existing = settings.permissions\r\n if (existing && typeof existing === 'object') {\r\n return existing as SettingsPermissions\r\n }\r\n settings.permissions = {}\r\n return settings.permissions as SettingsPermissions\r\n}\r\n\r\nfunction behaviorKey(\r\n behavior: ToolPermissionRuleBehavior,\r\n): keyof SettingsPermissions {\r\n switch (behavior) {\r\n case 'allow':\r\n return 'allow'\r\n case 'deny':\r\n return 'deny'\r\n case 'ask':\r\n return 'ask'\r\n }\r\n}\r\n\r\nexport function persistToolPermissionUpdateToDisk(options: {\r\n update: ToolPermissionContextUpdate\r\n projectDir?: string\r\n homeDir?: string\r\n}): { persisted: boolean } {\r\n const update = options.update\r\n if (!isPersistableToolPermissionDestination(update.destination)) {\r\n return { persisted: false }\r\n }\r\n if (update.type === 'setMode') {\r\n return { persisted: false }\r\n }\r\n\r\n const filePath = getPrimarySettingsFilePathForDestination({\r\n destination: update.destination,\r\n projectDir: options.projectDir,\r\n homeDir: options.homeDir,\r\n })\r\n if (!filePath) return { persisted: false }\r\n\r\n const existing =\r\n (loadSettingsWithLegacyFallback({\r\n destination: update.destination as any,\r\n projectDir: options.projectDir,\r\n homeDir: options.homeDir,\r\n migrateToPrimary: true,\r\n }).settings as SettingsFileWithPermissions | null) ?? {}\r\n const permissions = getOrCreatePermissions(existing)\r\n\r\n try {\r\n switch (update.type) {\r\n case 'addRules':\r\n case 'replaceRules':\r\n case 'removeRules': {\r\n const key = behaviorKey(update.behavior)\r\n const current = uniqueStrings(permissions[key])\r\n\r\n if (update.type === 'addRules') {\r\n const merged = [...new Set([...current, ...update.rules])]\r\n permissions[key] = merged\r\n } else if (update.type === 'replaceRules') {\r\n permissions[key] = uniqueStrings(update.rules)\r\n } else {\r\n const toRemove = new Set(update.rules)\r\n permissions[key] = current.filter(rule => !toRemove.has(rule))\r\n }\r\n break\r\n }\r\n case 'addDirectories':\r\n case 'removeDirectories': {\r\n const current = uniqueStrings(permissions.additionalDirectories)\r\n if (update.type === 'addDirectories') {\r\n permissions.additionalDirectories = [\r\n ...new Set([...current, ...update.directories]),\r\n ]\r\n } else {\r\n const toRemove = new Set(update.directories)\r\n permissions.additionalDirectories = current.filter(\r\n dir => !toRemove.has(dir),\r\n )\r\n }\r\n break\r\n }\r\n default:\r\n return { persisted: false }\r\n }\r\n\r\n saveSettingsToPrimaryAndSyncLegacy({\r\n destination: update.destination as any,\r\n projectDir: options.projectDir,\r\n homeDir: options.homeDir,\r\n settings: existing as SettingsFile,\r\n syncLegacyIfExists: true,\r\n })\r\n return { persisted: true }\r\n } catch (error) {\r\n logError(error)\r\n return { persisted: false }\r\n }\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,136 @@
1
+ import { createRequire as __kodeCreateRequire } from "node:module";
2
+ const require = __kodeCreateRequire(import.meta.url);
3
+ import {
4
+ PRODUCT_NAME,
5
+ execFileNoThrow,
6
+ init_execFileNoThrow,
7
+ init_log,
8
+ init_product,
9
+ logError
10
+ } from "./chunk-SQGAHZPM.js";
11
+ import {
12
+ MACRO,
13
+ init_macros
14
+ } from "./chunk-UNCTVIS7.js";
15
+
16
+ // src/utils/session/autoUpdater.ts
17
+ init_execFileNoThrow();
18
+ init_log();
19
+ init_macros();
20
+ init_product();
21
+ async function getSemver() {
22
+ const mod = await import("semver");
23
+ return mod?.default ?? mod;
24
+ }
25
+ async function assertMinVersion() {
26
+ try {
27
+ const versionConfig = { minVersion: "0.0.0" };
28
+ if (versionConfig.minVersion) {
29
+ const { lt } = await getSemver();
30
+ if (!lt(MACRO.VERSION, versionConfig.minVersion)) return;
31
+ const suggestions = await getUpdateCommandSuggestions();
32
+ process.stderr.write(
33
+ `Your ${PRODUCT_NAME} version ${MACRO.VERSION} is below the minimum supported ${versionConfig.minVersion}.
34
+ Update using one of:
35
+ ` + suggestions.map((c) => ` ${c}`).join("\n") + "\n"
36
+ );
37
+ process.exit(1);
38
+ }
39
+ } catch (error) {
40
+ logError(`Error checking minimum version: ${error}`);
41
+ }
42
+ }
43
+ async function getLatestVersion() {
44
+ try {
45
+ const abortController = new AbortController();
46
+ setTimeout(() => abortController.abort(), 5e3);
47
+ const result = await execFileNoThrow(
48
+ "npm",
49
+ ["view", MACRO.PACKAGE_URL, "version"],
50
+ abortController.signal
51
+ );
52
+ if (result.code === 0) {
53
+ const v = result.stdout.trim();
54
+ if (v) return v;
55
+ }
56
+ } catch {
57
+ }
58
+ try {
59
+ const controller = new AbortController();
60
+ const timer = setTimeout(() => controller.abort(), 5e3);
61
+ const res = await fetch(
62
+ `https://registry.npmjs.org/${encodeURIComponent(MACRO.PACKAGE_URL)}`,
63
+ {
64
+ method: "GET",
65
+ headers: {
66
+ Accept: "application/vnd.npm.install-v1+json",
67
+ "User-Agent": `${PRODUCT_NAME}/${MACRO.VERSION}`
68
+ },
69
+ signal: controller.signal
70
+ }
71
+ );
72
+ clearTimeout(timer);
73
+ if (!res.ok) return null;
74
+ const json = await res.json().catch(() => null);
75
+ const latest = json && json["dist-tags"] && json["dist-tags"].latest;
76
+ return typeof latest === "string" ? latest : null;
77
+ } catch {
78
+ return null;
79
+ }
80
+ }
81
+ async function getUpdateCommandSuggestions() {
82
+ return [
83
+ `bun add -g ${MACRO.PACKAGE_URL}@latest`,
84
+ `npm install -g ${MACRO.PACKAGE_URL}@latest`
85
+ ];
86
+ }
87
+ async function checkAndNotifyUpdate() {
88
+ try {
89
+ if (process.env.NODE_ENV === "test") return;
90
+ const [
91
+ { isAutoUpdaterDisabled, getGlobalConfig, saveGlobalConfig },
92
+ { env }
93
+ ] = await Promise.all([import("./config-MLH7ZTFA.js"), import("./env-VMEIP4EW.js")]);
94
+ if (await isAutoUpdaterDisabled()) return;
95
+ if (await env.getIsDocker()) return;
96
+ if (!await env.hasInternetAccess()) return;
97
+ const config = getGlobalConfig();
98
+ const now = Date.now();
99
+ const DAY_MS = 24 * 60 * 60 * 1e3;
100
+ const lastCheck = Number(config.lastUpdateCheckAt || 0);
101
+ if (lastCheck && now - lastCheck < DAY_MS) return;
102
+ const latest = await getLatestVersion();
103
+ if (!latest) {
104
+ saveGlobalConfig({ ...config, lastUpdateCheckAt: now });
105
+ return;
106
+ }
107
+ const { gt } = await getSemver();
108
+ if (gt(latest, MACRO.VERSION)) {
109
+ saveGlobalConfig({
110
+ ...config,
111
+ lastUpdateCheckAt: now,
112
+ lastSuggestedVersion: latest
113
+ });
114
+ const suggestions = await getUpdateCommandSuggestions();
115
+ process.stderr.write(
116
+ [
117
+ `New version available: ${latest} (current: ${MACRO.VERSION})`,
118
+ "Run the following command to update:",
119
+ ...suggestions.map((command) => ` ${command}`),
120
+ ""
121
+ ].join("\n")
122
+ );
123
+ } else {
124
+ saveGlobalConfig({ ...config, lastUpdateCheckAt: now });
125
+ }
126
+ } catch (error) {
127
+ logError(`update-notify: ${error}`);
128
+ }
129
+ }
130
+
131
+ export {
132
+ assertMinVersion,
133
+ getLatestVersion,
134
+ getUpdateCommandSuggestions,
135
+ checkAndNotifyUpdate
136
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/session/autoUpdater.ts"],
4
+ "sourcesContent": ["import { execFileNoThrow } from '@utils/system/execFileNoThrow'\r\nimport { logError } from '@utils/log'\r\n\r\nimport { MACRO } from '@constants/macros'\r\nimport { PRODUCT_NAME } from '@constants/product'\r\n\r\nasync function getSemver() {\r\n const mod: any = await import('semver')\r\n return (mod?.default ?? mod) as {\r\n lt: (a: string, b: string) => boolean\r\n gt: (a: string, b: string) => boolean\r\n }\r\n}\r\n\r\nexport type VersionConfig = {\r\n minVersion: string\r\n}\r\n\r\nexport async function assertMinVersion(): Promise<void> {\r\n try {\r\n const versionConfig: VersionConfig = { minVersion: '0.0.0' }\r\n if (versionConfig.minVersion) {\r\n const { lt } = await getSemver()\r\n if (!lt(MACRO.VERSION, versionConfig.minVersion)) return\r\n\r\n const suggestions = await getUpdateCommandSuggestions()\r\n process.stderr.write(\r\n `Your ${PRODUCT_NAME} version ${MACRO.VERSION} is below the minimum supported ${versionConfig.minVersion}.\\n` +\r\n 'Update using one of:\\n' +\r\n suggestions.map(c => ` ${c}`).join('\\n') +\r\n '\\n',\r\n )\r\n process.exit(1)\r\n }\r\n } catch (error) {\r\n logError(`Error checking minimum version: ${error}`)\r\n }\r\n}\r\n\r\nexport async function getLatestVersion(): Promise<string | null> {\r\n try {\r\n const abortController = new AbortController()\r\n setTimeout(() => abortController.abort(), 5000)\r\n const result = await execFileNoThrow(\r\n 'npm',\r\n ['view', MACRO.PACKAGE_URL, 'version'],\r\n abortController.signal,\r\n )\r\n if (result.code === 0) {\r\n const v = result.stdout.trim()\r\n if (v) return v\r\n }\r\n } catch {}\r\n\r\n\t try {\r\n\t const controller = new AbortController()\r\n\t const timer = setTimeout(() => controller.abort(), 5000)\r\n\t const res = await fetch(\r\n\t `https://registry.npmjs.org/${encodeURIComponent(MACRO.PACKAGE_URL)}`,\r\n\t {\r\n\t method: 'GET',\r\n\t headers: {\r\n\t Accept: 'application/vnd.npm.install-v1+json',\r\n\t 'User-Agent': `${PRODUCT_NAME}/${MACRO.VERSION}`,\r\n\t },\r\n\t signal: controller.signal,\r\n\t },\r\n\t )\r\n\t clearTimeout(timer)\r\n\t if (!res.ok) return null\r\n\t const json: any = await res.json().catch(() => null)\r\n\t const latest = json && json['dist-tags'] && json['dist-tags'].latest\r\n\t return typeof latest === 'string' ? latest : null\r\n\t } catch {\r\n\t return null\r\n\t }\r\n\t}\r\n\r\nexport async function getUpdateCommandSuggestions(): Promise<string[]> {\r\n return [\r\n `bun add -g ${MACRO.PACKAGE_URL}@latest`,\r\n `npm install -g ${MACRO.PACKAGE_URL}@latest`,\r\n ]\r\n}\r\n\r\nexport async function checkAndNotifyUpdate(): Promise<void> {\r\n try {\r\n if (process.env.NODE_ENV === 'test') return\r\n const [\r\n { isAutoUpdaterDisabled, getGlobalConfig, saveGlobalConfig },\r\n { env },\r\n ] = await Promise.all([import('@utils/config'), import('@utils/config/env')])\r\n if (await isAutoUpdaterDisabled()) return\r\n if (await env.getIsDocker()) return\r\n if (!(await env.hasInternetAccess())) return\r\n\r\n const config: any = getGlobalConfig()\r\n const now = Date.now()\r\n const DAY_MS = 24 * 60 * 60 * 1000\r\n const lastCheck = Number(config.lastUpdateCheckAt || 0)\r\n if (lastCheck && now - lastCheck < DAY_MS) return\r\n\r\n const latest = await getLatestVersion()\r\n if (!latest) {\r\n saveGlobalConfig({ ...config, lastUpdateCheckAt: now })\r\n return\r\n }\r\n\r\n const { gt } = await getSemver()\r\n if (gt(latest, MACRO.VERSION)) {\r\n saveGlobalConfig({\r\n ...config,\r\n lastUpdateCheckAt: now,\r\n lastSuggestedVersion: latest,\r\n })\r\n const suggestions = await getUpdateCommandSuggestions()\r\n process.stderr.write(\r\n [\r\n `New version available: ${latest} (current: ${MACRO.VERSION})`,\r\n 'Run the following command to update:',\r\n ...suggestions.map(command => ` ${command}`),\r\n '',\r\n ].join('\\n'),\r\n )\r\n } else {\r\n saveGlobalConfig({ ...config, lastUpdateCheckAt: now })\r\n }\r\n } catch (error) {\r\n logError(`update-notify: ${error}`)\r\n }\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }