@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.
- package/dist/agents/AgentLoader.d.ts +33 -0
- package/dist/agents/AgentLoader.d.ts.map +1 -0
- package/dist/agents/AgentLoader.js +167 -0
- package/dist/agents/AgentLoader.js.map +1 -0
- package/dist/agents/profiles.d.ts +3 -0
- package/dist/agents/profiles.d.ts.map +1 -0
- package/dist/agents/profiles.js +121 -0
- package/dist/agents/profiles.js.map +1 -0
- package/dist/agents/prompts/architecture.d.ts +2 -0
- package/dist/agents/prompts/architecture.d.ts.map +1 -0
- package/dist/agents/prompts/architecture.js +151 -0
- package/dist/agents/prompts/architecture.js.map +1 -0
- package/dist/agents/prompts/backend.d.ts +2 -0
- package/dist/agents/prompts/backend.d.ts.map +1 -0
- package/dist/agents/prompts/backend.js +96 -0
- package/dist/agents/prompts/backend.js.map +1 -0
- package/dist/agents/prompts/coder.d.ts +2 -0
- package/dist/agents/prompts/coder.d.ts.map +1 -0
- package/dist/agents/prompts/coder.js +50 -0
- package/dist/agents/prompts/coder.js.map +1 -0
- package/dist/agents/prompts/data.d.ts +2 -0
- package/dist/agents/prompts/data.d.ts.map +1 -0
- package/dist/agents/prompts/data.js +123 -0
- package/dist/agents/prompts/data.js.map +1 -0
- package/dist/agents/prompts/frontend.d.ts +2 -0
- package/dist/agents/prompts/frontend.d.ts.map +1 -0
- package/dist/agents/prompts/frontend.js +91 -0
- package/dist/agents/prompts/frontend.js.map +1 -0
- package/dist/agents/prompts/general.d.ts +2 -0
- package/dist/agents/prompts/general.d.ts.map +1 -0
- package/dist/agents/prompts/general.js +93 -0
- package/dist/agents/prompts/general.js.map +1 -0
- package/dist/agents/prompts/infrastructure.d.ts +2 -0
- package/dist/agents/prompts/infrastructure.d.ts.map +1 -0
- package/dist/agents/prompts/infrastructure.js +145 -0
- package/dist/agents/prompts/infrastructure.js.map +1 -0
- package/dist/agents/prompts/project-manager.d.ts +2 -0
- package/dist/agents/prompts/project-manager.d.ts.map +1 -0
- package/dist/agents/prompts/project-manager.js +66 -0
- package/dist/agents/prompts/project-manager.js.map +1 -0
- package/dist/agents/prompts/qa.d.ts +2 -0
- package/dist/agents/prompts/qa.d.ts.map +1 -0
- package/dist/agents/prompts/qa.js +166 -0
- package/dist/agents/prompts/qa.js.map +1 -0
- package/dist/agents/prompts/security.d.ts +2 -0
- package/dist/agents/prompts/security.d.ts.map +1 -0
- package/dist/agents/prompts/security.js +129 -0
- package/dist/agents/prompts/security.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +27 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +167 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/index.d.ts +160 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +340 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestration/capability-matrix.d.ts +10 -0
- package/dist/orchestration/capability-matrix.d.ts.map +1 -0
- package/dist/orchestration/capability-matrix.js +48 -0
- package/dist/orchestration/capability-matrix.js.map +1 -0
- package/dist/providers/AnthropicProvider.d.ts +20 -0
- package/dist/providers/AnthropicProvider.d.ts.map +1 -0
- package/dist/providers/AnthropicProvider.js +185 -0
- package/dist/providers/AnthropicProvider.js.map +1 -0
- package/dist/providers/DeepSeekProvider.d.ts +11 -0
- package/dist/providers/DeepSeekProvider.d.ts.map +1 -0
- package/dist/providers/DeepSeekProvider.js +18 -0
- package/dist/providers/DeepSeekProvider.js.map +1 -0
- package/dist/providers/OpenAICompatibleProvider.d.ts +22 -0
- package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -0
- package/dist/providers/OpenAICompatibleProvider.js +124 -0
- package/dist/providers/OpenAICompatibleProvider.js.map +1 -0
- package/dist/skills/builtins/global.d.ts +7 -0
- package/dist/skills/builtins/global.d.ts.map +1 -0
- package/dist/skills/builtins/global.js +208 -0
- package/dist/skills/builtins/global.js.map +1 -0
- package/dist/skills/builtins/go-pack.d.ts +7 -0
- package/dist/skills/builtins/go-pack.d.ts.map +1 -0
- package/dist/skills/builtins/go-pack.js +263 -0
- package/dist/skills/builtins/go-pack.js.map +1 -0
- package/dist/skills/builtins/java-pack.d.ts +7 -0
- package/dist/skills/builtins/java-pack.d.ts.map +1 -0
- package/dist/skills/builtins/java-pack.js +272 -0
- package/dist/skills/builtins/java-pack.js.map +1 -0
- package/dist/skills/builtins/kotlin-pack.d.ts +9 -0
- package/dist/skills/builtins/kotlin-pack.d.ts.map +1 -0
- package/dist/skills/builtins/kotlin-pack.js +292 -0
- package/dist/skills/builtins/kotlin-pack.js.map +1 -0
- package/dist/skills/builtins/node-pack.d.ts +7 -0
- package/dist/skills/builtins/node-pack.d.ts.map +1 -0
- package/dist/skills/builtins/node-pack.js +750 -0
- package/dist/skills/builtins/node-pack.js.map +1 -0
- package/dist/skills/builtins/python-pack.d.ts +7 -0
- package/dist/skills/builtins/python-pack.d.ts.map +1 -0
- package/dist/skills/builtins/python-pack.js +303 -0
- package/dist/skills/builtins/python-pack.js.map +1 -0
- package/dist/skills/index.d.ts +7 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +16 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/store/LearningRouter.d.ts +17 -0
- package/dist/store/LearningRouter.d.ts.map +1 -0
- package/dist/store/LearningRouter.js +165 -0
- package/dist/store/LearningRouter.js.map +1 -0
- package/dist/store/PersistentMemory.d.ts +10 -0
- package/dist/store/PersistentMemory.d.ts.map +1 -0
- package/dist/store/PersistentMemory.js +29 -0
- package/dist/store/PersistentMemory.js.map +1 -0
- package/dist/store/ProjectStore.d.ts +29 -0
- package/dist/store/ProjectStore.d.ts.map +1 -0
- package/dist/store/ProjectStore.js +191 -0
- package/dist/store/ProjectStore.js.map +1 -0
- package/dist/store/__tests__/PersistentMemory.test.d.ts +2 -0
- package/dist/store/__tests__/PersistentMemory.test.d.ts.map +1 -0
- package/dist/store/__tests__/PersistentMemory.test.js +46 -0
- package/dist/store/__tests__/PersistentMemory.test.js.map +1 -0
- package/dist/tools/__tests__/file-tools.test.d.ts +2 -0
- package/dist/tools/__tests__/file-tools.test.d.ts.map +1 -0
- package/dist/tools/__tests__/file-tools.test.js +144 -0
- package/dist/tools/__tests__/file-tools.test.js.map +1 -0
- package/dist/tools/__tests__/path-sandbox.test.d.ts +2 -0
- package/dist/tools/__tests__/path-sandbox.test.d.ts.map +1 -0
- package/dist/tools/__tests__/path-sandbox.test.js +45 -0
- package/dist/tools/__tests__/path-sandbox.test.js.map +1 -0
- package/dist/tools/__tests__/run-command.test.d.ts +2 -0
- package/dist/tools/__tests__/run-command.test.d.ts.map +1 -0
- package/dist/tools/__tests__/run-command.test.js +61 -0
- package/dist/tools/__tests__/run-command.test.js.map +1 -0
- package/dist/tools/append-log.d.ts +2 -0
- package/dist/tools/append-log.d.ts.map +1 -0
- package/dist/tools/append-log.js +3 -0
- package/dist/tools/append-log.js.map +1 -0
- package/dist/tools/edit-file.d.ts +2 -0
- package/dist/tools/edit-file.d.ts.map +1 -0
- package/dist/tools/edit-file.js +45 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/list-directory.d.ts +2 -0
- package/dist/tools/list-directory.d.ts.map +1 -0
- package/dist/tools/list-directory.js +47 -0
- package/dist/tools/list-directory.js.map +1 -0
- package/dist/tools/path-sandbox.d.ts +31 -0
- package/dist/tools/path-sandbox.d.ts.map +1 -0
- package/dist/tools/path-sandbox.js +99 -0
- package/dist/tools/path-sandbox.js.map +1 -0
- package/dist/tools/read-file.d.ts +2 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +28 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/run-command.d.ts +2 -0
- package/dist/tools/run-command.d.ts.map +1 -0
- package/dist/tools/run-command.js +192 -0
- package/dist/tools/run-command.js.map +1 -0
- package/dist/tools/save-audit.d.ts +4 -0
- package/dist/tools/save-audit.d.ts.map +1 -0
- package/dist/tools/save-audit.js +42 -0
- package/dist/tools/save-audit.js.map +1 -0
- package/dist/tools/save-context.d.ts +2 -0
- package/dist/tools/save-context.d.ts.map +1 -0
- package/dist/tools/save-context.js +18 -0
- package/dist/tools/save-context.js.map +1 -0
- package/dist/tools/save-learning.d.ts +2 -0
- package/dist/tools/save-learning.d.ts.map +1 -0
- package/dist/tools/save-learning.js +41 -0
- package/dist/tools/save-learning.js.map +1 -0
- package/dist/tools/save-user-preference.d.ts +3 -0
- package/dist/tools/save-user-preference.d.ts.map +1 -0
- package/dist/tools/save-user-preference.js +22 -0
- package/dist/tools/save-user-preference.js.map +1 -0
- package/dist/tools/search-files.d.ts +2 -0
- package/dist/tools/search-files.d.ts.map +1 -0
- package/dist/tools/search-files.js +170 -0
- package/dist/tools/search-files.js.map +1 -0
- package/dist/tools/secret-scanner.d.ts +15 -0
- package/dist/tools/secret-scanner.d.ts.map +1 -0
- package/dist/tools/secret-scanner.js +44 -0
- package/dist/tools/secret-scanner.js.map +1 -0
- package/dist/tools/update-session.d.ts +3 -0
- package/dist/tools/update-session.d.ts.map +1 -0
- package/dist/tools/update-session.js +49 -0
- package/dist/tools/update-session.js.map +1 -0
- package/dist/tools/write-file.d.ts +2 -0
- package/dist/tools/write-file.d.ts.map +1 -0
- package/dist/tools/write-file.js +32 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/workflows/InitWorkflow.d.ts +6 -0
- package/dist/workflows/InitWorkflow.d.ts.map +1 -0
- package/dist/workflows/InitWorkflow.js +448 -0
- package/dist/workflows/InitWorkflow.js.map +1 -0
- package/dist/workflows/__tests__/InitWorkflow.test.d.ts +2 -0
- package/dist/workflows/__tests__/InitWorkflow.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/InitWorkflow.test.js +43 -0
- package/dist/workflows/__tests__/InitWorkflow.test.js.map +1 -0
- 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 @@
|
|
|
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"}
|