@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.
- package/LICENSE +201 -0
- package/README.md +336 -0
- package/cli-acp.js +82 -0
- package/cli.js +105 -0
- package/dist/REPL-EYUOXCEC.js +42 -0
- package/dist/REPL-EYUOXCEC.js.map +7 -0
- package/dist/acp-S5WNCLMD.js +1372 -0
- package/dist/acp-S5WNCLMD.js.map +7 -0
- package/dist/agentsValidate-RQ2QDGNY.js +373 -0
- package/dist/agentsValidate-RQ2QDGNY.js.map +7 -0
- package/dist/ask-TX526UBD.js +129 -0
- package/dist/ask-TX526UBD.js.map +7 -0
- package/dist/autoUpdater-63RAZ24N.js +17 -0
- package/dist/autoUpdater-63RAZ24N.js.map +7 -0
- package/dist/chunk-2VQWLLDU.js +16 -0
- package/dist/chunk-2VQWLLDU.js.map +7 -0
- package/dist/chunk-4CLHMO4I.js +656 -0
- package/dist/chunk-4CLHMO4I.js.map +7 -0
- package/dist/chunk-4ZNNWJZU.js +5696 -0
- package/dist/chunk-4ZNNWJZU.js.map +7 -0
- package/dist/chunk-66EZC7Y7.js +149 -0
- package/dist/chunk-66EZC7Y7.js.map +7 -0
- package/dist/chunk-6EPQRP3S.js +96 -0
- package/dist/chunk-6EPQRP3S.js.map +7 -0
- package/dist/chunk-77IRSDFR.js +195 -0
- package/dist/chunk-77IRSDFR.js.map +7 -0
- package/dist/chunk-7RZNLBEK.js +136 -0
- package/dist/chunk-7RZNLBEK.js.map +7 -0
- package/dist/chunk-BNBV2FXC.js +19 -0
- package/dist/chunk-BNBV2FXC.js.map +7 -0
- package/dist/chunk-CQCREBDO.js +248 -0
- package/dist/chunk-CQCREBDO.js.map +7 -0
- package/dist/chunk-D77XS6TB.js +74 -0
- package/dist/chunk-D77XS6TB.js.map +7 -0
- package/dist/chunk-DHYBJN3V.js +474 -0
- package/dist/chunk-DHYBJN3V.js.map +7 -0
- package/dist/chunk-DLSLSLTR.js +842 -0
- package/dist/chunk-DLSLSLTR.js.map +7 -0
- package/dist/chunk-ELAE6Z4H.js +514 -0
- package/dist/chunk-ELAE6Z4H.js.map +7 -0
- package/dist/chunk-ELZQD7ZR.js +531 -0
- package/dist/chunk-ELZQD7ZR.js.map +7 -0
- package/dist/chunk-F6DEGMX6.js +31269 -0
- package/dist/chunk-F6DEGMX6.js.map +7 -0
- package/dist/chunk-GDF2AON2.js +124 -0
- package/dist/chunk-GDF2AON2.js.map +7 -0
- package/dist/chunk-H7BGBV4P.js +498 -0
- package/dist/chunk-H7BGBV4P.js.map +7 -0
- package/dist/chunk-HIIHGKXP.js +24 -0
- package/dist/chunk-HIIHGKXP.js.map +7 -0
- package/dist/chunk-HJCCXED7.js +17 -0
- package/dist/chunk-HJCCXED7.js.map +7 -0
- package/dist/chunk-IQ6VZB2Y.js +139 -0
- package/dist/chunk-IQ6VZB2Y.js.map +7 -0
- package/dist/chunk-J4D7AELD.js +518 -0
- package/dist/chunk-J4D7AELD.js.map +7 -0
- package/dist/chunk-JVGG2YQR.js +23 -0
- package/dist/chunk-JVGG2YQR.js.map +7 -0
- package/dist/chunk-LGEK2NV7.js +939 -0
- package/dist/chunk-LGEK2NV7.js.map +7 -0
- package/dist/chunk-LWXT5RGE.js +95 -0
- package/dist/chunk-LWXT5RGE.js.map +7 -0
- package/dist/chunk-M3TKNAUR.js +35 -0
- package/dist/chunk-M3TKNAUR.js.map +7 -0
- package/dist/chunk-MRFO7QO5.js +170 -0
- package/dist/chunk-MRFO7QO5.js.map +7 -0
- package/dist/chunk-MVN3DHQF.js +95 -0
- package/dist/chunk-MVN3DHQF.js.map +7 -0
- package/dist/chunk-O25PXGOC.js +772 -0
- package/dist/chunk-O25PXGOC.js.map +7 -0
- package/dist/chunk-OBGVKM3N.js +1618 -0
- package/dist/chunk-OBGVKM3N.js.map +7 -0
- package/dist/chunk-OV5HJXXQ.js +198 -0
- package/dist/chunk-OV5HJXXQ.js.map +7 -0
- package/dist/chunk-P5VWDMRD.js +249 -0
- package/dist/chunk-P5VWDMRD.js.map +7 -0
- package/dist/chunk-PDSAJX7G.js +49 -0
- package/dist/chunk-PDSAJX7G.js.map +7 -0
- package/dist/chunk-RHNEZOPO.js +739 -0
- package/dist/chunk-RHNEZOPO.js.map +7 -0
- package/dist/chunk-SQGAHZPM.js +3004 -0
- package/dist/chunk-SQGAHZPM.js.map +7 -0
- package/dist/chunk-U7Z4MXY4.js +21 -0
- package/dist/chunk-U7Z4MXY4.js.map +7 -0
- package/dist/chunk-UNCTVIS7.js +146 -0
- package/dist/chunk-UNCTVIS7.js.map +7 -0
- package/dist/chunk-VMEOI6MH.js +1103 -0
- package/dist/chunk-VMEOI6MH.js.map +7 -0
- package/dist/chunk-WAY3DKFO.js +47 -0
- package/dist/chunk-WAY3DKFO.js.map +7 -0
- package/dist/chunk-XEYEKVFT.js +24 -0
- package/dist/chunk-XEYEKVFT.js.map +7 -0
- package/dist/chunk-Y4BQ36T4.js +796 -0
- package/dist/chunk-Y4BQ36T4.js.map +7 -0
- package/dist/chunk-Y5LQPJWK.js +12 -0
- package/dist/chunk-Y5LQPJWK.js.map +7 -0
- package/dist/chunk-YIJWUNWF.js +1260 -0
- package/dist/chunk-YIJWUNWF.js.map +7 -0
- package/dist/chunk-YMIWYEZ7.js +34 -0
- package/dist/chunk-YMIWYEZ7.js.map +7 -0
- package/dist/cli-PQNZWJX4.js +3952 -0
- package/dist/cli-PQNZWJX4.js.map +7 -0
- package/dist/commands-HOBCZ3VQ.js +46 -0
- package/dist/commands-HOBCZ3VQ.js.map +7 -0
- package/dist/config-MLH7ZTFA.js +81 -0
- package/dist/config-MLH7ZTFA.js.map +7 -0
- package/dist/context-FZ6G4J63.js +30 -0
- package/dist/context-FZ6G4J63.js.map +7 -0
- package/dist/costTracker-5WKZXN5S.js +19 -0
- package/dist/costTracker-5WKZXN5S.js.map +7 -0
- package/dist/customCommands-EB4MMZSS.js +25 -0
- package/dist/customCommands-EB4MMZSS.js.map +7 -0
- package/dist/env-VMEIP4EW.js +28 -0
- package/dist/env-VMEIP4EW.js.map +7 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +7 -0
- package/dist/kodeAgentSessionId-WUT74FSH.js +16 -0
- package/dist/kodeAgentSessionId-WUT74FSH.js.map +7 -0
- package/dist/kodeAgentSessionLoad-KR4JSD6D.js +21 -0
- package/dist/kodeAgentSessionLoad-KR4JSD6D.js.map +7 -0
- package/dist/kodeAgentSessionResume-BCD6UV74.js +18 -0
- package/dist/kodeAgentSessionResume-BCD6UV74.js.map +7 -0
- package/dist/kodeAgentStreamJson-EDHHWNNX.js +15 -0
- package/dist/kodeAgentStreamJson-EDHHWNNX.js.map +7 -0
- package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js +133 -0
- package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js.map +7 -0
- package/dist/kodeAgentStructuredStdio-UA5P5UNU.js +11 -0
- package/dist/kodeAgentStructuredStdio-UA5P5UNU.js.map +7 -0
- package/dist/kodeHooks-EHM6GSIQ.js +37 -0
- package/dist/kodeHooks-EHM6GSIQ.js.map +7 -0
- package/dist/llm-SJXCV7DA.js +3138 -0
- package/dist/llm-SJXCV7DA.js.map +7 -0
- package/dist/llmLazy-2QYJVD6K.js +15 -0
- package/dist/llmLazy-2QYJVD6K.js.map +7 -0
- package/dist/loader-LJX77EFL.js +28 -0
- package/dist/loader-LJX77EFL.js.map +7 -0
- package/dist/mcp-DOROSLPN.js +49 -0
- package/dist/mcp-DOROSLPN.js.map +7 -0
- package/dist/mentionProcessor-5UZRHCGH.js +215 -0
- package/dist/mentionProcessor-5UZRHCGH.js.map +7 -0
- package/dist/messages-N5KBI53P.js +65 -0
- package/dist/messages-N5KBI53P.js.map +7 -0
- package/dist/model-HPLBR53R.js +30 -0
- package/dist/model-HPLBR53R.js.map +7 -0
- package/dist/openai-YP4OJYKF.js +29 -0
- package/dist/openai-YP4OJYKF.js.map +7 -0
- package/dist/outputStyles-NNALI5D7.js +28 -0
- package/dist/outputStyles-NNALI5D7.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/pluginRuntime-JYYI5BSQ.js +220 -0
- package/dist/pluginRuntime-JYYI5BSQ.js.map +7 -0
- package/dist/pluginValidation-JWUFPZUE.js +17 -0
- package/dist/pluginValidation-JWUFPZUE.js.map +7 -0
- package/dist/prompts-B2SS7CWI.js +50 -0
- package/dist/prompts-B2SS7CWI.js.map +7 -0
- package/dist/query-HIK457UU.js +50 -0
- package/dist/query-HIK457UU.js.map +7 -0
- package/dist/responsesStreaming-L2BSN37C.js +10 -0
- package/dist/responsesStreaming-L2BSN37C.js.map +7 -0
- package/dist/ripgrep-GCKI4UTL.js +17 -0
- package/dist/ripgrep-GCKI4UTL.js.map +7 -0
- package/dist/skillMarketplace-PCTUUX46.js +37 -0
- package/dist/skillMarketplace-PCTUUX46.js.map +7 -0
- package/dist/state-XJICGOUA.js +18 -0
- package/dist/state-XJICGOUA.js.map +7 -0
- package/dist/theme-DP7O4SGH.js +14 -0
- package/dist/theme-DP7O4SGH.js.map +7 -0
- package/dist/toolPermissionContext-DHAGUPEW.js +17 -0
- package/dist/toolPermissionContext-DHAGUPEW.js.map +7 -0
- package/dist/toolPermissionSettings-PT65MQIQ.js +18 -0
- package/dist/toolPermissionSettings-PT65MQIQ.js.map +7 -0
- package/dist/tools-BHW37PCF.js +47 -0
- package/dist/tools-BHW37PCF.js.map +7 -0
- package/dist/userInput-XDRYT5TI.js +316 -0
- package/dist/userInput-XDRYT5TI.js.map +7 -0
- package/dist/uuid-QUYJMIUV.js +9 -0
- package/dist/uuid-QUYJMIUV.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +115 -0
- package/scripts/binary-utils.cjs +62 -0
- package/scripts/cli-acp-wrapper.cjs +82 -0
- package/scripts/cli-wrapper.cjs +105 -0
- package/scripts/postinstall.js +144 -0
- 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": ";;;;;;;;;;AAGA;AACA;AAJA,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,eAAe;AACxB,SAAS,SAAS,MAAM,eAAe;AAavC,SAAS,kBAAkB,OAA+B;AACxD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,UAAU,QAAQ,OAAO,IAAI;AACtC;AAEA,SAAS,cAAc,QAA4B;AACjD,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,MAAO;AACZ,QAAI,KAAK,IAAI,KAAK,EAAG;AACrB,SAAK,IAAI,KAAK;AACd,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,oBAA4B;AACnC,QAAM,UACJ,OAAO,QAAQ,IAAI,SAAS,WACxB,QAAQ,IAAI,OACZ,OAAO,QAAQ,IAAI,gBAAgB,WACjC,QAAQ,IAAI,cACZ;AACR,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAS,QAAO;AACpB,SAAO,QAAQ;AACjB;AAEA,SAAS,oBAAoB,SAGlB;AACT,QAAM,qBAAqB,SAAS,sBAAsB;AAC1D,MAAI,oBAAoB;AACtB,UAAM,WAAW;AAAA,MACf,QAAQ,IAAI,oBAAoB,QAAQ,IAAI,mBAAmB,QAAQ,IAAI;AAAA,IAC7E;AACA,QAAI,SAAU,QAAO;AAAA,EACvB;AACA,QAAM,OAAO,SAAS,WAAW,kBAAkB;AACnD,SAAO,KAAK,MAAM,QAAQ;AAC5B;AAEA,SAAS,qBAAqB,SAGnB;AACT,QAAM,qBAAqB,SAAS,sBAAsB;AAC1D,MAAI,oBAAoB;AACtB,UAAM,WAAW,kBAAkB,QAAQ,IAAI,iBAAiB;AAChE,QAAI,SAAU,QAAO;AAAA,EACvB;AACA,QAAM,OAAO,SAAS,WAAW,kBAAkB;AACnD,SAAO,KAAK,MAAM,SAAS;AAC7B;AAEO,SAAS,0BAA0B,SAIO;AAC/C,QAAM,aAAa,QAAQ,cAAc,OAAO;AAChD,QAAM,UAAU,QAAQ,WAAW,kBAAkB;AACrD,QAAM,qBAAqB,QAAQ,YAAY;AAE/C,UAAQ,QAAQ,aAAa;AAAA,IAC3B,KAAK,iBAAiB;AACpB,YAAM,UAAU,KAAK,YAAY,UAAU,qBAAqB;AAChE,YAAM,SAAS,CAAC,KAAK,YAAY,SAAS,qBAAqB,GAAG,KAAK,YAAY,WAAW,qBAAqB,CAAC;AACpH,aAAO,EAAE,SAAS,OAAO;AAAA,IAC3B;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,UAAU,KAAK,YAAY,UAAU,eAAe;AAC1D,YAAM,SAAS,CAAC,KAAK,YAAY,SAAS,eAAe,GAAG,KAAK,YAAY,WAAW,eAAe,CAAC;AACxG,aAAO,EAAE,SAAS,OAAO;AAAA,IAC3B;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,UAAU;AAAA,QACd,oBAAoB,EAAE,SAAS,mBAAmB,CAAC;AAAA,QACnD;AAAA,MACF;AACA,YAAM,SAAS,cAAc;AAAA,QAC3B;AAAA,UACE,qBAAqB,EAAE,SAAS,mBAAmB,CAAC;AAAA,UACpD;AAAA,QACF;AAAA,QACA,KAAK,SAAS,WAAW,eAAe;AAAA,MAC1C,CAAC;AACD,aAAO,EAAE,SAAS,OAAO;AAAA,IAC3B;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,iBAAiB,UAAuC;AACtE,MAAI,CAAC,WAAW,QAAQ,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,MAAM,aAAa,UAAU,OAAO;AAC1C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,aAAS,KAAK;AACd,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBACd,UACA,UACM;AACN,YAAU,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,gBAAc,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,MAAM,OAAO;AAC3E;AAEO,SAAS,+BAA+B,SAKgB;AAC7D,QAAM,aAAa,0BAA0B,OAAO;AACpD,MAAI,CAAC,WAAY,QAAO,EAAE,UAAU,MAAM,UAAU,KAAK;AAEzD,QAAM,kBAAkB,iBAAiB,WAAW,OAAO;AAC3D,MAAI;AACF,WAAO,EAAE,UAAU,iBAAiB,UAAU,WAAW,QAAQ;AAEnE,aAAW,cAAc,WAAW,QAAQ;AAC1C,UAAM,iBAAiB,iBAAiB,UAAU;AAClD,QAAI,CAAC,eAAgB;AAErB,QAAI,QAAQ,oBAAoB,eAAe,WAAW,SAAS;AACjE,UAAI;AACF,YAAI,CAAC,WAAW,WAAW,OAAO,GAAG;AACnC,4BAAkB,WAAW,SAAS,cAAc;AAAA,QACtD;AAAA,MACF,SAAS,OAAO;AACd,iBAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,gBAAgB,UAAU,WAAW;AAAA,EAC1D;AAEA,SAAO,EAAE,UAAU,MAAM,UAAU,KAAK;AAC1C;AAEO,SAAS,mCAAmC,SAM1C;AACP,QAAM,aAAa,0BAA0B,OAAO;AACpD,MAAI,CAAC,WAAY;AAEjB,oBAAkB,WAAW,SAAS,QAAQ,QAAQ;AAEtD,MAAI,CAAC,QAAQ,mBAAoB;AACjC,aAAW,cAAc,WAAW,QAAQ;AAC1C,QAAI,eAAe,WAAW,QAAS;AACvC,QAAI,CAAC,WAAW,UAAU,EAAG;AAC7B,QAAI;AACF,wBAAkB,YAAY,QAAQ,QAAQ;AAAA,IAChD,SAAS,OAAO;AACd,eAAS,KAAK;AAAA,IAChB;AAAA,EACF;AACF;",
|
|
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
|
+
}
|