@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,19 @@
|
|
|
1
|
+
import { createRequire as __kodeCreateRequire } from "node:module";
|
|
2
|
+
const require = __kodeCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/utils/text/generators.ts
|
|
5
|
+
var NO_VALUE = Symbol("NO_VALUE");
|
|
6
|
+
async function lastX(as) {
|
|
7
|
+
let lastValue = NO_VALUE;
|
|
8
|
+
for await (const a of as) {
|
|
9
|
+
lastValue = a;
|
|
10
|
+
}
|
|
11
|
+
if (lastValue === NO_VALUE) {
|
|
12
|
+
throw new Error("No items in generator");
|
|
13
|
+
}
|
|
14
|
+
return lastValue;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export {
|
|
18
|
+
lastX
|
|
19
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/text/generators.ts"],
|
|
4
|
+
"sourcesContent": ["const NO_VALUE = Symbol('NO_VALUE')\r\n\r\nexport async function lastX<A>(as: AsyncGenerator<A>): Promise<A> {\r\n let lastValue: A | typeof NO_VALUE = NO_VALUE\r\n for await (const a of as) {\r\n lastValue = a\r\n }\r\n if (lastValue === NO_VALUE) {\r\n throw new Error('No items in generator')\r\n }\r\n return lastValue\r\n}\r\n\r\ntype QueuedGenerator<A> = {\r\n done: boolean | void\r\n value: A | void\r\n generator: AsyncGenerator<A, void>\r\n promise: Promise<QueuedGenerator<A>>\r\n}\r\n\r\nexport async function* all<A>(\r\n generators: AsyncGenerator<A, void>[],\r\n concurrencyCap = Infinity,\r\n): AsyncGenerator<A, void> {\r\n const next = (generator: AsyncGenerator<A, void>) => {\r\n const promise: Promise<QueuedGenerator<A>> = generator\r\n .next()\r\n .then(({ done, value }) => ({\r\n done,\r\n value,\r\n generator,\r\n promise,\r\n }))\r\n return promise\r\n }\r\n const waiting = [...generators]\r\n const promises = new Set<Promise<QueuedGenerator<A>>>()\r\n\r\n while (promises.size < concurrencyCap && waiting.length > 0) {\r\n const gen = waiting.shift()!\r\n promises.add(next(gen))\r\n }\r\n\r\n while (promises.size > 0) {\r\n const { done, value, generator, promise } = await Promise.race(promises)\r\n promises.delete(promise)\r\n\r\n if (!done) {\r\n promises.add(next(generator))\r\n if (value !== undefined) {\r\n yield value as A\r\n }\r\n } else if (waiting.length > 0) {\r\n const nextGen = waiting.shift()!\r\n promises.add(next(nextGen))\r\n }\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": ";;;;AAAA,IAAM,WAAW,OAAO,UAAU;AAElC,eAAsB,MAAS,IAAmC;AAChE,MAAI,YAAiC;AACrC,mBAAiB,KAAK,IAAI;AACxB,gBAAY;AAAA,EACd;AACA,MAAI,cAAc,UAAU;AAC1B,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { createRequire as __kodeCreateRequire } from "node:module";
|
|
2
|
+
const require = __kodeCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
getDanyaAgentSessionId
|
|
5
|
+
} from "./chunk-U7Z4MXY4.js";
|
|
6
|
+
import {
|
|
7
|
+
PLAN_SLUG_ADJECTIVES,
|
|
8
|
+
PLAN_SLUG_NOUNS,
|
|
9
|
+
PLAN_SLUG_VERBS,
|
|
10
|
+
getCwd,
|
|
11
|
+
getKodeBaseDir,
|
|
12
|
+
init_env,
|
|
13
|
+
init_planSlugWords,
|
|
14
|
+
init_state
|
|
15
|
+
} from "./chunk-SQGAHZPM.js";
|
|
16
|
+
import {
|
|
17
|
+
MACRO,
|
|
18
|
+
init_macros
|
|
19
|
+
} from "./chunk-UNCTVIS7.js";
|
|
20
|
+
|
|
21
|
+
// src/utils/protocol/kodeAgentSessionLog.ts
|
|
22
|
+
init_macros();
|
|
23
|
+
init_state();
|
|
24
|
+
import { execFileSync } from "child_process";
|
|
25
|
+
import {
|
|
26
|
+
appendFileSync,
|
|
27
|
+
existsSync,
|
|
28
|
+
mkdirSync,
|
|
29
|
+
readFileSync,
|
|
30
|
+
statSync,
|
|
31
|
+
writeFileSync
|
|
32
|
+
} from "fs";
|
|
33
|
+
import { randomBytes } from "crypto";
|
|
34
|
+
import { dirname, join } from "path";
|
|
35
|
+
init_env();
|
|
36
|
+
init_planSlugWords();
|
|
37
|
+
function getSessionStoreBaseDir() {
|
|
38
|
+
return getKodeBaseDir();
|
|
39
|
+
}
|
|
40
|
+
function sanitizeProjectNameForSessionStore(cwd) {
|
|
41
|
+
return cwd.replace(/[^a-zA-Z0-9]/g, "-");
|
|
42
|
+
}
|
|
43
|
+
function getSessionProjectsDir() {
|
|
44
|
+
return join(getSessionStoreBaseDir(), "projects");
|
|
45
|
+
}
|
|
46
|
+
function getSessionProjectDir(cwd) {
|
|
47
|
+
return join(getSessionProjectsDir(), sanitizeProjectNameForSessionStore(cwd));
|
|
48
|
+
}
|
|
49
|
+
function getSessionLogFilePath(args) {
|
|
50
|
+
return join(getSessionProjectDir(args.cwd), `${args.sessionId}.jsonl`);
|
|
51
|
+
}
|
|
52
|
+
function getAgentLogFilePath(args) {
|
|
53
|
+
return join(getSessionProjectDir(args.cwd), `agent-${args.agentId}.jsonl`);
|
|
54
|
+
}
|
|
55
|
+
function safeMkdir(dir) {
|
|
56
|
+
if (existsSync(dir)) return;
|
|
57
|
+
mkdirSync(dir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
function safeEnsureFile(path) {
|
|
60
|
+
safeMkdir(dirname(path));
|
|
61
|
+
if (!existsSync(path)) writeFileSync(path, "", "utf8");
|
|
62
|
+
}
|
|
63
|
+
function safeAppendJsonl(path, record) {
|
|
64
|
+
try {
|
|
65
|
+
safeEnsureFile(path);
|
|
66
|
+
appendFileSync(path, JSON.stringify(record) + "\n", "utf8");
|
|
67
|
+
} catch {
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
var lastUuidByFile = /* @__PURE__ */ new Map();
|
|
71
|
+
var snapshotWrittenByFile = /* @__PURE__ */ new Set();
|
|
72
|
+
var slugBySessionId = /* @__PURE__ */ new Map();
|
|
73
|
+
var currentSessionCustomTitle = null;
|
|
74
|
+
var currentSessionTag = null;
|
|
75
|
+
function safeReadLastPersistedInfo(filePath) {
|
|
76
|
+
try {
|
|
77
|
+
if (!existsSync(filePath)) return { uuid: null, slug: null };
|
|
78
|
+
const content = readFileSync(filePath, "utf8");
|
|
79
|
+
const lines = content.split("\n");
|
|
80
|
+
let lastSlug = null;
|
|
81
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
82
|
+
const line = lines[i]?.trim();
|
|
83
|
+
if (!line) continue;
|
|
84
|
+
let parsed;
|
|
85
|
+
try {
|
|
86
|
+
parsed = JSON.parse(line);
|
|
87
|
+
} catch {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (!parsed || typeof parsed !== "object") continue;
|
|
91
|
+
if (!lastSlug && typeof parsed.slug === "string" && parsed.slug.trim()) {
|
|
92
|
+
lastSlug = parsed.slug.trim();
|
|
93
|
+
}
|
|
94
|
+
if (typeof parsed.uuid === "string" && parsed.uuid) {
|
|
95
|
+
return { uuid: parsed.uuid, slug: lastSlug };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return { uuid: null, slug: lastSlug };
|
|
99
|
+
} catch {
|
|
100
|
+
return { uuid: null, slug: null };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function pickIndex(length) {
|
|
104
|
+
return randomBytes(4).readUInt32BE(0) % length;
|
|
105
|
+
}
|
|
106
|
+
function pickWord(words) {
|
|
107
|
+
return words[pickIndex(words.length)];
|
|
108
|
+
}
|
|
109
|
+
function generateSessionSlug() {
|
|
110
|
+
const adjective = pickWord(PLAN_SLUG_ADJECTIVES);
|
|
111
|
+
const verb = pickWord(PLAN_SLUG_VERBS);
|
|
112
|
+
const noun = pickWord(PLAN_SLUG_NOUNS);
|
|
113
|
+
return `${adjective}-${verb}-${noun}`;
|
|
114
|
+
}
|
|
115
|
+
function getOrCreateSessionSlug(sessionId) {
|
|
116
|
+
const existing = slugBySessionId.get(sessionId);
|
|
117
|
+
if (existing) return existing;
|
|
118
|
+
const slug = generateSessionSlug();
|
|
119
|
+
slugBySessionId.set(sessionId, slug);
|
|
120
|
+
return slug;
|
|
121
|
+
}
|
|
122
|
+
var gitBranchCache = null;
|
|
123
|
+
function getGitBranchBestEffort(cwd) {
|
|
124
|
+
if (gitBranchCache && gitBranchCache.cwd === cwd) return gitBranchCache.value;
|
|
125
|
+
let value;
|
|
126
|
+
try {
|
|
127
|
+
const stdout = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
|
|
128
|
+
cwd,
|
|
129
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
130
|
+
timeout: 750
|
|
131
|
+
});
|
|
132
|
+
const branch = stdout.toString("utf8").trim();
|
|
133
|
+
value = branch || void 0;
|
|
134
|
+
} catch {
|
|
135
|
+
value = void 0;
|
|
136
|
+
}
|
|
137
|
+
gitBranchCache = { cwd, value };
|
|
138
|
+
return value;
|
|
139
|
+
}
|
|
140
|
+
function ensureFileHistorySnapshot(filePath, firstMessageUuid) {
|
|
141
|
+
if (snapshotWrittenByFile.has(filePath)) return;
|
|
142
|
+
try {
|
|
143
|
+
safeEnsureFile(filePath);
|
|
144
|
+
const size = statSync(filePath).size;
|
|
145
|
+
if (size > 0) {
|
|
146
|
+
snapshotWrittenByFile.add(filePath);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
} catch {
|
|
150
|
+
}
|
|
151
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
152
|
+
safeAppendJsonl(filePath, {
|
|
153
|
+
type: "file-history-snapshot",
|
|
154
|
+
messageId: firstMessageUuid,
|
|
155
|
+
snapshot: {
|
|
156
|
+
messageId: firstMessageUuid,
|
|
157
|
+
trackedFileBackups: {},
|
|
158
|
+
timestamp: now
|
|
159
|
+
},
|
|
160
|
+
isSnapshotUpdate: false
|
|
161
|
+
});
|
|
162
|
+
snapshotWrittenByFile.add(filePath);
|
|
163
|
+
}
|
|
164
|
+
function resolvePersistTarget(toolUseContext) {
|
|
165
|
+
const agentId = toolUseContext.agentId;
|
|
166
|
+
if (agentId && agentId !== "main") return { kind: "agent", agentId };
|
|
167
|
+
return { kind: "session", sessionId: getDanyaAgentSessionId() };
|
|
168
|
+
}
|
|
169
|
+
function appendSessionJsonlFromMessage(args) {
|
|
170
|
+
const { message, toolUseContext } = args;
|
|
171
|
+
if (message.type !== "user" && message.type !== "assistant") return;
|
|
172
|
+
const cwd = getCwd();
|
|
173
|
+
const userType = (process.env.USER_TYPE ?? "external").trim() || "external";
|
|
174
|
+
const sessionId = getDanyaAgentSessionId();
|
|
175
|
+
const agentId = (toolUseContext.agentId ?? "main").trim() || "main";
|
|
176
|
+
const isSidechain = agentId !== "main";
|
|
177
|
+
const gitBranch = getGitBranchBestEffort(cwd);
|
|
178
|
+
const target = resolvePersistTarget(toolUseContext);
|
|
179
|
+
const filePath = target.kind === "agent" ? getAgentLogFilePath({ cwd, agentId: target.agentId }) : getSessionLogFilePath({ cwd, sessionId: target.sessionId });
|
|
180
|
+
if (!lastUuidByFile.has(filePath)) {
|
|
181
|
+
const info = safeReadLastPersistedInfo(filePath);
|
|
182
|
+
lastUuidByFile.set(filePath, info.uuid);
|
|
183
|
+
if (info.slug) slugBySessionId.set(sessionId, info.slug);
|
|
184
|
+
}
|
|
185
|
+
const previousUuid = lastUuidByFile.get(filePath) ?? null;
|
|
186
|
+
const slug = getOrCreateSessionSlug(sessionId);
|
|
187
|
+
if (target.kind === "session") {
|
|
188
|
+
ensureFileHistorySnapshot(filePath, message.uuid);
|
|
189
|
+
}
|
|
190
|
+
const base = {
|
|
191
|
+
parentUuid: previousUuid,
|
|
192
|
+
logicalParentUuid: void 0,
|
|
193
|
+
isSidechain,
|
|
194
|
+
userType,
|
|
195
|
+
cwd,
|
|
196
|
+
sessionId,
|
|
197
|
+
version: MACRO.VERSION,
|
|
198
|
+
...gitBranch ? { gitBranch } : {},
|
|
199
|
+
agentId,
|
|
200
|
+
slug,
|
|
201
|
+
uuid: message.uuid,
|
|
202
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
203
|
+
};
|
|
204
|
+
const record = message.type === "user" ? {
|
|
205
|
+
...base,
|
|
206
|
+
type: "user",
|
|
207
|
+
message: message.message,
|
|
208
|
+
...message.toolUseResult?.data !== void 0 ? { toolUseResult: message.toolUseResult.data } : {}
|
|
209
|
+
} : {
|
|
210
|
+
...base,
|
|
211
|
+
type: "assistant",
|
|
212
|
+
message: message.message,
|
|
213
|
+
...typeof message.requestId === "string" ? { requestId: String(message.requestId) } : {},
|
|
214
|
+
...message.isApiErrorMessage ? { isApiErrorMessage: true } : {}
|
|
215
|
+
};
|
|
216
|
+
safeAppendJsonl(filePath, record);
|
|
217
|
+
lastUuidByFile.set(filePath, message.uuid);
|
|
218
|
+
}
|
|
219
|
+
function appendSessionCustomTitleRecord(args) {
|
|
220
|
+
const cwd = getCwd();
|
|
221
|
+
safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {
|
|
222
|
+
type: "custom-title",
|
|
223
|
+
sessionId: args.sessionId,
|
|
224
|
+
customTitle: args.customTitle
|
|
225
|
+
});
|
|
226
|
+
if (args.sessionId === getDanyaAgentSessionId()) {
|
|
227
|
+
currentSessionCustomTitle = args.customTitle;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function appendSessionTagRecord(args) {
|
|
231
|
+
const cwd = getCwd();
|
|
232
|
+
safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {
|
|
233
|
+
type: "tag",
|
|
234
|
+
sessionId: args.sessionId,
|
|
235
|
+
tag: args.tag
|
|
236
|
+
});
|
|
237
|
+
if (args.sessionId === getDanyaAgentSessionId()) {
|
|
238
|
+
currentSessionTag = args.tag;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export {
|
|
243
|
+
getSessionProjectsDir,
|
|
244
|
+
getSessionProjectDir,
|
|
245
|
+
appendSessionJsonlFromMessage,
|
|
246
|
+
appendSessionCustomTitleRecord,
|
|
247
|
+
appendSessionTagRecord
|
|
248
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/protocol/kodeAgentSessionLog.ts"],
|
|
4
|
+
"sourcesContent": ["import { execFileSync } from 'child_process'\r\nimport {\r\n appendFileSync,\r\n existsSync,\r\n mkdirSync,\r\n readFileSync,\r\n statSync,\r\n writeFileSync,\r\n} from 'fs'\r\nimport { randomBytes } from 'crypto'\r\nimport { dirname, join } from 'path'\r\nimport type { Message } from '@query'\r\nimport { MACRO } from '@constants/macros'\r\nimport { getCwd } from '@utils/state'\r\nimport { getDanyaAgentSessionId } from './kodeAgentSessionId'\r\nimport { getKodeBaseDir } from '@utils/config/env'\r\nimport {\r\n PLAN_SLUG_ADJECTIVES,\r\n PLAN_SLUG_NOUNS,\r\n PLAN_SLUG_VERBS,\r\n} from '@utils/plan/planSlugWords'\r\n\r\ntype PersistTarget =\r\n | { kind: 'session'; sessionId: string }\r\n | { kind: 'agent'; agentId: string }\r\n\r\ntype JsonlEnvelopeBase = {\r\n cwd: string\r\n sessionId: string\r\n version: string\r\n gitBranch?: string\r\n userType: string\r\n isSidechain: boolean\r\n parentUuid: string | null\r\n logicalParentUuid?: string\r\n agentId: string\r\n slug: string\r\n uuid: string\r\n timestamp: string\r\n}\r\n\r\ntype SessionJsonlEntry =\r\n | (JsonlEnvelopeBase & {\r\n type: 'user'\r\n message: any\r\n toolUseResult?: any\r\n })\r\n | (JsonlEnvelopeBase & {\r\n type: 'assistant'\r\n message: any\r\n requestId?: string\r\n isApiErrorMessage?: boolean\r\n })\r\n | { type: 'summary'; summary: string; leafUuid: string }\r\n | { type: 'custom-title'; sessionId: string; customTitle: string }\r\n | { type: 'tag'; sessionId: string; tag: string }\r\n | {\r\n type: 'file-history-snapshot'\r\n messageId: string\r\n snapshot: {\r\n messageId: string\r\n trackedFileBackups: Record<string, unknown>\r\n timestamp: string\r\n }\r\n isSnapshotUpdate: boolean\r\n }\r\n\r\nfunction getSessionStoreBaseDir(): string {\r\n return getKodeBaseDir()\r\n}\r\n\r\nexport function sanitizeProjectNameForSessionStore(cwd: string): string {\r\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\r\n}\r\n\r\nexport function getSessionProjectsDir(): string {\r\n return join(getSessionStoreBaseDir(), 'projects')\r\n}\r\n\r\nexport function getSessionProjectDir(cwd: string): string {\r\n return join(getSessionProjectsDir(), sanitizeProjectNameForSessionStore(cwd))\r\n}\r\n\r\nexport function getSessionLogFilePath(args: {\r\n cwd: string\r\n sessionId: string\r\n}): string {\r\n return join(getSessionProjectDir(args.cwd), `${args.sessionId}.jsonl`)\r\n}\r\n\r\nexport function getAgentLogFilePath(args: {\r\n cwd: string\r\n agentId: string\r\n}): string {\r\n return join(getSessionProjectDir(args.cwd), `agent-${args.agentId}.jsonl`)\r\n}\r\n\r\nfunction safeMkdir(dir: string): void {\r\n if (existsSync(dir)) return\r\n mkdirSync(dir, { recursive: true })\r\n}\r\n\r\nfunction safeEnsureFile(path: string): void {\r\n safeMkdir(dirname(path))\r\n if (!existsSync(path)) writeFileSync(path, '', 'utf8')\r\n}\r\n\r\nfunction safeAppendJsonl(path: string, record: unknown): void {\r\n try {\r\n safeEnsureFile(path)\r\n appendFileSync(path, JSON.stringify(record) + '\\n', 'utf8')\r\n } catch {\r\n }\r\n}\r\n\r\nconst lastUuidByFile = new Map<string, string | null>()\r\nconst snapshotWrittenByFile = new Set<string>()\r\nconst slugBySessionId = new Map<string, string>()\r\nlet currentSessionCustomTitle: string | null = null\r\nlet currentSessionTag: string | null = null\r\n\r\ntype LastPersistedInfo = { uuid: string | null; slug: string | null }\r\n\r\nfunction safeReadLastPersistedInfo(filePath: string): LastPersistedInfo {\r\n try {\r\n if (!existsSync(filePath)) return { uuid: null, slug: null }\r\n const content = readFileSync(filePath, 'utf8')\r\n const lines = content.split('\\n')\r\n\r\n let lastSlug: string | null = null\r\n for (let i = lines.length - 1; i >= 0; i--) {\r\n const line = lines[i]?.trim()\r\n if (!line) continue\r\n let parsed: any\r\n try {\r\n parsed = JSON.parse(line)\r\n } catch {\r\n continue\r\n }\r\n if (!parsed || typeof parsed !== 'object') continue\r\n\r\n if (!lastSlug && typeof parsed.slug === 'string' && parsed.slug.trim()) {\r\n lastSlug = parsed.slug.trim()\r\n }\r\n\r\n if (typeof parsed.uuid === 'string' && parsed.uuid) {\r\n return { uuid: parsed.uuid, slug: lastSlug }\r\n }\r\n }\r\n\r\n return { uuid: null, slug: lastSlug }\r\n } catch {\r\n return { uuid: null, slug: null }\r\n }\r\n}\r\n\r\nfunction pickIndex(length: number): number {\r\n return randomBytes(4).readUInt32BE(0) % length\r\n}\r\n\r\nfunction pickWord(words: readonly string[]): string {\r\n return words[pickIndex(words.length)]!\r\n}\r\n\r\nfunction generateSessionSlug(): string {\r\n const adjective = pickWord(PLAN_SLUG_ADJECTIVES)\r\n const verb = pickWord(PLAN_SLUG_VERBS)\r\n const noun = pickWord(PLAN_SLUG_NOUNS)\r\n return `${adjective}-${verb}-${noun}`\r\n}\r\n\r\nfunction getOrCreateSessionSlug(sessionId: string): string {\r\n const existing = slugBySessionId.get(sessionId)\r\n if (existing) return existing\r\n const slug = generateSessionSlug()\r\n slugBySessionId.set(sessionId, slug)\r\n return slug\r\n}\r\n\r\ntype GitBranchCacheEntry = { cwd: string; value: string | undefined }\r\nlet gitBranchCache: GitBranchCacheEntry | null = null\r\n\r\nfunction getGitBranchBestEffort(cwd: string): string | undefined {\r\n if (gitBranchCache && gitBranchCache.cwd === cwd) return gitBranchCache.value\r\n\r\n let value: string | undefined\r\n try {\r\n const stdout = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {\r\n cwd,\r\n stdio: ['ignore', 'pipe', 'ignore'],\r\n timeout: 750,\r\n })\r\n const branch = stdout.toString('utf8').trim()\r\n value = branch || undefined\r\n } catch {\r\n value = undefined\r\n }\r\n\r\n gitBranchCache = { cwd, value }\r\n return value\r\n}\r\n\r\nfunction ensureFileHistorySnapshot(\r\n filePath: string,\r\n firstMessageUuid: string,\r\n): void {\r\n if (snapshotWrittenByFile.has(filePath)) return\r\n\r\n try {\r\n safeEnsureFile(filePath)\r\n const size = statSync(filePath).size\r\n if (size > 0) {\r\n snapshotWrittenByFile.add(filePath)\r\n return\r\n }\r\n } catch {\r\n }\r\n\r\n const now = new Date().toISOString()\r\n safeAppendJsonl(filePath, {\r\n type: 'file-history-snapshot',\r\n messageId: firstMessageUuid,\r\n snapshot: {\r\n messageId: firstMessageUuid,\r\n trackedFileBackups: {},\r\n timestamp: now,\r\n },\r\n isSnapshotUpdate: false,\r\n } satisfies SessionJsonlEntry)\r\n\r\n snapshotWrittenByFile.add(filePath)\r\n}\r\n\r\nfunction resolvePersistTarget(toolUseContext: {\r\n agentId?: string\r\n}): PersistTarget {\r\n const agentId = toolUseContext.agentId\r\n if (agentId && agentId !== 'main') return { kind: 'agent', agentId }\r\n return { kind: 'session', sessionId: getDanyaAgentSessionId() }\r\n}\r\n\r\nexport function appendSessionJsonlFromMessage(args: {\r\n message: Message\r\n toolUseContext: { agentId?: string }\r\n}): void {\r\n const { message, toolUseContext } = args\r\n if (message.type !== 'user' && message.type !== 'assistant') return\r\n\r\n const cwd = getCwd()\r\n const userType = (process.env.USER_TYPE ?? 'external').trim() || 'external'\r\n const sessionId = getDanyaAgentSessionId()\r\n const agentId = (toolUseContext.agentId ?? 'main').trim() || 'main'\r\n const isSidechain = agentId !== 'main'\r\n const gitBranch = getGitBranchBestEffort(cwd)\r\n\r\n const target = resolvePersistTarget(toolUseContext)\r\n const filePath =\r\n target.kind === 'agent'\r\n ? getAgentLogFilePath({ cwd, agentId: target.agentId })\r\n : getSessionLogFilePath({ cwd, sessionId: target.sessionId })\r\n\r\n if (!lastUuidByFile.has(filePath)) {\r\n const info = safeReadLastPersistedInfo(filePath)\r\n lastUuidByFile.set(filePath, info.uuid)\r\n if (info.slug) slugBySessionId.set(sessionId, info.slug)\r\n }\r\n const previousUuid = lastUuidByFile.get(filePath) ?? null\r\n\r\n const slug = getOrCreateSessionSlug(sessionId)\r\n\r\n if (target.kind === 'session') {\r\n ensureFileHistorySnapshot(filePath, message.uuid)\r\n }\r\n\r\n const base: JsonlEnvelopeBase = {\r\n parentUuid: previousUuid,\r\n logicalParentUuid: undefined,\r\n isSidechain,\r\n userType,\r\n cwd,\r\n sessionId,\r\n version: MACRO.VERSION,\r\n ...(gitBranch ? { gitBranch } : {}),\r\n agentId,\r\n slug,\r\n uuid: message.uuid,\r\n timestamp: new Date().toISOString(),\r\n }\r\n\r\n const record: SessionJsonlEntry =\r\n message.type === 'user'\r\n ? {\r\n ...base,\r\n type: 'user',\r\n message: message.message,\r\n ...(message.toolUseResult?.data !== undefined\r\n ? { toolUseResult: message.toolUseResult.data }\r\n : {}),\r\n }\r\n : {\r\n ...base,\r\n type: 'assistant',\r\n message: message.message,\r\n ...(typeof (message as any).requestId === 'string'\r\n ? { requestId: String((message as any).requestId) }\r\n : {}),\r\n ...(message.isApiErrorMessage ? { isApiErrorMessage: true } : {}),\r\n }\r\n\r\n safeAppendJsonl(filePath, record)\r\n lastUuidByFile.set(filePath, message.uuid)\r\n}\r\n\r\nexport function appendSessionSummaryRecord(args: {\r\n summary: string\r\n leafUuid: string\r\n sessionId?: string\r\n}): void {\r\n const sessionId = args.sessionId ?? getDanyaAgentSessionId()\r\n const cwd = getCwd()\r\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId }), {\r\n type: 'summary',\r\n summary: args.summary,\r\n leafUuid: args.leafUuid,\r\n } satisfies SessionJsonlEntry)\r\n}\r\n\r\nexport function appendSessionCustomTitleRecord(args: {\r\n sessionId: string\r\n customTitle: string\r\n}): void {\r\n const cwd = getCwd()\r\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {\r\n type: 'custom-title',\r\n sessionId: args.sessionId,\r\n customTitle: args.customTitle,\r\n } satisfies SessionJsonlEntry)\r\n if (args.sessionId === getDanyaAgentSessionId()) {\r\n currentSessionCustomTitle = args.customTitle\r\n }\r\n}\r\n\r\nexport function appendSessionTagRecord(args: {\r\n sessionId: string\r\n tag: string\r\n}): void {\r\n const cwd = getCwd()\r\n safeAppendJsonl(getSessionLogFilePath({ cwd, sessionId: args.sessionId }), {\r\n type: 'tag',\r\n sessionId: args.sessionId,\r\n tag: args.tag,\r\n } satisfies SessionJsonlEntry)\r\n if (args.sessionId === getDanyaAgentSessionId()) {\r\n currentSessionTag = args.tag\r\n }\r\n}\r\n\r\nexport function getCurrentSessionCustomTitle(): string | null {\r\n return currentSessionCustomTitle\r\n}\r\n\r\nexport function getCurrentSessionTag(): string | null {\r\n return currentSessionTag\r\n}\r\n\r\nexport function resetSessionJsonlStateForTests(): void {\r\n lastUuidByFile.clear()\r\n snapshotWrittenByFile.clear()\r\n slugBySessionId.clear()\r\n gitBranchCache = null\r\n currentSessionCustomTitle = null\r\n currentSessionTag = null\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createRequire as __kodeCreateRequire } from "node:module";
|
|
2
|
+
const require = __kodeCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/utils/protocol/kodeAgentStreamJson.ts
|
|
5
|
+
function normalizeToolUseBlockTypes(block) {
|
|
6
|
+
if (!block || typeof block !== "object") return block;
|
|
7
|
+
if (block.type === "server_tool_use" || block.type === "mcp_tool_use") {
|
|
8
|
+
return { ...block, type: "tool_use" };
|
|
9
|
+
}
|
|
10
|
+
return block;
|
|
11
|
+
}
|
|
12
|
+
function makeSdkInitMessage(args) {
|
|
13
|
+
return {
|
|
14
|
+
type: "system",
|
|
15
|
+
subtype: "init",
|
|
16
|
+
session_id: args.sessionId,
|
|
17
|
+
cwd: args.cwd,
|
|
18
|
+
model: args.model,
|
|
19
|
+
tools: args.tools,
|
|
20
|
+
...args.slashCommands ? { slash_commands: args.slashCommands } : {}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function makeSdkResultMessage(args) {
|
|
24
|
+
return {
|
|
25
|
+
type: "result",
|
|
26
|
+
subtype: args.isError ? "error_during_execution" : "success",
|
|
27
|
+
result: args.result,
|
|
28
|
+
...args.structuredOutput ? { structured_output: args.structuredOutput } : {},
|
|
29
|
+
num_turns: args.numTurns,
|
|
30
|
+
usage: args.usage,
|
|
31
|
+
total_cost_usd: args.totalCostUsd,
|
|
32
|
+
duration_ms: args.durationMs,
|
|
33
|
+
duration_api_ms: args.durationApiMs,
|
|
34
|
+
is_error: args.isError,
|
|
35
|
+
session_id: args.sessionId
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function danyaMessageToSdkMessage(message, sessionId) {
|
|
39
|
+
if (message.type === "progress") return null;
|
|
40
|
+
if (message.type === "user") {
|
|
41
|
+
return {
|
|
42
|
+
type: "user",
|
|
43
|
+
session_id: sessionId,
|
|
44
|
+
uuid: message.uuid,
|
|
45
|
+
parent_tool_use_id: null,
|
|
46
|
+
message: {
|
|
47
|
+
role: "user",
|
|
48
|
+
content: message.message.content
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (message.type === "assistant") {
|
|
53
|
+
const content = Array.isArray(message.message.content) ? message.message.content.map(normalizeToolUseBlockTypes) : [];
|
|
54
|
+
return {
|
|
55
|
+
type: "assistant",
|
|
56
|
+
session_id: sessionId,
|
|
57
|
+
uuid: message.uuid,
|
|
58
|
+
parent_tool_use_id: null,
|
|
59
|
+
message: {
|
|
60
|
+
role: "assistant",
|
|
61
|
+
content
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
var kodeMessageToSdkMessage = danyaMessageToSdkMessage;
|
|
68
|
+
|
|
69
|
+
export {
|
|
70
|
+
makeSdkInitMessage,
|
|
71
|
+
makeSdkResultMessage,
|
|
72
|
+
danyaMessageToSdkMessage,
|
|
73
|
+
kodeMessageToSdkMessage
|
|
74
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/protocol/kodeAgentStreamJson.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Message as DanyaMessage } from '@query'\r\n\r\n\r\nexport type SdkMessage =\r\n | {\r\n type: 'system'\r\n subtype: string\r\n session_id?: string\r\n model?: string\r\n cwd?: string\r\n tools?: string[]\r\n slash_commands?: string[]\r\n status?: string\r\n uuid?: string\r\n }\r\n | {\r\n type: 'user'\r\n session_id?: string\r\n uuid?: string\r\n parent_tool_use_id?: string | null\r\n message: { role: 'user'; content: any }\r\n }\r\n | {\r\n type: 'assistant'\r\n session_id?: string\r\n uuid?: string\r\n parent_tool_use_id?: string | null\r\n message: { role: 'assistant'; content: any[] }\r\n }\r\n | {\r\n type: 'result'\r\n subtype: 'success' | 'error_during_execution' | 'error_max_turns'\r\n result?: string\r\n structured_output?: Record<string, unknown>\r\n num_turns: number\r\n usage?: any\r\n total_cost_usd: number\r\n duration_ms: number\r\n duration_api_ms: number\r\n is_error: boolean\r\n session_id: string\r\n }\r\n | {\r\n type: 'log'\r\n log: { level: 'debug' | 'info' | 'warn' | 'error'; message: string }\r\n }\r\n\r\nfunction normalizeToolUseBlockTypes(block: any): any {\r\n if (!block || typeof block !== 'object') return block\r\n if (block.type === 'server_tool_use' || block.type === 'mcp_tool_use') {\r\n return { ...block, type: 'tool_use' }\r\n }\r\n return block\r\n}\r\n\r\nexport function makeSdkInitMessage(args: {\r\n sessionId: string\r\n cwd: string\r\n model?: string\r\n tools?: string[]\r\n slashCommands?: string[]\r\n}): SdkMessage {\r\n return {\r\n type: 'system',\r\n subtype: 'init',\r\n session_id: args.sessionId,\r\n cwd: args.cwd,\r\n model: args.model,\r\n tools: args.tools,\r\n ...(args.slashCommands ? { slash_commands: args.slashCommands } : {}),\r\n }\r\n}\r\n\r\nexport function makeSdkResultMessage(args: {\r\n sessionId: string\r\n result: string\r\n structuredOutput?: Record<string, unknown>\r\n numTurns: number\r\n usage?: any\r\n totalCostUsd: number\r\n durationMs: number\r\n durationApiMs: number\r\n isError: boolean\r\n}): SdkMessage {\r\n return {\r\n type: 'result',\r\n subtype: args.isError ? 'error_during_execution' : 'success',\r\n result: args.result,\r\n ...(args.structuredOutput\r\n ? { structured_output: args.structuredOutput }\r\n : {}),\r\n num_turns: args.numTurns,\r\n usage: args.usage,\r\n total_cost_usd: args.totalCostUsd,\r\n duration_ms: args.durationMs,\r\n duration_api_ms: args.durationApiMs,\r\n is_error: args.isError,\r\n session_id: args.sessionId,\r\n }\r\n}\r\n\r\nexport function danyaMessageToSdkMessage(\r\n message: DanyaMessage,\r\n sessionId: string,\r\n): SdkMessage | null {\r\n if (message.type === 'progress') return null\r\n\r\n if (message.type === 'user') {\r\n return {\r\n type: 'user',\r\n session_id: sessionId,\r\n uuid: message.uuid,\r\n parent_tool_use_id: null,\r\n message: {\r\n role: 'user',\r\n content: message.message.content as any,\r\n },\r\n }\r\n }\r\n\r\n if (message.type === 'assistant') {\r\n const content = Array.isArray(message.message.content)\r\n ? message.message.content.map(normalizeToolUseBlockTypes)\r\n : []\r\n return {\r\n type: 'assistant',\r\n session_id: sessionId,\r\n uuid: message.uuid,\r\n parent_tool_use_id: null,\r\n message: {\r\n role: 'assistant',\r\n content: content as any[],\r\n },\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\n/** @deprecated Use danyaMessageToSdkMessage */\r\nexport const kodeMessageToSdkMessage = danyaMessageToSdkMessage\r\n"],
|
|
5
|
+
"mappings": ";;;;AA+CA,SAAS,2BAA2B,OAAiB;AACnD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,MAAI,MAAM,SAAS,qBAAqB,MAAM,SAAS,gBAAgB;AACrE,WAAO,EAAE,GAAG,OAAO,MAAM,WAAW;AAAA,EACtC;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,MAMpB;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,KAAK;AAAA,IACjB,KAAK,KAAK;AAAA,IACV,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,GAAI,KAAK,gBAAgB,EAAE,gBAAgB,KAAK,cAAc,IAAI,CAAC;AAAA,EACrE;AACF;AAEO,SAAS,qBAAqB,MAUtB;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,KAAK,UAAU,2BAA2B;AAAA,IACnD,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,mBACL,EAAE,mBAAmB,KAAK,iBAAiB,IAC3C,CAAC;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,gBAAgB,KAAK;AAAA,IACrB,aAAa,KAAK;AAAA,IAClB,iBAAiB,KAAK;AAAA,IACtB,UAAU,KAAK;AAAA,IACf,YAAY,KAAK;AAAA,EACnB;AACF;AAEO,SAAS,yBACd,SACA,WACmB;AACnB,MAAI,QAAQ,SAAS,WAAY,QAAO;AAExC,MAAI,QAAQ,SAAS,QAAQ;AAC3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,oBAAoB;AAAA,MACpB,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS,QAAQ,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,aAAa;AAChC,UAAM,UAAU,MAAM,QAAQ,QAAQ,QAAQ,OAAO,IACjD,QAAQ,QAAQ,QAAQ,IAAI,0BAA0B,IACtD,CAAC;AACL,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,oBAAoB;AAAA,MACpB,SAAS;AAAA,QACP,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGO,IAAM,0BAA0B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|