sa2kit 3.4.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/{chunk-KVYHCGRY.js → chunk-7Z3XR2Y4.js} +552 -263
  2. package/dist/chunk-7Z3XR2Y4.js.map +1 -0
  3. package/dist/chunk-XPY45Y75.js +1143 -0
  4. package/dist/chunk-XPY45Y75.js.map +1 -0
  5. package/dist/{chunk-YIRPPMCN.mjs → chunk-XSTMLLJV.mjs} +474 -198
  6. package/dist/chunk-XSTMLLJV.mjs.map +1 -0
  7. package/dist/chunk-ZJLS5JU5.mjs +1090 -0
  8. package/dist/chunk-ZJLS5JU5.mjs.map +1 -0
  9. package/dist/common/aiApi/client/index.d.mts +71 -0
  10. package/dist/common/aiApi/client/index.d.ts +71 -0
  11. package/dist/common/aiApi/client/index.js +165 -0
  12. package/dist/common/aiApi/client/index.js.map +1 -0
  13. package/dist/common/aiApi/client/index.mjs +151 -0
  14. package/dist/common/aiApi/client/index.mjs.map +1 -0
  15. package/dist/common/aiApi/index.d.mts +184 -0
  16. package/dist/common/aiApi/index.d.ts +184 -0
  17. package/dist/common/aiApi/index.js +217 -0
  18. package/dist/common/aiApi/index.mjs +4 -0
  19. package/dist/common/aiApi/server/index.d.mts +3 -0
  20. package/dist/common/aiApi/server/index.d.ts +3 -0
  21. package/dist/common/aiApi/server/index.js +217 -0
  22. package/dist/common/aiApi/server/index.mjs +4 -0
  23. package/dist/common/components/index.js +176 -177
  24. package/dist/common/components/index.mjs +1 -2
  25. package/dist/common/index.js +2 -3
  26. package/dist/common/index.mjs +1 -2
  27. package/dist/index.d.mts +314 -154
  28. package/dist/index.d.ts +314 -154
  29. package/dist/index.js +1055 -369
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +1005 -360
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/types-CiqMQ-uu.d.mts +166 -0
  34. package/dist/types-CiqMQ-uu.d.ts +166 -0
  35. package/package.json +15 -50
  36. package/dist/chunk-3R6JHA6D.js +0 -120
  37. package/dist/chunk-3R6JHA6D.js.map +0 -1
  38. package/dist/chunk-4PJM4752.js +0 -4
  39. package/dist/chunk-4PJM4752.js.map +0 -1
  40. package/dist/chunk-7PMT4L4I.js +0 -324
  41. package/dist/chunk-7PMT4L4I.js.map +0 -1
  42. package/dist/chunk-FY2X3LYR.mjs +0 -3
  43. package/dist/chunk-FY2X3LYR.mjs.map +0 -1
  44. package/dist/chunk-GS4SAW25.mjs +0 -116
  45. package/dist/chunk-GS4SAW25.mjs.map +0 -1
  46. package/dist/chunk-HL4H2HF6.js +0 -279
  47. package/dist/chunk-HL4H2HF6.js.map +0 -1
  48. package/dist/chunk-IJIQUMAK.mjs +0 -272
  49. package/dist/chunk-IJIQUMAK.mjs.map +0 -1
  50. package/dist/chunk-KVYHCGRY.js.map +0 -1
  51. package/dist/chunk-MMDSZIXD.mjs +0 -286
  52. package/dist/chunk-MMDSZIXD.mjs.map +0 -1
  53. package/dist/chunk-N2O3OX5Y.mjs +0 -243
  54. package/dist/chunk-N2O3OX5Y.mjs.map +0 -1
  55. package/dist/chunk-RRQ2X26Z.js +0 -106
  56. package/dist/chunk-RRQ2X26Z.js.map +0 -1
  57. package/dist/chunk-RVNQI6BI.js +0 -249
  58. package/dist/chunk-RVNQI6BI.js.map +0 -1
  59. package/dist/chunk-UJUWDF7M.mjs +0 -336
  60. package/dist/chunk-UJUWDF7M.mjs.map +0 -1
  61. package/dist/chunk-VCKXK6V5.js +0 -345
  62. package/dist/chunk-VCKXK6V5.js.map +0 -1
  63. package/dist/chunk-VIEXDTNF.mjs +0 -100
  64. package/dist/chunk-VIEXDTNF.mjs.map +0 -1
  65. package/dist/chunk-YIRPPMCN.mjs.map +0 -1
  66. package/dist/common/ai/llm/core/index.d.mts +0 -70
  67. package/dist/common/ai/llm/core/index.d.ts +0 -70
  68. package/dist/common/ai/llm/core/index.js +0 -54
  69. package/dist/common/ai/llm/core/index.mjs +0 -5
  70. package/dist/common/ai/llm/electron/index.d.mts +0 -6
  71. package/dist/common/ai/llm/electron/index.d.ts +0 -6
  72. package/dist/common/ai/llm/electron/index.js +0 -67
  73. package/dist/common/ai/llm/electron/index.mjs +0 -10
  74. package/dist/common/ai/llm/index.d.mts +0 -3
  75. package/dist/common/ai/llm/index.d.ts +0 -3
  76. package/dist/common/ai/llm/index.js +0 -54
  77. package/dist/common/ai/llm/index.js.map +0 -1
  78. package/dist/common/ai/llm/index.mjs +0 -5
  79. package/dist/common/ai/llm/index.mjs.map +0 -1
  80. package/dist/common/ai/llm/miniapp/index.d.mts +0 -6
  81. package/dist/common/ai/llm/miniapp/index.d.ts +0 -6
  82. package/dist/common/ai/llm/miniapp/index.js +0 -59
  83. package/dist/common/ai/llm/miniapp/index.js.map +0 -1
  84. package/dist/common/ai/llm/miniapp/index.mjs +0 -6
  85. package/dist/common/ai/llm/miniapp/index.mjs.map +0 -1
  86. package/dist/common/ai/llm/rn/index.d.mts +0 -6
  87. package/dist/common/ai/llm/rn/index.d.ts +0 -6
  88. package/dist/common/ai/llm/rn/index.js +0 -59
  89. package/dist/common/ai/llm/rn/index.js.map +0 -1
  90. package/dist/common/ai/llm/rn/index.mjs +0 -6
  91. package/dist/common/ai/llm/rn/index.mjs.map +0 -1
  92. package/dist/common/ai/llm/ui/electron/index.d.mts +0 -5
  93. package/dist/common/ai/llm/ui/electron/index.d.ts +0 -5
  94. package/dist/common/ai/llm/ui/electron/index.js +0 -22
  95. package/dist/common/ai/llm/ui/electron/index.js.map +0 -1
  96. package/dist/common/ai/llm/ui/electron/index.mjs +0 -9
  97. package/dist/common/ai/llm/ui/electron/index.mjs.map +0 -1
  98. package/dist/common/ai/llm/ui/miniapp/index.d.mts +0 -9
  99. package/dist/common/ai/llm/ui/miniapp/index.d.ts +0 -9
  100. package/dist/common/ai/llm/ui/miniapp/index.js +0 -14
  101. package/dist/common/ai/llm/ui/miniapp/index.js.map +0 -1
  102. package/dist/common/ai/llm/ui/miniapp/index.mjs +0 -5
  103. package/dist/common/ai/llm/ui/miniapp/index.mjs.map +0 -1
  104. package/dist/common/ai/llm/ui/rn/index.d.mts +0 -9
  105. package/dist/common/ai/llm/ui/rn/index.d.ts +0 -9
  106. package/dist/common/ai/llm/ui/rn/index.js +0 -14
  107. package/dist/common/ai/llm/ui/rn/index.js.map +0 -1
  108. package/dist/common/ai/llm/ui/rn/index.mjs +0 -5
  109. package/dist/common/ai/llm/ui/rn/index.mjs.map +0 -1
  110. package/dist/common/ai/llm/ui/web/index.d.mts +0 -15
  111. package/dist/common/ai/llm/ui/web/index.d.ts +0 -15
  112. package/dist/common/ai/llm/ui/web/index.js +0 -21
  113. package/dist/common/ai/llm/ui/web/index.js.map +0 -1
  114. package/dist/common/ai/llm/ui/web/index.mjs +0 -8
  115. package/dist/common/ai/llm/ui/web/index.mjs.map +0 -1
  116. package/dist/common/ai/llm/web/index.d.mts +0 -6
  117. package/dist/common/ai/llm/web/index.d.ts +0 -6
  118. package/dist/common/ai/llm/web/index.js +0 -66
  119. package/dist/common/ai/llm/web/index.js.map +0 -1
  120. package/dist/common/ai/llm/web/index.mjs +0 -9
  121. package/dist/common/ai/llm/web/index.mjs.map +0 -1
  122. package/dist/types-B2rs_jq1.d.mts +0 -38
  123. package/dist/types-DgACCUpT.d.ts +0 -122
  124. package/dist/types-DwS2Eg0q.d.ts +0 -38
  125. package/dist/types-LU_BGSzk.d.mts +0 -122
  126. /package/dist/common/{ai/llm/core → aiApi}/index.js.map +0 -0
  127. /package/dist/common/{ai/llm/core → aiApi}/index.mjs.map +0 -0
  128. /package/dist/common/{ai/llm/electron → aiApi/server}/index.js.map +0 -0
  129. /package/dist/common/{ai/llm/electron → aiApi/server}/index.mjs.map +0 -0
@@ -1,336 +0,0 @@
1
- import { applyPromptTemplate } from './chunk-GS4SAW25.mjs';
2
-
3
- // src/common/ai/llm/client/request.ts
4
- var requestJson = async (options) => {
5
- const { url, method = "POST", headers = {}, body, timeoutMs, requestAdapter } = options;
6
- if (requestAdapter) {
7
- return requestAdapter.request({
8
- url,
9
- method,
10
- headers,
11
- body
12
- });
13
- }
14
- const controller = timeoutMs ? new AbortController() : void 0;
15
- const timeoutId = timeoutMs ? setTimeout(() => {
16
- controller?.abort();
17
- }, timeoutMs) : void 0;
18
- try {
19
- const response = await fetch(url, {
20
- method,
21
- headers,
22
- body: body ? JSON.stringify(body) : void 0,
23
- signal: controller?.signal
24
- });
25
- const text = await response.text();
26
- let data = null;
27
- if (text) {
28
- try {
29
- data = JSON.parse(text);
30
- } catch {
31
- data = text;
32
- }
33
- }
34
- if (!response.ok) {
35
- const errorMessage = data?.error?.message || data?.error || data?.message || `Request failed with status ${response.status}`;
36
- const error = new Error(errorMessage);
37
- error.status = response.status;
38
- error.data = data;
39
- throw error;
40
- }
41
- return data;
42
- } finally {
43
- if (timeoutId) {
44
- clearTimeout(timeoutId);
45
- }
46
- }
47
- };
48
-
49
- // src/common/ai/llm/providers/openai-compatible.ts
50
- var DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1";
51
- var DEFAULT_OPENAI_MODEL = "gpt-3.5-turbo";
52
- var joinUrl = (base, path) => {
53
- const trimmedBase = base.replace(/\/+$/, "");
54
- const trimmedPath = path.replace(/^\/+/, "");
55
- return `${trimmedBase}/${trimmedPath}`;
56
- };
57
- var normalizeToolCalls = (toolCalls) => {
58
- if (!toolCalls || !toolCalls.length) {
59
- return void 0;
60
- }
61
- return toolCalls.map((call, index) => ({
62
- id: call?.id ?? String(index),
63
- type: "function",
64
- function: {
65
- name: call?.function?.name ?? "",
66
- arguments: call?.function?.arguments ?? ""
67
- }
68
- }));
69
- };
70
- var normalizeUsage = (usage) => {
71
- if (!usage) {
72
- return void 0;
73
- }
74
- return {
75
- promptTokens: usage.prompt_tokens,
76
- completionTokens: usage.completion_tokens,
77
- totalTokens: usage.total_tokens
78
- };
79
- };
80
- var mapMessage = (message) => {
81
- const mapped = {
82
- role: message.role,
83
- content: message.content
84
- };
85
- if (message.name) {
86
- mapped.name = message.name;
87
- }
88
- if (message.toolCallId) {
89
- mapped.tool_call_id = message.toolCallId;
90
- }
91
- if (message.toolCalls?.length) {
92
- mapped.tool_calls = message.toolCalls.map((call) => ({
93
- id: call.id,
94
- type: call.type,
95
- function: {
96
- name: call.function.name,
97
- arguments: call.function.arguments
98
- }
99
- }));
100
- }
101
- return mapped;
102
- };
103
- var createOpenAICompatibleProvider = () => {
104
- return {
105
- id: "openai-compatible",
106
- sendChat: async (request, config) => {
107
- if (request.stream) {
108
- throw new Error("Streaming is not supported in sendChat. Use streamChat when available.");
109
- }
110
- const model = request.model ?? config.model ?? DEFAULT_OPENAI_MODEL;
111
- if (!model) {
112
- throw new Error("Model is required for chat completion requests.");
113
- }
114
- const payload = {
115
- model,
116
- messages: request.messages.map(mapMessage)
117
- };
118
- if (request.temperature !== void 0) {
119
- payload.temperature = request.temperature;
120
- }
121
- if (request.maxTokens !== void 0) {
122
- payload.max_tokens = request.maxTokens;
123
- }
124
- if (request.topP !== void 0) {
125
- payload.top_p = request.topP;
126
- }
127
- if (request.stop !== void 0) {
128
- payload.stop = request.stop;
129
- }
130
- if (request.tools) {
131
- payload.tools = request.tools;
132
- }
133
- if (request.toolChoice) {
134
- payload.tool_choice = request.toolChoice;
135
- }
136
- const url = joinUrl(config.baseUrl || DEFAULT_OPENAI_BASE_URL, "chat/completions");
137
- const response = await requestJson({
138
- url,
139
- method: "POST",
140
- headers: config.headers,
141
- body: payload,
142
- timeoutMs: config.timeoutMs,
143
- requestAdapter: config.requestAdapter
144
- });
145
- const firstMessage = response.choices?.[0]?.message;
146
- const toolCalls = normalizeToolCalls(firstMessage?.tool_calls);
147
- const content = firstMessage?.content ?? "";
148
- const assistantMessage = {
149
- role: "assistant",
150
- content,
151
- toolCalls
152
- };
153
- return {
154
- id: response.id ?? "",
155
- content,
156
- message: assistantMessage,
157
- usage: normalizeUsage(response.usage),
158
- toolCalls,
159
- raw: response
160
- };
161
- }
162
- };
163
- };
164
-
165
- // src/common/ai/llm/client/createAiClient.ts
166
- var DEFAULT_TIMEOUT_MS = 6e4;
167
- var resolveApiKey = async (config) => {
168
- if (config.apiKey) {
169
- return config.apiKey;
170
- }
171
- if (config.getApiKey) {
172
- return await config.getApiKey();
173
- }
174
- return void 0;
175
- };
176
- var hasAuthorizationHeader = (headers) => {
177
- return Object.keys(headers).some((key) => key.toLowerCase() === "authorization");
178
- };
179
- var resolveHeaders = async (config) => {
180
- const headers = {
181
- "Content-Type": "application/json",
182
- ...config.headers ?? {}
183
- };
184
- if (!hasAuthorizationHeader(headers)) {
185
- const apiKey = await resolveApiKey(config);
186
- if (apiKey) {
187
- headers.Authorization = `Bearer ${apiKey}`;
188
- }
189
- }
190
- return headers;
191
- };
192
- var resolveClientConfig = async (config) => {
193
- const headers = await resolveHeaders(config);
194
- return {
195
- ...config,
196
- baseUrl: config.baseUrl ?? "https://api.openai.com/v1",
197
- headers,
198
- timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS
199
- };
200
- };
201
- var resolveProvider = (provider) => {
202
- return provider ?? createOpenAICompatibleProvider();
203
- };
204
- var createAiClient = (config) => {
205
- const provider = resolveProvider(config.provider);
206
- const sendChat = async (request) => {
207
- const resolvedConfig = await resolveClientConfig(config);
208
- config.logger?.debug?.("ai.sendChat", {
209
- model: request.model ?? resolvedConfig.model,
210
- messageCount: request.messages.length
211
- });
212
- try {
213
- return await provider.sendChat(request, resolvedConfig);
214
- } catch (error) {
215
- config.logger?.error?.("ai.sendChat.error", error);
216
- throw error;
217
- }
218
- };
219
- const sendMessage = async (content, options) => {
220
- const resolvedOptions = options ?? {};
221
- const { systemPrompt, ...requestOptions } = resolvedOptions;
222
- const messages = [];
223
- if (systemPrompt) {
224
- messages.push({ role: "system", content: systemPrompt });
225
- }
226
- messages.push({ role: "user", content });
227
- return sendChat({
228
- messages,
229
- ...requestOptions
230
- });
231
- };
232
- return {
233
- sendChat,
234
- sendMessage
235
- };
236
- };
237
-
238
- // src/common/ai/llm/client/createChatSession.ts
239
- var buildBaseMessages = (systemPrompt, initialMessages) => {
240
- const baseMessages = [];
241
- if (systemPrompt) {
242
- baseMessages.push({ role: "system", content: systemPrompt });
243
- }
244
- if (initialMessages?.length) {
245
- baseMessages.push(...initialMessages);
246
- }
247
- return baseMessages;
248
- };
249
- var createChatSession = (options) => {
250
- let systemPrompt = options.systemPrompt;
251
- let messages = buildBaseMessages(systemPrompt, options.initialMessages);
252
- const reset = () => {
253
- messages = buildBaseMessages(systemPrompt, options.initialMessages);
254
- };
255
- const setSystemPrompt = (prompt) => {
256
- systemPrompt = prompt;
257
- reset();
258
- };
259
- const sendMessage = async (input, requestOptions = {}) => {
260
- const { template, variables, ...chatOptions } = requestOptions;
261
- const activeTemplate = template ?? options.template;
262
- const mergedVariables = { input, ...variables ?? {} };
263
- const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;
264
- const userMessage = { role: "user", content };
265
- const nextMessages = [...messages, userMessage];
266
- const response = await options.client.sendChat({
267
- messages: nextMessages,
268
- ...chatOptions
269
- });
270
- const assistantMessage = response.message ?? {
271
- role: "assistant",
272
- content: response.content,
273
- toolCalls: response.toolCalls
274
- };
275
- messages = [...nextMessages, assistantMessage];
276
- return response;
277
- };
278
- return {
279
- getMessages: () => messages,
280
- setSystemPrompt,
281
- reset,
282
- sendMessage
283
- };
284
- };
285
-
286
- // src/common/ai/llm/skills/registry.ts
287
- var skillToToolDefinition = (skill) => {
288
- const toolDefinition = {
289
- type: "function",
290
- function: {
291
- name: skill.name,
292
- description: skill.description
293
- }
294
- };
295
- if (skill.inputSchema) {
296
- toolDefinition.function.parameters = skill.inputSchema;
297
- }
298
- return toolDefinition;
299
- };
300
- var InMemorySkillRegistry = class {
301
- constructor(initialSkills) {
302
- this.skills = /* @__PURE__ */ new Map();
303
- initialSkills?.forEach((skill) => {
304
- this.skills.set(skill.name, skill);
305
- });
306
- }
307
- registerSkill(skill) {
308
- this.skills.set(skill.name, skill);
309
- }
310
- unregisterSkill(name) {
311
- return this.skills.delete(name);
312
- }
313
- getSkill(name) {
314
- return this.skills.get(name);
315
- }
316
- listSkills() {
317
- return Array.from(this.skills.values());
318
- }
319
- async executeSkill(name, input, context) {
320
- const skill = this.skills.get(name);
321
- if (!skill) {
322
- throw new Error(`Skill not found: ${name}`);
323
- }
324
- return await skill.execute(input, context);
325
- }
326
- toToolDefinitions() {
327
- return this.listSkills().map(skillToToolDefinition);
328
- }
329
- };
330
- var createSkillRegistry = (initialSkills) => {
331
- return new InMemorySkillRegistry(initialSkills);
332
- };
333
-
334
- export { DEFAULT_OPENAI_BASE_URL, DEFAULT_OPENAI_MODEL, InMemorySkillRegistry, createAiClient, createChatSession, createOpenAICompatibleProvider, createSkillRegistry, skillToToolDefinition };
335
- //# sourceMappingURL=chunk-UJUWDF7M.mjs.map
336
- //# sourceMappingURL=chunk-UJUWDF7M.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/ai/llm/client/request.ts","../src/common/ai/llm/providers/openai-compatible.ts","../src/common/ai/llm/client/createAiClient.ts","../src/common/ai/llm/client/createChatSession.ts","../src/common/ai/llm/skills/registry.ts"],"names":[],"mappings":"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","file":"chunk-UJUWDF7M.mjs","sourcesContent":["import type { RequestAdapter } from '../../../request';\n\nexport type JsonRequestOptions = {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n headers?: Record<string, string>;\n body?: any;\n timeoutMs?: number;\n requestAdapter?: RequestAdapter;\n};\n\nexport const requestJson = async <T>(options: JsonRequestOptions): Promise<T> => {\n const { url, method = 'POST', headers = {}, body, timeoutMs, requestAdapter } = options;\n\n if (requestAdapter) {\n return requestAdapter.request<T>({\n url,\n method,\n headers,\n body,\n });\n }\n\n const controller = timeoutMs ? new AbortController() : undefined;\n const timeoutId = timeoutMs\n ? setTimeout(() => {\n controller?.abort();\n }, timeoutMs)\n : undefined;\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller?.signal,\n });\n\n const text = await response.text();\n let data: any = null;\n\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n }\n\n if (!response.ok) {\n const errorMessage =\n data?.error?.message ||\n data?.error ||\n data?.message ||\n `Request failed with status ${response.status}`;\n const error = new Error(errorMessage);\n (error as any).status = response.status;\n (error as any).data = data;\n throw error;\n }\n\n return data as T;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n};\n","import type {\n AiChatRequest,\n AiChatResponse,\n AiMessage,\n AiToolCall,\n AiUsage,\n ResolvedAiClientConfig,\n} from '../types';\nimport type { AiProvider } from './types';\nimport { requestJson } from '../client/request';\n\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_OPENAI_MODEL = 'gpt-3.5-turbo';\n\ntype OpenAIToolCall = {\n id?: string;\n type?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n};\n\ntype OpenAIMessage = {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n};\n\ntype OpenAIChatResponse = {\n id: string;\n choices?: Array<{\n message?: OpenAIMessage;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n};\n\nconst joinUrl = (base: string, path: string): string => {\n const trimmedBase = base.replace(/\\/+$/, '');\n const trimmedPath = path.replace(/^\\/+/, '');\n return `${trimmedBase}/${trimmedPath}`;\n};\n\nconst normalizeToolCalls = (toolCalls?: OpenAIToolCall[]): AiToolCall[] | undefined => {\n if (!toolCalls || !toolCalls.length) {\n return undefined;\n }\n\n return toolCalls.map((call, index) => ({\n id: call?.id ?? String(index),\n type: 'function',\n function: {\n name: call?.function?.name ?? '',\n arguments: call?.function?.arguments ?? '',\n },\n }));\n};\n\nconst normalizeUsage = (usage?: OpenAIChatResponse['usage']): AiUsage | undefined => {\n if (!usage) {\n return undefined;\n }\n\n return {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n};\n\nconst mapMessage = (message: AiMessage): Record<string, any> => {\n const mapped: Record<string, any> = {\n role: message.role,\n content: message.content,\n };\n\n if (message.name) {\n mapped.name = message.name;\n }\n if (message.toolCallId) {\n mapped.tool_call_id = message.toolCallId;\n }\n if (message.toolCalls?.length) {\n mapped.tool_calls = message.toolCalls.map((call) => ({\n id: call.id,\n type: call.type,\n function: {\n name: call.function.name,\n arguments: call.function.arguments,\n },\n }));\n }\n\n return mapped;\n};\n\nexport const createOpenAICompatibleProvider = (): AiProvider => {\n return {\n id: 'openai-compatible',\n sendChat: async (request: AiChatRequest, config: ResolvedAiClientConfig): Promise<AiChatResponse> => {\n if (request.stream) {\n throw new Error('Streaming is not supported in sendChat. Use streamChat when available.');\n }\n\n const model = request.model ?? config.model ?? DEFAULT_OPENAI_MODEL;\n if (!model) {\n throw new Error('Model is required for chat completion requests.');\n }\n\n const payload: Record<string, any> = {\n model,\n messages: request.messages.map(mapMessage),\n };\n\n if (request.temperature !== undefined) {\n payload.temperature = request.temperature;\n }\n if (request.maxTokens !== undefined) {\n payload.max_tokens = request.maxTokens;\n }\n if (request.topP !== undefined) {\n payload.top_p = request.topP;\n }\n if (request.stop !== undefined) {\n payload.stop = request.stop;\n }\n if (request.tools) {\n payload.tools = request.tools;\n }\n if (request.toolChoice) {\n payload.tool_choice = request.toolChoice;\n }\n\n const url = joinUrl(config.baseUrl || DEFAULT_OPENAI_BASE_URL, 'chat/completions');\n const response = await requestJson<OpenAIChatResponse>({\n url,\n method: 'POST',\n headers: config.headers,\n body: payload,\n timeoutMs: config.timeoutMs,\n requestAdapter: config.requestAdapter,\n });\n\n const firstMessage = response.choices?.[0]?.message;\n const toolCalls = normalizeToolCalls(firstMessage?.tool_calls);\n const content = firstMessage?.content ?? '';\n const assistantMessage: AiMessage = {\n role: 'assistant',\n content,\n toolCalls,\n };\n\n return {\n id: response.id ?? '',\n content,\n message: assistantMessage,\n usage: normalizeUsage(response.usage),\n toolCalls,\n raw: response,\n };\n },\n };\n};\n","import type {\n AiChatRequest,\n AiChatRequestOptions,\n AiChatResponse,\n AiClient,\n AiClientConfig,\n AiMessage,\n ResolvedAiClientConfig,\n} from '../types';\nimport type { AiProvider } from '../providers/types';\nimport { createOpenAICompatibleProvider } from '../providers/openai-compatible';\n\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\nconst resolveApiKey = async (config: AiClientConfig): Promise<string | undefined> => {\n if (config.apiKey) {\n return config.apiKey;\n }\n if (config.getApiKey) {\n return await config.getApiKey();\n }\n return undefined;\n};\n\nconst hasAuthorizationHeader = (headers: Record<string, string>): boolean => {\n return Object.keys(headers).some((key) => key.toLowerCase() === 'authorization');\n};\n\nconst resolveHeaders = async (config: AiClientConfig): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers ?? {}),\n };\n\n if (!hasAuthorizationHeader(headers)) {\n const apiKey = await resolveApiKey(config);\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n }\n\n return headers;\n};\n\nconst resolveClientConfig = async (config: AiClientConfig): Promise<ResolvedAiClientConfig> => {\n const headers = await resolveHeaders(config);\n\n return {\n ...config,\n baseUrl: config.baseUrl ?? 'https://api.openai.com/v1',\n headers,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n };\n};\n\nconst resolveProvider = (provider?: AiProvider): AiProvider => {\n return provider ?? createOpenAICompatibleProvider();\n};\n\nexport const createAiClient = (config: AiClientConfig): AiClient => {\n const provider = resolveProvider(config.provider);\n\n const sendChat = async (request: AiChatRequest): Promise<AiChatResponse> => {\n const resolvedConfig = await resolveClientConfig(config);\n config.logger?.debug?.('ai.sendChat', {\n model: request.model ?? resolvedConfig.model,\n messageCount: request.messages.length,\n });\n try {\n return await provider.sendChat(request, resolvedConfig);\n } catch (error) {\n config.logger?.error?.('ai.sendChat.error', error);\n throw error;\n }\n };\n\n type SendMessageOptions = AiChatRequestOptions & { systemPrompt?: string };\n\n const sendMessage = async (\n content: string,\n options?: SendMessageOptions\n ): Promise<AiChatResponse> => {\n const resolvedOptions: SendMessageOptions = options ?? {};\n const { systemPrompt, ...requestOptions } = resolvedOptions;\n\n const messages: AiMessage[] = [];\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n messages.push({ role: 'user', content });\n\n return sendChat({\n messages,\n ...requestOptions,\n });\n };\n\n return {\n sendChat,\n sendMessage,\n };\n};\n","import { applyPromptTemplate } from '../prompt/template';\nimport type { AiChatInputOptions, AiChatResponse, AiChatSession, AiChatSessionOptions, AiMessage } from '../types';\n\nconst buildBaseMessages = (systemPrompt?: string, initialMessages?: AiMessage[]): AiMessage[] => {\n const baseMessages: AiMessage[] = [];\n if (systemPrompt) {\n baseMessages.push({ role: 'system', content: systemPrompt });\n }\n if (initialMessages?.length) {\n baseMessages.push(...initialMessages);\n }\n return baseMessages;\n};\n\nexport const createChatSession = (options: AiChatSessionOptions): AiChatSession => {\n let systemPrompt = options.systemPrompt;\n let messages = buildBaseMessages(systemPrompt, options.initialMessages);\n\n const reset = () => {\n messages = buildBaseMessages(systemPrompt, options.initialMessages);\n };\n\n const setSystemPrompt = (prompt?: string) => {\n systemPrompt = prompt;\n reset();\n };\n\n const sendMessage = async (\n input: string,\n requestOptions: AiChatInputOptions = {}\n ): Promise<AiChatResponse> => {\n const { template, variables, ...chatOptions } = requestOptions;\n const activeTemplate = template ?? options.template;\n const mergedVariables = { input, ...(variables ?? {}) };\n const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;\n\n const userMessage: AiMessage = { role: 'user', content };\n const nextMessages = [...messages, userMessage];\n\n const response = await options.client.sendChat({\n messages: nextMessages,\n ...chatOptions,\n });\n\n const assistantMessage: AiMessage =\n response.message ?? {\n role: 'assistant',\n content: response.content,\n toolCalls: response.toolCalls,\n };\n\n messages = [...nextMessages, assistantMessage];\n\n return response;\n };\n\n return {\n getMessages: () => messages,\n setSystemPrompt,\n reset,\n sendMessage,\n };\n};\n","import type { AiToolDefinition } from '../types';\nimport type { SkillDefinition, SkillExecutionContext, SkillRegistry } from './types';\n\nexport const skillToToolDefinition = (skill: SkillDefinition): AiToolDefinition => {\n const toolDefinition: AiToolDefinition = {\n type: 'function',\n function: {\n name: skill.name,\n description: skill.description,\n },\n };\n\n if (skill.inputSchema) {\n toolDefinition.function.parameters = skill.inputSchema;\n }\n\n return toolDefinition;\n};\n\nexport class InMemorySkillRegistry implements SkillRegistry {\n private skills = new Map<string, SkillDefinition>();\n\n constructor(initialSkills?: SkillDefinition[]) {\n initialSkills?.forEach((skill) => {\n this.skills.set(skill.name, skill);\n });\n }\n\n registerSkill(skill: SkillDefinition): void {\n this.skills.set(skill.name, skill);\n }\n\n unregisterSkill(name: string): boolean {\n return this.skills.delete(name);\n }\n\n getSkill(name: string): SkillDefinition | undefined {\n return this.skills.get(name);\n }\n\n listSkills(): SkillDefinition[] {\n return Array.from(this.skills.values());\n }\n\n async executeSkill(name: string, input: any, context?: SkillExecutionContext): Promise<any> {\n const skill = this.skills.get(name);\n if (!skill) {\n throw new Error(`Skill not found: ${name}`);\n }\n return await skill.execute(input, context);\n }\n\n toToolDefinitions(): AiToolDefinition[] {\n return this.listSkills().map(skillToToolDefinition);\n }\n}\n\nexport const createSkillRegistry = (initialSkills?: SkillDefinition[]): InMemorySkillRegistry => {\n return new InMemorySkillRegistry(initialSkills);\n};\n"]}