sa2kit 3.4.0 → 3.7.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 (157) hide show
  1. package/dist/business/index.d.mts +2 -7
  2. package/dist/business/index.d.ts +2 -7
  3. package/dist/business/index.js +1761 -8045
  4. package/dist/business/index.js.map +1 -1
  5. package/dist/business/index.mjs +1169 -7452
  6. package/dist/business/index.mjs.map +1 -1
  7. package/dist/business/portfolio/index.d.mts +1 -2
  8. package/dist/business/portfolio/index.d.ts +1 -2
  9. package/dist/{chunk-KVYHCGRY.js → chunk-7Z3XR2Y4.js} +552 -263
  10. package/dist/chunk-7Z3XR2Y4.js.map +1 -0
  11. package/dist/chunk-XPY45Y75.js +1143 -0
  12. package/dist/chunk-XPY45Y75.js.map +1 -0
  13. package/dist/{chunk-YIRPPMCN.mjs → chunk-XSTMLLJV.mjs} +474 -198
  14. package/dist/chunk-XSTMLLJV.mjs.map +1 -0
  15. package/dist/chunk-ZJLS5JU5.mjs +1090 -0
  16. package/dist/chunk-ZJLS5JU5.mjs.map +1 -0
  17. package/dist/common/aiApi/client/index.d.mts +71 -0
  18. package/dist/common/aiApi/client/index.d.ts +71 -0
  19. package/dist/common/aiApi/client/index.js +165 -0
  20. package/dist/common/aiApi/client/index.js.map +1 -0
  21. package/dist/common/aiApi/client/index.mjs +151 -0
  22. package/dist/common/aiApi/client/index.mjs.map +1 -0
  23. package/dist/common/aiApi/index.d.mts +184 -0
  24. package/dist/common/aiApi/index.d.ts +184 -0
  25. package/dist/common/aiApi/index.js +217 -0
  26. package/dist/common/aiApi/index.mjs +4 -0
  27. package/dist/common/aiApi/server/index.d.mts +3 -0
  28. package/dist/common/aiApi/server/index.d.ts +3 -0
  29. package/dist/common/aiApi/server/index.js +217 -0
  30. package/dist/common/aiApi/server/index.mjs +4 -0
  31. package/dist/common/components/index.js +176 -177
  32. package/dist/common/components/index.mjs +1 -2
  33. package/dist/common/index.js +2 -3
  34. package/dist/common/index.mjs +1 -2
  35. package/dist/{index-BSmd4ikf.d.ts → index-B4wDXFL0.d.mts} +39 -2
  36. package/dist/{index-r2-zE3iC.d.mts → index-B4wDXFL0.d.ts} +39 -2
  37. package/dist/{index-DLLPTprx.d.mts → index-B9vXYzok.d.mts} +48 -13
  38. package/dist/{index-VFDbZxVM.d.ts → index-BZ0MhRau.d.ts} +48 -13
  39. package/dist/index.d.mts +703 -181
  40. package/dist/index.d.ts +703 -181
  41. package/dist/index.js +2921 -7257
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +2161 -6538
  44. package/dist/index.mjs.map +1 -1
  45. package/dist/types-CiqMQ-uu.d.mts +166 -0
  46. package/dist/types-CiqMQ-uu.d.ts +166 -0
  47. package/package.json +15 -60
  48. package/dist/CollisionBalls-DgKtscU2.d.mts +0 -41
  49. package/dist/CollisionBalls-DgKtscU2.d.ts +0 -41
  50. package/dist/business/calendar/index.d.mts +0 -6
  51. package/dist/business/calendar/index.d.ts +0 -6
  52. package/dist/business/calendar/index.js +0 -7433
  53. package/dist/business/calendar/index.js.map +0 -1
  54. package/dist/business/calendar/index.mjs +0 -7257
  55. package/dist/business/calendar/index.mjs.map +0 -1
  56. package/dist/business/calendar/routes/index.d.mts +0 -191
  57. package/dist/business/calendar/routes/index.d.ts +0 -191
  58. package/dist/business/calendar/routes/index.js +0 -844
  59. package/dist/business/calendar/routes/index.js.map +0 -1
  60. package/dist/business/calendar/routes/index.mjs +0 -826
  61. package/dist/business/calendar/routes/index.mjs.map +0 -1
  62. package/dist/chunk-3R6JHA6D.js +0 -120
  63. package/dist/chunk-3R6JHA6D.js.map +0 -1
  64. package/dist/chunk-4PJM4752.js +0 -4
  65. package/dist/chunk-4PJM4752.js.map +0 -1
  66. package/dist/chunk-7PMT4L4I.js +0 -324
  67. package/dist/chunk-7PMT4L4I.js.map +0 -1
  68. package/dist/chunk-FY2X3LYR.mjs +0 -3
  69. package/dist/chunk-FY2X3LYR.mjs.map +0 -1
  70. package/dist/chunk-GS4SAW25.mjs +0 -116
  71. package/dist/chunk-GS4SAW25.mjs.map +0 -1
  72. package/dist/chunk-HL4H2HF6.js +0 -279
  73. package/dist/chunk-HL4H2HF6.js.map +0 -1
  74. package/dist/chunk-IJIQUMAK.mjs +0 -272
  75. package/dist/chunk-IJIQUMAK.mjs.map +0 -1
  76. package/dist/chunk-KVYHCGRY.js.map +0 -1
  77. package/dist/chunk-MMDSZIXD.mjs +0 -286
  78. package/dist/chunk-MMDSZIXD.mjs.map +0 -1
  79. package/dist/chunk-N2O3OX5Y.mjs +0 -243
  80. package/dist/chunk-N2O3OX5Y.mjs.map +0 -1
  81. package/dist/chunk-RRQ2X26Z.js +0 -106
  82. package/dist/chunk-RRQ2X26Z.js.map +0 -1
  83. package/dist/chunk-RVNQI6BI.js +0 -249
  84. package/dist/chunk-RVNQI6BI.js.map +0 -1
  85. package/dist/chunk-UJUWDF7M.mjs +0 -336
  86. package/dist/chunk-UJUWDF7M.mjs.map +0 -1
  87. package/dist/chunk-VCKXK6V5.js +0 -345
  88. package/dist/chunk-VCKXK6V5.js.map +0 -1
  89. package/dist/chunk-VIEXDTNF.mjs +0 -100
  90. package/dist/chunk-VIEXDTNF.mjs.map +0 -1
  91. package/dist/chunk-YIRPPMCN.mjs.map +0 -1
  92. package/dist/common/ai/llm/core/index.d.mts +0 -70
  93. package/dist/common/ai/llm/core/index.d.ts +0 -70
  94. package/dist/common/ai/llm/core/index.js +0 -54
  95. package/dist/common/ai/llm/core/index.mjs +0 -5
  96. package/dist/common/ai/llm/electron/index.d.mts +0 -6
  97. package/dist/common/ai/llm/electron/index.d.ts +0 -6
  98. package/dist/common/ai/llm/electron/index.js +0 -67
  99. package/dist/common/ai/llm/electron/index.mjs +0 -10
  100. package/dist/common/ai/llm/index.d.mts +0 -3
  101. package/dist/common/ai/llm/index.d.ts +0 -3
  102. package/dist/common/ai/llm/index.js +0 -54
  103. package/dist/common/ai/llm/index.js.map +0 -1
  104. package/dist/common/ai/llm/index.mjs +0 -5
  105. package/dist/common/ai/llm/index.mjs.map +0 -1
  106. package/dist/common/ai/llm/miniapp/index.d.mts +0 -6
  107. package/dist/common/ai/llm/miniapp/index.d.ts +0 -6
  108. package/dist/common/ai/llm/miniapp/index.js +0 -59
  109. package/dist/common/ai/llm/miniapp/index.js.map +0 -1
  110. package/dist/common/ai/llm/miniapp/index.mjs +0 -6
  111. package/dist/common/ai/llm/miniapp/index.mjs.map +0 -1
  112. package/dist/common/ai/llm/rn/index.d.mts +0 -6
  113. package/dist/common/ai/llm/rn/index.d.ts +0 -6
  114. package/dist/common/ai/llm/rn/index.js +0 -59
  115. package/dist/common/ai/llm/rn/index.js.map +0 -1
  116. package/dist/common/ai/llm/rn/index.mjs +0 -6
  117. package/dist/common/ai/llm/rn/index.mjs.map +0 -1
  118. package/dist/common/ai/llm/ui/electron/index.d.mts +0 -5
  119. package/dist/common/ai/llm/ui/electron/index.d.ts +0 -5
  120. package/dist/common/ai/llm/ui/electron/index.js +0 -22
  121. package/dist/common/ai/llm/ui/electron/index.js.map +0 -1
  122. package/dist/common/ai/llm/ui/electron/index.mjs +0 -9
  123. package/dist/common/ai/llm/ui/electron/index.mjs.map +0 -1
  124. package/dist/common/ai/llm/ui/miniapp/index.d.mts +0 -9
  125. package/dist/common/ai/llm/ui/miniapp/index.d.ts +0 -9
  126. package/dist/common/ai/llm/ui/miniapp/index.js +0 -14
  127. package/dist/common/ai/llm/ui/miniapp/index.js.map +0 -1
  128. package/dist/common/ai/llm/ui/miniapp/index.mjs +0 -5
  129. package/dist/common/ai/llm/ui/miniapp/index.mjs.map +0 -1
  130. package/dist/common/ai/llm/ui/rn/index.d.mts +0 -9
  131. package/dist/common/ai/llm/ui/rn/index.d.ts +0 -9
  132. package/dist/common/ai/llm/ui/rn/index.js +0 -14
  133. package/dist/common/ai/llm/ui/rn/index.js.map +0 -1
  134. package/dist/common/ai/llm/ui/rn/index.mjs +0 -5
  135. package/dist/common/ai/llm/ui/rn/index.mjs.map +0 -1
  136. package/dist/common/ai/llm/ui/web/index.d.mts +0 -15
  137. package/dist/common/ai/llm/ui/web/index.d.ts +0 -15
  138. package/dist/common/ai/llm/ui/web/index.js +0 -21
  139. package/dist/common/ai/llm/ui/web/index.js.map +0 -1
  140. package/dist/common/ai/llm/ui/web/index.mjs +0 -8
  141. package/dist/common/ai/llm/ui/web/index.mjs.map +0 -1
  142. package/dist/common/ai/llm/web/index.d.mts +0 -6
  143. package/dist/common/ai/llm/web/index.d.ts +0 -6
  144. package/dist/common/ai/llm/web/index.js +0 -66
  145. package/dist/common/ai/llm/web/index.js.map +0 -1
  146. package/dist/common/ai/llm/web/index.mjs +0 -9
  147. package/dist/common/ai/llm/web/index.mjs.map +0 -1
  148. package/dist/index-BMgdH5dL.d.mts +0 -1716
  149. package/dist/index-IXMAeTtN.d.ts +0 -1716
  150. package/dist/types-B2rs_jq1.d.mts +0 -38
  151. package/dist/types-DgACCUpT.d.ts +0 -122
  152. package/dist/types-DwS2Eg0q.d.ts +0 -38
  153. package/dist/types-LU_BGSzk.d.mts +0 -122
  154. /package/dist/common/{ai/llm/core → aiApi}/index.js.map +0 -0
  155. /package/dist/common/{ai/llm/core → aiApi}/index.mjs.map +0 -0
  156. /package/dist/common/{ai/llm/electron → aiApi/server}/index.js.map +0 -0
  157. /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"]}