aemeathcli 1.0.9 → 1.0.11
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 +21 -0
- package/README.md +609 -608
- package/dist/App-YAHJUWCX.js +4274 -0
- package/dist/App-YAHJUWCX.js.map +1 -0
- package/dist/agent-store/architect.md +32 -0
- package/dist/agent-store/debugger.md +32 -0
- package/dist/agent-store/developer.md +29 -0
- package/dist/agent-store/documenter.md +30 -0
- package/dist/agent-store/researcher.md +31 -0
- package/dist/agent-store/reviewer.md +28 -0
- package/dist/agent-store/supervisor.md +37 -0
- package/dist/agent-store/tester.md +30 -0
- package/dist/api-key-fallback-UN3TJEOO.js +11 -0
- package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-UN3TJEOO.js.map} +1 -1
- package/dist/auth-status-EIM5A5KL.js +13 -0
- package/dist/auth-status-EIM5A5KL.js.map +1 -0
- package/dist/{chunk-UY2SYSEZ.js → chunk-25UNNEHN.js} +32 -103
- package/dist/chunk-25UNNEHN.js.map +1 -0
- package/dist/{chunk-CYQNBB25.js → chunk-2GKOK6T7.js} +28 -5
- package/dist/chunk-2GKOK6T7.js.map +1 -0
- package/dist/{chunk-MFBHNWGV.js → chunk-2LF7ALGR.js} +12 -20
- package/dist/chunk-2LF7ALGR.js.map +1 -0
- package/dist/{chunk-H66O5Z2V.js → chunk-2NWNIKBK.js} +42 -7
- package/dist/chunk-2NWNIKBK.js.map +1 -0
- package/dist/chunk-3TSPZRGM.js +26 -0
- package/dist/chunk-3TSPZRGM.js.map +1 -0
- package/dist/{chunk-ZGOHARPV.js → chunk-473JN6M5.js} +2 -2
- package/dist/chunk-473JN6M5.js.map +1 -0
- package/dist/{chunk-IYW62KKR.js → chunk-5XFSV6PF.js} +66 -23
- package/dist/chunk-5XFSV6PF.js.map +1 -0
- package/dist/{chunk-HCIHOHLX.js → chunk-62HSGYQD.js} +2 -2
- package/dist/chunk-62HSGYQD.js.map +1 -0
- package/dist/{chunk-I5PZ4JTS.js → chunk-6GUD7QIM.js} +4 -4
- package/dist/chunk-6GUD7QIM.js.map +1 -0
- package/dist/{chunk-4IJD72YB.js → chunk-AQ23TYSQ.js} +7 -7
- package/dist/chunk-AQ23TYSQ.js.map +1 -0
- package/dist/{chunk-NBR3GHMT.js → chunk-BY4DAKUU.js} +39 -7
- package/dist/chunk-BY4DAKUU.js.map +1 -0
- package/dist/chunk-CC7MGWYY.js +12 -0
- package/dist/chunk-CC7MGWYY.js.map +1 -0
- package/dist/chunk-CTFZTARK.js +155 -0
- package/dist/chunk-CTFZTARK.js.map +1 -0
- package/dist/chunk-FIC7AK4Q.js +232 -0
- package/dist/chunk-FIC7AK4Q.js.map +1 -0
- package/dist/chunk-GU33WKPG.js +140 -0
- package/dist/chunk-GU33WKPG.js.map +1 -0
- package/dist/{chunk-VUG4IZ7J.js → chunk-H2SYKIMI.js} +10 -10
- package/dist/chunk-H2SYKIMI.js.map +1 -0
- package/dist/{chunk-JAXXTYID.js → chunk-HEKFAKVH.js} +2 -2
- package/dist/chunk-HEKFAKVH.js.map +1 -0
- package/dist/chunk-IARA5XYP.js +186 -0
- package/dist/chunk-IARA5XYP.js.map +1 -0
- package/dist/{chunk-HMJRPNPZ.js → chunk-LCYH4T6N.js} +95 -23
- package/dist/chunk-LCYH4T6N.js.map +1 -0
- package/dist/{chunk-CARHU3DO.js → chunk-LDVY5ELP.js} +66 -18
- package/dist/chunk-LDVY5ELP.js.map +1 -0
- package/dist/chunk-OCJPQFOR.js +88 -0
- package/dist/chunk-OCJPQFOR.js.map +1 -0
- package/dist/chunk-ODBY7S4X.js +141 -0
- package/dist/chunk-ODBY7S4X.js.map +1 -0
- package/dist/{chunk-DAHGLHNR.js → chunk-ONQ4WCUI.js} +7 -142
- package/dist/chunk-ONQ4WCUI.js.map +1 -0
- package/dist/{chunk-WPP3PEDE.js → chunk-P5TKZM3T.js} +32 -107
- package/dist/chunk-P5TKZM3T.js.map +1 -0
- package/dist/{chunk-ASGRGXYK.js → chunk-P66WDACW.js} +23 -22
- package/dist/chunk-P66WDACW.js.map +1 -0
- package/dist/{chunk-LSOYPSAT.js → chunk-QCRK4QEL.js} +4 -4
- package/dist/chunk-QCRK4QEL.js.map +1 -0
- package/dist/{chunk-YL5XFHR3.js → chunk-ROJPFPJ7.js} +2 -2
- package/dist/chunk-ROJPFPJ7.js.map +1 -0
- package/dist/chunk-RP2TAL3J.js +71 -0
- package/dist/chunk-RP2TAL3J.js.map +1 -0
- package/dist/{chunk-6PDJ45T4.js → chunk-RYOB3TLZ.js} +51 -26
- package/dist/chunk-RYOB3TLZ.js.map +1 -0
- package/dist/{chunk-Y5XVD2CD.js → chunk-SOQFMNQC.js} +110 -83
- package/dist/chunk-SOQFMNQC.js.map +1 -0
- package/dist/{chunk-TEVZS4FA.js → chunk-TDFTX32B.js} +16 -9
- package/dist/chunk-TDFTX32B.js.map +1 -0
- package/dist/chunk-VBLLDY4R.js +38 -0
- package/dist/chunk-VBLLDY4R.js.map +1 -0
- package/dist/{chunk-CGEV3ARR.js → chunk-VJNQJALF.js} +4 -4
- package/dist/chunk-VJNQJALF.js.map +1 -0
- package/dist/chunk-WAYSJMPS.js +26 -0
- package/dist/chunk-WAYSJMPS.js.map +1 -0
- package/dist/chunk-WC72BRHR.js +241 -0
- package/dist/chunk-WC72BRHR.js.map +1 -0
- package/dist/{chunk-MXZSI3AY.js → chunk-YPFOE2QJ.js} +43 -11
- package/dist/chunk-YPFOE2QJ.js.map +1 -0
- package/dist/claude-adapter-6P4SJH7P.js +7 -0
- package/dist/{claude-adapter-QMLFMSP3.js.map → claude-adapter-6P4SJH7P.js.map} +1 -1
- package/dist/{claude-login-5WELXPKT.js → claude-login-IS5WTBMP.js} +10 -10
- package/dist/claude-login-IS5WTBMP.js.map +1 -0
- package/dist/cli.js +371 -172
- package/dist/cli.js.map +1 -1
- package/dist/{codex-login-DDJBCT43.js → codex-login-GMPF64MR.js} +18 -17
- package/dist/codex-login-GMPF64MR.js.map +1 -0
- package/dist/config-store-POB6I37G.js +7 -0
- package/dist/{config-store-W6FBCQAQ.js.map → config-store-POB6I37G.js.map} +1 -1
- package/dist/conversation-store-PRBHWQMJ.js +4 -0
- package/dist/conversation-store-PRBHWQMJ.js.map +1 -0
- package/dist/detect-providers-C4SVQHFF.js +4 -0
- package/dist/detect-providers-C4SVQHFF.js.map +1 -0
- package/dist/executor-RUX7VK3T.js +4 -0
- package/dist/{executor-6RIKIGXK.js.map → executor-RUX7VK3T.js.map} +1 -1
- package/dist/first-run-GDEVRFPO.js +230 -0
- package/dist/first-run-GDEVRFPO.js.map +1 -0
- package/dist/gemini-adapter-MV3U4QFH.js +7 -0
- package/dist/{gemini-adapter-6JIHZ7WI.js.map → gemini-adapter-MV3U4QFH.js.map} +1 -1
- package/dist/{gemini-login-YEPK6GGW.js → gemini-login-KE224MSW.js} +13 -14
- package/dist/gemini-login-KE224MSW.js.map +1 -0
- package/dist/index.d.ts +47 -17
- package/dist/index.js +86 -471
- package/dist/index.js.map +1 -1
- package/dist/input-history-MIOO3FIW.js +57 -0
- package/dist/input-history-MIOO3FIW.js.map +1 -0
- package/dist/kimi-adapter-UODMNX6K.js +6 -0
- package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-UODMNX6K.js.map} +1 -1
- package/dist/{kimi-login-ZR74MIY4.js → kimi-login-DNT5YBKX.js} +18 -17
- package/dist/kimi-login-DNT5YBKX.js.map +1 -0
- package/dist/logger-PLPDWACQ.js +3 -0
- package/dist/logger-PLPDWACQ.js.map +1 -0
- package/dist/model-discovery-O64ZWPX5.js +6 -0
- package/dist/model-discovery-O64ZWPX5.js.map +1 -0
- package/dist/native-cli-adapters-JMZX2C2C.js +8 -0
- package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-JMZX2C2C.js.map} +1 -1
- package/dist/ollama-adapter-GE67BNSS.js +5 -0
- package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-GE67BNSS.js.map} +1 -1
- package/dist/openai-adapter-SHPLK77L.js +7 -0
- package/dist/{openai-adapter-XU46EN7B.js.map → openai-adapter-SHPLK77L.js.map} +1 -1
- package/dist/pathResolver-A6IXQQFE.js +3 -0
- package/dist/pathResolver-A6IXQQFE.js.map +1 -0
- package/dist/profile-loader-TNAXBLDX.js +162 -0
- package/dist/profile-loader-TNAXBLDX.js.map +1 -0
- package/dist/registry-3NHVCXCZ.js +6 -0
- package/dist/{registry-H7B3AHPQ.js.map → registry-3NHVCXCZ.js.map} +1 -1
- package/dist/registry-7CQ3NCAD.js +5 -0
- package/dist/{registry-OYWYT7WL.js.map → registry-7CQ3NCAD.js.map} +1 -1
- package/dist/server-manager-DES23IBQ.js +5 -0
- package/dist/{server-manager-PTGBHCLS.js.map → server-manager-DES23IBQ.js.map} +1 -1
- package/dist/session-manager-EHD7GWM2.js +12 -0
- package/dist/{session-manager-NYB2RKMS.js.map → session-manager-EHD7GWM2.js.map} +1 -1
- package/dist/skills/built-in/code-review/SKILL.md +85 -0
- package/dist/skills/built-in/commit/SKILL.md +83 -0
- package/dist/skills/built-in/debug/SKILL.md +119 -0
- package/dist/skills/built-in/plan/SKILL.md +123 -0
- package/dist/skills/built-in/refactor/SKILL.md +132 -0
- package/dist/skills/built-in/test/SKILL.md +128 -0
- package/dist/sqlite-store-7ZIVOUNI.js +5 -0
- package/dist/sqlite-store-7ZIVOUNI.js.map +1 -0
- package/dist/team-manager-6DCNLGTC.js +11 -0
- package/dist/{team-manager-HC4XGCFY.js.map → team-manager-6DCNLGTC.js.map} +1 -1
- package/dist/team-state-R2D7DT5M.js +3 -0
- package/dist/team-state-R2D7DT5M.js.map +1 -0
- package/dist/tmux-manager-WBKHUHDT.js +6 -0
- package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-WBKHUHDT.js.map} +1 -1
- package/dist/tools-I6XCTEZY.js +6 -0
- package/dist/{tools-TSMXMHIF.js.map → tools-I6XCTEZY.js.map} +1 -1
- package/package.json +93 -89
- package/dist/App-TE3JJKOW.js +0 -2789
- package/dist/App-TE3JJKOW.js.map +0 -1
- package/dist/api-key-fallback-YQQBOQIL.js +0 -11
- package/dist/chunk-4IJD72YB.js.map +0 -1
- package/dist/chunk-6PDJ45T4.js.map +0 -1
- package/dist/chunk-ASGRGXYK.js.map +0 -1
- package/dist/chunk-CARHU3DO.js.map +0 -1
- package/dist/chunk-CGEV3ARR.js.map +0 -1
- package/dist/chunk-CS5X3BWX.js +0 -27
- package/dist/chunk-CS5X3BWX.js.map +0 -1
- package/dist/chunk-CYQNBB25.js.map +0 -1
- package/dist/chunk-DAHGLHNR.js.map +0 -1
- package/dist/chunk-H66O5Z2V.js.map +0 -1
- package/dist/chunk-HCIHOHLX.js.map +0 -1
- package/dist/chunk-HMJRPNPZ.js.map +0 -1
- package/dist/chunk-I5PZ4JTS.js.map +0 -1
- package/dist/chunk-IYW62KKR.js.map +0 -1
- package/dist/chunk-JAXXTYID.js.map +0 -1
- package/dist/chunk-LSOYPSAT.js.map +0 -1
- package/dist/chunk-MFBHNWGV.js.map +0 -1
- package/dist/chunk-MXZSI3AY.js.map +0 -1
- package/dist/chunk-NBR3GHMT.js.map +0 -1
- package/dist/chunk-TEVZS4FA.js.map +0 -1
- package/dist/chunk-UY2SYSEZ.js.map +0 -1
- package/dist/chunk-VUG4IZ7J.js.map +0 -1
- package/dist/chunk-WAHVZH7V.js +0 -260
- package/dist/chunk-WAHVZH7V.js.map +0 -1
- package/dist/chunk-WPP3PEDE.js.map +0 -1
- package/dist/chunk-Y5XVD2CD.js.map +0 -1
- package/dist/chunk-YL5XFHR3.js.map +0 -1
- package/dist/chunk-ZGOHARPV.js.map +0 -1
- package/dist/claude-adapter-QMLFMSP3.js +0 -6
- package/dist/claude-login-5WELXPKT.js.map +0 -1
- package/dist/codex-login-DDJBCT43.js.map +0 -1
- package/dist/config-store-W6FBCQAQ.js +0 -6
- package/dist/executor-6RIKIGXK.js +0 -4
- package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
- package/dist/gemini-login-YEPK6GGW.js.map +0 -1
- package/dist/kimi-adapter-JN4HFFHU.js +0 -6
- package/dist/kimi-login-ZR74MIY4.js.map +0 -1
- package/dist/native-cli-adapters-OLW3XX57.js +0 -6
- package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js +0 -6
- package/dist/registry-H7B3AHPQ.js +0 -5
- package/dist/registry-OYWYT7WL.js +0 -6
- package/dist/server-manager-PTGBHCLS.js +0 -5
- package/dist/session-manager-NYB2RKMS.js +0 -12
- package/dist/team-manager-HC4XGCFY.js +0 -11
- package/dist/tmux-manager-GPYZ3WQH.js +0 -6
- package/dist/tools-TSMXMHIF.js +0 -6
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { logger } from './chunk-HEKFAKVH.js';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
|
|
4
|
+
var ConversationStore = class {
|
|
5
|
+
store;
|
|
6
|
+
constructor(store) {
|
|
7
|
+
this.store = store;
|
|
8
|
+
}
|
|
9
|
+
createConversation(projectRoot, defaultModel, metadata) {
|
|
10
|
+
const id = randomUUID();
|
|
11
|
+
const metadataJson = JSON.stringify(metadata ?? {});
|
|
12
|
+
this.store.run(
|
|
13
|
+
`INSERT INTO conversations (id, project_root, default_model, metadata)
|
|
14
|
+
VALUES (?, ?, ?, ?)`,
|
|
15
|
+
id,
|
|
16
|
+
projectRoot,
|
|
17
|
+
defaultModel ?? null,
|
|
18
|
+
metadataJson
|
|
19
|
+
);
|
|
20
|
+
logger.info({ conversationId: id, projectRoot }, "Conversation created");
|
|
21
|
+
const row = this.store.get(
|
|
22
|
+
"SELECT * FROM conversations WHERE id = ?",
|
|
23
|
+
id
|
|
24
|
+
);
|
|
25
|
+
if (!row) {
|
|
26
|
+
throw new Error(`Failed to retrieve created conversation: ${id}`);
|
|
27
|
+
}
|
|
28
|
+
return this.mapConversationRow(row);
|
|
29
|
+
}
|
|
30
|
+
getConversation(id) {
|
|
31
|
+
const row = this.store.get(
|
|
32
|
+
"SELECT * FROM conversations WHERE id = ?",
|
|
33
|
+
id
|
|
34
|
+
);
|
|
35
|
+
return row ? this.mapConversationRow(row) : void 0;
|
|
36
|
+
}
|
|
37
|
+
listConversations(projectRoot) {
|
|
38
|
+
const rows = projectRoot ? this.store.all(
|
|
39
|
+
"SELECT * FROM conversations WHERE project_root = ? ORDER BY updated_at DESC",
|
|
40
|
+
projectRoot
|
|
41
|
+
) : this.store.all(
|
|
42
|
+
"SELECT * FROM conversations ORDER BY updated_at DESC"
|
|
43
|
+
);
|
|
44
|
+
return rows.map((row) => this.mapConversationRow(row));
|
|
45
|
+
}
|
|
46
|
+
deleteConversation(id) {
|
|
47
|
+
this.store.run("DELETE FROM conversations WHERE id = ?", id);
|
|
48
|
+
logger.info({ conversationId: id }, "Conversation deleted");
|
|
49
|
+
}
|
|
50
|
+
addMessage(params) {
|
|
51
|
+
const toolCallsJson = params.toolCalls ? JSON.stringify(params.toolCalls) : null;
|
|
52
|
+
const tokenUsageJson = params.tokenUsage ? JSON.stringify(params.tokenUsage) : null;
|
|
53
|
+
const result = this.store.run(
|
|
54
|
+
`INSERT INTO messages
|
|
55
|
+
(conversation_id, role, model, provider, content, tool_calls, token_usage)
|
|
56
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
57
|
+
params.conversationId,
|
|
58
|
+
params.role,
|
|
59
|
+
params.model ?? null,
|
|
60
|
+
params.provider ?? null,
|
|
61
|
+
params.content,
|
|
62
|
+
toolCallsJson,
|
|
63
|
+
tokenUsageJson
|
|
64
|
+
);
|
|
65
|
+
this.store.run(
|
|
66
|
+
"UPDATE conversations SET updated_at = datetime('now') WHERE id = ?",
|
|
67
|
+
params.conversationId
|
|
68
|
+
);
|
|
69
|
+
const row = this.store.get(
|
|
70
|
+
"SELECT * FROM messages WHERE id = ?",
|
|
71
|
+
result.lastInsertRowid
|
|
72
|
+
);
|
|
73
|
+
if (!row) {
|
|
74
|
+
throw new Error("Failed to retrieve created message");
|
|
75
|
+
}
|
|
76
|
+
return this.mapMessageRow(row);
|
|
77
|
+
}
|
|
78
|
+
getMessages(conversationId, pagination) {
|
|
79
|
+
const limit = pagination?.limit ?? 100;
|
|
80
|
+
const offset = pagination?.offset ?? 0;
|
|
81
|
+
const rows = this.store.all(
|
|
82
|
+
`SELECT * FROM messages
|
|
83
|
+
WHERE conversation_id = ?
|
|
84
|
+
ORDER BY created_at ASC
|
|
85
|
+
LIMIT ? OFFSET ?`,
|
|
86
|
+
conversationId,
|
|
87
|
+
limit,
|
|
88
|
+
offset
|
|
89
|
+
);
|
|
90
|
+
return rows.map((row) => this.mapMessageRow(row));
|
|
91
|
+
}
|
|
92
|
+
getMessageCount(conversationId) {
|
|
93
|
+
const result = this.store.get(
|
|
94
|
+
"SELECT COUNT(*) as count FROM messages WHERE conversation_id = ?",
|
|
95
|
+
conversationId
|
|
96
|
+
);
|
|
97
|
+
return result?.count ?? 0;
|
|
98
|
+
}
|
|
99
|
+
addFileContext(params) {
|
|
100
|
+
const result = this.store.run(
|
|
101
|
+
`INSERT INTO file_context
|
|
102
|
+
(conversation_id, file_path, content_hash, token_count)
|
|
103
|
+
VALUES (?, ?, ?, ?)`,
|
|
104
|
+
params.conversationId,
|
|
105
|
+
params.filePath,
|
|
106
|
+
params.contentHash ?? null,
|
|
107
|
+
params.tokenCount ?? null
|
|
108
|
+
);
|
|
109
|
+
const row = this.store.get(
|
|
110
|
+
"SELECT * FROM file_context WHERE id = ?",
|
|
111
|
+
result.lastInsertRowid
|
|
112
|
+
);
|
|
113
|
+
if (!row) {
|
|
114
|
+
throw new Error("Failed to retrieve created file context");
|
|
115
|
+
}
|
|
116
|
+
return this.mapFileContextRow(row);
|
|
117
|
+
}
|
|
118
|
+
getFileContext(conversationId) {
|
|
119
|
+
const rows = this.store.all(
|
|
120
|
+
"SELECT * FROM file_context WHERE conversation_id = ? ORDER BY added_at DESC",
|
|
121
|
+
conversationId
|
|
122
|
+
);
|
|
123
|
+
return rows.map((row) => this.mapFileContextRow(row));
|
|
124
|
+
}
|
|
125
|
+
removeFileContext(conversationId, filePath) {
|
|
126
|
+
this.store.run(
|
|
127
|
+
"DELETE FROM file_context WHERE conversation_id = ? AND file_path = ?",
|
|
128
|
+
conversationId,
|
|
129
|
+
filePath
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
addCost(params) {
|
|
133
|
+
const result = this.store.run(
|
|
134
|
+
`INSERT INTO cost_tracking
|
|
135
|
+
(conversation_id, provider, model, role, input_tokens, output_tokens, cost_usd)
|
|
136
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
137
|
+
params.conversationId,
|
|
138
|
+
params.provider,
|
|
139
|
+
params.model,
|
|
140
|
+
params.role ?? null,
|
|
141
|
+
params.inputTokens ?? null,
|
|
142
|
+
params.outputTokens ?? null,
|
|
143
|
+
params.costUsd ?? null
|
|
144
|
+
);
|
|
145
|
+
const row = this.store.get(
|
|
146
|
+
"SELECT * FROM cost_tracking WHERE id = ?",
|
|
147
|
+
result.lastInsertRowid
|
|
148
|
+
);
|
|
149
|
+
if (!row) {
|
|
150
|
+
throw new Error("Failed to retrieve created cost entry");
|
|
151
|
+
}
|
|
152
|
+
return this.mapCostRow(row);
|
|
153
|
+
}
|
|
154
|
+
getConversationCost(conversationId) {
|
|
155
|
+
const result = this.store.get(
|
|
156
|
+
"SELECT SUM(cost_usd) as total FROM cost_tracking WHERE conversation_id = ?",
|
|
157
|
+
conversationId
|
|
158
|
+
);
|
|
159
|
+
return result?.total ?? 0;
|
|
160
|
+
}
|
|
161
|
+
getCostBreakdown(conversationId) {
|
|
162
|
+
const rows = this.store.all(
|
|
163
|
+
"SELECT * FROM cost_tracking WHERE conversation_id = ? ORDER BY created_at ASC",
|
|
164
|
+
conversationId
|
|
165
|
+
);
|
|
166
|
+
return rows.map((row) => this.mapCostRow(row));
|
|
167
|
+
}
|
|
168
|
+
// ── Private row mappers ─────────────────────────────────────────────
|
|
169
|
+
mapConversationRow(row) {
|
|
170
|
+
let metadata = {};
|
|
171
|
+
try {
|
|
172
|
+
metadata = JSON.parse(row.metadata);
|
|
173
|
+
} catch {
|
|
174
|
+
metadata = {};
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
id: row.id,
|
|
178
|
+
projectRoot: row.project_root,
|
|
179
|
+
defaultModel: row.default_model,
|
|
180
|
+
createdAt: row.created_at,
|
|
181
|
+
updatedAt: row.updated_at,
|
|
182
|
+
metadata
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
mapMessageRow(row) {
|
|
186
|
+
let toolCalls = null;
|
|
187
|
+
if (row.tool_calls) {
|
|
188
|
+
try {
|
|
189
|
+
toolCalls = JSON.parse(row.tool_calls);
|
|
190
|
+
} catch {
|
|
191
|
+
toolCalls = null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
let tokenUsage = null;
|
|
195
|
+
if (row.token_usage) {
|
|
196
|
+
try {
|
|
197
|
+
tokenUsage = JSON.parse(row.token_usage);
|
|
198
|
+
} catch {
|
|
199
|
+
tokenUsage = null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
id: row.id,
|
|
204
|
+
conversationId: row.conversation_id,
|
|
205
|
+
role: row.role,
|
|
206
|
+
model: row.model,
|
|
207
|
+
provider: row.provider,
|
|
208
|
+
content: row.content,
|
|
209
|
+
toolCalls,
|
|
210
|
+
tokenUsage,
|
|
211
|
+
createdAt: row.created_at
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
mapFileContextRow(row) {
|
|
215
|
+
return {
|
|
216
|
+
id: row.id,
|
|
217
|
+
conversationId: row.conversation_id,
|
|
218
|
+
filePath: row.file_path,
|
|
219
|
+
contentHash: row.content_hash,
|
|
220
|
+
tokenCount: row.token_count,
|
|
221
|
+
addedAt: row.added_at
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
mapCostRow(row) {
|
|
225
|
+
return {
|
|
226
|
+
id: row.id,
|
|
227
|
+
conversationId: row.conversation_id,
|
|
228
|
+
provider: row.provider,
|
|
229
|
+
model: row.model,
|
|
230
|
+
role: row.role,
|
|
231
|
+
inputTokens: row.input_tokens,
|
|
232
|
+
outputTokens: row.output_tokens,
|
|
233
|
+
costUsd: row.cost_usd,
|
|
234
|
+
createdAt: row.created_at
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
export { ConversationStore };
|
|
240
|
+
//# sourceMappingURL=chunk-WC72BRHR.js.map
|
|
241
|
+
//# sourceMappingURL=chunk-WC72BRHR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/conversation-store.ts"],"names":[],"mappings":"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","file":"chunk-WC72BRHR.js","sourcesContent":["/**\r\n * Conversation store — PRD section 17.1\r\n * CRUD for conversations, messages, file context, and cost tracking.\r\n * All queries use parameterized prepared statements.\r\n */\r\n\r\nimport { randomUUID } from \"node:crypto\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport type { SqliteStore } from \"./sqlite-store.js\";\r\nimport type { MessageRole } from \"../types/message.js\";\r\nimport type { ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IConversationRow,\r\n IMessageRow,\r\n IFileContextRow,\r\n ICostRow,\r\n IConversation,\r\n IMessage,\r\n IStoredTokenUsage,\r\n IFileContext,\r\n ICostEntry,\r\n IPaginationOptions,\r\n IAddMessageParams,\r\n IAddCostParams,\r\n IAddFileContextParams,\r\n} from \"./conversation-types.js\";\r\n\r\nexport type {\r\n IConversation,\r\n IMessage,\r\n IStoredTokenUsage,\r\n IFileContext,\r\n ICostEntry,\r\n IPaginationOptions,\r\n IAddMessageParams,\r\n IAddCostParams,\r\n IAddFileContextParams,\r\n} from \"./conversation-types.js\";\r\n\r\nexport class ConversationStore {\r\n private readonly store: SqliteStore;\r\n\r\n constructor(store: SqliteStore) {\r\n this.store = store;\r\n }\r\n\r\n createConversation(\r\n projectRoot: string,\r\n defaultModel?: string,\r\n metadata?: Record<string, unknown>,\r\n ): IConversation {\r\n const id = randomUUID();\r\n const metadataJson = JSON.stringify(metadata ?? {});\r\n\r\n this.store.run(\r\n `INSERT INTO conversations (id, project_root, default_model, metadata)\r\n VALUES (?, ?, ?, ?)`,\r\n id,\r\n projectRoot,\r\n defaultModel ?? null,\r\n metadataJson,\r\n );\r\n\r\n logger.info({ conversationId: id, projectRoot }, \"Conversation created\");\r\n\r\n const row = this.store.get(\r\n \"SELECT * FROM conversations WHERE id = ?\",\r\n id,\r\n ) as IConversationRow | undefined;\r\n\r\n if (!row) {\r\n throw new Error(`Failed to retrieve created conversation: ${id}`);\r\n }\r\n\r\n return this.mapConversationRow(row);\r\n }\r\n\r\n getConversation(id: string): IConversation | undefined {\r\n const row = this.store.get(\r\n \"SELECT * FROM conversations WHERE id = ?\",\r\n id,\r\n ) as IConversationRow | undefined;\r\n return row ? this.mapConversationRow(row) : undefined;\r\n }\r\n\r\n listConversations(projectRoot?: string): IConversation[] {\r\n const rows = projectRoot\r\n ? (this.store.all(\r\n \"SELECT * FROM conversations WHERE project_root = ? ORDER BY updated_at DESC\",\r\n projectRoot,\r\n ) as IConversationRow[])\r\n : (this.store.all(\r\n \"SELECT * FROM conversations ORDER BY updated_at DESC\",\r\n ) as IConversationRow[]);\r\n\r\n return rows.map((row) => this.mapConversationRow(row));\r\n }\r\n\r\n deleteConversation(id: string): void {\r\n this.store.run(\"DELETE FROM conversations WHERE id = ?\", id);\r\n logger.info({ conversationId: id }, \"Conversation deleted\");\r\n }\r\n\r\n addMessage(params: IAddMessageParams): IMessage {\r\n const toolCallsJson = params.toolCalls\r\n ? JSON.stringify(params.toolCalls)\r\n : null;\r\n const tokenUsageJson = params.tokenUsage\r\n ? JSON.stringify(params.tokenUsage)\r\n : null;\r\n\r\n const result = this.store.run(\r\n `INSERT INTO messages\r\n (conversation_id, role, model, provider, content, tool_calls, token_usage)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n params.conversationId,\r\n params.role,\r\n params.model ?? null,\r\n params.provider ?? null,\r\n params.content,\r\n toolCallsJson,\r\n tokenUsageJson,\r\n );\r\n\r\n this.store.run(\r\n \"UPDATE conversations SET updated_at = datetime('now') WHERE id = ?\",\r\n params.conversationId,\r\n );\r\n\r\n const row = this.store.get(\r\n \"SELECT * FROM messages WHERE id = ?\",\r\n result.lastInsertRowid,\r\n ) as IMessageRow | undefined;\r\n\r\n if (!row) {\r\n throw new Error(\"Failed to retrieve created message\");\r\n }\r\n\r\n return this.mapMessageRow(row);\r\n }\r\n\r\n getMessages(\r\n conversationId: string,\r\n pagination?: IPaginationOptions,\r\n ): IMessage[] {\r\n const limit = pagination?.limit ?? 100;\r\n const offset = pagination?.offset ?? 0;\r\n\r\n const rows = this.store.all(\r\n `SELECT * FROM messages\r\n WHERE conversation_id = ?\r\n ORDER BY created_at ASC\r\n LIMIT ? OFFSET ?`,\r\n conversationId,\r\n limit,\r\n offset,\r\n ) as IMessageRow[];\r\n\r\n return rows.map((row) => this.mapMessageRow(row));\r\n }\r\n\r\n getMessageCount(conversationId: string): number {\r\n const result = this.store.get(\r\n \"SELECT COUNT(*) as count FROM messages WHERE conversation_id = ?\",\r\n conversationId,\r\n ) as { count: number } | undefined;\r\n return result?.count ?? 0;\r\n }\r\n\r\n addFileContext(params: IAddFileContextParams): IFileContext {\r\n const result = this.store.run(\r\n `INSERT INTO file_context\r\n (conversation_id, file_path, content_hash, token_count)\r\n VALUES (?, ?, ?, ?)`,\r\n params.conversationId,\r\n params.filePath,\r\n params.contentHash ?? null,\r\n params.tokenCount ?? null,\r\n );\r\n\r\n const row = this.store.get(\r\n \"SELECT * FROM file_context WHERE id = ?\",\r\n result.lastInsertRowid,\r\n ) as IFileContextRow | undefined;\r\n\r\n if (!row) {\r\n throw new Error(\"Failed to retrieve created file context\");\r\n }\r\n\r\n return this.mapFileContextRow(row);\r\n }\r\n\r\n getFileContext(conversationId: string): IFileContext[] {\r\n const rows = this.store.all(\r\n \"SELECT * FROM file_context WHERE conversation_id = ? ORDER BY added_at DESC\",\r\n conversationId,\r\n ) as IFileContextRow[];\r\n return rows.map((row) => this.mapFileContextRow(row));\r\n }\r\n\r\n removeFileContext(conversationId: string, filePath: string): void {\r\n this.store.run(\r\n \"DELETE FROM file_context WHERE conversation_id = ? AND file_path = ?\",\r\n conversationId,\r\n filePath,\r\n );\r\n }\r\n\r\n addCost(params: IAddCostParams): ICostEntry {\r\n const result = this.store.run(\r\n `INSERT INTO cost_tracking\r\n (conversation_id, provider, model, role, input_tokens, output_tokens, cost_usd)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n params.conversationId,\r\n params.provider,\r\n params.model,\r\n params.role ?? null,\r\n params.inputTokens ?? null,\r\n params.outputTokens ?? null,\r\n params.costUsd ?? null,\r\n );\r\n\r\n const row = this.store.get(\r\n \"SELECT * FROM cost_tracking WHERE id = ?\",\r\n result.lastInsertRowid,\r\n ) as ICostRow | undefined;\r\n\r\n if (!row) {\r\n throw new Error(\"Failed to retrieve created cost entry\");\r\n }\r\n\r\n return this.mapCostRow(row);\r\n }\r\n\r\n getConversationCost(conversationId: string): number {\r\n const result = this.store.get(\r\n \"SELECT SUM(cost_usd) as total FROM cost_tracking WHERE conversation_id = ?\",\r\n conversationId,\r\n ) as { total: number | null } | undefined;\r\n return result?.total ?? 0;\r\n }\r\n\r\n getCostBreakdown(conversationId: string): ICostEntry[] {\r\n const rows = this.store.all(\r\n \"SELECT * FROM cost_tracking WHERE conversation_id = ? ORDER BY created_at ASC\",\r\n conversationId,\r\n ) as ICostRow[];\r\n return rows.map((row) => this.mapCostRow(row));\r\n }\r\n\r\n // ── Private row mappers ─────────────────────────────────────────────\r\n\r\n private mapConversationRow(row: IConversationRow): IConversation {\r\n let metadata: Record<string, unknown> = {};\r\n try {\r\n metadata = JSON.parse(row.metadata) as Record<string, unknown>;\r\n } catch {\r\n metadata = {};\r\n }\r\n\r\n return {\r\n id: row.id,\r\n projectRoot: row.project_root,\r\n defaultModel: row.default_model,\r\n createdAt: row.created_at,\r\n updatedAt: row.updated_at,\r\n metadata,\r\n };\r\n }\r\n\r\n private mapMessageRow(row: IMessageRow): IMessage {\r\n let toolCalls: unknown[] | null = null;\r\n if (row.tool_calls) {\r\n try {\r\n toolCalls = JSON.parse(row.tool_calls) as unknown[];\r\n } catch {\r\n toolCalls = null;\r\n }\r\n }\r\n\r\n let tokenUsage: IStoredTokenUsage | null = null;\r\n if (row.token_usage) {\r\n try {\r\n tokenUsage = JSON.parse(row.token_usage) as IStoredTokenUsage;\r\n } catch {\r\n tokenUsage = null;\r\n }\r\n }\r\n\r\n return {\r\n id: row.id,\r\n conversationId: row.conversation_id,\r\n role: row.role as MessageRole,\r\n model: row.model,\r\n provider: row.provider as ProviderName | null,\r\n content: row.content,\r\n toolCalls,\r\n tokenUsage,\r\n createdAt: row.created_at,\r\n };\r\n }\r\n\r\n private mapFileContextRow(row: IFileContextRow): IFileContext {\r\n return {\r\n id: row.id,\r\n conversationId: row.conversation_id,\r\n filePath: row.file_path,\r\n contentHash: row.content_hash,\r\n tokenCount: row.token_count,\r\n addedAt: row.added_at,\r\n };\r\n }\r\n\r\n private mapCostRow(row: ICostRow): ICostEntry {\r\n return {\r\n id: row.id,\r\n conversationId: row.conversation_id,\r\n provider: row.provider,\r\n model: row.model,\r\n role: row.role,\r\n inputTokens: row.input_tokens,\r\n outputTokens: row.output_tokens,\r\n costUsd: row.cost_usd,\r\n createdAt: row.created_at,\r\n };\r\n }\r\n}\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { logger } from './chunk-
|
|
1
|
+
import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-473JN6M5.js';
|
|
2
|
+
import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
|
|
3
|
+
import { logger } from './chunk-HEKFAKVH.js';
|
|
4
4
|
|
|
5
5
|
// src/providers/kimi-adapter.ts
|
|
6
6
|
var PROVIDER_NAME = "kimi";
|
|
@@ -8,10 +8,41 @@ var DEFAULT_BASE_URL = "https://api.moonshot.cn/v1";
|
|
|
8
8
|
var KIMI_MODELS = ["kimi-for-coding"];
|
|
9
9
|
var CHARS_PER_TOKEN_ESTIMATE = 4;
|
|
10
10
|
function convertMessages(messages) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
const converted = [];
|
|
12
|
+
for (const msg of messages) {
|
|
13
|
+
if (msg.role === "assistant" && msg.toolCalls !== void 0 && msg.toolCalls.length > 0) {
|
|
14
|
+
converted.push({
|
|
15
|
+
role: "assistant",
|
|
16
|
+
content: msg.content.length > 0 ? msg.content : null,
|
|
17
|
+
tool_calls: msg.toolCalls.map((toolCall) => ({
|
|
18
|
+
id: toolCall.id,
|
|
19
|
+
type: "function",
|
|
20
|
+
function: {
|
|
21
|
+
name: toolCall.name,
|
|
22
|
+
arguments: JSON.stringify(toolCall.arguments)
|
|
23
|
+
}
|
|
24
|
+
}))
|
|
25
|
+
});
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (msg.role === "tool") {
|
|
29
|
+
const toolCall = msg.toolCalls?.[0];
|
|
30
|
+
if (toolCall !== void 0) {
|
|
31
|
+
converted.push({
|
|
32
|
+
role: "tool",
|
|
33
|
+
content: msg.content,
|
|
34
|
+
tool_call_id: toolCall.id,
|
|
35
|
+
name: toolCall.name
|
|
36
|
+
});
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
converted.push({
|
|
41
|
+
role: msg.role,
|
|
42
|
+
content: msg.content
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return converted;
|
|
15
46
|
}
|
|
16
47
|
function convertTools(tools) {
|
|
17
48
|
if (tools === void 0 || tools.length === 0) {
|
|
@@ -64,6 +95,7 @@ async function handleResponseError(response, model) {
|
|
|
64
95
|
var KimiAdapter = class {
|
|
65
96
|
name = PROVIDER_NAME;
|
|
66
97
|
supportedModels = KIMI_MODELS;
|
|
98
|
+
supportsToolCalling = true;
|
|
67
99
|
baseUrl;
|
|
68
100
|
apiKey;
|
|
69
101
|
constructor(options) {
|
|
@@ -178,8 +210,8 @@ var KimiAdapter = class {
|
|
|
178
210
|
yield { type: "done" };
|
|
179
211
|
}
|
|
180
212
|
}
|
|
181
|
-
|
|
182
|
-
return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
|
|
213
|
+
countTokens(text, _model) {
|
|
214
|
+
return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));
|
|
183
215
|
}
|
|
184
216
|
getModelInfo(model) {
|
|
185
217
|
const info = SUPPORTED_MODELS[model];
|
|
@@ -307,5 +339,5 @@ function mapFinishReason(reason) {
|
|
|
307
339
|
}
|
|
308
340
|
|
|
309
341
|
export { KimiAdapter };
|
|
310
|
-
//# sourceMappingURL=chunk-
|
|
311
|
-
//# sourceMappingURL=chunk-
|
|
342
|
+
//# sourceMappingURL=chunk-YPFOE2QJ.js.map
|
|
343
|
+
//# sourceMappingURL=chunk-YPFOE2QJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/kimi-adapter.ts"],"names":[],"mappings":"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","file":"chunk-YPFOE2QJ.js","sourcesContent":["/**\r\n * Kimi (Moonshot) adapter — custom HTTP per PRD section 7.1\r\n * Uses OpenAI-compatible API format via fetch().\r\n * Supports Kimi Code (kimi-for-coding)\r\n */\r\n\r\nimport { logger } from \"../utils/logger.js\";\r\nimport {\r\n AuthenticationError,\r\n RateLimitError,\r\n ModelNotFoundError,\r\n} from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IChatRequest,\r\n IChatResponse,\r\n IChatMessage,\r\n IStreamChunk,\r\n IToolCall,\r\n IToolDefinition,\r\n ITokenUsage,\r\n} from \"../types/message.js\";\r\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\r\n\r\nconst PROVIDER_NAME: ProviderName = \"kimi\";\r\nconst DEFAULT_BASE_URL = \"https://api.moonshot.cn/v1\";\r\n\r\nconst KIMI_MODELS: readonly string[] = [\"kimi-for-coding\"] as const;\r\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\r\n\r\ninterface OpenAIStandardMessage {\r\n role: \"system\" | \"user\" | \"assistant\";\r\n content: string | null;\r\n tool_calls?: readonly OpenAIToolCallRef[] | undefined;\r\n}\r\ninterface OpenAIToolResultMessage {\r\n role: \"tool\";\r\n content: string;\r\n tool_call_id: string;\r\n name: string;\r\n}\r\ntype OpenAIMessage = OpenAIStandardMessage | OpenAIToolResultMessage;\r\ninterface OpenAITool { type: \"function\"; function: { name: string; description: string; parameters: Record<string, unknown> } }\r\ninterface OpenAIToolCallRef { id: string; type: string; function: { name: string; arguments: string } }\r\ninterface OpenAIChoice {\r\n index: number;\r\n message: { role: string; content: string | null; tool_calls?: readonly OpenAIToolCallRef[] };\r\n finish_reason: string;\r\n}\r\ninterface OpenAIUsage { prompt_tokens: number; completion_tokens: number; total_tokens: number }\r\ninterface OpenAIChatResponse { id: string; choices: OpenAIChoice[]; usage: OpenAIUsage }\r\n\r\nfunction convertMessages(messages: readonly IChatMessage[]): OpenAIMessage[] {\r\n const converted: OpenAIMessage[] = [];\r\n\r\n for (const msg of messages) {\r\n if (msg.role === \"assistant\" && msg.toolCalls !== undefined && msg.toolCalls.length > 0) {\r\n converted.push({\r\n role: \"assistant\" as const,\r\n content: msg.content.length > 0 ? msg.content : null,\r\n tool_calls: msg.toolCalls.map((toolCall) => ({\r\n id: toolCall.id,\r\n type: \"function\",\r\n function: {\r\n name: toolCall.name,\r\n arguments: JSON.stringify(toolCall.arguments),\r\n },\r\n })),\r\n });\r\n continue;\r\n }\r\n\r\n if (msg.role === \"tool\") {\r\n const toolCall = msg.toolCalls?.[0];\r\n if (toolCall !== undefined) {\r\n converted.push({\r\n role: \"tool\" as const,\r\n content: msg.content,\r\n tool_call_id: toolCall.id,\r\n name: toolCall.name,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n converted.push({\r\n role: msg.role as \"system\" | \"user\" | \"assistant\",\r\n content: msg.content,\r\n });\r\n }\r\n\r\n return converted;\r\n}\r\n\r\nfunction convertTools(tools: readonly IToolDefinition[] | undefined): OpenAITool[] | undefined {\r\n if (tools === undefined || tools.length === 0) {\r\n return undefined;\r\n }\r\n return tools.map((tool) => {\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n for (const param of tool.parameters) {\r\n const prop: Record<string, unknown> = {\r\n type: param.type,\r\n description: param.description,\r\n };\r\n if (param.enum !== undefined) {\r\n prop[\"enum\"] = param.enum;\r\n }\r\n properties[param.name] = prop;\r\n if (param.required) {\r\n required.push(param.name);\r\n }\r\n }\r\n return {\r\n type: \"function\" as const,\r\n function: {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: { type: \"object\", properties, required },\r\n },\r\n };\r\n });\r\n}\r\n\r\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\r\n return (\r\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\r\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\r\n );\r\n}\r\n\r\nasync function handleResponseError(response: Response, model: string): Promise<never> {\r\n const body = await response.text();\r\n if (response.status === 401 || response.status === 403) {\r\n throw new AuthenticationError(PROVIDER_NAME, body);\r\n }\r\n if (response.status === 429) {\r\n const retryHeader = response.headers.get(\"retry-after\");\r\n const retryMs = retryHeader !== null ? parseInt(retryHeader, 10) * 1000 : 60_000;\r\n throw new RateLimitError(PROVIDER_NAME, retryMs);\r\n }\r\n if (response.status === 404) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n throw new Error(`Kimi API error (${response.status}): ${body}`);\r\n}\r\n\r\nexport class KimiAdapter implements IModelProvider {\r\n readonly name = PROVIDER_NAME;\r\n readonly supportedModels = KIMI_MODELS;\r\n readonly supportsToolCalling = true;\r\n\r\n private readonly baseUrl: string;\r\n private readonly apiKey: string;\r\n\r\n constructor(options?: IProviderOptions) {\r\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\r\n this.apiKey = options?.apiKey ?? process.env[\"MOONSHOT_API_KEY\"] ?? \"\";\r\n }\r\n\r\n async chat(request: IChatRequest): Promise<IChatResponse> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = convertMessages(request.messages);\r\n const tools = convertTools(request.tools);\r\n\r\n if (request.system !== undefined) {\r\n messages.unshift({ role: \"system\", content: request.system });\r\n }\r\n\r\n const body: Record<string, unknown> = {\r\n model: request.model,\r\n messages,\r\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n stream: false,\r\n };\r\n if (request.temperature !== undefined) {\r\n body[\"temperature\"] = request.temperature;\r\n }\r\n if (tools !== undefined) {\r\n body[\"tools\"] = tools;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.apiKey}`,\r\n },\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n await handleResponseError(response, request.model);\r\n }\r\n\r\n const data = (await response.json()) as OpenAIChatResponse;\r\n const choice = data.choices[0];\r\n if (choice === undefined) {\r\n throw new Error(\"Kimi API returned empty choices\");\r\n }\r\n\r\n const toolCalls = extractToolCalls(choice);\r\n const inputTokens = data.usage.prompt_tokens;\r\n const outputTokens = data.usage.completion_tokens;\r\n\r\n const usage: ITokenUsage = {\r\n inputTokens,\r\n outputTokens,\r\n totalTokens: inputTokens + outputTokens,\r\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\r\n };\r\n\r\n const responseMessage: IChatMessage = {\r\n id: data.id,\r\n role: \"assistant\",\r\n content: choice.message.content ?? \"\",\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\r\n tokenUsage: usage,\r\n createdAt: new Date(),\r\n };\r\n\r\n return {\r\n id: data.id,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n message: responseMessage,\r\n usage,\r\n finishReason: mapFinishReason(choice.finish_reason),\r\n };\r\n }\r\n\r\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = convertMessages(request.messages);\r\n const tools = convertTools(request.tools);\r\n\r\n if (request.system !== undefined) {\r\n messages.unshift({ role: \"system\", content: request.system });\r\n }\r\n\r\n const body: Record<string, unknown> = {\r\n model: request.model,\r\n messages,\r\n max_tokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n stream: true,\r\n };\r\n if (request.temperature !== undefined) {\r\n body[\"temperature\"] = request.temperature;\r\n }\r\n if (tools !== undefined) {\r\n body[\"tools\"] = tools;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.apiKey}`,\r\n },\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n await handleResponseError(response, request.model);\r\n }\r\n\r\n if (response.body === null) {\r\n yield { type: \"error\", error: \"Kimi API returned empty stream body\" };\r\n yield { type: \"done\" };\r\n return;\r\n }\r\n\r\n try {\r\n yield* this.parseSSEStream(response.body, modelInfo);\r\n yield { type: \"done\" };\r\n } catch (error: unknown) {\r\n const errMsg = error instanceof Error ? error.message : String(error);\r\n logger.error({ error: errMsg, model: request.model }, \"Kimi stream error\");\r\n yield { type: \"error\", error: errMsg };\r\n yield { type: \"done\" };\r\n }\r\n }\r\n\r\n countTokens(text: string, _model: string): Promise<number> {\r\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\r\n }\r\n\r\n getModelInfo(model: string): IModelInfo {\r\n const info = SUPPORTED_MODELS[model];\r\n if (info === undefined || info.provider !== PROVIDER_NAME) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n return info;\r\n }\r\n\r\n async listAvailableModels(): Promise<readonly string[]> {\r\n if (!this.apiKey) return [...this.supportedModels];\r\n\r\n try {\r\n const response = await fetch(`${this.baseUrl}/models`, {\r\n headers: { Authorization: `Bearer ${this.apiKey}` },\r\n signal: AbortSignal.timeout(5000),\r\n });\r\n if (!response.ok) return [...this.supportedModels];\r\n\r\n const data = (await response.json()) as { data: Array<{ id: string }> };\r\n const models = data.data.map((m) => m.id).sort();\r\n return models.length > 0 ? models : [...this.supportedModels];\r\n } catch {\r\n return [...this.supportedModels];\r\n }\r\n }\r\n\r\n private async *parseSSEStream(\r\n body: ReadableStream<Uint8Array>,\r\n modelInfo: IModelInfo,\r\n ): AsyncIterable<IStreamChunk> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n\r\n try {\r\n for (;;) {\r\n const { done, value } = await reader.read();\r\n if (done) {\r\n break;\r\n }\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split(\"\\n\");\r\n buffer = lines.pop() ?? \"\";\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (trimmed === \"\" || trimmed === \"data: [DONE]\") {\r\n continue;\r\n }\r\n if (!trimmed.startsWith(\"data: \")) {\r\n continue;\r\n }\r\n\r\n const jsonStr = trimmed.slice(6);\r\n let parsed: {\r\n choices?: Array<{\r\n delta?: {\r\n content?: string;\r\n tool_calls?: Array<{\r\n id?: string;\r\n function?: { name?: string; arguments?: string };\r\n }>;\r\n };\r\n }>;\r\n usage?: OpenAIUsage;\r\n };\r\n\r\n try {\r\n parsed = JSON.parse(jsonStr) as typeof parsed;\r\n } catch {\r\n continue;\r\n }\r\n\r\n const delta = parsed.choices?.[0]?.delta;\r\n if (delta?.content !== undefined && delta.content !== \"\") {\r\n yield { type: \"text\", content: delta.content };\r\n }\r\n\r\n if (delta?.tool_calls !== undefined) {\r\n for (const tc of delta.tool_calls) {\r\n if (tc.id !== undefined && tc.function?.name !== undefined) {\r\n let args: Record<string, unknown> = {};\r\n if (tc.function.arguments !== undefined) {\r\n try {\r\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\r\n } catch {\r\n args = {};\r\n }\r\n }\r\n const toolCall: IToolCall = {\r\n id: tc.id,\r\n name: tc.function.name,\r\n arguments: args,\r\n };\r\n yield { type: \"tool_call\", toolCall };\r\n }\r\n }\r\n }\r\n\r\n if (parsed.usage !== undefined) {\r\n const inTok = parsed.usage.prompt_tokens;\r\n const outTok = parsed.usage.completion_tokens;\r\n yield {\r\n type: \"usage\",\r\n usage: {\r\n inputTokens: inTok,\r\n outputTokens: outTok,\r\n totalTokens: inTok + outTok,\r\n costUsd: computeCost(modelInfo, inTok, outTok),\r\n },\r\n };\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n}\r\n\r\nfunction extractToolCalls(choice: OpenAIChoice): IToolCall[] {\r\n if (choice.message.tool_calls === undefined || choice.message.tool_calls.length === 0) {\r\n return [];\r\n }\r\n return choice.message.tool_calls.map((tc) => {\r\n let args: Record<string, unknown> = {};\r\n try {\r\n args = JSON.parse(tc.function.arguments) as Record<string, unknown>;\r\n } catch {\r\n args = {};\r\n }\r\n return {\r\n id: tc.id,\r\n name: tc.function.name,\r\n arguments: args,\r\n };\r\n });\r\n}\r\n\r\nfunction mapFinishReason(\r\n reason: string,\r\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\r\n switch (reason) {\r\n case \"stop\":\r\n return \"stop\";\r\n case \"tool_calls\":\r\n return \"tool_calls\";\r\n case \"length\":\r\n return \"max_tokens\";\r\n default:\r\n return \"stop\";\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { ClaudeAdapter } from './chunk-CTFZTARK.js';
|
|
2
|
+
import './chunk-ODBY7S4X.js';
|
|
3
|
+
import './chunk-473JN6M5.js';
|
|
4
|
+
import './chunk-62HSGYQD.js';
|
|
5
|
+
import './chunk-HEKFAKVH.js';
|
|
6
|
+
//# sourceMappingURL=claude-adapter-6P4SJH7P.js.map
|
|
7
|
+
//# sourceMappingURL=claude-adapter-6P4SJH7P.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"claude-adapter-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"claude-adapter-6P4SJH7P.js"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { CredentialStore } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
1
|
+
import { CredentialStore } from './chunk-AQ23TYSQ.js';
|
|
2
|
+
import './chunk-VJNQJALF.js';
|
|
3
|
+
import './chunk-VBLLDY4R.js';
|
|
4
|
+
import './chunk-2GKOK6T7.js';
|
|
5
|
+
import { AuthenticationError } from './chunk-473JN6M5.js';
|
|
6
|
+
import './chunk-62HSGYQD.js';
|
|
7
|
+
import { logger } from './chunk-HEKFAKVH.js';
|
|
8
|
+
import './chunk-BY4DAKUU.js';
|
|
9
9
|
import { createServer } from 'http';
|
|
10
10
|
import { randomBytes, createHash } from 'crypto';
|
|
11
11
|
import { execFile } from 'child_process';
|
|
@@ -320,5 +320,5 @@ var ClaudeLogin = class {
|
|
|
320
320
|
};
|
|
321
321
|
|
|
322
322
|
export { ClaudeLogin };
|
|
323
|
-
//# sourceMappingURL=claude-login-
|
|
324
|
-
//# sourceMappingURL=claude-login-
|
|
323
|
+
//# sourceMappingURL=claude-login-IS5WTBMP.js.map
|
|
324
|
+
//# sourceMappingURL=claude-login-IS5WTBMP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/providers/claude-login.ts"],"names":["isExpired"],"mappings":"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","file":"claude-login-IS5WTBMP.js","sourcesContent":["/**\r\n * Claude Code OAuth 2.0 + PKCE login\r\n * Uses the same client ID as the official Claude Code CLI.\r\n * After login, stores tokens in our credential store AND writes to macOS Keychain\r\n * so credentials are shared with the official Claude Code CLI.\r\n */\r\n\r\nimport { createServer, type Server, type IncomingMessage, type ServerResponse } from \"node:http\";\r\nimport { randomBytes, createHash } from \"node:crypto\";\r\nimport { execFile } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nimport { URL } from \"node:url\";\r\nimport type { ICredential } from \"../../types/index.js\";\r\nimport { AuthenticationError } from \"../../types/index.js\";\r\nimport { CredentialStore } from \"../credential-store.js\";\r\nimport { logger } from \"../../utils/index.js\";\r\n\r\nconst execFileAsync = promisify(execFile);\r\n\r\n// ── Claude Code OAuth Config (same as official Claude Code CLI) ─────────\r\n\r\nconst CLIENT_ID = \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\";\r\nconst AUTHORIZE_URL = \"https://claude.ai/oauth/authorize\";\r\nconst TOKEN_URL = \"https://platform.claude.com/v1/oauth/token\";\r\nconst SCOPE = \"user:inference\";\r\nconst CALLBACK_TIMEOUT_MS = 300_000;\r\nconst LOCALHOST = \"localhost\";\r\n\r\n// ── Also try reading from official Claude Code CLI's keychain ───────────\r\n\r\nconst KEYCHAIN_SERVICE = \"Claude Code-credentials\";\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null;\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\r\n}\r\n\r\nfunction asDate(value: unknown): Date | undefined {\r\n if (value instanceof Date) {\r\n return Number.isNaN(value.getTime()) ? undefined : value;\r\n }\r\n\r\n if (typeof value === \"number\" && Number.isFinite(value)) {\r\n const millis = value > 10_000_000_000 ? value : value * 1000;\r\n const date = new Date(millis);\r\n return Number.isNaN(date.getTime()) ? undefined : date;\r\n }\r\n\r\n if (typeof value === \"string\" && value.length > 0) {\r\n const numeric = Number(value);\r\n if (Number.isFinite(numeric) && value.trim() !== \"\") {\r\n return asDate(numeric);\r\n }\r\n\r\n const parsed = new Date(value);\r\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction parseKeychainCredential(raw: string): ICredential | undefined {\r\n if (raw.length === 0) {\r\n return undefined;\r\n }\r\n\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(raw) as unknown;\r\n } catch {\r\n return undefined;\r\n }\r\n\r\n if (!isRecord(parsed)) {\r\n return undefined;\r\n }\r\n\r\n const directPayload = parsed;\r\n const nestedPayload = isRecord(parsed[\"claudeAiOauth\"])\r\n ? parsed[\"claudeAiOauth\"]\r\n : undefined;\r\n const payloads = nestedPayload ? [nestedPayload, directPayload] : [directPayload];\r\n\r\n for (const payload of payloads) {\r\n const accessToken = asString(payload[\"accessToken\"]) ?? asString(payload[\"access_token\"]);\r\n if (!accessToken) {\r\n continue;\r\n }\r\n\r\n const refreshToken = asString(payload[\"refreshToken\"]) ?? asString(payload[\"refresh_token\"]);\r\n const expiresAt = asDate(payload[\"expiresAt\"] ?? payload[\"expires_at\"]);\r\n const email = asString(payload[\"email\"]);\r\n const plan = asString(payload[\"plan\"])\r\n ?? asString(payload[\"subscriptionType\"])\r\n ?? asString(payload[\"subscription_type\"])\r\n ?? asString(payload[\"rateLimitTier\"])\r\n ?? asString(payload[\"rate_limit_tier\"]);\r\n\r\n return {\r\n provider: \"anthropic\",\r\n method: \"native_login\",\r\n token: accessToken,\r\n ...(refreshToken !== undefined ? { refreshToken } : {}),\r\n ...(expiresAt !== undefined ? { expiresAt } : {}),\r\n ...(email !== undefined ? { email } : {}),\r\n ...(plan !== undefined ? { plan } : {}),\r\n };\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nasync function readKeychainCredential(): Promise<ICredential | undefined> {\r\n if (process.platform !== \"darwin\") return undefined;\r\n\r\n try {\r\n const { stdout } = await execFileAsync(\"security\", [\r\n \"find-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-w\",\r\n ], { timeout: 5000 });\r\n\r\n return parseKeychainCredential(stdout.trim());\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n// ── PKCE Helpers ────────────────────────────────────────────────────────\r\n\r\nfunction generateCodeVerifier(): string {\r\n return randomBytes(32).toString(\"base64url\");\r\n}\r\n\r\nfunction generateCodeChallenge(verifier: string): string {\r\n return createHash(\"sha256\").update(verifier).digest(\"base64url\");\r\n}\r\n\r\nfunction generateState(): string {\r\n return randomBytes(16).toString(\"hex\");\r\n}\r\n\r\n// ── HTML Responses ──────────────────────────────────────────────────────\r\n\r\nfunction escapeHtml(unsafe: string): string {\r\n return unsafe\r\n .replace(/&/g, \"&\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\");\r\n}\r\n\r\nfunction successHtml(): string {\r\n return `<!DOCTYPE html>\r\n<html><head><title>AemeathCLI — Login Successful</title></head>\r\n<body style=\"font-family:system-ui;text-align:center;padding:40px\">\r\n<h1>Login Successful</h1>\r\n<p>You can close this window and return to your terminal.</p>\r\n</body></html>`;\r\n}\r\n\r\nfunction errorHtml(message: string): string {\r\n return `<!DOCTYPE html>\r\n<html><head><title>AemeathCLI — Login Failed</title></head>\r\n<body style=\"font-family:system-ui;text-align:center;padding:40px\">\r\n<h1>Login Failed</h1>\r\n<p>${escapeHtml(message)}</p>\r\n</body></html>`;\r\n}\r\n\r\n// ── ClaudeLogin Class ───────────────────────────────────────────────────\r\n\r\nexport class ClaudeLogin {\r\n private readonly credentialStore: CredentialStore;\r\n private callbackServer: Server | undefined;\r\n\r\n constructor(store?: CredentialStore) {\r\n this.credentialStore = store ?? new CredentialStore();\r\n }\r\n\r\n /**\r\n * Run browser-based OAuth 2.0 + PKCE login using the same client ID\r\n * as the official Claude Code CLI. Browser opens automatically.\r\n */\r\n async login(): Promise<ICredential> {\r\n // First try importing existing credentials from Claude Code's keychain\r\n const existing = await readKeychainCredential();\r\n if (existing && existing.token) {\r\n const isExpired = existing.expiresAt ? new Date() > existing.expiresAt : false;\r\n if (!isExpired) {\r\n logger.info(\"Imported existing Claude Code credentials from keychain\");\r\n await this.credentialStore.set(\"anthropic\", existing);\r\n return existing;\r\n }\r\n }\r\n\r\n // Run the OAuth flow — browser opens automatically\r\n const codeVerifier = generateCodeVerifier();\r\n const codeChallenge = generateCodeChallenge(codeVerifier);\r\n const state = generateState();\r\n\r\n const { port, server } = await this.startCallbackServer();\r\n this.callbackServer = server;\r\n\r\n const redirectUri = `http://${LOCALHOST}:${port}/callback`;\r\n\r\n const authUrl = new URL(AUTHORIZE_URL);\r\n authUrl.searchParams.set(\"code\", \"true\");\r\n authUrl.searchParams.set(\"client_id\", CLIENT_ID);\r\n authUrl.searchParams.set(\"response_type\", \"code\");\r\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\r\n authUrl.searchParams.set(\"scope\", SCOPE);\r\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\r\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\r\n authUrl.searchParams.set(\"state\", state);\r\n\r\n logger.info(\"Opening browser for Claude OAuth login\");\r\n\r\n try {\r\n const openModule = await import(\"open\");\r\n await openModule.default(authUrl.toString());\r\n } catch {\r\n this.stopServer();\r\n throw new AuthenticationError(\"anthropic\", \"Failed to open browser for login\");\r\n }\r\n\r\n try {\r\n const code = await this.waitForCallback(state);\r\n const credential = await this.exchangeCodeForToken(code, codeVerifier, redirectUri, state);\r\n\r\n await this.credentialStore.set(\"anthropic\", credential);\r\n logger.info(\"Claude OAuth login successful\");\r\n\r\n return credential;\r\n } finally {\r\n this.stopServer();\r\n }\r\n }\r\n\r\n async logout(): Promise<void> {\r\n await this.credentialStore.delete(\"anthropic\");\r\n logger.info(\"Claude session revoked\");\r\n }\r\n\r\n async isLoggedIn(): Promise<boolean> {\r\n const credential = await this.getCachedCredential();\r\n return credential !== undefined;\r\n }\r\n\r\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\r\n const loggedIn = await this.isLoggedIn();\r\n if (!loggedIn) return { loggedIn: false };\r\n\r\n const credential = await this.credentialStore.get(\"anthropic\");\r\n if (!credential) return { loggedIn: false };\r\n\r\n return {\r\n loggedIn: true,\r\n ...(credential.email !== undefined ? { email: credential.email } : {}),\r\n ...(credential.plan !== undefined ? { plan: credential.plan } : {}),\r\n };\r\n }\r\n\r\n async getCachedCredential(): Promise<ICredential | undefined> {\r\n const existing = await this.credentialStore.get(\"anthropic\");\r\n if (existing?.method === \"native_login\" && existing.token) {\r\n const isExpired = existing.expiresAt ? new Date() > existing.expiresAt : false;\r\n if (!isExpired) {\r\n return existing;\r\n }\r\n }\r\n\r\n const keychain = await readKeychainCredential();\r\n if (!keychain?.token) {\r\n return undefined;\r\n }\r\n\r\n const isExpired = keychain.expiresAt ? new Date() > keychain.expiresAt : false;\r\n if (isExpired) {\r\n return undefined;\r\n }\r\n\r\n await this.credentialStore.set(\"anthropic\", keychain);\r\n return keychain;\r\n }\r\n\r\n // ── Internal ──────────────────────────────────────────────────────────\r\n\r\n private startCallbackServer(): Promise<{ port: number; server: Server }> {\r\n return new Promise((resolve, reject) => {\r\n const server = createServer();\r\n server.listen(0, LOCALHOST, () => {\r\n const address = server.address();\r\n if (address === null || typeof address === \"string\") {\r\n server.close();\r\n reject(new Error(\"Failed to bind callback server\"));\r\n return;\r\n }\r\n resolve({ port: address.port, server });\r\n });\r\n server.on(\"error\", reject);\r\n });\r\n }\r\n\r\n private waitForCallback(expectedState: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const server = this.callbackServer;\r\n if (server === undefined) {\r\n reject(new AuthenticationError(\"anthropic\", \"Callback server not started\"));\r\n return;\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n reject(new AuthenticationError(\"anthropic\", \"Login timed out\"));\r\n }, CALLBACK_TIMEOUT_MS);\r\n\r\n server.on(\"request\", (req: IncomingMessage, res: ServerResponse) => {\r\n const requestUrl = new URL(req.url ?? \"/\", `http://${LOCALHOST}`);\r\n if (requestUrl.pathname !== \"/callback\") {\r\n res.writeHead(404);\r\n res.end(\"Not found\");\r\n return;\r\n }\r\n\r\n clearTimeout(timeout);\r\n\r\n const code = requestUrl.searchParams.get(\"code\");\r\n const state = requestUrl.searchParams.get(\"state\");\r\n const error = requestUrl.searchParams.get(\"error\");\r\n\r\n if (error) {\r\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\r\n res.end(errorHtml(`OAuth error: ${error}`));\r\n reject(new AuthenticationError(\"anthropic\", `OAuth error: ${error}`));\r\n return;\r\n }\r\n\r\n if (state !== expectedState) {\r\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\r\n res.end(errorHtml(\"State mismatch\"));\r\n reject(new AuthenticationError(\"anthropic\", \"OAuth state mismatch\"));\r\n return;\r\n }\r\n\r\n if (!code) {\r\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\r\n res.end(errorHtml(\"Missing authorization code\"));\r\n reject(new AuthenticationError(\"anthropic\", \"No authorization code received\"));\r\n return;\r\n }\r\n\r\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\r\n res.end(successHtml());\r\n resolve(code);\r\n });\r\n });\r\n }\r\n\r\n private async exchangeCodeForToken(\r\n code: string,\r\n codeVerifier: string,\r\n redirectUri: string,\r\n state: string,\r\n ): Promise<ICredential> {\r\n const body = {\r\n grant_type: \"authorization_code\",\r\n code,\r\n redirect_uri: redirectUri,\r\n client_id: CLIENT_ID,\r\n code_verifier: codeVerifier,\r\n state,\r\n };\r\n\r\n const response = await fetch(TOKEN_URL, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n throw new AuthenticationError(\"anthropic\", `Token exchange failed: ${response.status} ${text}`);\r\n }\r\n\r\n const data = (await response.json()) as {\r\n access_token?: string;\r\n refresh_token?: string;\r\n expires_in?: number;\r\n email?: string;\r\n plan?: string;\r\n };\r\n\r\n if (!data.access_token) {\r\n throw new AuthenticationError(\"anthropic\", \"Token exchange returned no access_token\");\r\n }\r\n\r\n const expiresAt = data.expires_in\r\n ? new Date(Date.now() + data.expires_in * 1000)\r\n : undefined;\r\n\r\n return {\r\n provider: \"anthropic\",\r\n method: \"native_login\",\r\n token: data.access_token,\r\n ...(data.refresh_token !== undefined ? { refreshToken: data.refresh_token } : {}),\r\n ...(expiresAt !== undefined ? { expiresAt } : {}),\r\n ...(data.email !== undefined ? { email: data.email } : {}),\r\n ...(data.plan !== undefined ? { plan: data.plan } : {}),\r\n };\r\n }\r\n\r\n private stopServer(): void {\r\n if (this.callbackServer !== undefined) {\r\n this.callbackServer.close();\r\n this.callbackServer = undefined;\r\n }\r\n }\r\n}\r\n"]}
|