aemeathcli 1.0.10 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -54
  3. package/dist/App-JQ622M66.js +4431 -0
  4. package/dist/App-JQ622M66.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -0
  6. package/dist/agent-store/debugger.md +32 -0
  7. package/dist/agent-store/developer.md +29 -0
  8. package/dist/agent-store/documenter.md +30 -0
  9. package/dist/agent-store/researcher.md +31 -0
  10. package/dist/agent-store/reviewer.md +28 -0
  11. package/dist/agent-store/supervisor.md +37 -0
  12. package/dist/agent-store/tester.md +30 -0
  13. package/dist/api-key-fallback-RJLPM3KH.js +11 -0
  14. package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
  15. package/dist/auth-status-JQJOKUPF.js +13 -0
  16. package/dist/auth-status-JQJOKUPF.js.map +1 -0
  17. package/dist/{chunk-RWCNNAL7.js → chunk-2KMA5RBC.js} +25 -48
  18. package/dist/chunk-2KMA5RBC.js.map +1 -0
  19. package/dist/{chunk-CYQNBB25.js → chunk-2Y7TR6BS.js} +28 -5
  20. package/dist/chunk-2Y7TR6BS.js.map +1 -0
  21. package/dist/{chunk-DAHGLHNR.js → chunk-2ZYK5IJG.js} +6 -141
  22. package/dist/chunk-2ZYK5IJG.js.map +1 -0
  23. package/dist/chunk-36RXCZOV.js +88 -0
  24. package/dist/chunk-36RXCZOV.js.map +1 -0
  25. package/dist/{chunk-DMBPX3RG.js → chunk-7EBLXPL4.js} +9 -9
  26. package/dist/{chunk-DMBPX3RG.js.map → chunk-7EBLXPL4.js.map} +1 -1
  27. package/dist/chunk-BIMQL4AG.js +186 -0
  28. package/dist/chunk-BIMQL4AG.js.map +1 -0
  29. package/dist/{chunk-NBR3GHMT.js → chunk-D275MCIH.js} +39 -7
  30. package/dist/chunk-D275MCIH.js.map +1 -0
  31. package/dist/{chunk-Y5XVD2CD.js → chunk-FFS4T7BZ.js} +109 -82
  32. package/dist/chunk-FFS4T7BZ.js.map +1 -0
  33. package/dist/{chunk-CARHU3DO.js → chunk-GXAJGP2T.js} +64 -16
  34. package/dist/chunk-GXAJGP2T.js.map +1 -0
  35. package/dist/{chunk-I5PZ4JTS.js → chunk-HESQLCLU.js} +4 -4
  36. package/dist/{chunk-I5PZ4JTS.js.map → chunk-HESQLCLU.js.map} +1 -1
  37. package/dist/{chunk-JAXXTYID.js → chunk-IR5HLBMH.js} +2 -2
  38. package/dist/{chunk-JAXXTYID.js.map → chunk-IR5HLBMH.js.map} +1 -1
  39. package/dist/{chunk-MFBHNWGV.js → chunk-K2FCMRXH.js} +11 -19
  40. package/dist/chunk-K2FCMRXH.js.map +1 -0
  41. package/dist/{chunk-H66O5Z2V.js → chunk-KIC7UI5U.js} +41 -6
  42. package/dist/chunk-KIC7UI5U.js.map +1 -0
  43. package/dist/{chunk-MXZSI3AY.js → chunk-KMOAJRDE.js} +42 -10
  44. package/dist/chunk-KMOAJRDE.js.map +1 -0
  45. package/dist/chunk-LQBALETG.js +71 -0
  46. package/dist/chunk-LQBALETG.js.map +1 -0
  47. package/dist/chunk-M3FPQSRU.js +12 -0
  48. package/dist/chunk-M3FPQSRU.js.map +1 -0
  49. package/dist/chunk-NQEUK763.js +26 -0
  50. package/dist/chunk-NQEUK763.js.map +1 -0
  51. package/dist/chunk-OPWAFS6Y.js +38 -0
  52. package/dist/chunk-OPWAFS6Y.js.map +1 -0
  53. package/dist/{chunk-6PDJ45T4.js → chunk-PS4WEFW6.js} +50 -25
  54. package/dist/chunk-PS4WEFW6.js.map +1 -0
  55. package/dist/{chunk-HMJRPNPZ.js → chunk-QK7TKNHV.js} +93 -21
  56. package/dist/chunk-QK7TKNHV.js.map +1 -0
  57. package/dist/{chunk-LSOYPSAT.js → chunk-RADJSEG5.js} +4 -4
  58. package/dist/chunk-RADJSEG5.js.map +1 -0
  59. package/dist/{chunk-4IJD72YB.js → chunk-SNWPI6XJ.js} +7 -7
  60. package/dist/chunk-SNWPI6XJ.js.map +1 -0
  61. package/dist/{chunk-TEVZS4FA.js → chunk-UM7MSLOV.js} +16 -9
  62. package/dist/chunk-UM7MSLOV.js.map +1 -0
  63. package/dist/chunk-VNZ3YTQD.js +232 -0
  64. package/dist/chunk-VNZ3YTQD.js.map +1 -0
  65. package/dist/{chunk-IYW62KKR.js → chunk-WXIN65UG.js} +66 -23
  66. package/dist/chunk-WXIN65UG.js.map +1 -0
  67. package/dist/chunk-XEXWX7C7.js +241 -0
  68. package/dist/chunk-XEXWX7C7.js.map +1 -0
  69. package/dist/{chunk-CGEV3ARR.js → chunk-YCCYXDW7.js} +3 -3
  70. package/dist/chunk-YCCYXDW7.js.map +1 -0
  71. package/dist/chunk-YPQ2MLAV.js +140 -0
  72. package/dist/chunk-YPQ2MLAV.js.map +1 -0
  73. package/dist/chunk-ZCOVMVK4.js +26 -0
  74. package/dist/chunk-ZCOVMVK4.js.map +1 -0
  75. package/dist/{claude-login-5WELXPKT.js → claude-login-AIFIWTYF.js} +9 -9
  76. package/dist/{claude-login-5WELXPKT.js.map → claude-login-AIFIWTYF.js.map} +1 -1
  77. package/dist/cli.js +370 -171
  78. package/dist/cli.js.map +1 -1
  79. package/dist/{codex-login-GZIFXUWD.js → codex-login-LW5X7GAM.js} +10 -10
  80. package/dist/codex-login-LW5X7GAM.js.map +1 -0
  81. package/dist/config-store-NF56VHFU.js +7 -0
  82. package/dist/{config-store-W6FBCQAQ.js.map → config-store-NF56VHFU.js.map} +1 -1
  83. package/dist/conversation-store-7GRDQZD2.js +4 -0
  84. package/dist/conversation-store-7GRDQZD2.js.map +1 -0
  85. package/dist/detect-providers-QICJ5U3R.js +4 -0
  86. package/dist/detect-providers-QICJ5U3R.js.map +1 -0
  87. package/dist/executor-FTABX2AW.js +4 -0
  88. package/dist/{executor-6RIKIGXK.js.map → executor-FTABX2AW.js.map} +1 -1
  89. package/dist/first-run-ADROZVYF.js +230 -0
  90. package/dist/first-run-ADROZVYF.js.map +1 -0
  91. package/dist/{gemini-login-AZGL3CE7.js → gemini-login-TST454MX.js} +9 -9
  92. package/dist/{gemini-login-AZGL3CE7.js.map → gemini-login-TST454MX.js.map} +1 -1
  93. package/dist/index.d.ts +46 -70
  94. package/dist/index.js +79 -468
  95. package/dist/index.js.map +1 -1
  96. package/dist/input-history-BEICE7PT.js +57 -0
  97. package/dist/input-history-BEICE7PT.js.map +1 -0
  98. package/dist/kimi-adapter-7FYOAKOI.js +6 -0
  99. package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
  100. package/dist/{kimi-login-6LUWB7P6.js → kimi-login-3IGVOBJI.js} +9 -9
  101. package/dist/{kimi-login-6LUWB7P6.js.map → kimi-login-3IGVOBJI.js.map} +1 -1
  102. package/dist/logger-KGHUQ4VE.js +3 -0
  103. package/dist/logger-KGHUQ4VE.js.map +1 -0
  104. package/dist/model-discovery-AAJDHRFO.js +6 -0
  105. package/dist/model-discovery-AAJDHRFO.js.map +1 -0
  106. package/dist/native-cli-adapters-CLONTZOA.js +8 -0
  107. package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
  108. package/dist/ollama-adapter-2N5OQIEV.js +5 -0
  109. package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
  110. package/dist/pathResolver-UVAB2FCW.js +3 -0
  111. package/dist/pathResolver-UVAB2FCW.js.map +1 -0
  112. package/dist/profile-loader-EMLV4J7S.js +162 -0
  113. package/dist/profile-loader-EMLV4J7S.js.map +1 -0
  114. package/dist/registry-LRURZVUL.js +5 -0
  115. package/dist/{registry-AZ2LOHHJ.js.map → registry-LRURZVUL.js.map} +1 -1
  116. package/dist/registry-MVNSXCEF.js +6 -0
  117. package/dist/{registry-H7B3AHPQ.js.map → registry-MVNSXCEF.js.map} +1 -1
  118. package/dist/server-manager-THGZBBZB.js +5 -0
  119. package/dist/{server-manager-PTGBHCLS.js.map → server-manager-THGZBBZB.js.map} +1 -1
  120. package/dist/session-manager-X3DXT53M.js +12 -0
  121. package/dist/{session-manager-XOMDMC77.js.map → session-manager-X3DXT53M.js.map} +1 -1
  122. package/dist/skills/built-in/code-review/SKILL.md +85 -0
  123. package/dist/skills/built-in/commit/SKILL.md +83 -0
  124. package/dist/skills/built-in/debug/SKILL.md +119 -0
  125. package/dist/skills/built-in/plan/SKILL.md +123 -0
  126. package/dist/skills/built-in/refactor/SKILL.md +132 -0
  127. package/dist/skills/built-in/test/SKILL.md +128 -0
  128. package/dist/sqlite-store-7OECRTXM.js +5 -0
  129. package/dist/sqlite-store-7OECRTXM.js.map +1 -0
  130. package/dist/team-manager-2VSMALAA.js +11 -0
  131. package/dist/{team-manager-HC4XGCFY.js.map → team-manager-2VSMALAA.js.map} +1 -1
  132. package/dist/team-state-HZNVMQHT.js +3 -0
  133. package/dist/team-state-HZNVMQHT.js.map +1 -0
  134. package/dist/tmux-manager-57QCUVHU.js +6 -0
  135. package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
  136. package/dist/tools-KWFSYT56.js +6 -0
  137. package/dist/{tools-TSMXMHIF.js.map → tools-KWFSYT56.js.map} +1 -1
  138. package/package.json +11 -11
  139. package/dist/App-FKRSMFMB.js +0 -2789
  140. package/dist/App-FKRSMFMB.js.map +0 -1
  141. package/dist/api-key-fallback-YQQBOQIL.js +0 -11
  142. package/dist/chunk-4IJD72YB.js.map +0 -1
  143. package/dist/chunk-6PDJ45T4.js.map +0 -1
  144. package/dist/chunk-CARHU3DO.js.map +0 -1
  145. package/dist/chunk-CGEV3ARR.js.map +0 -1
  146. package/dist/chunk-CS5X3BWX.js +0 -27
  147. package/dist/chunk-CS5X3BWX.js.map +0 -1
  148. package/dist/chunk-CYQNBB25.js.map +0 -1
  149. package/dist/chunk-DAHGLHNR.js.map +0 -1
  150. package/dist/chunk-H66O5Z2V.js.map +0 -1
  151. package/dist/chunk-HMJRPNPZ.js.map +0 -1
  152. package/dist/chunk-IYW62KKR.js.map +0 -1
  153. package/dist/chunk-LSOYPSAT.js.map +0 -1
  154. package/dist/chunk-MFBHNWGV.js.map +0 -1
  155. package/dist/chunk-MXZSI3AY.js.map +0 -1
  156. package/dist/chunk-NBR3GHMT.js.map +0 -1
  157. package/dist/chunk-RWCNNAL7.js.map +0 -1
  158. package/dist/chunk-TEVZS4FA.js.map +0 -1
  159. package/dist/chunk-UY2SYSEZ.js +0 -211
  160. package/dist/chunk-UY2SYSEZ.js.map +0 -1
  161. package/dist/chunk-WAHVZH7V.js +0 -260
  162. package/dist/chunk-WAHVZH7V.js.map +0 -1
  163. package/dist/chunk-WPP3PEDE.js +0 -234
  164. package/dist/chunk-WPP3PEDE.js.map +0 -1
  165. package/dist/chunk-Y5XVD2CD.js.map +0 -1
  166. package/dist/claude-adapter-QMLFMSP3.js +0 -6
  167. package/dist/claude-adapter-QMLFMSP3.js.map +0 -1
  168. package/dist/codex-login-GZIFXUWD.js.map +0 -1
  169. package/dist/config-store-W6FBCQAQ.js +0 -6
  170. package/dist/executor-6RIKIGXK.js +0 -4
  171. package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
  172. package/dist/gemini-adapter-6JIHZ7WI.js.map +0 -1
  173. package/dist/kimi-adapter-JN4HFFHU.js +0 -6
  174. package/dist/native-cli-adapters-OLW3XX57.js +0 -6
  175. package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
  176. package/dist/openai-adapter-XU46EN7B.js +0 -6
  177. package/dist/openai-adapter-XU46EN7B.js.map +0 -1
  178. package/dist/registry-AZ2LOHHJ.js +0 -6
  179. package/dist/registry-H7B3AHPQ.js +0 -5
  180. package/dist/server-manager-PTGBHCLS.js +0 -5
  181. package/dist/session-manager-XOMDMC77.js +0 -12
  182. package/dist/team-manager-HC4XGCFY.js +0 -11
  183. package/dist/tmux-manager-GPYZ3WQH.js +0 -6
  184. package/dist/tools-TSMXMHIF.js +0 -6
@@ -1,234 +0,0 @@
1
- import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
- import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-ZGOHARPV.js';
3
- import { logger } from './chunk-JAXXTYID.js';
4
- import { generateText, streamText } from 'ai';
5
- import { createOpenAI } from '@ai-sdk/openai';
6
-
7
- var PROVIDER_NAME = "openai";
8
- var OPENAI_MODELS = [
9
- "gpt-5.3-codex",
10
- "gpt-5.3-codex-spark",
11
- "gpt-5.2-codex",
12
- "gpt-5.1-codex-max",
13
- "gpt-5.2",
14
- "gpt-5.1-codex-mini"
15
- ];
16
- var CHARS_PER_TOKEN_ESTIMATE = 4;
17
- function convertTools(tools) {
18
- if (tools === void 0 || tools.length === 0) {
19
- return void 0;
20
- }
21
- const result = {};
22
- for (const tool of tools) {
23
- const properties = {};
24
- const required = [];
25
- for (const param of tool.parameters) {
26
- const prop = {
27
- type: param.type,
28
- description: param.description
29
- };
30
- if (param.enum !== void 0) {
31
- prop["enum"] = param.enum;
32
- }
33
- if (param.default !== void 0) {
34
- prop["default"] = param.default;
35
- }
36
- properties[param.name] = prop;
37
- if (param.required) {
38
- required.push(param.name);
39
- }
40
- }
41
- result[tool.name] = {
42
- description: tool.description,
43
- parameters: {
44
- type: "object",
45
- properties,
46
- required
47
- }
48
- };
49
- }
50
- return result;
51
- }
52
- function buildMessages(messages) {
53
- return messages.map((msg) => ({
54
- role: msg.role,
55
- content: msg.content
56
- }));
57
- }
58
- function computeCost(modelInfo, inputTokens, outputTokens) {
59
- return inputTokens / 1e6 * modelInfo.inputPricePerMToken + outputTokens / 1e6 * modelInfo.outputPricePerMToken;
60
- }
61
- function classifyError(error, model) {
62
- const message = error instanceof Error ? error.message : String(error);
63
- const lower = message.toLowerCase();
64
- if (lower.includes("401") || lower.includes("unauthorized") || lower.includes("invalid api key")) {
65
- throw new AuthenticationError(PROVIDER_NAME, message);
66
- }
67
- if (lower.includes("429") || lower.includes("rate limit") || lower.includes("too many requests")) {
68
- const match = /(\d+)\s*s/i.exec(message);
69
- const retryMs = match?.[1] !== void 0 ? parseInt(match[1], 10) * 1e3 : 6e4;
70
- throw new RateLimitError(PROVIDER_NAME, retryMs);
71
- }
72
- if (lower.includes("model") && lower.includes("not found")) {
73
- throw new ModelNotFoundError(model);
74
- }
75
- throw error instanceof Error ? error : new Error(message);
76
- }
77
- var OpenAIAdapter = class {
78
- name = PROVIDER_NAME;
79
- supportedModels = OPENAI_MODELS;
80
- openai;
81
- apiKey;
82
- baseUrl;
83
- constructor(options) {
84
- this.apiKey = options?.apiKey ?? process.env["OPENAI_API_KEY"];
85
- this.baseUrl = options?.baseUrl;
86
- this.openai = createOpenAI({
87
- ...this.apiKey !== void 0 ? { apiKey: this.apiKey } : {},
88
- ...this.baseUrl !== void 0 ? { baseURL: this.baseUrl } : {}
89
- });
90
- }
91
- async chat(request) {
92
- const modelInfo = this.getModelInfo(request.model);
93
- const messages = buildMessages(request.messages);
94
- const tools = convertTools(request.tools);
95
- try {
96
- const result = await generateText({
97
- model: this.openai(request.model),
98
- messages,
99
- ...request.system !== void 0 ? { system: request.system } : {},
100
- tools,
101
- maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
102
- ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
103
- });
104
- const toolCalls = extractToolCalls(result);
105
- const inputTokens = result.usage?.promptTokens ?? 0;
106
- const outputTokens = result.usage?.completionTokens ?? 0;
107
- const usage = {
108
- inputTokens,
109
- outputTokens,
110
- totalTokens: inputTokens + outputTokens,
111
- costUsd: computeCost(modelInfo, inputTokens, outputTokens)
112
- };
113
- const responseMessage = {
114
- id: result.response?.id ?? crypto.randomUUID(),
115
- role: "assistant",
116
- content: result.text,
117
- model: request.model,
118
- provider: PROVIDER_NAME,
119
- toolCalls: toolCalls.length > 0 ? toolCalls : void 0,
120
- tokenUsage: usage,
121
- createdAt: /* @__PURE__ */ new Date()
122
- };
123
- return {
124
- id: result.response?.id ?? crypto.randomUUID(),
125
- model: request.model,
126
- provider: PROVIDER_NAME,
127
- message: responseMessage,
128
- usage,
129
- finishReason: mapFinishReason(result.finishReason)
130
- };
131
- } catch (error) {
132
- classifyError(error, request.model);
133
- }
134
- }
135
- async *stream(request) {
136
- const modelInfo = this.getModelInfo(request.model);
137
- const messages = buildMessages(request.messages);
138
- const tools = convertTools(request.tools);
139
- try {
140
- const result = streamText({
141
- model: this.openai(request.model),
142
- messages,
143
- ...request.system !== void 0 ? { system: request.system } : {},
144
- tools,
145
- maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
146
- ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
147
- });
148
- for await (const part of result.fullStream) {
149
- if (part.type === "text-delta") {
150
- yield { type: "text", content: part.textDelta };
151
- } else if (part.type === "tool-call") {
152
- const toolCall = {
153
- id: part.toolCallId,
154
- name: part.toolName,
155
- arguments: part.args
156
- };
157
- yield { type: "tool_call", toolCall };
158
- } else if (part.type === "finish") {
159
- const inputTokens = part.usage?.promptTokens ?? 0;
160
- const outputTokens = part.usage?.completionTokens ?? 0;
161
- const usage = {
162
- inputTokens,
163
- outputTokens,
164
- totalTokens: inputTokens + outputTokens,
165
- costUsd: computeCost(modelInfo, inputTokens, outputTokens)
166
- };
167
- yield { type: "usage", usage };
168
- } else if (part.type === "error") {
169
- const errMsg = part.error instanceof Error ? part.error.message : String(part.error);
170
- yield { type: "error", error: errMsg };
171
- }
172
- }
173
- yield { type: "done" };
174
- } catch (error) {
175
- const errMsg = error instanceof Error ? error.message : String(error);
176
- logger.error({ error: errMsg, model: request.model }, "OpenAI stream error");
177
- yield { type: "error", error: errMsg };
178
- yield { type: "done" };
179
- }
180
- }
181
- async countTokens(text, _model) {
182
- return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
183
- }
184
- getModelInfo(model) {
185
- const info = SUPPORTED_MODELS[model];
186
- if (info === void 0 || info.provider !== PROVIDER_NAME) {
187
- throw new ModelNotFoundError(model);
188
- }
189
- return info;
190
- }
191
- async listAvailableModels() {
192
- if (!this.apiKey) return [...this.supportedModels];
193
- try {
194
- const base = this.baseUrl ?? "https://api.openai.com/v1";
195
- const response = await fetch(`${base}/models`, {
196
- headers: { Authorization: `Bearer ${this.apiKey}` },
197
- signal: AbortSignal.timeout(5e3)
198
- });
199
- if (!response.ok) return [...this.supportedModels];
200
- const data = await response.json();
201
- const chatPrefixes = ["gpt-", "o1", "o3", "o4", "chatgpt-"];
202
- const models = data.data.map((m) => m.id).filter((id) => chatPrefixes.some((p) => id.startsWith(p))).sort();
203
- return models.length > 0 ? models : [...this.supportedModels];
204
- } catch {
205
- return [...this.supportedModels];
206
- }
207
- }
208
- };
209
- function extractToolCalls(result) {
210
- if (result.toolCalls === void 0 || result.toolCalls.length === 0) {
211
- return [];
212
- }
213
- return result.toolCalls.map((tc) => ({
214
- id: tc.toolCallId,
215
- name: tc.toolName,
216
- arguments: tc.args
217
- }));
218
- }
219
- function mapFinishReason(reason) {
220
- switch (reason) {
221
- case "stop":
222
- return "stop";
223
- case "tool-calls":
224
- return "tool_calls";
225
- case "length":
226
- return "max_tokens";
227
- default:
228
- return "stop";
229
- }
230
- }
231
-
232
- export { OpenAIAdapter };
233
- //# sourceMappingURL=chunk-WPP3PEDE.js.map
234
- //# sourceMappingURL=chunk-WPP3PEDE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers/openai-adapter.ts"],"names":[],"mappings":"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","file":"chunk-WPP3PEDE.js","sourcesContent":["/**\n * OpenAI adapter via Vercel AI SDK per PRD section 7.1\n * Supports GPT-5.3 Codex, GPT-5.2, GPT-5.1 Codex series\n */\n\nimport { generateText, streamText, type CoreMessage } from \"ai\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n AuthenticationError,\n RateLimitError,\n ModelNotFoundError,\n} from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\nimport type {\n IChatRequest,\n IChatResponse,\n IChatMessage,\n IStreamChunk,\n IToolCall,\n IToolDefinition,\n ITokenUsage,\n} from \"../types/message.js\";\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\n\nconst PROVIDER_NAME: ProviderName = \"openai\";\n\nconst OPENAI_MODELS: readonly string[] = [\n \"gpt-5.3-codex\",\n \"gpt-5.3-codex-spark\",\n \"gpt-5.2-codex\",\n \"gpt-5.1-codex-max\",\n \"gpt-5.2\",\n \"gpt-5.1-codex-mini\",\n] as const;\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\n\nfunction convertTools(\n tools: readonly IToolDefinition[] | undefined,\n): Record<string, { description: string; parameters: Record<string, unknown> }> | undefined {\n if (tools === undefined || tools.length === 0) {\n return undefined;\n }\n\n const result: Record<string, { description: string; parameters: Record<string, unknown> }> = {};\n\n for (const tool of tools) {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const param of tool.parameters) {\n const prop: Record<string, unknown> = {\n type: param.type,\n description: param.description,\n };\n if (param.enum !== undefined) {\n prop[\"enum\"] = param.enum;\n }\n if (param.default !== undefined) {\n prop[\"default\"] = param.default;\n }\n properties[param.name] = prop;\n if (param.required) {\n required.push(param.name);\n }\n }\n\n result[tool.name] = {\n description: tool.description,\n parameters: {\n type: \"object\",\n properties,\n required,\n },\n };\n }\n\n return result;\n}\n\nfunction buildMessages(\n messages: readonly IChatMessage[],\n): CoreMessage[] {\n return messages.map((msg) => ({\n role: msg.role as \"user\" | \"assistant\" | \"system\" | \"tool\",\n content: msg.content,\n })) as CoreMessage[];\n}\n\nfunction computeCost(modelInfo: IModelInfo, inputTokens: number, outputTokens: number): number {\n return (\n (inputTokens / 1_000_000) * modelInfo.inputPricePerMToken +\n (outputTokens / 1_000_000) * modelInfo.outputPricePerMToken\n );\n}\n\nfunction classifyError(error: unknown, model: string): never {\n const message = error instanceof Error ? error.message : String(error);\n const lower = message.toLowerCase();\n\n if (lower.includes(\"401\") || lower.includes(\"unauthorized\") || lower.includes(\"invalid api key\")) {\n throw new AuthenticationError(PROVIDER_NAME, message);\n }\n if (lower.includes(\"429\") || lower.includes(\"rate limit\") || lower.includes(\"too many requests\")) {\n const match = /(\\d+)\\s*s/i.exec(message);\n const retryMs = match?.[1] !== undefined ? parseInt(match[1], 10) * 1000 : 60_000;\n throw new RateLimitError(PROVIDER_NAME, retryMs);\n }\n if (lower.includes(\"model\") && lower.includes(\"not found\")) {\n throw new ModelNotFoundError(model);\n }\n\n throw error instanceof Error ? error : new Error(message);\n}\n\nexport class OpenAIAdapter implements IModelProvider {\n readonly name = PROVIDER_NAME;\n readonly supportedModels = OPENAI_MODELS;\n\n private readonly openai: ReturnType<typeof createOpenAI>;\n private readonly apiKey: string | undefined;\n private readonly baseUrl: string | undefined;\n\n constructor(options?: IProviderOptions) {\n this.apiKey = options?.apiKey ?? process.env[\"OPENAI_API_KEY\"];\n this.baseUrl = options?.baseUrl;\n this.openai = createOpenAI({\n ...(this.apiKey !== undefined ? { apiKey: this.apiKey } : {}),\n ...(this.baseUrl !== undefined ? { baseURL: this.baseUrl } : {}),\n });\n }\n\n async chat(request: IChatRequest): Promise<IChatResponse> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = buildMessages(request.messages);\n const tools = convertTools(request.tools);\n\n try {\n const result = await generateText({\n model: this.openai(request.model),\n messages,\n ...(request.system !== undefined ? { system: request.system } : {}),\n tools: tools as Record<string, never>,\n maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n });\n\n const toolCalls = extractToolCalls(result);\n const inputTokens = result.usage?.promptTokens ?? 0;\n const outputTokens = result.usage?.completionTokens ?? 0;\n\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n\n const responseMessage: IChatMessage = {\n id: result.response?.id ?? crypto.randomUUID(),\n role: \"assistant\",\n content: result.text,\n model: request.model,\n provider: PROVIDER_NAME,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n tokenUsage: usage,\n createdAt: new Date(),\n };\n\n return {\n id: result.response?.id ?? crypto.randomUUID(),\n model: request.model,\n provider: PROVIDER_NAME,\n message: responseMessage,\n usage,\n finishReason: mapFinishReason(result.finishReason),\n };\n } catch (error: unknown) {\n classifyError(error, request.model);\n }\n }\n\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\n const modelInfo = this.getModelInfo(request.model);\n const messages = buildMessages(request.messages);\n const tools = convertTools(request.tools);\n\n try {\n const result = streamText({\n model: this.openai(request.model),\n messages,\n ...(request.system !== undefined ? { system: request.system } : {}),\n tools: tools as Record<string, never>,\n maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n });\n\n for await (const part of result.fullStream) {\n if (part.type === \"text-delta\") {\n yield { type: \"text\", content: part.textDelta };\n } else if (part.type === \"tool-call\") {\n const toolCall: IToolCall = {\n id: part.toolCallId,\n name: part.toolName,\n arguments: part.args as Record<string, unknown>,\n };\n yield { type: \"tool_call\", toolCall };\n } else if (part.type === \"finish\") {\n const inputTokens = part.usage?.promptTokens ?? 0;\n const outputTokens = part.usage?.completionTokens ?? 0;\n const usage: ITokenUsage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n costUsd: computeCost(modelInfo, inputTokens, outputTokens),\n };\n yield { type: \"usage\", usage };\n } else if (part.type === \"error\") {\n const errMsg = part.error instanceof Error ? part.error.message : String(part.error);\n yield { type: \"error\", error: errMsg };\n }\n }\n\n yield { type: \"done\" };\n } catch (error: unknown) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error({ error: errMsg, model: request.model }, \"OpenAI stream error\");\n yield { type: \"error\", error: errMsg };\n yield { type: \"done\" };\n }\n }\n\n async countTokens(text: string, _model: string): Promise<number> {\n return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);\n }\n\n getModelInfo(model: string): IModelInfo {\n const info = SUPPORTED_MODELS[model];\n if (info === undefined || info.provider !== PROVIDER_NAME) {\n throw new ModelNotFoundError(model);\n }\n return info;\n }\n\n async listAvailableModels(): Promise<readonly string[]> {\n if (!this.apiKey) return [...this.supportedModels];\n\n try {\n const base = this.baseUrl ?? \"https://api.openai.com/v1\";\n const response = await fetch(`${base}/models`, {\n headers: { Authorization: `Bearer ${this.apiKey}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!response.ok) return [...this.supportedModels];\n\n const data = (await response.json()) as { data: Array<{ id: string }> };\n const chatPrefixes = [\"gpt-\", \"o1\", \"o3\", \"o4\", \"chatgpt-\"];\n const models = data.data\n .map((m) => m.id)\n .filter((id) => chatPrefixes.some((p) => id.startsWith(p)))\n .sort();\n return models.length > 0 ? models : [...this.supportedModels];\n } catch {\n return [...this.supportedModels];\n }\n }\n}\n\nfunction extractToolCalls(\n result: { toolCalls?: ReadonlyArray<{ toolCallId: string; toolName: string; args: unknown }> },\n): IToolCall[] {\n if (result.toolCalls === undefined || result.toolCalls.length === 0) {\n return [];\n }\n return result.toolCalls.map((tc) => ({\n id: tc.toolCallId,\n name: tc.toolName,\n arguments: tc.args as Record<string, unknown>,\n }));\n}\n\nfunction mapFinishReason(\n reason: string | undefined,\n): \"stop\" | \"tool_calls\" | \"max_tokens\" | \"error\" {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"tool-calls\":\n return \"tool_calls\";\n case \"length\":\n return \"max_tokens\";\n default:\n return \"stop\";\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/registry.ts","../src/tools/read.ts","../src/tools/write.ts","../src/tools/edit.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/bash.ts","../src/tools/web-search.ts","../src/tools/web-fetch.ts","../src/tools/git.ts","../src/tools/index.ts"],"names":["extname","projectRoot","stat","readFile","writeFile","resolve","MAX_OUTPUT_LENGTH","DEFAULT_TIMEOUT_MS","truncateOutput","workingDirectory","execaCommand"],"mappings":"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","file":"chunk-Y5XVD2CD.js","sourcesContent":["/**\n * Tool Registry — central registry for all built-in and MCP tools.\n * Per PRD sections 5.1, 14.4\n */\n\nimport type {\n IToolRegistry,\n IToolRegistration,\n IToolExecutionContext,\n ToolCategory,\n} from \"../types/tool.js\";\nimport type { IToolDefinition, IToolResult, IToolCall } from \"../types/message.js\";\nimport { PermissionDeniedError, ToolCallError } from \"../types/errors.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { redactSecrets } from \"../utils/sanitizer.js\";\n\nfunction redactToolArgs(args: Record<string, unknown>): Record<string, unknown> {\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(args)) {\n if (typeof value === \"string\" && (key === \"content\" || key === \"command\" || key === \"new_source\")) {\n redacted[key] = redactSecrets(value.length > 200 ? value.slice(0, 200) + \"...\" : value);\n } else if (typeof value === \"string\") {\n redacted[key] = redactSecrets(value);\n } else {\n redacted[key] = value;\n }\n }\n return redacted;\n}\n\nexport class ToolRegistry implements IToolRegistry {\n private readonly tools: Map<string, IToolRegistration> = new Map();\n private readonly categoryIndex: Map<ToolCategory, Set<string>> = new Map();\n\n register(tool: IToolRegistration): void {\n const name = tool.definition.name;\n if (this.tools.has(name)) {\n logger.warn({ toolName: name }, \"Overwriting existing tool registration\");\n }\n this.tools.set(name, tool);\n\n let categorySet = this.categoryIndex.get(tool.category);\n if (!categorySet) {\n categorySet = new Set();\n this.categoryIndex.set(tool.category, categorySet);\n }\n categorySet.add(name);\n\n logger.debug({ toolName: name, category: tool.category }, \"Tool registered\");\n }\n\n get(name: string): IToolRegistration | undefined {\n return this.tools.get(name);\n }\n\n getAll(): readonly IToolRegistration[] {\n return [...this.tools.values()];\n }\n\n getDefinitions(): readonly IToolDefinition[] {\n return [...this.tools.values()].map((t) => t.definition);\n }\n\n getByCategory(category: ToolCategory): readonly IToolRegistration[] {\n const names = this.categoryIndex.get(category);\n if (!names) {\n return [];\n }\n const results: IToolRegistration[] = [];\n for (const name of names) {\n const tool = this.tools.get(name);\n if (tool) {\n results.push(tool);\n }\n }\n return results;\n }\n\n async execute(\n call: IToolCall,\n context: IToolExecutionContext,\n ): Promise<IToolResult> {\n const tool = this.tools.get(call.name);\n if (!tool) {\n return {\n toolCallId: call.id,\n name: call.name,\n content: `Unknown tool: ${call.name}`,\n isError: true,\n };\n }\n\n if (tool.requiresApproval(context.permissionMode, call.arguments)) {\n return {\n toolCallId: call.id,\n name: call.name,\n content: `Tool \"${call.name}\" requires user approval in ${context.permissionMode} mode.`,\n isError: true,\n };\n }\n\n try {\n logger.debug({ toolName: call.name, args: redactToolArgs(call.arguments) }, \"Executing tool\");\n const result = await tool.execute(call.arguments);\n return {\n ...result,\n toolCallId: call.id,\n name: call.name,\n };\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : \"Unknown execution error\";\n logger.error({ toolName: call.name, error: message }, \"Tool execution failed\");\n return {\n toolCallId: call.id,\n name: call.name,\n content: message,\n isError: true,\n };\n }\n }\n}\n","/**\n * Read tool — file reading with line numbers, offset/limit, binary detection.\n * Per PRD section 5.1\n */\n\nimport { readFile, stat } from \"node:fs/promises\";\nimport { extname } from \"node:path\";\nimport type { IToolRegistration, PermissionMode } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { FileNotFoundError } from \"../types/errors.js\";\nimport { validatePath } from \"../utils/sanitizer.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB\nconst DEFAULT_LINE_LIMIT = 2000;\nconst MAX_LINE_LENGTH = 2000;\n\nconst BINARY_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".ico\", \".webp\", \".svg\",\n \".mp3\", \".mp4\", \".avi\", \".mov\", \".wav\", \".flac\",\n \".zip\", \".gz\", \".tar\", \".bz2\", \".7z\", \".rar\",\n \".exe\", \".dll\", \".so\", \".dylib\", \".o\", \".a\",\n \".pdf\", \".doc\", \".docx\", \".xls\", \".xlsx\",\n \".woff\", \".woff2\", \".ttf\", \".eot\", \".otf\",\n \".sqlite\", \".db\",\n]);\n\nfunction isBinaryFile(filePath: string, buffer: Buffer): boolean {\n if (BINARY_EXTENSIONS.has(extname(filePath).toLowerCase())) {\n return true;\n }\n // Check for null bytes in first 8KB\n const sample = buffer.subarray(0, 8192);\n for (let i = 0; i < sample.length; i++) {\n if (sample[i] === 0) {\n return true;\n }\n }\n return false;\n}\n\nfunction formatWithLineNumbers(\n content: string,\n offset: number,\n limit: number,\n): string {\n const allLines = content.split(\"\\n\");\n const startLine = Math.max(0, offset);\n const endLine = Math.min(allLines.length, startLine + limit);\n const sliced = allLines.slice(startLine, endLine);\n\n const maxLineNum = endLine;\n const padWidth = String(maxLineNum).length;\n\n return sliced\n .map((line, idx) => {\n const lineNum = String(startLine + idx + 1).padStart(padWidth, \" \");\n const truncated =\n line.length > MAX_LINE_LENGTH\n ? line.substring(0, MAX_LINE_LENGTH) + \"...\"\n : line;\n return `${lineNum}\\t${truncated}`;\n })\n .join(\"\\n\");\n}\n\nlet projectRoot = process.cwd();\n\nexport function setReadProjectRoot(root: string): void {\n projectRoot = root;\n}\n\nexport function createReadTool(): IToolRegistration {\n return {\n definition: {\n name: \"read\",\n description:\n \"Read a file from the filesystem with line numbers. Supports offset and limit for large files.\",\n parameters: [\n {\n name: \"file_path\",\n type: \"string\",\n description: \"Absolute path to the file to read\",\n required: true,\n },\n {\n name: \"offset\",\n type: \"number\",\n description: \"Line number to start reading from (0-indexed)\",\n required: false,\n default: 0,\n },\n {\n name: \"limit\",\n type: \"number\",\n description: \"Maximum number of lines to read\",\n required: false,\n default: DEFAULT_LINE_LIMIT,\n },\n ],\n },\n category: \"file\",\n requiresApproval: (_mode: PermissionMode, _args: Record<string, unknown>): boolean => {\n return false; // Read never requires approval\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const filePath = args[\"file_path\"];\n if (typeof filePath !== \"string\" || filePath.length === 0) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: \"file_path parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n let resolvedPath: string;\n try {\n resolvedPath = validatePath(filePath, projectRoot);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Path validation failed\";\n return { toolCallId: \"\", name: \"read\", content: msg, isError: true };\n }\n\n let fileStat;\n try {\n fileStat = await stat(resolvedPath);\n } catch {\n throw new FileNotFoundError(resolvedPath);\n }\n\n if (!fileStat.isFile()) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: `\"${resolvedPath}\" is not a regular file. Use Bash ls to list directories.`,\n isError: true,\n };\n }\n\n if (fileStat.size > MAX_FILE_SIZE) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: `File is too large (${(fileStat.size / 1024 / 1024).toFixed(1)} MB). Maximum is ${MAX_FILE_SIZE / 1024 / 1024} MB.`,\n isError: true,\n };\n }\n\n const rawBuffer = await readFile(resolvedPath);\n\n if (isBinaryFile(resolvedPath, rawBuffer)) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: `Binary file detected: ${resolvedPath} (${fileStat.size} bytes). Cannot display binary content.`,\n isError: false,\n };\n }\n\n const content = rawBuffer.toString(\"utf-8\");\n\n if (content.length === 0) {\n return {\n toolCallId: \"\",\n name: \"read\",\n content: `File \"${resolvedPath}\" exists but is empty.`,\n isError: false,\n };\n }\n\n const offset = typeof args[\"offset\"] === \"number\" ? args[\"offset\"] : 0;\n const limit = typeof args[\"limit\"] === \"number\" ? args[\"limit\"] : DEFAULT_LINE_LIMIT;\n\n const formatted = formatWithLineNumbers(content, offset, limit);\n logger.debug({ file: resolvedPath, offset, limit }, \"File read\");\n\n return {\n toolCallId: \"\",\n name: \"read\",\n content: formatted,\n isError: false,\n };\n },\n };\n}\n","/**\n * Write tool — write content to files, create parent dirs, set permissions.\n * Per PRD section 5.1\n */\n\nimport { writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { dirname, extname } from \"node:path\";\nimport type { IToolRegistration, PermissionMode } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { validatePath } from \"../utils/sanitizer.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst CONFIG_EXTENSIONS = new Set([\n \".env\", \".pem\", \".key\", \".crt\", \".p12\", \".pfx\", \".jks\",\n]);\n\nconst SENSITIVE_FILENAMES = new Set([\n \".env\", \".env.local\", \".env.production\", \".env.development\",\n \"credentials.json\", \"credentials.enc\", \"secrets.json\",\n \"id_rsa\", \"id_ed25519\", \"config.json\",\n]);\n\nfunction isConfigFile(filePath: string): boolean {\n const ext = extname(filePath).toLowerCase();\n const base = filePath.split(\"/\").pop() ?? \"\";\n return CONFIG_EXTENSIONS.has(ext) || SENSITIVE_FILENAMES.has(base);\n}\n\nlet projectRoot = process.cwd();\n\nexport function setWriteProjectRoot(root: string): void {\n projectRoot = root;\n}\n\nexport function createWriteTool(): IToolRegistration {\n return {\n definition: {\n name: \"write\",\n description:\n \"Write content to a file. Creates parent directories if needed. Overwrites existing files.\",\n parameters: [\n {\n name: \"file_path\",\n type: \"string\",\n description: \"Absolute path to the file to write\",\n required: true,\n },\n {\n name: \"content\",\n type: \"string\",\n description: \"The content to write to the file\",\n required: true,\n },\n ],\n },\n category: \"file\",\n requiresApproval: (mode: PermissionMode, _args: Record<string, unknown>): boolean => {\n // Write always requires approval in strict and standard modes\n return mode === \"strict\" || mode === \"standard\";\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const filePath = args[\"file_path\"];\n const content = args[\"content\"];\n\n if (typeof filePath !== \"string\" || filePath.length === 0) {\n return {\n toolCallId: \"\",\n name: \"write\",\n content: \"file_path parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n if (typeof content !== \"string\") {\n return {\n toolCallId: \"\",\n name: \"write\",\n content: \"content parameter is required and must be a string.\",\n isError: true,\n };\n }\n\n let resolvedPath: string;\n try {\n resolvedPath = validatePath(filePath, projectRoot);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Path validation failed\";\n return { toolCallId: \"\", name: \"write\", content: msg, isError: true };\n }\n\n const parentDir = dirname(resolvedPath);\n try {\n await mkdir(parentDir, { recursive: true });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Failed to create directory\";\n return {\n toolCallId: \"\",\n name: \"write\",\n content: `Failed to create parent directory: ${msg}`,\n isError: true,\n };\n }\n\n const fileMode = isConfigFile(resolvedPath) ? 0o600 : 0o644;\n\n let existed = false;\n try {\n const fileStat = await stat(resolvedPath);\n existed = fileStat.isFile();\n } catch {\n // File does not exist — will be created\n }\n\n try {\n await writeFile(resolvedPath, content, { encoding: \"utf-8\", mode: fileMode });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Write failed\";\n return {\n toolCallId: \"\",\n name: \"write\",\n content: `Failed to write file: ${msg}`,\n isError: true,\n };\n }\n\n const lineCount = content.split(\"\\n\").length;\n const action = existed ? \"Updated\" : \"Created\";\n\n logger.debug(\n { file: resolvedPath, lines: lineCount, mode: fileMode.toString(8) },\n `File ${action.toLowerCase()}`,\n );\n\n return {\n toolCallId: \"\",\n name: \"write\",\n content: `${action} ${resolvedPath} (${lineCount} lines)`,\n isError: false,\n };\n },\n };\n}\n","/**\n * Edit tool — exact string replacement with uniqueness validation.\n * Per PRD section 5.1\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { stat } from \"node:fs/promises\";\nimport type { IToolRegistration, PermissionMode } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { FileNotFoundError } from \"../types/errors.js\";\nimport { validatePath } from \"../utils/sanitizer.js\";\nimport { logger } from \"../utils/logger.js\";\n\nlet projectRoot = process.cwd();\n\nexport function setEditProjectRoot(root: string): void {\n projectRoot = root;\n}\n\nexport function createEditTool(): IToolRegistration {\n return {\n definition: {\n name: \"edit\",\n description:\n \"Perform exact string replacement in a file. The old_string must be unique unless replace_all is true.\",\n parameters: [\n {\n name: \"file_path\",\n type: \"string\",\n description: \"Absolute path to the file to edit\",\n required: true,\n },\n {\n name: \"old_string\",\n type: \"string\",\n description: \"The exact text to find and replace\",\n required: true,\n },\n {\n name: \"new_string\",\n type: \"string\",\n description: \"The replacement text\",\n required: true,\n },\n {\n name: \"replace_all\",\n type: \"boolean\",\n description: \"Replace all occurrences instead of requiring uniqueness\",\n required: false,\n default: false,\n },\n ],\n },\n category: \"file\",\n requiresApproval: (mode: PermissionMode, _args: Record<string, unknown>): boolean => {\n return mode === \"strict\" || mode === \"standard\";\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const filePath = args[\"file_path\"];\n const oldString = args[\"old_string\"];\n const newString = args[\"new_string\"];\n const replaceAll = args[\"replace_all\"] === true;\n\n if (typeof filePath !== \"string\" || filePath.length === 0) {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: \"file_path parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n if (typeof oldString !== \"string\") {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: \"old_string parameter is required and must be a string.\",\n isError: true,\n };\n }\n\n if (typeof newString !== \"string\") {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: \"new_string parameter is required and must be a string.\",\n isError: true,\n };\n }\n\n if (oldString === newString) {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: \"old_string and new_string are identical — no edit needed.\",\n isError: true,\n };\n }\n\n let resolvedPath: string;\n try {\n resolvedPath = validatePath(filePath, projectRoot);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Path validation failed\";\n return { toolCallId: \"\", name: \"edit\", content: msg, isError: true };\n }\n\n try {\n const fileStat = await stat(resolvedPath);\n if (!fileStat.isFile()) {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: `\"${resolvedPath}\" is not a regular file.`,\n isError: true,\n };\n }\n } catch {\n throw new FileNotFoundError(resolvedPath);\n }\n\n const rawBuffer = await readFile(resolvedPath);\n const originalContent = rawBuffer.toString(\"utf-8\");\n\n if (!originalContent.includes(oldString)) {\n return {\n toolCallId: \"\",\n name: \"edit\",\n content:\n `old_string not found in ${resolvedPath}. Ensure it matches the file content exactly, including whitespace and indentation.`,\n isError: true,\n };\n }\n\n if (!replaceAll) {\n const firstIdx = originalContent.indexOf(oldString);\n const secondIdx = originalContent.indexOf(oldString, firstIdx + 1);\n if (secondIdx !== -1) {\n const occurrences = originalContent.split(oldString).length - 1;\n return {\n toolCallId: \"\",\n name: \"edit\",\n content:\n `old_string is not unique — found ${occurrences} occurrences in ${resolvedPath}. ` +\n `Provide more surrounding context to make it unique, or set replace_all to true.`,\n isError: true,\n };\n }\n }\n\n let newContent: string;\n let replacementCount: number;\n\n if (replaceAll) {\n replacementCount = originalContent.split(oldString).length - 1;\n newContent = originalContent.split(oldString).join(newString);\n } else {\n replacementCount = 1;\n const idx = originalContent.indexOf(oldString);\n newContent =\n originalContent.substring(0, idx) +\n newString +\n originalContent.substring(idx + oldString.length);\n }\n\n await writeFile(resolvedPath, newContent, \"utf-8\");\n\n logger.debug(\n { file: resolvedPath, replacements: replacementCount },\n \"File edited\",\n );\n\n return {\n toolCallId: \"\",\n name: \"edit\",\n content: `Edited ${resolvedPath}: ${replacementCount} replacement(s) made.`,\n isError: false,\n };\n },\n };\n}\n","/**\n * Glob tool — fast file pattern matching sorted by modification time.\n * Per PRD section 5.1\n */\n\nimport fg from \"fast-glob\";\nimport { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { IToolRegistration, PermissionMode } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { validatePath } from \"../utils/sanitizer.js\";\n\nconst MAX_RESULTS = 1000;\n\ninterface FileEntry {\n readonly path: string;\n readonly mtimeMs: number;\n}\n\nlet projectRoot = process.cwd();\n\nexport function setGlobProjectRoot(root: string): void {\n projectRoot = root;\n}\n\nexport function createGlobTool(): IToolRegistration {\n return {\n definition: {\n name: \"glob\",\n description:\n \"Find files matching a glob pattern. Results are sorted by modification time (newest first).\",\n parameters: [\n {\n name: \"pattern\",\n type: \"string\",\n description: 'Glob pattern to match (e.g. \"**/*.ts\", \"src/**/*.tsx\")',\n required: true,\n },\n {\n name: \"path\",\n type: \"string\",\n description: \"Directory to search in. Defaults to project root.\",\n required: false,\n },\n ],\n },\n category: \"search\",\n requiresApproval: (_mode: PermissionMode, _args: Record<string, unknown>): boolean => {\n return false; // Glob never requires approval\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const pattern = args[\"pattern\"];\n if (typeof pattern !== \"string\" || pattern.length === 0) {\n return {\n toolCallId: \"\",\n name: \"glob\",\n content: \"pattern parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n let searchPath: string;\n if (typeof args[\"path\"] === \"string\" && args[\"path\"].length > 0) {\n const resolved = resolve(projectRoot, args[\"path\"]);\n searchPath = validatePath(resolved, projectRoot);\n } else {\n searchPath = projectRoot;\n }\n\n let matchedPaths: string[];\n try {\n matchedPaths = await fg(pattern, {\n cwd: searchPath,\n absolute: true,\n dot: false,\n onlyFiles: true,\n ignore: [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.next/**\",\n \"**/coverage/**\",\n ],\n });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Glob search failed\";\n return { toolCallId: \"\", name: \"glob\", content: msg, isError: true };\n }\n\n if (matchedPaths.length === 0) {\n return {\n toolCallId: \"\",\n name: \"glob\",\n content: \"No files found\",\n isError: false,\n };\n }\n\n // Sort by modification time — newest first\n const entries: FileEntry[] = [];\n for (const filePath of matchedPaths) {\n try {\n const fileStat = await stat(filePath);\n entries.push({ path: filePath, mtimeMs: fileStat.mtimeMs });\n } catch {\n // Skip files we can't stat\n }\n }\n\n entries.sort((a, b) => b.mtimeMs - a.mtimeMs);\n\n const truncated = entries.length > MAX_RESULTS;\n const resultEntries = truncated ? entries.slice(0, MAX_RESULTS) : entries;\n const output = resultEntries.map((e) => e.path).join(\"\\n\");\n\n logger.debug(\n { pattern, searchPath, total: entries.length, returned: resultEntries.length },\n \"Glob search complete\",\n );\n\n const suffix = truncated\n ? `\\n\\n(Showing ${MAX_RESULTS} of ${entries.length} matches)`\n : \"\";\n\n return {\n toolCallId: \"\",\n name: \"glob\",\n content: output + suffix,\n isError: false,\n };\n },\n };\n}\n","/**\n * Grep tool — content search using ripgrep with grep fallback.\n * Per PRD section 5.1\n */\n\nimport { execFile } from \"node:child_process\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { IToolRegistration, PermissionMode } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { validatePath } from \"../utils/sanitizer.js\";\n\nconst execFileAsync = promisify(execFile);\n\nconst MAX_OUTPUT_LENGTH = 30_000;\nconst DEFAULT_HEAD_LIMIT = 0; // unlimited\n\ntype OutputMode = \"content\" | \"files_with_matches\" | \"count\";\n\nasync function findSearchBinary(): Promise<string> {\n try {\n await execFileAsync(\"which\", [\"rg\"]);\n return \"rg\";\n } catch {\n return \"grep\";\n }\n}\n\nfunction buildRipgrepArgs(\n pattern: string,\n searchPath: string,\n outputMode: OutputMode,\n opts: {\n readonly glob?: string | undefined;\n readonly fileType?: string | undefined;\n readonly contextLines?: number | undefined;\n readonly beforeContext?: number | undefined;\n readonly afterContext?: number | undefined;\n readonly caseInsensitive?: boolean | undefined;\n readonly multiline?: boolean | undefined;\n readonly lineNumbers?: boolean | undefined;\n readonly headLimit?: number | undefined;\n },\n): string[] {\n const args: string[] = [];\n\n if (outputMode === \"files_with_matches\") {\n args.push(\"--files-with-matches\");\n } else if (outputMode === \"count\") {\n args.push(\"--count\");\n }\n\n if (opts.caseInsensitive === true) {\n args.push(\"-i\");\n }\n\n if (opts.multiline === true) {\n args.push(\"-U\", \"--multiline-dotall\");\n }\n\n if (outputMode === \"content\") {\n if (opts.lineNumbers !== false) {\n args.push(\"-n\");\n }\n if (typeof opts.contextLines === \"number\" && opts.contextLines > 0) {\n args.push(\"-C\", String(opts.contextLines));\n } else {\n if (typeof opts.beforeContext === \"number\" && opts.beforeContext > 0) {\n args.push(\"-B\", String(opts.beforeContext));\n }\n if (typeof opts.afterContext === \"number\" && opts.afterContext > 0) {\n args.push(\"-A\", String(opts.afterContext));\n }\n }\n }\n\n if (typeof opts.glob === \"string\" && opts.glob.length > 0) {\n args.push(\"--glob\", opts.glob);\n }\n\n if (typeof opts.fileType === \"string\" && opts.fileType.length > 0) {\n args.push(\"--type\", opts.fileType);\n }\n\n // Always skip common uninteresting directories\n args.push(\n \"--glob\", \"!node_modules\",\n \"--glob\", \"!.git\",\n \"--glob\", \"!dist\",\n \"--glob\", \"!build\",\n \"--glob\", \"!coverage\",\n );\n\n args.push(\"--\", pattern, searchPath);\n\n return args;\n}\n\nfunction buildGrepArgs(\n pattern: string,\n searchPath: string,\n outputMode: OutputMode,\n opts: {\n readonly caseInsensitive?: boolean | undefined;\n readonly contextLines?: number | undefined;\n },\n): string[] {\n const args: string[] = [\"-r\", \"--extended-regexp\"];\n\n if (outputMode === \"files_with_matches\") {\n args.push(\"-l\");\n } else if (outputMode === \"count\") {\n args.push(\"-c\");\n }\n\n if (opts.caseInsensitive === true) {\n args.push(\"-i\");\n }\n\n if (outputMode === \"content\" && typeof opts.contextLines === \"number\" && opts.contextLines > 0) {\n args.push(\"-C\", String(opts.contextLines));\n }\n\n args.push(\n \"--exclude-dir=node_modules\",\n \"--exclude-dir=.git\",\n \"--exclude-dir=dist\",\n \"--exclude-dir=build\",\n );\n\n args.push(\"--\", pattern, searchPath);\n\n return args;\n}\n\nfunction applyLimits(\n output: string,\n headLimit: number,\n offset: number,\n): string {\n let lines = output.split(\"\\n\");\n\n if (offset > 0) {\n lines = lines.slice(offset);\n }\n\n if (headLimit > 0) {\n lines = lines.slice(0, headLimit);\n }\n\n let result = lines.join(\"\\n\");\n\n if (result.length > MAX_OUTPUT_LENGTH) {\n result = result.substring(0, MAX_OUTPUT_LENGTH) + \"\\n...(truncated)\";\n }\n\n return result;\n}\n\nlet projectRoot = process.cwd();\n\nexport function setGrepProjectRoot(root: string): void {\n projectRoot = root;\n}\n\nexport function createGrepTool(): IToolRegistration {\n return {\n definition: {\n name: \"grep\",\n description:\n \"Search file contents using regex patterns. Uses ripgrep (rg) with grep fallback.\",\n parameters: [\n {\n name: \"pattern\",\n type: \"string\",\n description: \"Regular expression pattern to search for\",\n required: true,\n },\n {\n name: \"path\",\n type: \"string\",\n description: \"File or directory to search in. Defaults to project root.\",\n required: false,\n },\n {\n name: \"output_mode\",\n type: \"string\",\n description: \"Output mode: content, files_with_matches, or count\",\n required: false,\n default: \"files_with_matches\",\n enum: [\"content\", \"files_with_matches\", \"count\"],\n },\n {\n name: \"glob\",\n type: \"string\",\n description: 'Glob filter for files (e.g. \"*.ts\")',\n required: false,\n },\n {\n name: \"type\",\n type: \"string\",\n description: 'File type filter (e.g. \"ts\", \"py\")',\n required: false,\n },\n {\n name: \"context\",\n type: \"number\",\n description: \"Lines of context around matches\",\n required: false,\n },\n {\n name: \"-B\",\n type: \"number\",\n description: \"Lines of context before matches\",\n required: false,\n },\n {\n name: \"-A\",\n type: \"number\",\n description: \"Lines of context after matches\",\n required: false,\n },\n {\n name: \"-i\",\n type: \"boolean\",\n description: \"Case insensitive search\",\n required: false,\n default: false,\n },\n {\n name: \"multiline\",\n type: \"boolean\",\n description: \"Enable multiline matching\",\n required: false,\n default: false,\n },\n {\n name: \"head_limit\",\n type: \"number\",\n description: \"Limit output to first N entries\",\n required: false,\n default: 0,\n },\n {\n name: \"offset\",\n type: \"number\",\n description: \"Skip first N entries\",\n required: false,\n default: 0,\n },\n ],\n },\n category: \"search\",\n requiresApproval: (_mode: PermissionMode, _args: Record<string, unknown>): boolean => {\n return false;\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const pattern = args[\"pattern\"];\n if (typeof pattern !== \"string\" || pattern.length === 0) {\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: \"pattern parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n let searchPath: string;\n if (typeof args[\"path\"] === \"string\" && args[\"path\"].length > 0) {\n const resolved = resolve(projectRoot, args[\"path\"]);\n searchPath = validatePath(resolved, projectRoot);\n } else {\n searchPath = projectRoot;\n }\n\n const outputMode: OutputMode =\n args[\"output_mode\"] === \"content\" || args[\"output_mode\"] === \"count\"\n ? args[\"output_mode\"]\n : \"files_with_matches\";\n\n const headLimit =\n typeof args[\"head_limit\"] === \"number\" ? args[\"head_limit\"] : DEFAULT_HEAD_LIMIT;\n const offset = typeof args[\"offset\"] === \"number\" ? args[\"offset\"] : 0;\n\n const binary = await findSearchBinary();\n\n const searchArgs =\n binary === \"rg\"\n ? buildRipgrepArgs(pattern, searchPath, outputMode, {\n glob: typeof args[\"glob\"] === \"string\" ? args[\"glob\"] : undefined,\n fileType: typeof args[\"type\"] === \"string\" ? args[\"type\"] : undefined,\n contextLines: typeof args[\"context\"] === \"number\" ? args[\"context\"] : undefined,\n beforeContext: typeof args[\"-B\"] === \"number\" ? args[\"-B\"] : undefined,\n afterContext: typeof args[\"-A\"] === \"number\" ? args[\"-A\"] : undefined,\n caseInsensitive: args[\"-i\"] === true,\n multiline: args[\"multiline\"] === true,\n lineNumbers: true,\n headLimit,\n })\n : buildGrepArgs(pattern, searchPath, outputMode, {\n caseInsensitive: args[\"-i\"] === true,\n contextLines: typeof args[\"context\"] === \"number\" ? args[\"context\"] : undefined,\n });\n\n try {\n const { stdout } = await execFileAsync(binary, searchArgs, {\n maxBuffer: 10 * 1024 * 1024,\n timeout: 30_000,\n });\n\n const result = applyLimits(stdout.trim(), headLimit, offset);\n\n if (result.length === 0) {\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: \"No matches found.\",\n isError: false,\n };\n }\n\n logger.debug({ binary, pattern, outputMode, matches: result.split(\"\\n\").length }, \"Grep complete\");\n\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: result,\n isError: false,\n };\n } catch (err: unknown) {\n // Exit code 1 = no matches (for both rg and grep)\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"1\") {\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: \"No matches found.\",\n isError: false,\n };\n }\n\n // ripgrep and grep return exit code 1 for no matches\n const execError = err as { status?: number; stdout?: string };\n if (execError.status === 1) {\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: \"No matches found.\",\n isError: false,\n };\n }\n\n const msg = err instanceof Error ? err.message : \"Search failed\";\n logger.error({ binary, pattern, error: msg }, \"Grep failed\");\n\n return {\n toolCallId: \"\",\n name: \"grep\",\n content: `Search failed: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Bash tool — shell command execution with timeout, blocklist, and sanitization.\n * Per PRD sections 5.1, 14.4\n */\n\nimport { execaCommand } from \"execa\";\nimport type { IToolRegistration, PermissionMode } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { ExecutionTimeoutError } from \"../types/errors.js\";\nimport { isCommandBlocked, sanitizeShellArg, redactSecrets } from \"../utils/sanitizer.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst DEFAULT_TIMEOUT_MS = 120_000; // 2 minutes\nconst MAX_TIMEOUT_MS = 600_000; // 10 minutes\nconst MAX_OUTPUT_LENGTH = 30_000;\n\nconst DANGEROUS_PATTERNS: readonly string[] = [\n \"rm -rf /\",\n \"rm -rf ~\",\n \"mkfs\",\n \"dd if=\",\n \"> /dev/sd\",\n \"chmod -R 777 /\",\n \":(){ :|:& };:\",\n \"fork bomb\",\n \"shutdown\",\n \"reboot\",\n \"init 0\",\n \"init 6\",\n];\n\nconst ALWAYS_DANGEROUS_COMMANDS: readonly string[] = [\n \"push --force\",\n \"push -f\",\n \"reset --hard\",\n \"clean -fd\",\n \"branch -D\",\n \"rm -rf\",\n \"drop table\",\n \"drop database\",\n \"truncate table\",\n];\n\nconst SENSITIVE_ENV_PATTERNS: readonly string[] = [\n \"API_KEY\",\n \"SECRET\",\n \"TOKEN\",\n \"PASSWORD\",\n \"CREDENTIAL\",\n \"ANTHROPIC_API\",\n \"OPENAI_API\",\n \"GOOGLE_API\",\n \"MOONSHOT_API\",\n \"KIMI_API\",\n \"SESSION_TOKEN\",\n \"REFRESH_TOKEN\",\n \"ACCESS_TOKEN\",\n \"PRIVATE_KEY\",\n];\n\nfunction filterSensitiveEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const filtered: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(env)) {\n const upperKey = key.toUpperCase();\n const isSensitive = SENSITIVE_ENV_PATTERNS.some((pattern) => upperKey.includes(pattern));\n if (!isSensitive) {\n filtered[key] = value;\n }\n }\n return filtered;\n}\n\nfunction isDangerousCommand(command: string): boolean {\n const lowerCommand = command.toLowerCase().trim();\n return DANGEROUS_PATTERNS.some((p) => lowerCommand.includes(p)) ||\n ALWAYS_DANGEROUS_COMMANDS.some((p) => lowerCommand.includes(p.toLowerCase()));\n}\n\nfunction truncateOutput(output: string): string {\n if (output.length <= MAX_OUTPUT_LENGTH) {\n return output;\n }\n return output.substring(0, MAX_OUTPUT_LENGTH) + \"\\n...(truncated)\";\n}\n\nlet workingDirectory = process.cwd();\nlet blockedCommands: readonly string[] = [];\n\nexport function setBashWorkingDirectory(dir: string): void {\n workingDirectory = dir;\n}\n\nexport function setBashBlockedCommands(commands: readonly string[]): void {\n blockedCommands = commands;\n}\n\nexport function createBashTool(): IToolRegistration {\n return {\n definition: {\n name: \"bash\",\n description:\n \"Execute a shell command. Supports timeout. Dangerous commands require approval.\",\n parameters: [\n {\n name: \"command\",\n type: \"string\",\n description: \"The shell command to execute\",\n required: true,\n },\n {\n name: \"description\",\n type: \"string\",\n description: \"Short description of what this command does\",\n required: false,\n },\n {\n name: \"timeout\",\n type: \"number\",\n description: \"Timeout in milliseconds (max 600000)\",\n required: false,\n default: DEFAULT_TIMEOUT_MS,\n },\n ],\n },\n category: \"shell\",\n requiresApproval: (mode: PermissionMode, args: Record<string, unknown>): boolean => {\n const command = typeof args[\"command\"] === \"string\" ? args[\"command\"] : \"\";\n\n // Dangerous commands always require approval\n if (isDangerousCommand(command) || isCommandBlocked(command, blockedCommands)) {\n return true;\n }\n\n // Strict mode: all shell commands require approval\n if (mode === \"strict\") {\n return true;\n }\n\n return false;\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const command = args[\"command\"];\n if (typeof command !== \"string\" || command.length === 0) {\n return {\n toolCallId: \"\",\n name: \"bash\",\n content: \"command parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n // Block extremely dangerous patterns\n const lowerCommand = command.toLowerCase().trim();\n for (const pattern of DANGEROUS_PATTERNS) {\n if (lowerCommand.includes(pattern)) {\n return {\n toolCallId: \"\",\n name: \"bash\",\n content: `Blocked: command matches dangerous pattern \"${pattern}\".`,\n isError: true,\n };\n }\n }\n\n if (isCommandBlocked(command, blockedCommands)) {\n return {\n toolCallId: \"\",\n name: \"bash\",\n content: \"Command is on the blocked list and cannot be executed.\",\n isError: true,\n };\n }\n\n let timeoutMs = DEFAULT_TIMEOUT_MS;\n if (typeof args[\"timeout\"] === \"number\") {\n timeoutMs = Math.max(1000, Math.min(args[\"timeout\"], MAX_TIMEOUT_MS));\n }\n\n logger.debug({ command: redactSecrets(command), timeout: timeoutMs, cwd: workingDirectory }, \"Executing bash command\");\n\n try {\n const result = await execaCommand(command, {\n cwd: workingDirectory,\n timeout: timeoutMs,\n reject: false,\n shell: true,\n env: {\n ...filterSensitiveEnv(process.env),\n TERM: \"dumb\",\n NO_COLOR: \"1\",\n },\n stripFinalNewline: true,\n });\n\n const stdout = result.stdout ? truncateOutput(result.stdout) : \"\";\n const stderr = result.stderr ? truncateOutput(result.stderr) : \"\";\n\n let content = \"\";\n if (stdout.length > 0) {\n content += stdout;\n }\n if (stderr.length > 0) {\n content += (content.length > 0 ? \"\\n\\nSTDERR:\\n\" : \"STDERR:\\n\") + stderr;\n }\n if (content.length === 0) {\n content = `Command completed with exit code ${result.exitCode ?? 0}.`;\n }\n\n const isError = (result.exitCode ?? 0) !== 0;\n\n if (isError) {\n content = `Exit code: ${result.exitCode ?? \"unknown\"}\\n${content}`;\n }\n\n return {\n toolCallId: \"\",\n name: \"bash\",\n content,\n isError,\n };\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes(\"timed out\")) {\n throw new ExecutionTimeoutError(command, timeoutMs);\n }\n\n const msg = err instanceof Error ? err.message : \"Command execution failed\";\n logger.error({ command: redactSecrets(command), error: msg }, \"Bash execution failed\");\n\n return {\n toolCallId: \"\",\n name: \"bash\",\n content: `Execution failed: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Web Search tool — search interface (provider-dependent implementation).\n * Per PRD section 5.1\n */\n\nimport type { IToolRegistration, PermissionMode } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\n\ntype WebSearchProvider = (\n query: string,\n options: { readonly allowedDomains?: readonly string[] | undefined; readonly blockedDomains?: readonly string[] | undefined },\n) => Promise<string>;\n\nlet searchProvider: WebSearchProvider | undefined;\n\nexport function setWebSearchProvider(provider: WebSearchProvider): void {\n searchProvider = provider;\n}\n\nexport function createWebSearchTool(): IToolRegistration {\n return {\n definition: {\n name: \"web_search\",\n description:\n \"Search the web for up-to-date information. Requires a configured search provider.\",\n parameters: [\n {\n name: \"query\",\n type: \"string\",\n description: \"The search query\",\n required: true,\n },\n {\n name: \"allowed_domains\",\n type: \"array\",\n description: \"Only include results from these domains\",\n required: false,\n },\n {\n name: \"blocked_domains\",\n type: \"array\",\n description: \"Exclude results from these domains\",\n required: false,\n },\n ],\n },\n category: \"web\",\n requiresApproval: (_mode: PermissionMode, _args: Record<string, unknown>): boolean => {\n return false;\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const query = args[\"query\"];\n if (typeof query !== \"string\" || query.length === 0) {\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content: \"query parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n if (!searchProvider) {\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content:\n \"Web search is not configured. Set up a search provider in your configuration.\",\n isError: true,\n };\n }\n\n const allowedDomains = Array.isArray(args[\"allowed_domains\"])\n ? (args[\"allowed_domains\"] as unknown[]).filter(\n (d): d is string => typeof d === \"string\",\n )\n : undefined;\n\n const blockedDomains = Array.isArray(args[\"blocked_domains\"])\n ? (args[\"blocked_domains\"] as unknown[]).filter(\n (d): d is string => typeof d === \"string\",\n )\n : undefined;\n\n try {\n logger.debug({ query }, \"Web search executing\");\n\n const results = await searchProvider(query, {\n allowedDomains,\n blockedDomains,\n });\n\n if (results.length === 0) {\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content: `No results found for: ${query}`,\n isError: false,\n };\n }\n\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content: results,\n isError: false,\n };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Search failed\";\n logger.error({ query, error: msg }, \"Web search failed\");\n\n return {\n toolCallId: \"\",\n name: \"web_search\",\n content: `Web search failed: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Web Fetch tool — fetch URL content, strip HTML, timeout handling.\n * Per PRD section 5.1\n */\n\nimport type { IToolRegistration, PermissionMode } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_CONTENT_LENGTH = 100_000;\nconst MAX_URL_LENGTH = 2048;\n\nfunction stripHtmlTags(html: string): string {\n // Remove script and style blocks entirely\n let text = html.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, \"\");\n text = text.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, \"\");\n\n // Replace common block elements with newlines\n text = text.replace(/<\\/(p|div|h[1-6]|li|tr|br|hr)[^>]*>/gi, \"\\n\");\n text = text.replace(/<br\\s*\\/?>/gi, \"\\n\");\n\n // Strip all remaining tags\n text = text.replace(/<[^>]+>/g, \"\");\n\n // Decode common HTML entities\n text = text.replace(/&amp;/g, \"&\");\n text = text.replace(/&lt;/g, \"<\");\n text = text.replace(/&gt;/g, \">\");\n text = text.replace(/&quot;/g, '\"');\n text = text.replace(/&#39;/g, \"'\");\n text = text.replace(/&nbsp;/g, \" \");\n\n // Collapse excessive whitespace\n text = text.replace(/[ \\t]+/g, \" \");\n text = text.replace(/\\n{3,}/g, \"\\n\\n\");\n\n return text.trim();\n}\n\nfunction isPrivateHostname(hostname: string): boolean {\n if (hostname === \"localhost\" || hostname === \"[::1]\") {\n return true;\n }\n const ipMatch = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(hostname);\n if (ipMatch) {\n const [, a, b] = ipMatch as unknown as [string, string, string, string, string];\n const first = parseInt(a!, 10);\n const second = parseInt(b!, 10);\n if (first === 127) return true;\n if (first === 10) return true;\n if (first === 172 && second >= 16 && second <= 31) return true;\n if (first === 192 && second === 168) return true;\n if (first === 169 && second === 254) return true;\n if (first === 0) return true;\n }\n return false;\n}\n\nfunction isValidUrl(urlString: string): boolean {\n if (urlString.length > MAX_URL_LENGTH) {\n return false;\n }\n try {\n const url = new URL(urlString);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n return false;\n }\n if (isPrivateHostname(url.hostname)) {\n return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n\nfunction enforceHttps(urlString: string): string {\n try {\n const url = new URL(urlString);\n if (url.protocol === \"http:\") {\n url.protocol = \"https:\";\n }\n return url.toString();\n } catch {\n return urlString;\n }\n}\n\nexport function createWebFetchTool(): IToolRegistration {\n return {\n definition: {\n name: \"web_fetch\",\n description:\n \"Fetch content from a URL and convert HTML to readable text. HTTP URLs are upgraded to HTTPS.\",\n parameters: [\n {\n name: \"url\",\n type: \"string\",\n description: \"The URL to fetch content from\",\n required: true,\n },\n {\n name: \"prompt\",\n type: \"string\",\n description: \"What information to extract from the page\",\n required: false,\n },\n {\n name: \"timeout\",\n type: \"number\",\n description: \"Timeout in milliseconds (default 30000)\",\n required: false,\n default: DEFAULT_TIMEOUT_MS,\n },\n ],\n },\n category: \"web\",\n requiresApproval: (_mode: PermissionMode, _args: Record<string, unknown>): boolean => {\n return false;\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const rawUrl = args[\"url\"];\n if (typeof rawUrl !== \"string\" || rawUrl.length === 0) {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: \"url parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n if (!isValidUrl(rawUrl)) {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `Invalid URL: \"${rawUrl}\". Must be a valid HTTP(S) URL.`,\n isError: true,\n };\n }\n\n const url = enforceHttps(rawUrl);\n let timeoutMs = DEFAULT_TIMEOUT_MS;\n if (typeof args[\"timeout\"] === \"number\") {\n timeoutMs = Math.max(5000, Math.min(args[\"timeout\"], 60_000));\n }\n\n logger.debug({ url, timeout: timeoutMs }, \"Fetching URL\");\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n signal: controller.signal,\n headers: {\n \"User-Agent\": \"AemeathCLI/1.0\",\n \"Accept\": \"text/html, application/json, text/plain, */*\",\n },\n redirect: \"follow\",\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `HTTP ${response.status} ${response.statusText} for ${url}`,\n isError: true,\n };\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n const rawBody = await response.text();\n\n let content: string;\n if (contentType.includes(\"text/html\")) {\n content = stripHtmlTags(rawBody);\n } else {\n content = rawBody;\n }\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = content.substring(0, MAX_CONTENT_LENGTH) + \"\\n...(content truncated)\";\n }\n\n if (content.length === 0) {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `Fetched ${url} but the response body was empty.`,\n isError: false,\n };\n }\n\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content,\n isError: false,\n };\n } catch (err: unknown) {\n clearTimeout(timeoutId);\n\n if (err instanceof Error && err.name === \"AbortError\") {\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `Request timed out after ${timeoutMs}ms for ${url}`,\n isError: true,\n };\n }\n\n const msg = err instanceof Error ? err.message : \"Fetch failed\";\n logger.error({ url, error: msg }, \"Web fetch failed\");\n\n return {\n toolCallId: \"\",\n name: \"web_fetch\",\n content: `Fetch failed for ${url}: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Git tool — safe git operations via execa. Never force push by default.\n * Per PRD section 5.1\n */\n\nimport { execaCommand } from \"execa\";\nimport type { IToolRegistration, PermissionMode } from \"../types/tool.js\";\nimport type { IToolResult } from \"../types/message.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst GIT_TIMEOUT_MS = 60_000;\nconst MAX_OUTPUT_LENGTH = 30_000;\n\nconst ALLOWED_SUBCOMMANDS: ReadonlySet<string> = new Set([\n \"status\", \"diff\", \"log\", \"show\", \"branch\", \"tag\",\n \"add\", \"commit\", \"checkout\", \"switch\", \"merge\",\n \"rebase\", \"cherry-pick\", \"stash\", \"fetch\", \"pull\", \"push\",\n \"remote\", \"rev-parse\", \"describe\", \"blame\",\n]);\n\nconst DANGEROUS_FLAGS: readonly string[] = [\n \"--force\", \"-f\",\n \"--force-with-lease\",\n \"--hard\",\n \"--no-verify\",\n \"-D\",\n];\n\nconst READ_ONLY_SUBCOMMANDS: ReadonlySet<string> = new Set([\n \"status\", \"diff\", \"log\", \"show\", \"branch\", \"tag\",\n \"remote\", \"rev-parse\", \"describe\", \"blame\",\n]);\n\nfunction parseGitSubcommand(command: string): string | undefined {\n const parts = command.trim().split(/\\s+/);\n // Expect \"git <subcommand> ...\"\n if (parts[0] !== \"git\" || parts.length < 2) {\n return undefined;\n }\n return parts[1];\n}\n\nfunction hasDangerousFlags(command: string): boolean {\n const lowerCommand = command.toLowerCase();\n return DANGEROUS_FLAGS.some((flag) => {\n // Match as whole token\n const pattern = new RegExp(`(^|\\\\s)${flag.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}(\\\\s|$)`);\n return pattern.test(lowerCommand);\n });\n}\n\nfunction truncateOutput(output: string): string {\n if (output.length <= MAX_OUTPUT_LENGTH) {\n return output;\n }\n return output.substring(0, MAX_OUTPUT_LENGTH) + \"\\n...(truncated)\";\n}\n\nlet workingDirectory = process.cwd();\n\nexport function setGitWorkingDirectory(dir: string): void {\n workingDirectory = dir;\n}\n\nexport function createGitTool(): IToolRegistration {\n return {\n definition: {\n name: \"git\",\n description:\n \"Execute git commands safely. Supports status, diff, log, add, commit, branch operations. Never force pushes by default.\",\n parameters: [\n {\n name: \"command\",\n type: \"string\",\n description: 'Full git command to execute (e.g. \"git status\", \"git diff HEAD\")',\n required: true,\n },\n ],\n },\n category: \"git\",\n requiresApproval: (mode: PermissionMode, args: Record<string, unknown>): boolean => {\n const command = typeof args[\"command\"] === \"string\" ? args[\"command\"] : \"\";\n const subcommand = parseGitSubcommand(command);\n\n // Dangerous flags always need approval\n if (hasDangerousFlags(command)) {\n return true;\n }\n\n // Read-only commands never need approval\n if (subcommand && READ_ONLY_SUBCOMMANDS.has(subcommand)) {\n return false;\n }\n\n // Write commands need approval in strict mode\n if (mode === \"strict\") {\n return true;\n }\n\n // Push needs approval in standard mode\n if (subcommand === \"push\" && mode === \"standard\") {\n return true;\n }\n\n return false;\n },\n execute: async (args: Record<string, unknown>): Promise<IToolResult> => {\n const command = args[\"command\"];\n if (typeof command !== \"string\" || command.length === 0) {\n return {\n toolCallId: \"\",\n name: \"git\",\n content: \"command parameter is required and must be a non-empty string.\",\n isError: true,\n };\n }\n\n const trimmedCommand = command.trim();\n if (!trimmedCommand.startsWith(\"git \")) {\n return {\n toolCallId: \"\",\n name: \"git\",\n content: 'Command must start with \"git\".',\n isError: true,\n };\n }\n\n const subcommand = parseGitSubcommand(trimmedCommand);\n if (!subcommand || !ALLOWED_SUBCOMMANDS.has(subcommand)) {\n return {\n toolCallId: \"\",\n name: \"git\",\n content: `Git subcommand \"${subcommand ?? \"unknown\"}\" is not allowed. Allowed: ${[...ALLOWED_SUBCOMMANDS].join(\", \")}`,\n isError: true,\n };\n }\n\n // Block force push completely\n const lowerCommand = trimmedCommand.toLowerCase();\n if (\n subcommand === \"push\" &&\n (lowerCommand.includes(\"--force\") || lowerCommand.includes(\" -f\"))\n ) {\n return {\n toolCallId: \"\",\n name: \"git\",\n content:\n \"Force push is blocked by default. Use --force-with-lease if needed (requires approval).\",\n isError: true,\n };\n }\n\n logger.debug({ command: trimmedCommand, subcommand, cwd: workingDirectory }, \"Executing git command\");\n\n try {\n const result = await execaCommand(trimmedCommand, {\n cwd: workingDirectory,\n timeout: GIT_TIMEOUT_MS,\n reject: false,\n env: {\n ...process.env,\n GIT_TERMINAL_PROMPT: \"0\",\n GIT_PAGER: \"cat\",\n },\n stripFinalNewline: true,\n });\n\n const stdout = result.stdout ? truncateOutput(result.stdout) : \"\";\n const stderr = result.stderr ? truncateOutput(result.stderr) : \"\";\n\n let content = \"\";\n if (stdout.length > 0) {\n content += stdout;\n }\n if (stderr.length > 0) {\n content += (content.length > 0 ? \"\\n\\nSTDERR:\\n\" : \"\") + stderr;\n }\n if (content.length === 0) {\n content = `Git command completed with exit code ${result.exitCode ?? 0}.`;\n }\n\n const isError = (result.exitCode ?? 0) !== 0;\n\n return {\n toolCallId: \"\",\n name: \"git\",\n content,\n isError,\n };\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : \"Git command failed\";\n logger.error({ command: trimmedCommand, error: msg }, \"Git execution failed\");\n\n return {\n toolCallId: \"\",\n name: \"git\",\n content: `Git command failed: ${msg}`,\n isError: true,\n };\n }\n },\n };\n}\n","/**\n * Tools barrel export and default registry factory.\n * Per PRD section 5.1\n */\n\nexport { ToolRegistry } from \"./registry.js\";\n\nexport { createReadTool, setReadProjectRoot } from \"./read.js\";\nexport { createWriteTool, setWriteProjectRoot } from \"./write.js\";\nexport { createEditTool, setEditProjectRoot } from \"./edit.js\";\nexport { createGlobTool, setGlobProjectRoot } from \"./glob.js\";\nexport { createGrepTool, setGrepProjectRoot } from \"./grep.js\";\nexport { createBashTool, setBashWorkingDirectory, setBashBlockedCommands } from \"./bash.js\";\nexport { createWebSearchTool, setWebSearchProvider } from \"./web-search.js\";\nexport { createWebFetchTool } from \"./web-fetch.js\";\nexport { createGitTool, setGitWorkingDirectory } from \"./git.js\";\n\nimport { ToolRegistry } from \"./registry.js\";\nimport { createReadTool, setReadProjectRoot } from \"./read.js\";\nimport { createWriteTool, setWriteProjectRoot } from \"./write.js\";\nimport { createEditTool, setEditProjectRoot } from \"./edit.js\";\nimport { createGlobTool, setGlobProjectRoot } from \"./glob.js\";\nimport { createGrepTool, setGrepProjectRoot } from \"./grep.js\";\nimport {\n createBashTool,\n setBashWorkingDirectory,\n setBashBlockedCommands,\n} from \"./bash.js\";\nimport { createWebSearchTool } from \"./web-search.js\";\nimport { createWebFetchTool } from \"./web-fetch.js\";\nimport { createGitTool, setGitWorkingDirectory } from \"./git.js\";\nimport type { IToolExecutionContext } from \"../types/tool.js\";\n\nexport function createDefaultRegistry(context: IToolExecutionContext): ToolRegistry {\n // Configure module-level settings from context\n setReadProjectRoot(context.projectRoot);\n setWriteProjectRoot(context.projectRoot);\n setEditProjectRoot(context.projectRoot);\n setGlobProjectRoot(context.projectRoot);\n setGrepProjectRoot(context.projectRoot);\n setBashWorkingDirectory(context.workingDirectory);\n setBashBlockedCommands(context.blockedCommands);\n setGitWorkingDirectory(context.workingDirectory);\n\n const registry = new ToolRegistry();\n\n registry.register(createReadTool());\n registry.register(createWriteTool());\n registry.register(createEditTool());\n registry.register(createGlobTool());\n registry.register(createGrepTool());\n registry.register(createBashTool());\n registry.register(createWebSearchTool());\n registry.register(createWebFetchTool());\n registry.register(createGitTool());\n\n return registry;\n}\n"]}
@@ -1,6 +0,0 @@
1
- export { ClaudeAdapter } from './chunk-WAHVZH7V.js';
2
- import './chunk-HCIHOHLX.js';
3
- import './chunk-ZGOHARPV.js';
4
- import './chunk-JAXXTYID.js';
5
- //# sourceMappingURL=claude-adapter-QMLFMSP3.js.map
6
- //# sourceMappingURL=claude-adapter-QMLFMSP3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"claude-adapter-QMLFMSP3.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/auth/providers/codex-login.ts"],"names":[],"mappings":"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","file":"codex-login-GZIFXUWD.js","sourcesContent":["/**\n * Codex (OpenAI) delegated authentication\n * Spawns `codex login` which opens the browser automatically for ChatGPT login.\n * After login, reads cached tokens from ~/.codex/auth.json.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { execa } from \"execa\";\nimport type { ICredential } from \"../../types/index.js\";\nimport { AuthenticationError } from \"../../types/index.js\";\nimport { CredentialStore } from \"../credential-store.js\";\nimport { logger } from \"../../utils/index.js\";\n\n// ── Codex CLI Token Paths ───────────────────────────────────────────────\n\nconst CLI_COMMAND = \"codex\";\n\nfunction getCodexHome(): string {\n return process.env[\"CODEX_HOME\"] ?? join(homedir(), \".codex\");\n}\n\nfunction getAuthJsonPath(): string {\n return join(getCodexHome(), \"auth.json\");\n}\n\n// ── auth.json Schema ────────────────────────────────────────────────────\n\ninterface ICodexAuthJson {\n readonly OPENAI_API_KEY?: string | null;\n readonly tokens?: {\n readonly id_token?: string;\n readonly access_token?: string;\n readonly refresh_token?: string;\n readonly account_id?: string;\n };\n readonly last_refresh?: string;\n}\n\nfunction readCodexAuthJson(): ICodexAuthJson | undefined {\n const authPath = getAuthJsonPath();\n if (!existsSync(authPath)) {\n return undefined;\n }\n\n try {\n const raw = readFileSync(authPath, \"utf-8\");\n return JSON.parse(raw) as ICodexAuthJson;\n } catch {\n return undefined;\n }\n}\n\nfunction extractEmailFromIdToken(idToken: string): string | undefined {\n try {\n const payload = idToken.split(\".\")[1];\n if (!payload) return undefined;\n const decoded = JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as {\n email?: string;\n };\n return decoded.email;\n } catch {\n return undefined;\n }\n}\n\n// ── CodexLogin Class ────────────────────────────────────────────────────\n\nexport class CodexLogin {\n private readonly credentialStore: CredentialStore;\n\n constructor(store?: CredentialStore) {\n this.credentialStore = store ?? new CredentialStore();\n }\n\n /**\n * Spawn `codex login` which opens the browser automatically for ChatGPT login,\n * then read the cached tokens from ~/.codex/auth.json.\n */\n async login(): Promise<ICredential> {\n // Check if already logged in via cached tokens\n const existing = this.readCachedCredentials();\n if (existing) {\n logger.info(\"Found existing Codex credentials in ~/.codex/auth.json\");\n await this.credentialStore.set(\"openai\", existing);\n return existing;\n }\n\n // Check if the CLI is available\n const cliAvailable = await this.isCliAvailable();\n if (!cliAvailable) {\n throw new AuthenticationError(\n \"openai\",\n \"Codex CLI not found. Install it first:\\n\" +\n \" npm install -g @openai/codex\\n\" +\n \"Or set an API key: aemeathcli auth set-key codex <key>\",\n );\n }\n\n // Spawn `codex login` — browser opens automatically\n logger.info(\"Spawning codex login (browser will open automatically)\");\n try {\n await this.spawnInteractive(CLI_COMMAND, [\"login\"]);\n } catch (error: unknown) {\n // Try device auth as fallback for headless environments\n try {\n await this.spawnInteractive(CLI_COMMAND, [\"login\", \"--device-auth\"]);\n } catch {\n throw new AuthenticationError(\n \"openai\",\n \"Codex login failed. Make sure you have the Codex CLI installed:\\n\" +\n \" npm install -g @openai/codex\\n\" +\n \"Or set an API key: aemeathcli auth set-key codex <key>\",\n );\n }\n }\n\n // Read the freshly cached credentials\n const credential = this.readCachedCredentials();\n if (!credential) {\n throw new AuthenticationError(\n \"openai\",\n \"No credentials found after Codex login. Please try again or set an API key: aemeathcli auth set-key codex <key>\",\n );\n }\n\n await this.credentialStore.set(\"openai\", credential);\n logger.info(\"Codex credentials imported successfully\");\n return credential;\n }\n\n async logout(): Promise<void> {\n await this.credentialStore.delete(\"openai\");\n logger.info(\"OpenAI session revoked from AemeathCLI\");\n }\n\n async isLoggedIn(): Promise<boolean> {\n const credential = this.readCachedCredentials();\n if (!credential) {\n return false;\n }\n\n await this.credentialStore.set(\"openai\", credential);\n return true;\n }\n\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\n const loggedIn = await this.isLoggedIn();\n if (!loggedIn) return { loggedIn: false };\n\n const credential = await this.credentialStore.get(\"openai\");\n if (!credential) return { loggedIn: false };\n\n return {\n loggedIn: true,\n ...(credential.email !== undefined ? { email: credential.email } : {}),\n };\n }\n\n async getCachedCredential(): Promise<ICredential | undefined> {\n const credential = this.readCachedCredentials();\n if (credential) {\n await this.credentialStore.set(\"openai\", credential);\n }\n return credential;\n }\n\n // ── Internal ──────────────────────────────────────────────────────────\n\n private readCachedCredentials(): ICredential | undefined {\n const authData = readCodexAuthJson();\n if (!authData) return undefined;\n\n if (authData.tokens?.access_token) {\n const email = authData.tokens.id_token\n ? extractEmailFromIdToken(authData.tokens.id_token)\n : undefined;\n\n return {\n provider: \"openai\",\n method: \"native_login\",\n token: authData.tokens.access_token,\n ...(authData.tokens.refresh_token !== undefined ? { refreshToken: authData.tokens.refresh_token } : {}),\n ...(email !== undefined ? { email } : {}),\n };\n }\n\n if (authData.OPENAI_API_KEY && typeof authData.OPENAI_API_KEY === \"string\") {\n return {\n provider: \"openai\",\n method: \"api_key\",\n token: authData.OPENAI_API_KEY,\n };\n }\n\n return undefined;\n }\n\n private async spawnInteractive(command: string, args: readonly string[]): Promise<void> {\n await execa(command, [...args], { stdio: \"inherit\", timeout: 300_000 });\n }\n\n private async isCliAvailable(): Promise<boolean> {\n try {\n await execa(CLI_COMMAND, [\"--version\"], { timeout: 5000, stdin: \"ignore\", stdout: \"ignore\", stderr: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n }\n}\n"]}
@@ -1,6 +0,0 @@
1
- export { ConfigStore } from './chunk-IYW62KKR.js';
2
- import './chunk-CYQNBB25.js';
3
- import './chunk-NBR3GHMT.js';
4
- import './chunk-JAXXTYID.js';
5
- //# sourceMappingURL=config-store-W6FBCQAQ.js.map
6
- //# sourceMappingURL=config-store-W6FBCQAQ.js.map
@@ -1,4 +0,0 @@
1
- export { SkillExecutor } from './chunk-LSOYPSAT.js';
2
- import './chunk-JAXXTYID.js';
3
- //# sourceMappingURL=executor-6RIKIGXK.js.map
4
- //# sourceMappingURL=executor-6RIKIGXK.js.map
@@ -1,6 +0,0 @@
1
- export { GeminiAdapter } from './chunk-UY2SYSEZ.js';
2
- import './chunk-HCIHOHLX.js';
3
- import './chunk-ZGOHARPV.js';
4
- import './chunk-JAXXTYID.js';
5
- //# sourceMappingURL=gemini-adapter-6JIHZ7WI.js.map
6
- //# sourceMappingURL=gemini-adapter-6JIHZ7WI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"gemini-adapter-6JIHZ7WI.js"}
@@ -1,6 +0,0 @@
1
- export { KimiAdapter } from './chunk-MXZSI3AY.js';
2
- import './chunk-HCIHOHLX.js';
3
- import './chunk-ZGOHARPV.js';
4
- import './chunk-JAXXTYID.js';
5
- //# sourceMappingURL=kimi-adapter-JN4HFFHU.js.map
6
- //# sourceMappingURL=kimi-adapter-JN4HFFHU.js.map