@backendkit-labs/agent-coding 0.14.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 (193) hide show
  1. package/dist/agents/AgentLoader.d.ts +33 -0
  2. package/dist/agents/AgentLoader.d.ts.map +1 -0
  3. package/dist/agents/AgentLoader.js +167 -0
  4. package/dist/agents/AgentLoader.js.map +1 -0
  5. package/dist/agents/profiles.d.ts +3 -0
  6. package/dist/agents/profiles.d.ts.map +1 -0
  7. package/dist/agents/profiles.js +121 -0
  8. package/dist/agents/profiles.js.map +1 -0
  9. package/dist/agents/prompts/architecture.d.ts +2 -0
  10. package/dist/agents/prompts/architecture.d.ts.map +1 -0
  11. package/dist/agents/prompts/architecture.js +151 -0
  12. package/dist/agents/prompts/architecture.js.map +1 -0
  13. package/dist/agents/prompts/backend.d.ts +2 -0
  14. package/dist/agents/prompts/backend.d.ts.map +1 -0
  15. package/dist/agents/prompts/backend.js +96 -0
  16. package/dist/agents/prompts/backend.js.map +1 -0
  17. package/dist/agents/prompts/coder.d.ts +2 -0
  18. package/dist/agents/prompts/coder.d.ts.map +1 -0
  19. package/dist/agents/prompts/coder.js +50 -0
  20. package/dist/agents/prompts/coder.js.map +1 -0
  21. package/dist/agents/prompts/data.d.ts +2 -0
  22. package/dist/agents/prompts/data.d.ts.map +1 -0
  23. package/dist/agents/prompts/data.js +123 -0
  24. package/dist/agents/prompts/data.js.map +1 -0
  25. package/dist/agents/prompts/frontend.d.ts +2 -0
  26. package/dist/agents/prompts/frontend.d.ts.map +1 -0
  27. package/dist/agents/prompts/frontend.js +91 -0
  28. package/dist/agents/prompts/frontend.js.map +1 -0
  29. package/dist/agents/prompts/general.d.ts +2 -0
  30. package/dist/agents/prompts/general.d.ts.map +1 -0
  31. package/dist/agents/prompts/general.js +93 -0
  32. package/dist/agents/prompts/general.js.map +1 -0
  33. package/dist/agents/prompts/infrastructure.d.ts +2 -0
  34. package/dist/agents/prompts/infrastructure.d.ts.map +1 -0
  35. package/dist/agents/prompts/infrastructure.js +145 -0
  36. package/dist/agents/prompts/infrastructure.js.map +1 -0
  37. package/dist/agents/prompts/project-manager.d.ts +2 -0
  38. package/dist/agents/prompts/project-manager.d.ts.map +1 -0
  39. package/dist/agents/prompts/project-manager.js +66 -0
  40. package/dist/agents/prompts/project-manager.js.map +1 -0
  41. package/dist/agents/prompts/qa.d.ts +2 -0
  42. package/dist/agents/prompts/qa.d.ts.map +1 -0
  43. package/dist/agents/prompts/qa.js +166 -0
  44. package/dist/agents/prompts/qa.js.map +1 -0
  45. package/dist/agents/prompts/security.d.ts +2 -0
  46. package/dist/agents/prompts/security.d.ts.map +1 -0
  47. package/dist/agents/prompts/security.js +129 -0
  48. package/dist/agents/prompts/security.js.map +1 -0
  49. package/dist/config/ConfigLoader.d.ts +27 -0
  50. package/dist/config/ConfigLoader.d.ts.map +1 -0
  51. package/dist/config/ConfigLoader.js +167 -0
  52. package/dist/config/ConfigLoader.js.map +1 -0
  53. package/dist/index.d.ts +160 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +340 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/orchestration/capability-matrix.d.ts +10 -0
  58. package/dist/orchestration/capability-matrix.d.ts.map +1 -0
  59. package/dist/orchestration/capability-matrix.js +48 -0
  60. package/dist/orchestration/capability-matrix.js.map +1 -0
  61. package/dist/providers/AnthropicProvider.d.ts +20 -0
  62. package/dist/providers/AnthropicProvider.d.ts.map +1 -0
  63. package/dist/providers/AnthropicProvider.js +185 -0
  64. package/dist/providers/AnthropicProvider.js.map +1 -0
  65. package/dist/providers/DeepSeekProvider.d.ts +11 -0
  66. package/dist/providers/DeepSeekProvider.d.ts.map +1 -0
  67. package/dist/providers/DeepSeekProvider.js +18 -0
  68. package/dist/providers/DeepSeekProvider.js.map +1 -0
  69. package/dist/providers/OpenAICompatibleProvider.d.ts +22 -0
  70. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -0
  71. package/dist/providers/OpenAICompatibleProvider.js +124 -0
  72. package/dist/providers/OpenAICompatibleProvider.js.map +1 -0
  73. package/dist/skills/builtins/global.d.ts +7 -0
  74. package/dist/skills/builtins/global.d.ts.map +1 -0
  75. package/dist/skills/builtins/global.js +208 -0
  76. package/dist/skills/builtins/global.js.map +1 -0
  77. package/dist/skills/builtins/go-pack.d.ts +7 -0
  78. package/dist/skills/builtins/go-pack.d.ts.map +1 -0
  79. package/dist/skills/builtins/go-pack.js +263 -0
  80. package/dist/skills/builtins/go-pack.js.map +1 -0
  81. package/dist/skills/builtins/java-pack.d.ts +7 -0
  82. package/dist/skills/builtins/java-pack.d.ts.map +1 -0
  83. package/dist/skills/builtins/java-pack.js +272 -0
  84. package/dist/skills/builtins/java-pack.js.map +1 -0
  85. package/dist/skills/builtins/kotlin-pack.d.ts +9 -0
  86. package/dist/skills/builtins/kotlin-pack.d.ts.map +1 -0
  87. package/dist/skills/builtins/kotlin-pack.js +292 -0
  88. package/dist/skills/builtins/kotlin-pack.js.map +1 -0
  89. package/dist/skills/builtins/node-pack.d.ts +7 -0
  90. package/dist/skills/builtins/node-pack.d.ts.map +1 -0
  91. package/dist/skills/builtins/node-pack.js +750 -0
  92. package/dist/skills/builtins/node-pack.js.map +1 -0
  93. package/dist/skills/builtins/python-pack.d.ts +7 -0
  94. package/dist/skills/builtins/python-pack.d.ts.map +1 -0
  95. package/dist/skills/builtins/python-pack.js +303 -0
  96. package/dist/skills/builtins/python-pack.js.map +1 -0
  97. package/dist/skills/index.d.ts +7 -0
  98. package/dist/skills/index.d.ts.map +1 -0
  99. package/dist/skills/index.js +16 -0
  100. package/dist/skills/index.js.map +1 -0
  101. package/dist/store/LearningRouter.d.ts +17 -0
  102. package/dist/store/LearningRouter.d.ts.map +1 -0
  103. package/dist/store/LearningRouter.js +165 -0
  104. package/dist/store/LearningRouter.js.map +1 -0
  105. package/dist/store/PersistentMemory.d.ts +10 -0
  106. package/dist/store/PersistentMemory.d.ts.map +1 -0
  107. package/dist/store/PersistentMemory.js +29 -0
  108. package/dist/store/PersistentMemory.js.map +1 -0
  109. package/dist/store/ProjectStore.d.ts +29 -0
  110. package/dist/store/ProjectStore.d.ts.map +1 -0
  111. package/dist/store/ProjectStore.js +191 -0
  112. package/dist/store/ProjectStore.js.map +1 -0
  113. package/dist/store/__tests__/PersistentMemory.test.d.ts +2 -0
  114. package/dist/store/__tests__/PersistentMemory.test.d.ts.map +1 -0
  115. package/dist/store/__tests__/PersistentMemory.test.js +46 -0
  116. package/dist/store/__tests__/PersistentMemory.test.js.map +1 -0
  117. package/dist/tools/__tests__/file-tools.test.d.ts +2 -0
  118. package/dist/tools/__tests__/file-tools.test.d.ts.map +1 -0
  119. package/dist/tools/__tests__/file-tools.test.js +144 -0
  120. package/dist/tools/__tests__/file-tools.test.js.map +1 -0
  121. package/dist/tools/__tests__/path-sandbox.test.d.ts +2 -0
  122. package/dist/tools/__tests__/path-sandbox.test.d.ts.map +1 -0
  123. package/dist/tools/__tests__/path-sandbox.test.js +45 -0
  124. package/dist/tools/__tests__/path-sandbox.test.js.map +1 -0
  125. package/dist/tools/__tests__/run-command.test.d.ts +2 -0
  126. package/dist/tools/__tests__/run-command.test.d.ts.map +1 -0
  127. package/dist/tools/__tests__/run-command.test.js +61 -0
  128. package/dist/tools/__tests__/run-command.test.js.map +1 -0
  129. package/dist/tools/append-log.d.ts +2 -0
  130. package/dist/tools/append-log.d.ts.map +1 -0
  131. package/dist/tools/append-log.js +3 -0
  132. package/dist/tools/append-log.js.map +1 -0
  133. package/dist/tools/edit-file.d.ts +2 -0
  134. package/dist/tools/edit-file.d.ts.map +1 -0
  135. package/dist/tools/edit-file.js +45 -0
  136. package/dist/tools/edit-file.js.map +1 -0
  137. package/dist/tools/list-directory.d.ts +2 -0
  138. package/dist/tools/list-directory.d.ts.map +1 -0
  139. package/dist/tools/list-directory.js +47 -0
  140. package/dist/tools/list-directory.js.map +1 -0
  141. package/dist/tools/path-sandbox.d.ts +31 -0
  142. package/dist/tools/path-sandbox.d.ts.map +1 -0
  143. package/dist/tools/path-sandbox.js +99 -0
  144. package/dist/tools/path-sandbox.js.map +1 -0
  145. package/dist/tools/read-file.d.ts +2 -0
  146. package/dist/tools/read-file.d.ts.map +1 -0
  147. package/dist/tools/read-file.js +28 -0
  148. package/dist/tools/read-file.js.map +1 -0
  149. package/dist/tools/run-command.d.ts +2 -0
  150. package/dist/tools/run-command.d.ts.map +1 -0
  151. package/dist/tools/run-command.js +192 -0
  152. package/dist/tools/run-command.js.map +1 -0
  153. package/dist/tools/save-audit.d.ts +4 -0
  154. package/dist/tools/save-audit.d.ts.map +1 -0
  155. package/dist/tools/save-audit.js +42 -0
  156. package/dist/tools/save-audit.js.map +1 -0
  157. package/dist/tools/save-context.d.ts +2 -0
  158. package/dist/tools/save-context.d.ts.map +1 -0
  159. package/dist/tools/save-context.js +18 -0
  160. package/dist/tools/save-context.js.map +1 -0
  161. package/dist/tools/save-learning.d.ts +2 -0
  162. package/dist/tools/save-learning.d.ts.map +1 -0
  163. package/dist/tools/save-learning.js +41 -0
  164. package/dist/tools/save-learning.js.map +1 -0
  165. package/dist/tools/save-user-preference.d.ts +3 -0
  166. package/dist/tools/save-user-preference.d.ts.map +1 -0
  167. package/dist/tools/save-user-preference.js +22 -0
  168. package/dist/tools/save-user-preference.js.map +1 -0
  169. package/dist/tools/search-files.d.ts +2 -0
  170. package/dist/tools/search-files.d.ts.map +1 -0
  171. package/dist/tools/search-files.js +170 -0
  172. package/dist/tools/search-files.js.map +1 -0
  173. package/dist/tools/secret-scanner.d.ts +15 -0
  174. package/dist/tools/secret-scanner.d.ts.map +1 -0
  175. package/dist/tools/secret-scanner.js +44 -0
  176. package/dist/tools/secret-scanner.js.map +1 -0
  177. package/dist/tools/update-session.d.ts +3 -0
  178. package/dist/tools/update-session.d.ts.map +1 -0
  179. package/dist/tools/update-session.js +49 -0
  180. package/dist/tools/update-session.js.map +1 -0
  181. package/dist/tools/write-file.d.ts +2 -0
  182. package/dist/tools/write-file.d.ts.map +1 -0
  183. package/dist/tools/write-file.js +32 -0
  184. package/dist/tools/write-file.js.map +1 -0
  185. package/dist/workflows/InitWorkflow.d.ts +6 -0
  186. package/dist/workflows/InitWorkflow.d.ts.map +1 -0
  187. package/dist/workflows/InitWorkflow.js +448 -0
  188. package/dist/workflows/InitWorkflow.js.map +1 -0
  189. package/dist/workflows/__tests__/InitWorkflow.test.d.ts +2 -0
  190. package/dist/workflows/__tests__/InitWorkflow.test.d.ts.map +1 -0
  191. package/dist/workflows/__tests__/InitWorkflow.test.js +43 -0
  192. package/dist/workflows/__tests__/InitWorkflow.test.js.map +1 -0
  193. package/package.json +34 -0
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AnthropicProvider = void 0;
7
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
+ // ── Fix #14: concatenate all system messages ──────────────────────────────────
9
+ function toAnthropicMessages(messages) {
10
+ const systemParts = [];
11
+ const result = [];
12
+ let i = 0;
13
+ while (i < messages.length) {
14
+ const msg = messages[i];
15
+ if (msg.role === 'system') {
16
+ if (msg.content)
17
+ systemParts.push(msg.content);
18
+ i++;
19
+ continue;
20
+ }
21
+ if (msg.role === 'user') {
22
+ result.push({ role: 'user', content: msg.content ?? '' });
23
+ i++;
24
+ continue;
25
+ }
26
+ if (msg.role === 'assistant') {
27
+ const content = [];
28
+ if (msg.content)
29
+ content.push({ type: 'text', text: msg.content });
30
+ for (const tc of msg.tool_calls ?? []) {
31
+ content.push({
32
+ type: 'tool_use',
33
+ id: tc.id,
34
+ name: tc.function.name,
35
+ input: JSON.parse(tc.function.arguments || '{}'),
36
+ });
37
+ }
38
+ result.push({ role: 'assistant', content });
39
+ i++;
40
+ continue;
41
+ }
42
+ if (msg.role === 'tool') {
43
+ // Consecutive tool results → single user message with tool_result blocks
44
+ const toolResults = [];
45
+ while (i < messages.length && messages[i].role === 'tool') {
46
+ const t = messages[i];
47
+ toolResults.push({
48
+ type: 'tool_result',
49
+ tool_use_id: t.tool_call_id ?? '',
50
+ content: t.content ?? '',
51
+ });
52
+ i++;
53
+ }
54
+ result.push({ role: 'user', content: toolResults });
55
+ continue;
56
+ }
57
+ i++;
58
+ }
59
+ return {
60
+ system: systemParts.length > 0 ? systemParts.join('\n\n') : undefined,
61
+ messages: result,
62
+ };
63
+ }
64
+ // ── Helpers ───────────────────────────────────────────────────────────────────
65
+ function isRetryable(err) {
66
+ if (err && typeof err === 'object' && 'status' in err) {
67
+ const status = err.status;
68
+ return status === 429 || status >= 500;
69
+ }
70
+ return false;
71
+ }
72
+ function backoffMs(attempt) {
73
+ return Math.min(1000 * Math.pow(2, attempt), 16_000);
74
+ }
75
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms));
76
+ // ── Provider ──────────────────────────────────────────────────────────────────
77
+ class AnthropicProvider {
78
+ client;
79
+ model;
80
+ maxTokens;
81
+ temperature;
82
+ maxRetries;
83
+ constructor(opts) {
84
+ this.client = new sdk_1.default({ apiKey: opts.apiKey, maxRetries: 0 }); // we handle retries ourselves
85
+ this.model = opts.model ?? 'claude-sonnet-4-6';
86
+ this.maxTokens = opts.maxTokens ?? 8192;
87
+ this.temperature = opts.temperature ?? 0.0;
88
+ this.maxRetries = opts.maxRetries ?? 3;
89
+ }
90
+ async chat(messages, tools, callbacks) {
91
+ const { system, messages: anthropicMessages } = toAnthropicMessages(messages);
92
+ const anthropicTools = tools.map(t => ({
93
+ name: t.name,
94
+ description: t.description,
95
+ input_schema: t.parameters,
96
+ }));
97
+ let attempt = 0;
98
+ let contentEmitted = false;
99
+ while (attempt < this.maxRetries) {
100
+ attempt++;
101
+ try {
102
+ await this.stream({ system, anthropicMessages, anthropicTools }, {
103
+ ...callbacks,
104
+ onChunk: (delta) => {
105
+ contentEmitted = true;
106
+ callbacks.onChunk?.(delta);
107
+ },
108
+ });
109
+ return;
110
+ }
111
+ catch (err) {
112
+ // Never retry mid-stream — content was already emitted to the caller
113
+ if (contentEmitted || !isRetryable(err) || attempt >= this.maxRetries) {
114
+ callbacks.onError(err instanceof Error ? err : new Error(String(err)));
115
+ return;
116
+ }
117
+ await sleep(backoffMs(attempt));
118
+ }
119
+ }
120
+ }
121
+ async stream(params, callbacks) {
122
+ const stream = this.client.messages.stream({
123
+ model: this.model,
124
+ max_tokens: this.maxTokens,
125
+ temperature: this.temperature,
126
+ ...(params.system ? { system: params.system } : {}),
127
+ messages: params.anthropicMessages,
128
+ ...(params.anthropicTools.length > 0 ? { tools: params.anthropicTools } : {}),
129
+ }, { signal: callbacks.signal });
130
+ let contentBuffer = '';
131
+ const toolCallBuffers = new Map();
132
+ let inputTokens = 0;
133
+ let outputTokens = 0;
134
+ for await (const event of stream) {
135
+ // ── Fix #16: token counting ───────────────────────────────────────
136
+ if (event.type === 'message_start') {
137
+ inputTokens = event.message.usage.input_tokens;
138
+ }
139
+ else if (event.type === 'message_delta') {
140
+ outputTokens = event.usage.output_tokens;
141
+ }
142
+ else if (event.type === 'content_block_start') {
143
+ if (event.content_block.type === 'tool_use') {
144
+ toolCallBuffers.set(event.index, {
145
+ id: event.content_block.id,
146
+ name: event.content_block.name,
147
+ args: '',
148
+ });
149
+ }
150
+ }
151
+ else if (event.type === 'content_block_delta') {
152
+ if (event.delta.type === 'text_delta') {
153
+ contentBuffer += event.delta.text;
154
+ callbacks.onChunk?.(event.delta.text);
155
+ }
156
+ else if (event.delta.type === 'input_json_delta') {
157
+ const buf = toolCallBuffers.get(event.index);
158
+ if (buf)
159
+ buf.args += event.delta.partial_json;
160
+ }
161
+ }
162
+ }
163
+ // Report token usage to observability
164
+ if (inputTokens > 0 || outputTokens > 0) {
165
+ callbacks.onMetrics?.(inputTokens, outputTokens);
166
+ }
167
+ const toolCalls = Array.from(toolCallBuffers.entries())
168
+ .sort(([a], [b]) => a - b)
169
+ .map(([, buf]) => ({
170
+ id: buf.id,
171
+ type: 'function',
172
+ function: { name: buf.name, arguments: buf.args },
173
+ }));
174
+ for (const tc of toolCalls) {
175
+ callbacks.onToolCall?.(tc.function.name, tc.function.arguments, tc.id);
176
+ }
177
+ callbacks.onDone({
178
+ role: 'assistant',
179
+ content: contentBuffer || null,
180
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
181
+ });
182
+ }
183
+ }
184
+ exports.AnthropicProvider = AnthropicProvider;
185
+ //# sourceMappingURL=AnthropicProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnthropicProvider.js","sourceRoot":"","sources":["../../src/providers/AnthropicProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { OpenAICompatibleProvider } from './OpenAICompatibleProvider';
2
+ import type { OpenAICompatibleProviderOptions } from './OpenAICompatibleProvider';
3
+ export type DeepSeekProviderOptions = Omit<OpenAICompatibleProviderOptions, 'baseUrl' | 'model'> & {
4
+ model?: string;
5
+ baseUrl?: string;
6
+ };
7
+ /** Thin alias for OpenAICompatibleProvider pre-configured for DeepSeek */
8
+ export declare class DeepSeekProvider extends OpenAICompatibleProvider {
9
+ constructor(opts: DeepSeekProviderOptions);
10
+ }
11
+ //# sourceMappingURL=DeepSeekProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeepSeekProvider.d.ts","sourceRoot":"","sources":["../../src/providers/DeepSeekProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAElF,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,+BAA+B,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,0EAA0E;AAC1E,qBAAa,gBAAiB,SAAQ,wBAAwB;gBAC9C,IAAI,EAAE,uBAAuB;CAS5C"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeepSeekProvider = void 0;
4
+ const OpenAICompatibleProvider_1 = require("./OpenAICompatibleProvider");
5
+ /** Thin alias for OpenAICompatibleProvider pre-configured for DeepSeek */
6
+ class DeepSeekProvider extends OpenAICompatibleProvider_1.OpenAICompatibleProvider {
7
+ constructor(opts) {
8
+ super({
9
+ apiKey: opts.apiKey,
10
+ baseUrl: opts.baseUrl ?? 'https://api.deepseek.com/v1',
11
+ model: opts.model ?? 'deepseek-chat',
12
+ maxTokens: opts.maxTokens,
13
+ temperature: opts.temperature,
14
+ });
15
+ }
16
+ }
17
+ exports.DeepSeekProvider = DeepSeekProvider;
18
+ //# sourceMappingURL=DeepSeekProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeepSeekProvider.js","sourceRoot":"","sources":["../../src/providers/DeepSeekProvider.ts"],"names":[],"mappings":";;;AAAA,yEAAsE;AAQtE,0EAA0E;AAC1E,MAAa,gBAAiB,SAAQ,mDAAwB;IAC1D,YAAY,IAA6B;QACrC,KAAK,CAAC;YACF,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,6BAA6B;YACtD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,eAAe;YACpC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAChC,CAAC,CAAC;IACP,CAAC;CACJ;AAVD,4CAUC"}
@@ -0,0 +1,22 @@
1
+ import type { LLMProvider, LLMMessage, LLMStreamCallbacks, ToolDefinition } from '@backendkit-labs/agent-core';
2
+ export interface OpenAICompatibleProviderOptions {
3
+ apiKey: string;
4
+ baseUrl: string;
5
+ model: string;
6
+ maxTokens?: number;
7
+ temperature?: number;
8
+ /** Max retry attempts on transient errors (429, 5xx). Default: 3. */
9
+ maxRetries?: number;
10
+ }
11
+ export declare class OpenAICompatibleProvider implements LLMProvider {
12
+ private readonly client;
13
+ private readonly model;
14
+ private readonly maxTokens;
15
+ private readonly temperature;
16
+ private readonly maxRetries;
17
+ constructor(opts: OpenAICompatibleProviderOptions);
18
+ chat(messages: LLMMessage[], tools: ToolDefinition[], callbacks: LLMStreamCallbacks): Promise<void>;
19
+ private stream;
20
+ private buildTools;
21
+ }
22
+ //# sourceMappingURL=OpenAICompatibleProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAICompatibleProvider.d.ts","sourceRoot":"","sources":["../../src/providers/OpenAICompatibleProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE/G,MAAM,WAAW,+BAA+B;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAgBD,qBAAa,wBAAyB,YAAW,WAAW;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,IAAI,EAAE,+BAA+B;IAQ3C,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;YA8B3F,MAAM;IAiEpB,OAAO,CAAC,UAAU;CAMrB"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAICompatibleProvider = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ function isRetryable(err) {
9
+ if (err && typeof err === 'object' && 'status' in err) {
10
+ const status = err.status;
11
+ return status === 429 || status >= 500;
12
+ }
13
+ return false;
14
+ }
15
+ function backoffMs(attempt) {
16
+ return Math.min(1000 * Math.pow(2, attempt), 16_000);
17
+ }
18
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms));
19
+ class OpenAICompatibleProvider {
20
+ client;
21
+ model;
22
+ maxTokens;
23
+ temperature;
24
+ maxRetries;
25
+ constructor(opts) {
26
+ this.client = new openai_1.default({ apiKey: opts.apiKey, baseURL: opts.baseUrl, maxRetries: 0 });
27
+ this.model = opts.model;
28
+ this.maxTokens = opts.maxTokens ?? 16384;
29
+ this.temperature = opts.temperature ?? 0.0;
30
+ this.maxRetries = opts.maxRetries ?? 3;
31
+ }
32
+ async chat(messages, tools, callbacks) {
33
+ const openaiTools = tools.map(t => ({
34
+ type: 'function',
35
+ function: { name: t.name, description: t.description, parameters: t.parameters },
36
+ }));
37
+ let attempt = 0;
38
+ let contentEmitted = false;
39
+ while (attempt < this.maxRetries) {
40
+ attempt++;
41
+ try {
42
+ await this.stream(messages, openaiTools, {
43
+ ...callbacks,
44
+ onChunk: (delta) => {
45
+ contentEmitted = true;
46
+ callbacks.onChunk?.(delta);
47
+ },
48
+ });
49
+ return;
50
+ }
51
+ catch (err) {
52
+ if (contentEmitted || !isRetryable(err) || attempt >= this.maxRetries) {
53
+ callbacks.onError(err instanceof Error ? err : new Error(String(err)));
54
+ return;
55
+ }
56
+ await sleep(backoffMs(attempt));
57
+ }
58
+ }
59
+ }
60
+ async stream(messages, openaiTools, callbacks) {
61
+ const stream = await this.client.chat.completions.create({
62
+ model: this.model,
63
+ messages: messages,
64
+ tools: openaiTools.length > 0 ? openaiTools : undefined,
65
+ tool_choice: openaiTools.length > 0 ? 'auto' : undefined,
66
+ max_tokens: this.maxTokens,
67
+ temperature: this.temperature,
68
+ stream: true,
69
+ stream_options: { include_usage: true }, // Fix #16: enables usage in final chunk
70
+ }, { signal: callbacks.signal });
71
+ let contentBuffer = '';
72
+ const toolCallBuffers = new Map();
73
+ for await (const chunk of stream) {
74
+ // Fix #16: usage is in the final chunk when include_usage: true
75
+ if (chunk.usage) {
76
+ callbacks.onMetrics?.(chunk.usage.prompt_tokens, chunk.usage.completion_tokens);
77
+ }
78
+ const delta = chunk.choices[0]?.delta;
79
+ if (!delta)
80
+ continue;
81
+ if (delta.content) {
82
+ contentBuffer += delta.content;
83
+ callbacks.onChunk?.(delta.content);
84
+ }
85
+ if (delta.tool_calls) {
86
+ for (const tc of delta.tool_calls) {
87
+ if (!toolCallBuffers.has(tc.index)) {
88
+ toolCallBuffers.set(tc.index, { id: tc.id ?? '', name: '', args: '' });
89
+ }
90
+ const buf = toolCallBuffers.get(tc.index);
91
+ if (tc.id)
92
+ buf.id = tc.id;
93
+ if (tc.function?.name)
94
+ buf.name += tc.function.name;
95
+ if (tc.function?.arguments)
96
+ buf.args += tc.function.arguments;
97
+ }
98
+ }
99
+ }
100
+ const toolCalls = Array.from(toolCallBuffers.entries())
101
+ .sort(([a], [b]) => a - b)
102
+ .map(([, buf]) => ({
103
+ id: buf.id,
104
+ type: 'function',
105
+ function: { name: buf.name, arguments: buf.args },
106
+ }));
107
+ for (const tc of toolCalls) {
108
+ callbacks.onToolCall?.(tc.function.name, tc.function.arguments, tc.id);
109
+ }
110
+ callbacks.onDone({
111
+ role: 'assistant',
112
+ content: contentBuffer || null,
113
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
114
+ });
115
+ }
116
+ buildTools(tools) {
117
+ return tools.map(t => ({
118
+ type: 'function',
119
+ function: { name: t.name, description: t.description, parameters: t.parameters },
120
+ }));
121
+ }
122
+ }
123
+ exports.OpenAICompatibleProvider = OpenAICompatibleProvider;
124
+ //# sourceMappingURL=OpenAICompatibleProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAICompatibleProvider.js","sourceRoot":"","sources":["../../src/providers/OpenAICompatibleProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Skill } from '@backendkit-labs/agent-core';
2
+ /**
3
+ * Language-agnostic skills built into the framework.
4
+ * These are always available regardless of project stack.
5
+ */
6
+ export declare const GLOBAL_BUILTIN_SKILLS: Skill[];
7
+ //# sourceMappingURL=global.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../../../src/skills/builtins/global.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,EAuMxC,CAAC"}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GLOBAL_BUILTIN_SKILLS = void 0;
4
+ /**
5
+ * Language-agnostic skills built into the framework.
6
+ * These are always available regardless of project stack.
7
+ */
8
+ exports.GLOBAL_BUILTIN_SKILLS = [
9
+ {
10
+ name: 'conventional-commits',
11
+ version: '1.0.0',
12
+ description: 'Conventional Commits specification for any language or stack',
13
+ scope: 'global',
14
+ triggers: [
15
+ 'commit', 'conventional commit', 'commit message', 'mensaje de commit',
16
+ 'changelog', 'semantic versioning', 'semver', 'release notes',
17
+ ],
18
+ systemPromptAddition: `## Conventional Commits
19
+
20
+ Formato obligatorio para todos los commits:
21
+ \`<type>(<scope>): <description>\`
22
+
23
+ ### Tipos
24
+ | Tipo | Cuando usarlo |
25
+ |---|---|
26
+ | feat | Nueva funcionalidad |
27
+ | fix | Correccion de bug |
28
+ | refactor | Refactor sin cambio de comportamiento |
29
+ | test | Tests nuevos o modificados |
30
+ | docs | Solo documentacion |
31
+ | chore | Mantenimiento, dependencias, config |
32
+ | perf | Mejora de rendimiento |
33
+ | ci | Cambios en CI/CD |
34
+
35
+ ### Reglas
36
+ - Descripcion en imperativo: "add", "fix", "update" — no "added", "fixed"
37
+ - Sin punto al final
38
+ - Breaking change: agrega "!" antes de ":" o pie de pagina "BREAKING CHANGE:"
39
+ - Scope opcional: nombre del modulo o dominio afectado`,
40
+ },
41
+ {
42
+ name: 'code-review',
43
+ version: '1.0.0',
44
+ description: 'Code review checklist and best practices for any language',
45
+ scope: 'global',
46
+ triggers: [
47
+ 'code review', 'revisar codigo', 'revisión de codigo', 'pull request',
48
+ 'pr review', 'review checklist', 'revisión', 'code quality',
49
+ ],
50
+ systemPromptAddition: `## Code Review
51
+
52
+ Al revisar codigo, evalua en este orden:
53
+
54
+ ### 1. Correctitud
55
+ - El codigo hace lo que dice que hace?
56
+ - Maneja edge cases y errores?
57
+ - Hay race conditions o problemas de concurrencia?
58
+
59
+ ### 2. Legibilidad
60
+ - Los nombres son descriptivos y consistentes?
61
+ - La logica es facil de seguir sin comentarios?
62
+ - Las funciones hacen una sola cosa?
63
+
64
+ ### 3. Mantenibilidad
65
+ - Hay duplicacion que deberia extraerse?
66
+ - Las abstracciones son las correctas (ni muy pocas ni demasiadas)?
67
+ - Los tests cubren el comportamiento, no la implementacion?
68
+
69
+ ### 4. Seguridad
70
+ - Hay inputs del usuario sin validar?
71
+ - Se expone informacion sensible en logs o errores?
72
+ - Las dependencias tienen vulnerabilidades conocidas?
73
+
74
+ ### 5. Rendimiento
75
+ - Hay N+1 queries o loops innecesarios?
76
+ - Se cachea lo que deberia cachearse?
77
+ - El impacto en memoria y CPU es razonable?
78
+
79
+ Formato de feedback: especifica archivo, linea y razon. Separa bloqueantes de sugerencias.`,
80
+ },
81
+ {
82
+ name: 'tdd',
83
+ version: '1.0.0',
84
+ description: 'Test-Driven Development discipline for any language',
85
+ scope: 'global',
86
+ triggers: [
87
+ 'tdd', 'test driven', 'test-driven development', 'red green refactor',
88
+ 'escribir tests primero', 'tests antes', 'coverage', 'cobertura',
89
+ ],
90
+ systemPromptAddition: `## Test-Driven Development
91
+
92
+ ### Ciclo obligatorio: Red → Green → Refactor
93
+ 1. **Red** — escribe el test que falla primero. El test define el comportamiento esperado.
94
+ 2. **Green** — escribe el minimo codigo para que el test pase. No sobredisenes.
95
+ 3. **Refactor** — mejora el codigo sin cambiar el comportamiento. Los tests deben seguir pasando.
96
+
97
+ ### Que testear
98
+ - Comportamiento observable, no implementacion interna
99
+ - Edge cases: nulo, vacio, maximo, minimo
100
+ - Casos de error: que pasa cuando algo falla
101
+
102
+ ### Que NO testear
103
+ - Detalles de implementacion que pueden cambiar
104
+ - Librerias de terceros (confiar en sus propios tests)
105
+ - Codigo trivial sin logica de negocio
106
+
107
+ ### Estructura de un buen test (AAA)
108
+ \`\`\`
109
+ // Arrange — preparar el estado inicial
110
+ // Act — ejecutar la accion bajo prueba
111
+ // Assert — verificar el resultado esperado
112
+ \`\`\`
113
+
114
+ ### Reglas
115
+ - Un test = una assertion logica (puede tener varias lineas de expect)
116
+ - Nombre del test: describe QUE hace, no COMO lo hace
117
+ - Tests deben ser deterministicos: mismo input = mismo output siempre`,
118
+ },
119
+ {
120
+ name: 'adr',
121
+ version: '1.0.0',
122
+ description: 'Architecture Decision Records — document significant design choices',
123
+ scope: 'global',
124
+ triggers: [
125
+ 'adr', 'architecture decision', 'decision de arquitectura', 'architectural record',
126
+ 'decision record', 'doc arquitectura', 'documentar decision',
127
+ ],
128
+ systemPromptAddition: `## Architecture Decision Records (ADR)
129
+
130
+ Usa este formato para documentar decisiones de arquitectura significativas.
131
+
132
+ ### Cuando crear un ADR
133
+ - Cambias una tecnologia o framework
134
+ - Adoptas un patron arquitectonico
135
+ - Rechazas una alternativa que alguien podria proponer en el futuro
136
+ - La decision tiene consecuencias a largo plazo o es dificil de revertir
137
+
138
+ ### Formato
139
+ \`\`\`markdown
140
+ # ADR-{numero}: {titulo breve}
141
+
142
+ **Fecha:** YYYY-MM-DD
143
+ **Estado:** Propuesto | Aceptado | Rechazado | Deprecado | Supersedido por ADR-{n}
144
+
145
+ ## Contexto
146
+ Por que necesitamos tomar esta decision? Cual es el problema o necesidad?
147
+
148
+ ## Decision
149
+ Que decidimos hacer?
150
+
151
+ ## Consecuencias
152
+ ### Positivas
153
+ - ...
154
+
155
+ ### Negativas / Trade-offs
156
+ - ...
157
+
158
+ ## Alternativas consideradas
159
+ - **{Alternativa A}** — por que fue descartada
160
+ - **{Alternativa B}** — por que fue descartada
161
+ \`\`\`
162
+
163
+ Guarda los ADRs en \`docs/adr/\` o \`architecture/decisions/\`.`,
164
+ },
165
+ {
166
+ name: 'security-checklist',
167
+ version: '1.0.0',
168
+ description: 'OWASP-based security checklist for any stack',
169
+ scope: 'global',
170
+ triggers: [
171
+ 'seguridad', 'security', 'owasp', 'vulnerabilidad', 'vulnerability',
172
+ 'pentest', 'auditoria de seguridad', 'security audit', 'hardening',
173
+ 'sql injection', 'xss', 'csrf', 'autenticacion', 'autorizacion',
174
+ ],
175
+ systemPromptAddition: `## Security Checklist (OWASP Top 10)
176
+
177
+ Al revisar o implementar codigo, verifica:
178
+
179
+ ### Inputs y validacion
180
+ - Todo input del usuario se valida y sanitiza antes de usarse
181
+ - Nunca se construyen queries con concatenacion de strings (usar parametrized queries)
182
+ - Los archivos subidos se validan en tipo, tamanio y contenido
183
+
184
+ ### Autenticacion y sesiones
185
+ - Passwords hasheados con bcrypt/argon2/scrypt (nunca MD5/SHA1)
186
+ - Tokens JWT validados en firma, expiracion y claims
187
+ - Sesiones invalidadas al logout
188
+
189
+ ### Autorizacion
190
+ - Cada endpoint verifica permisos, no solo autenticacion
191
+ - IDOR: no se puede acceder a recursos de otro usuario cambiando el ID
192
+
193
+ ### Datos sensibles
194
+ - Secretos en variables de entorno, nunca en codigo o logs
195
+ - HTTPS obligatorio en produccion
196
+ - Datos sensibles no se logean (tokens, passwords, PII)
197
+
198
+ ### Headers y configuracion
199
+ - CORS configurado restrictivamente (no "*" en produccion)
200
+ - CSP, X-Frame-Options, HSTS configurados
201
+ - Dependencias sin vulnerabilidades conocidas (npm audit, pip audit)
202
+
203
+ ### Errores
204
+ - Mensajes de error genericos al cliente (no exponer stack traces)
205
+ - Errores detallados solo en logs internos`,
206
+ },
207
+ ];
208
+ //# sourceMappingURL=global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.js","sourceRoot":"","sources":["../../../src/skills/builtins/global.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACU,QAAA,qBAAqB,GAAY;IAC1C;QACI,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,8DAA8D;QAC3E,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;YACN,QAAQ,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,mBAAmB;YACtE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,eAAe;SAChE;QACD,oBAAoB,EAAE;;;;;;;;;;;;;;;;;;;;;uDAqByB;KAClD;IACD;QACI,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,2DAA2D;QACxE,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;YACN,aAAa,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc;YACtE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc;SAC/D;QACD,oBAAoB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2FA6B6D;KACtF;IACD;QACI,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,qDAAqD;QAClE,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;YACN,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,oBAAoB;YACrE,wBAAwB,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW;SACnE;QACD,oBAAoB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;sEA2BwC;KACjE;IACD;QACI,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,uEAAuE;QACpF,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;YACN,KAAK,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,sBAAsB;YAClF,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB;SAC/D;QACD,oBAAoB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gEAmCkC;KAC3D;IACD;QACI,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,8CAA8C;QAC3D,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;YACN,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe;YACnE,SAAS,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,WAAW;YAClE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc;SAClE;QACD,oBAAoB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA8Ba;KACtC;CACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Skill } from '@backendkit-labs/agent-core';
2
+ /**
3
+ * Go skill pack (@bk-go).
4
+ * Activated for projects with go.mod.
5
+ */
6
+ export declare const GO_PACK_SKILLS: Skill[];
7
+ //# sourceMappingURL=go-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-pack.d.ts","sourceRoot":"","sources":["../../../src/skills/builtins/go-pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,EA8PjC,CAAC"}