katanakit-js 6.4.3 → 6.7.1

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 (93) hide show
  1. package/README.md +4 -3
  2. package/dist/adapters/express/server.d.ts +133 -1
  3. package/dist/adapters/express/server.d.ts.map +1 -1
  4. package/dist/adapters/express/server.js +199 -97
  5. package/dist/adapters/express/server.js.map +1 -1
  6. package/dist/adapters/insforge/insforge.service.d.ts +139 -4
  7. package/dist/adapters/insforge/insforge.service.d.ts.map +1 -1
  8. package/dist/adapters/insforge/insforge.service.js +383 -213
  9. package/dist/adapters/insforge/insforge.service.js.map +1 -1
  10. package/dist/adapters/notion/notion.service.d.ts +130 -144
  11. package/dist/adapters/notion/notion.service.d.ts.map +1 -1
  12. package/dist/adapters/notion/notion.service.js +330 -341
  13. package/dist/adapters/notion/notion.service.js.map +1 -1
  14. package/dist/adapters/telegram/telegram.service.d.ts +82 -13
  15. package/dist/adapters/telegram/telegram.service.d.ts.map +1 -1
  16. package/dist/adapters/telegram/telegram.service.js +133 -55
  17. package/dist/adapters/telegram/telegram.service.js.map +1 -1
  18. package/dist/adapters/wordpress/wordpress.service.d.ts +181 -110
  19. package/dist/adapters/wordpress/wordpress.service.d.ts.map +1 -1
  20. package/dist/adapters/wordpress/wordpress.service.js +556 -465
  21. package/dist/adapters/wordpress/wordpress.service.js.map +1 -1
  22. package/dist/core/services/access.service.d.ts +167 -4
  23. package/dist/core/services/access.service.d.ts.map +1 -1
  24. package/dist/core/services/access.service.js +241 -31
  25. package/dist/core/services/access.service.js.map +1 -1
  26. package/dist/core/services/agent.service.d.ts +182 -27
  27. package/dist/core/services/agent.service.d.ts.map +1 -1
  28. package/dist/core/services/agent.service.js +296 -164
  29. package/dist/core/services/agent.service.js.map +1 -1
  30. package/dist/core/services/assistant.service.d.ts +96 -5
  31. package/dist/core/services/assistant.service.d.ts.map +1 -1
  32. package/dist/core/services/assistant.service.js +171 -66
  33. package/dist/core/services/assistant.service.js.map +1 -1
  34. package/dist/core/services/dates.service.d.ts +183 -11
  35. package/dist/core/services/dates.service.d.ts.map +1 -1
  36. package/dist/core/services/dates.service.js +256 -57
  37. package/dist/core/services/dates.service.js.map +1 -1
  38. package/dist/core/services/http.service.d.ts +172 -133
  39. package/dist/core/services/http.service.d.ts.map +1 -1
  40. package/dist/core/services/http.service.js +381 -310
  41. package/dist/core/services/http.service.js.map +1 -1
  42. package/dist/core/services/logger.service.d.ts +96 -34
  43. package/dist/core/services/logger.service.d.ts.map +1 -1
  44. package/dist/core/services/logger.service.js +128 -41
  45. package/dist/core/services/logger.service.js.map +1 -1
  46. package/dist/core/services/query.service.d.ts +101 -0
  47. package/dist/core/services/query.service.d.ts.map +1 -1
  48. package/dist/core/services/query.service.js +131 -14
  49. package/dist/core/services/query.service.js.map +1 -1
  50. package/dist/core/services/utils.service.d.ts +286 -131
  51. package/dist/core/services/utils.service.d.ts.map +1 -1
  52. package/dist/core/services/utils.service.js +417 -227
  53. package/dist/core/services/utils.service.js.map +1 -1
  54. package/dist/core/services/validation.service.d.ts +48 -3
  55. package/dist/core/services/validation.service.d.ts.map +1 -1
  56. package/dist/core/services/validation.service.js +75 -23
  57. package/dist/core/services/validation.service.js.map +1 -1
  58. package/dist/infrastructure/decorators/cache.decorator.d.ts +53 -0
  59. package/dist/infrastructure/decorators/cache.decorator.d.ts.map +1 -0
  60. package/dist/infrastructure/decorators/cache.decorator.js +47 -0
  61. package/dist/infrastructure/decorators/cache.decorator.js.map +1 -0
  62. package/dist/infrastructure/decorators/index.d.ts +4 -0
  63. package/dist/infrastructure/decorators/index.d.ts.map +1 -0
  64. package/dist/infrastructure/decorators/index.js +4 -0
  65. package/dist/infrastructure/decorators/index.js.map +1 -0
  66. package/dist/infrastructure/decorators/logger.decorator.d.ts +38 -0
  67. package/dist/infrastructure/decorators/logger.decorator.d.ts.map +1 -0
  68. package/dist/infrastructure/decorators/logger.decorator.js +66 -0
  69. package/dist/infrastructure/decorators/logger.decorator.js.map +1 -0
  70. package/dist/infrastructure/decorators/retry.decorator.d.ts +37 -0
  71. package/dist/infrastructure/decorators/retry.decorator.d.ts.map +1 -0
  72. package/dist/infrastructure/decorators/retry.decorator.js +54 -0
  73. package/dist/infrastructure/decorators/retry.decorator.js.map +1 -0
  74. package/dist/infrastructure/dom/dom.service.d.ts +11 -5
  75. package/dist/infrastructure/dom/dom.service.d.ts.map +1 -1
  76. package/dist/infrastructure/dom/dom.service.js +20 -6
  77. package/dist/infrastructure/dom/dom.service.js.map +1 -1
  78. package/dist/infrastructure/index.d.ts +1 -0
  79. package/dist/infrastructure/index.d.ts.map +1 -1
  80. package/dist/infrastructure/index.js +1 -0
  81. package/dist/infrastructure/index.js.map +1 -1
  82. package/dist/prisma/schema.json +17 -13
  83. package/dist/styles.css +2 -0
  84. package/package.json +32 -38
  85. package/scss/_flags.scss +179 -0
  86. package/scss/_functions.scss +168 -0
  87. package/scss/_mixins.scss +658 -0
  88. package/scss/_reset.scss +275 -0
  89. package/scss/_utilities.scss +449 -0
  90. package/scss/_variables.scss +539 -0
  91. package/scss/components/_index.scss +50 -0
  92. package/scss/demo.scss +12 -0
  93. package/scss/main.scss +56 -0
@@ -1,4 +1,4 @@
1
- import type { AgentResult, AgentRunOptions, AiChatOptions, AiMessage, AiProviderConfig, AiResult } from "../../types/index.js";
1
+ import type { AgentResult, AgentRunOptions, AiChatOptions, AiMessage, AiProviderConfig, AiResult, AiTool, AiToolCall } from "../../types/index.js";
2
2
  /** Default endpoint for Alibaba Cloud Model Studio (DashScope) compatible mode. */
3
3
  export declare const KITT_BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
4
4
  /** Default model for the Kitt assistant preset. */
@@ -7,11 +7,183 @@ export declare const KITT_DEFAULT_MODEL = "qwen3.8-max";
7
7
  export declare const KITT_SYSTEM_PROMPT = "You are Kitt, a helpful assistant. Answer clearly and concisely.";
8
8
  /** Reusable preset (base URL + model) for the Kitt assistant. */
9
9
  export declare const kittPreset: Pick<AiProviderConfig, "baseUrl" | "model">;
10
+ /** Shape of a `/chat/completions` response. */
11
+ interface ChatCompletionResponse {
12
+ choices?: Array<{
13
+ message?: {
14
+ content?: string | null;
15
+ tool_calls?: AiToolCall[];
16
+ };
17
+ finish_reason?: string | null;
18
+ }>;
19
+ error?: {
20
+ message?: string;
21
+ };
22
+ }
23
+ /** Request options shared by chat and agent calls. */
24
+ interface RequestOptions {
25
+ temperature?: number;
26
+ maxTokens?: number;
27
+ topP?: number;
28
+ signal?: AbortSignal;
29
+ tools?: AiTool[];
30
+ }
10
31
  /**
11
- * Registers the AI provider for the Kitt assistant.
32
+ * Estrategia de proveedor AI - Strategy Pattern.
33
+ *
34
+ * Define el contrato que toda implementación de proveedor de completions debe
35
+ * cumplir. El {@link AgentService} delega la llamada HTTP en una estrategia
36
+ * concreta, permitiendo intercambiar proveedores (DashScope, OpenAI,
37
+ * self-hosted, mock en tests) sin tocar el bucle del agente.
38
+ */
39
+ export interface IAiProviderStrategy {
40
+ /**
41
+ * Performs a single `chat/completions` request against the provider.
42
+ *
43
+ * @param config - Provider configuration (baseUrl, model, apiKey).
44
+ * @param messages - Conversation messages.
45
+ * @param options - Sampling options, tools and abort signal.
46
+ * @returns The parsed provider response.
47
+ * @throws On non-2xx responses or transport failures.
48
+ */
49
+ requestCompletion(config: AiProviderConfig, messages: AiMessage[], options: RequestOptions): Promise<ChatCompletionResponse>;
50
+ }
51
+ /**
52
+ * Estrategia por defecto: proveedor compatible con OpenAI
53
+ * (`POST /chat/completions` con Bearer token). Cubre DashScope en modo
54
+ * compatible, OpenAI, Azure OpenAI y la mayoría de endpoints self-hosted.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * const strategy = new OpenAiCompatibleStrategy();
59
+ * const response = await strategy.requestCompletion(config, messages, {});
60
+ * ```
61
+ */
62
+ export declare class OpenAiCompatibleStrategy implements IAiProviderStrategy {
63
+ /**
64
+ * Performs a raw `chat/completions` request against the provider.
65
+ * Throws {@link AiHttpError} on non-2xx responses.
66
+ */
67
+ requestCompletion(config: AiProviderConfig, messages: AiMessage[], options: RequestOptions): Promise<ChatCompletionResponse>;
68
+ }
69
+ /**
70
+ * AgentService - Singleton facade con Strategy Pattern.
12
71
  *
13
- * `apiKey` falls back to `process.env.DASHSCOPE_API_KEY`; `baseUrl`, `model`
14
- * and `systemPrompt` fall back to the {@link kittPreset} defaults.
72
+ * Centraliza el registro del proveedor AI y el bucle de completions,
73
+ * delegando la llamada HTTP en una {@link IAiProviderStrategy}
74
+ * intercambiable. Por defecto usa {@link OpenAiCompatibleStrategy}.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * // Configurar el proveedor
79
+ * AgentService.getInstance().useInitAgent({ apiKey: process.env.DASHSCOPE_API_KEY });
80
+ *
81
+ * // Cambiar de estrategia en runtime (p. ej. un mock en tests)
82
+ * AgentService.getInstance().useSetStrategy(new OpenAiCompatibleStrategy());
83
+ * ```
84
+ */
85
+ export declare class AgentService {
86
+ private static instance;
87
+ private provider;
88
+ private strategy;
89
+ /**
90
+ * Constructor privado - enforce singleton.
91
+ * @param strategy - Estrategia de proveedor a inyectar (opcional).
92
+ */
93
+ private constructor();
94
+ /**
95
+ * Obtiene la instancia única del AgentService (Singleton).
96
+ *
97
+ * @returns La instancia única de {@link AgentService}.
98
+ */
99
+ static getInstance(): AgentService;
100
+ /**
101
+ * Crea una instancia NO-singleton con una estrategia específica.
102
+ * Útil para tests o para aislar varios proveedores.
103
+ *
104
+ * @param strategy - Estrategia a inyectar.
105
+ * @returns Una nueva instancia de {@link AgentService}.
106
+ */
107
+ static create(strategy?: IAiProviderStrategy): AgentService;
108
+ /**
109
+ * Intercambia la estrategia de proveedor en runtime (Strategy Pattern).
110
+ *
111
+ * @param strategy - La nueva estrategia a utilizar.
112
+ */
113
+ useSetStrategy(strategy: IAiProviderStrategy): void;
114
+ /** Returns the currently active provider strategy. */
115
+ useGetStrategy(): IAiProviderStrategy;
116
+ /** Retrieves the configured provider or throws. */
117
+ private useGetProvider;
118
+ /**
119
+ * Registers the AI provider for the Kitt assistant.
120
+ *
121
+ * `apiKey` falls back to `process.env.DASHSCOPE_API_KEY`; `baseUrl`, `model`
122
+ * and `systemPrompt` fall back to the {@link kittPreset} defaults.
123
+ *
124
+ * @param config - Partial provider configuration.
125
+ *
126
+ * @example
127
+ * ```ts
128
+ * import { useInitAgent } from "katanakit-js";
129
+ *
130
+ * useInitAgent({
131
+ * apiKey: process.env.DASHSCOPE_API_KEY,
132
+ * model: "qwen3.8-max",
133
+ * });
134
+ * ```
135
+ */
136
+ useInitAgent(config?: Partial<AiProviderConfig>): void;
137
+ /**
138
+ * Sends a single chat completion and returns the assistant text as a Safe Result.
139
+ *
140
+ * Use this for review / questioning (single-shot). For autonomous multi-step
141
+ * work with tools, use {@link useRunAgent}.
142
+ *
143
+ * @param messages - Conversation messages (a system prompt is prepended if absent).
144
+ * @param options - Optional completion options.
145
+ * @returns A `AiResult` with the assistant text.
146
+ *
147
+ * @example
148
+ * ```ts
149
+ * import { useChat } from "katanakit-js";
150
+ *
151
+ * const result = await useChat([
152
+ * { role: "user", content: "Summarize the benefits of solar energy in three bullet points." },
153
+ * ]);
154
+ * if (result.ok) console.log(result.data);
155
+ * ```
156
+ */
157
+ useChat(messages: AiMessage[], options?: AiChatOptions): Promise<AiResult<string>>;
158
+ /**
159
+ * Runs the tool-calling agent loop against a goal until it emits a final
160
+ * answer or exhausts `maxSteps`.
161
+ *
162
+ * @param goal - The natural-language objective.
163
+ * @param options - Tools, step budget and completion options.
164
+ * @returns An `AgentResult` with the final message and executed steps.
165
+ *
166
+ * @example
167
+ * ```ts
168
+ * import { useRunAgent } from "katanakit-js";
169
+ *
170
+ * const result = await useRunAgent("Fix the type errors reported by tsc", {
171
+ * tools: [
172
+ * {
173
+ * name: "runCommand",
174
+ * description: "Runs a shell command and returns its output",
175
+ * parameters: { type: "object", properties: { command: { type: "string" } } },
176
+ * execute: (input) => shell.run(input.command),
177
+ * },
178
+ * ],
179
+ * maxSteps: 12,
180
+ * });
181
+ * ```
182
+ */
183
+ useRunAgent(goal: string, options?: AgentRunOptions): Promise<AgentResult>;
184
+ }
185
+ /**
186
+ * Registers the AI provider for the Kitt assistant.
15
187
  *
16
188
  * @param config - Partial provider configuration.
17
189
  *
@@ -19,30 +191,22 @@ export declare const kittPreset: Pick<AiProviderConfig, "baseUrl" | "model">;
19
191
  * ```ts
20
192
  * import { useInitAgent } from "katanakit-js";
21
193
  *
22
- * useInitAgent({
23
- * apiKey: process.env.DASHSCOPE_API_KEY,
24
- * model: "qwen3.8-max",
25
- * });
194
+ * useInitAgent({ apiKey: process.env.DASHSCOPE_API_KEY });
26
195
  * ```
27
196
  */
28
197
  export declare function useInitAgent(config?: Partial<AiProviderConfig>): void;
29
198
  /**
30
199
  * Sends a single chat completion and returns the assistant text as a Safe Result.
31
200
  *
32
- * Use this for review / questioning (single-shot). For autonomous multi-step
33
- * work with tools, use {@link useRunAgent}.
34
- *
35
201
  * @param messages - Conversation messages (a system prompt is prepended if absent).
36
202
  * @param options - Optional completion options.
37
- * @returns A {@link AiResult} with the assistant text.
203
+ * @returns An `AiResult` with the assistant text.
38
204
  *
39
205
  * @example
40
206
  * ```ts
41
207
  * import { useChat } from "katanakit-js";
42
208
  *
43
- * const result = await useChat([
44
- * { role: "user", content: "Summarize the benefits of solar energy in three bullet points." },
45
- * ]);
209
+ * const result = await useChat([{ role: "user", content: "Hello" }]);
46
210
  * if (result.ok) console.log(result.data);
47
211
  * ```
48
212
  */
@@ -53,24 +217,15 @@ export declare function useChat(messages: AiMessage[], options?: AiChatOptions):
53
217
  *
54
218
  * @param goal - The natural-language objective.
55
219
  * @param options - Tools, step budget and completion options.
56
- * @returns An {@link AgentResult} with the final message and executed steps.
220
+ * @returns An `AgentResult` with the final message and executed steps.
57
221
  *
58
222
  * @example
59
223
  * ```ts
60
224
  * import { useRunAgent } from "katanakit-js";
61
225
  *
62
- * const result = await useRunAgent("Fix the type errors reported by tsc", {
63
- * tools: [
64
- * {
65
- * name: "runCommand",
66
- * description: "Runs a shell command and returns its output",
67
- * parameters: { type: "object", properties: { command: { type: "string" } } },
68
- * execute: (input) => shell.run(input.command),
69
- * },
70
- * ],
71
- * maxSteps: 12,
72
- * });
226
+ * const result = await useRunAgent("Fix the type errors reported by tsc");
73
227
  * ```
74
228
  */
75
229
  export declare function useRunAgent(goal: string, options?: AgentRunOptions): Promise<AgentResult>;
230
+ export {};
76
231
  //# sourceMappingURL=agent.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/agent.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,WAAW,EACX,eAAe,EAEf,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,QAAQ,EAGR,MAAM,sBAAsB,CAAC;AAE9B,mFAAmF;AACnF,eAAO,MAAM,aAAa,2DAA2D,CAAC;AAEtF,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,qEACoC,CAAC;AAEpE,iEAAiE;AACjE,eAAO,MAAM,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,OAAO,CAGlE,CAAC;AAgLF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAAG,IAAI,CAiBzE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,OAAO,CAC5B,QAAQ,EAAE,SAAS,EAAE,EACrB,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAuB3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,WAAW,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAoB,GAC3B,OAAO,CAAC,WAAW,CAAC,CA4EtB"}
1
+ {"version":3,"file":"agent.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/agent.service.ts"],"names":[],"mappings":"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"}