ineedcodes 0.1.7 → 0.2.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/agent.mjs +244 -0
- package/package.json +10 -25
- package/docs/assets/ineed-logo.svg +0 -161
- package/docs/configuration.md +0 -71
- package/docs/skills.md +0 -58
- package/packages/agent/dist/boost.d.ts +0 -34
- package/packages/agent/dist/boost.js +0 -138
- package/packages/agent/dist/boost.js.map +0 -1
- package/packages/agent/dist/events.d.ts +0 -67
- package/packages/agent/dist/events.js +0 -16
- package/packages/agent/dist/events.js.map +0 -1
- package/packages/agent/dist/index.d.ts +0 -6
- package/packages/agent/dist/index.js +0 -7
- package/packages/agent/dist/index.js.map +0 -1
- package/packages/agent/dist/lead-agent.d.ts +0 -85
- package/packages/agent/dist/lead-agent.js +0 -235
- package/packages/agent/dist/lead-agent.js.map +0 -1
- package/packages/agent/dist/orchestrator.d.ts +0 -43
- package/packages/agent/dist/orchestrator.js +0 -135
- package/packages/agent/dist/orchestrator.js.map +0 -1
- package/packages/agent/dist/runtime.d.ts +0 -44
- package/packages/agent/dist/runtime.js +0 -265
- package/packages/agent/dist/runtime.js.map +0 -1
- package/packages/agent/dist/system-prompts.d.ts +0 -24
- package/packages/agent/dist/system-prompts.js +0 -91
- package/packages/agent/dist/system-prompts.js.map +0 -1
- package/packages/agent/package.json +0 -21
- package/packages/cli/dist/index.d.ts +0 -3
- package/packages/cli/dist/index.js +0 -11426
- package/packages/cli/dist/index.js.map +0 -1
- package/packages/cli/dist/setup.d.ts +0 -37
- package/packages/cli/dist/setup.js +0 -250
- package/packages/cli/dist/setup.js.map +0 -1
- package/packages/cli/dist/tools-setup.d.ts +0 -12
- package/packages/cli/dist/tools-setup.js +0 -28
- package/packages/cli/dist/tools-setup.js.map +0 -1
- package/packages/cli/dist/ui/approval.d.ts +0 -12
- package/packages/cli/dist/ui/approval.js +0 -52
- package/packages/cli/dist/ui/approval.js.map +0 -1
- package/packages/cli/dist/ui/colors.d.ts +0 -14
- package/packages/cli/dist/ui/colors.js +0 -21
- package/packages/cli/dist/ui/colors.js.map +0 -1
- package/packages/cli/dist/ui/prompts.d.ts +0 -46
- package/packages/cli/dist/ui/prompts.js +0 -135
- package/packages/cli/dist/ui/prompts.js.map +0 -1
- package/packages/cli/dist/ui/renderer.d.ts +0 -13
- package/packages/cli/dist/ui/renderer.js +0 -95
- package/packages/cli/dist/ui/renderer.js.map +0 -1
- package/packages/cli/package.json +0 -23
- package/packages/core/dist/config/config.d.ts +0 -32
- package/packages/core/dist/config/config.js +0 -43
- package/packages/core/dist/config/config.js.map +0 -1
- package/packages/core/dist/context/engine.d.ts +0 -25
- package/packages/core/dist/context/engine.js +0 -98
- package/packages/core/dist/context/engine.js.map +0 -1
- package/packages/core/dist/index.d.ts +0 -20
- package/packages/core/dist/index.js +0 -21
- package/packages/core/dist/index.js.map +0 -1
- package/packages/core/dist/llm/openai-compatible.d.ts +0 -23
- package/packages/core/dist/llm/openai-compatible.js +0 -177
- package/packages/core/dist/llm/openai-compatible.js.map +0 -1
- package/packages/core/dist/memory/icm-adapter.d.ts +0 -31
- package/packages/core/dist/memory/icm-adapter.js +0 -98
- package/packages/core/dist/memory/icm-adapter.js.map +0 -1
- package/packages/core/dist/permissions/permissions.d.ts +0 -28
- package/packages/core/dist/permissions/permissions.js +0 -89
- package/packages/core/dist/permissions/permissions.js.map +0 -1
- package/packages/core/dist/security/secrets.d.ts +0 -4
- package/packages/core/dist/security/secrets.js +0 -43
- package/packages/core/dist/security/secrets.js.map +0 -1
- package/packages/core/dist/session/store.d.ts +0 -16
- package/packages/core/dist/session/store.js +0 -54
- package/packages/core/dist/session/store.js.map +0 -1
- package/packages/core/dist/shell/process.d.ts +0 -26
- package/packages/core/dist/shell/process.js +0 -128
- package/packages/core/dist/shell/process.js.map +0 -1
- package/packages/core/dist/skills/loader.d.ts +0 -9
- package/packages/core/dist/skills/loader.js +0 -163
- package/packages/core/dist/skills/loader.js.map +0 -1
- package/packages/core/dist/tools/fs.d.ts +0 -10
- package/packages/core/dist/tools/fs.js +0 -409
- package/packages/core/dist/tools/fs.js.map +0 -1
- package/packages/core/dist/tools/git.d.ts +0 -7
- package/packages/core/dist/tools/git.js +0 -251
- package/packages/core/dist/tools/git.js.map +0 -1
- package/packages/core/dist/tools/mcp.d.ts +0 -42
- package/packages/core/dist/tools/mcp.js +0 -158
- package/packages/core/dist/tools/mcp.js.map +0 -1
- package/packages/core/dist/tools/registry.d.ts +0 -21
- package/packages/core/dist/tools/registry.js +0 -50
- package/packages/core/dist/tools/registry.js.map +0 -1
- package/packages/core/dist/tools/search.d.ts +0 -2
- package/packages/core/dist/tools/search.js +0 -243
- package/packages/core/dist/tools/search.js.map +0 -1
- package/packages/core/dist/tools/shell.d.ts +0 -8
- package/packages/core/dist/tools/shell.js +0 -164
- package/packages/core/dist/tools/shell.js.map +0 -1
- package/packages/core/dist/tools/web.d.ts +0 -14
- package/packages/core/dist/tools/web.js +0 -125
- package/packages/core/dist/tools/web.js.map +0 -1
- package/packages/core/dist/types.d.ts +0 -202
- package/packages/core/dist/types.js +0 -7
- package/packages/core/dist/types.js.map +0 -1
- package/packages/core/dist/util/fs.d.ts +0 -5
- package/packages/core/dist/util/fs.js +0 -33
- package/packages/core/dist/util/fs.js.map +0 -1
- package/packages/core/dist/util/shell-quote.d.ts +0 -7
- package/packages/core/dist/util/shell-quote.js +0 -20
- package/packages/core/dist/util/shell-quote.js.map +0 -1
- package/packages/core/dist/workspace/workspace.d.ts +0 -15
- package/packages/core/dist/workspace/workspace.js +0 -84
- package/packages/core/dist/workspace/workspace.js.map +0 -1
- package/packages/core/package.json +0 -22
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
export class OpenAICompatibleProvider {
|
|
2
|
-
config;
|
|
3
|
-
id;
|
|
4
|
-
model;
|
|
5
|
-
contextLimit;
|
|
6
|
-
temperature;
|
|
7
|
-
maxRetries;
|
|
8
|
-
constructor(config, providerId = 'openai-compatible') {
|
|
9
|
-
this.config = config;
|
|
10
|
-
this.id = providerId;
|
|
11
|
-
this.model = config.model;
|
|
12
|
-
this.contextLimit = config.contextLimit ?? 128_000;
|
|
13
|
-
this.temperature = config.temperature ?? 0.2;
|
|
14
|
-
this.maxRetries = config.maxRetries ?? 2;
|
|
15
|
-
}
|
|
16
|
-
async complete(request) {
|
|
17
|
-
let lastError;
|
|
18
|
-
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
19
|
-
try {
|
|
20
|
-
return await this.attempt(request);
|
|
21
|
-
}
|
|
22
|
-
catch (err) {
|
|
23
|
-
lastError = err instanceof Error ? err : new Error(String(err));
|
|
24
|
-
if (request.signal?.aborted)
|
|
25
|
-
throw lastError;
|
|
26
|
-
const retriable = /timeout|econn|fetch failed|5\d\d|rate limit|overloaded/i.test(lastError.message);
|
|
27
|
-
if (!retriable || attempt === this.maxRetries)
|
|
28
|
-
break;
|
|
29
|
-
await sleep(500 * Math.pow(2, attempt));
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
throw lastError ?? new Error('LLM request failed');
|
|
33
|
-
}
|
|
34
|
-
async attempt(request) {
|
|
35
|
-
const apiKey = this.config.apiKey;
|
|
36
|
-
if (!apiKey) {
|
|
37
|
-
throw new Error('No API key configured. Set INEEDCODES_API_KEY (or add a provider in ~/.ineedcodes/config.json).');
|
|
38
|
-
}
|
|
39
|
-
const body = {
|
|
40
|
-
model: this.model,
|
|
41
|
-
messages: request.messages.map(toWire),
|
|
42
|
-
temperature: request.temperature ?? this.temperature,
|
|
43
|
-
max_tokens: request.maxTokens,
|
|
44
|
-
stream: true,
|
|
45
|
-
stream_options: { include_usage: true }
|
|
46
|
-
};
|
|
47
|
-
if (request.tools?.length) {
|
|
48
|
-
body.tools = request.tools.map((t) => ({
|
|
49
|
-
type: 'function',
|
|
50
|
-
function: { name: t.name, description: t.description, parameters: t.inputSchema }
|
|
51
|
-
}));
|
|
52
|
-
}
|
|
53
|
-
// Reasoning effort must actually change provider behavior.
|
|
54
|
-
// GLM 5.3-style models ALWAYS think and reject thinking:disabled: they accept
|
|
55
|
-
// effort levels (low/high/max) instead. So:
|
|
56
|
-
// - reasoning_effort: always sent when the user picked a level (OpenAI o-series reads this)
|
|
57
|
-
// - thinking.enabled: only for medium/high; LOW omits the switch entirely
|
|
58
|
-
// (sending disabled makes always-thinking models return HTTP 400)
|
|
59
|
-
if (request.reasoningEffort) {
|
|
60
|
-
body.reasoning_effort = request.reasoningEffort;
|
|
61
|
-
if (request.reasoningEffort !== 'low') {
|
|
62
|
-
body['thinking'] = { type: 'enabled' };
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
const controller = new AbortController();
|
|
66
|
-
const onAbort = () => controller.abort();
|
|
67
|
-
request.signal?.addEventListener('abort', onAbort, { once: true });
|
|
68
|
-
const timeout = setTimeout(() => controller.abort(), 180_000);
|
|
69
|
-
try {
|
|
70
|
-
const res = await fetch(this.endpointUrl('/chat/completions'), {
|
|
71
|
-
method: 'POST',
|
|
72
|
-
signal: controller.signal,
|
|
73
|
-
headers: {
|
|
74
|
-
'content-type': 'application/json',
|
|
75
|
-
'authorization': `Bearer ${apiKey}`
|
|
76
|
-
},
|
|
77
|
-
body: JSON.stringify(body)
|
|
78
|
-
});
|
|
79
|
-
if (!res.ok || !res.body) {
|
|
80
|
-
const text = await res.text().catch(() => '');
|
|
81
|
-
throw new Error(`Provider HTTP ${res.status}: ${text.slice(0, 500) || res.statusText}`);
|
|
82
|
-
}
|
|
83
|
-
return await this.consumeStream(res.body);
|
|
84
|
-
}
|
|
85
|
-
finally {
|
|
86
|
-
clearTimeout(timeout);
|
|
87
|
-
request.signal?.removeEventListener('abort', onAbort);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
async consumeStream(body) {
|
|
91
|
-
const reader = body.getReader();
|
|
92
|
-
const decoder = new TextDecoder();
|
|
93
|
-
let buffer = '';
|
|
94
|
-
let content = '';
|
|
95
|
-
let finishReason = null;
|
|
96
|
-
let usage;
|
|
97
|
-
const toolCalls = new Map();
|
|
98
|
-
while (true) {
|
|
99
|
-
const { done, value } = await reader.read();
|
|
100
|
-
if (done)
|
|
101
|
-
break;
|
|
102
|
-
buffer += decoder.decode(value, { stream: true });
|
|
103
|
-
let newlineIndex;
|
|
104
|
-
while ((newlineIndex = buffer.indexOf('\n')) >= 0) {
|
|
105
|
-
const line = buffer.slice(0, newlineIndex).trim();
|
|
106
|
-
buffer = buffer.slice(newlineIndex + 1);
|
|
107
|
-
if (!line.startsWith('data:'))
|
|
108
|
-
continue;
|
|
109
|
-
const payload = line.slice(5).trim();
|
|
110
|
-
if (payload === '[DONE]')
|
|
111
|
-
continue;
|
|
112
|
-
let chunk;
|
|
113
|
-
try {
|
|
114
|
-
chunk = JSON.parse(payload);
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
continue; // ignore malformed SSE fragments
|
|
118
|
-
}
|
|
119
|
-
if (chunk.usage)
|
|
120
|
-
usage = chunk.usage;
|
|
121
|
-
const choice = chunk.choices?.[0];
|
|
122
|
-
const delta = choice?.delta;
|
|
123
|
-
const reason = choice?.finish_reason ?? delta?.finish_reason;
|
|
124
|
-
if (reason)
|
|
125
|
-
finishReason = reason;
|
|
126
|
-
if (delta?.content)
|
|
127
|
-
content += delta.content;
|
|
128
|
-
for (const tc of delta?.tool_calls ?? []) {
|
|
129
|
-
const existing = toolCalls.get(tc.index) ?? { id: tc.id ?? `call_${tc.index}`, name: '', args: '' };
|
|
130
|
-
if (tc.id)
|
|
131
|
-
existing.id = tc.id;
|
|
132
|
-
if (tc.function?.name)
|
|
133
|
-
existing.name += tc.function.name;
|
|
134
|
-
if (tc.function?.arguments)
|
|
135
|
-
existing.args += tc.function.arguments;
|
|
136
|
-
toolCalls.set(tc.index, existing);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
const calls = [...toolCalls.values()]
|
|
141
|
-
.sort((a, b) => a.id.localeCompare(b.id))
|
|
142
|
-
.map((tc) => ({ id: tc.id, name: tc.name, arguments: tc.args || '{}' }));
|
|
143
|
-
return {
|
|
144
|
-
content: content || null,
|
|
145
|
-
toolCalls: calls,
|
|
146
|
-
usage
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
endpointUrl(path) {
|
|
150
|
-
const base = this.config.baseUrl.replace(/\/+$/, '');
|
|
151
|
-
return `${base}${path}`;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
function toWire(message) {
|
|
155
|
-
if (message.role === 'tool') {
|
|
156
|
-
return { role: 'tool', content: message.content ?? '', tool_call_id: message.toolCallId };
|
|
157
|
-
}
|
|
158
|
-
if (message.role === 'assistant' && message.toolCalls?.length) {
|
|
159
|
-
return {
|
|
160
|
-
role: 'assistant',
|
|
161
|
-
content: message.content,
|
|
162
|
-
tool_calls: message.toolCalls.map((tc) => ({
|
|
163
|
-
id: tc.id,
|
|
164
|
-
type: 'function',
|
|
165
|
-
function: { name: tc.name, arguments: tc.arguments }
|
|
166
|
-
}))
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
return { role: message.role, content: message.content };
|
|
170
|
-
}
|
|
171
|
-
function sleep(ms) {
|
|
172
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
173
|
-
}
|
|
174
|
-
export function createProvider(config, id) {
|
|
175
|
-
return new OpenAICompatibleProvider(config, id);
|
|
176
|
-
}
|
|
177
|
-
//# sourceMappingURL=openai-compatible.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../src/llm/openai-compatible.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { MemoryProvider, MemoryRecord } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Memory abstraction. The rest of iNeedCodes depends on this interface,
|
|
4
|
-
* never on ICM internals.
|
|
5
|
-
*/
|
|
6
|
-
export type { MemoryProvider, MemoryRecord };
|
|
7
|
-
/** Disabled memory backend: no-ops, never fails. */
|
|
8
|
-
export declare class OffMemoryProvider implements MemoryProvider {
|
|
9
|
-
readonly id = "off";
|
|
10
|
-
recall(): Promise<MemoryRecord[]>;
|
|
11
|
-
remember(content: string): Promise<MemoryRecord>;
|
|
12
|
-
forget(): Promise<boolean>;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* ICM adapter (rtk-ai/icm). Uses the `icm` CLI as the memory engine.
|
|
16
|
-
* Per-project isolation: every project gets its own ICM database under
|
|
17
|
-
* ~/.ineedcodes/projects/<project-id>/memory/ (plan §13).
|
|
18
|
-
*/
|
|
19
|
-
export declare class ICMAdapter implements MemoryProvider {
|
|
20
|
-
private readonly databasePath;
|
|
21
|
-
private readonly topic?;
|
|
22
|
-
readonly id = "icm";
|
|
23
|
-
constructor(databasePath: string, topic?: string | undefined);
|
|
24
|
-
static forProject(projectId: string, projectRoot: string): ICMAdapter;
|
|
25
|
-
private icm;
|
|
26
|
-
recall(query: string, limit?: number): Promise<MemoryRecord[]>;
|
|
27
|
-
remember(content: string, tags?: string[]): Promise<MemoryRecord>;
|
|
28
|
-
forget(id: string): Promise<boolean>;
|
|
29
|
-
}
|
|
30
|
-
export declare function parseRecallOutput(stdout: string): MemoryRecord[];
|
|
31
|
-
export declare function createMemoryProvider(backend: 'icm' | 'off', projectId: string, projectRoot: string): MemoryProvider;
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import * as path from 'node:path';
|
|
2
|
-
import * as os from 'node:os';
|
|
3
|
-
import { execShell } from '../shell/process.js';
|
|
4
|
-
import { shellQuote } from '../util/shell-quote.js';
|
|
5
|
-
/** Disabled memory backend: no-ops, never fails. */
|
|
6
|
-
export class OffMemoryProvider {
|
|
7
|
-
id = 'off';
|
|
8
|
-
async recall() {
|
|
9
|
-
return [];
|
|
10
|
-
}
|
|
11
|
-
async remember(content) {
|
|
12
|
-
void content;
|
|
13
|
-
throw new Error('Memory backend is disabled.');
|
|
14
|
-
}
|
|
15
|
-
async forget() {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* ICM adapter (rtk-ai/icm). Uses the `icm` CLI as the memory engine.
|
|
21
|
-
* Per-project isolation: every project gets its own ICM database under
|
|
22
|
-
* ~/.ineedcodes/projects/<project-id>/memory/ (plan §13).
|
|
23
|
-
*/
|
|
24
|
-
export class ICMAdapter {
|
|
25
|
-
databasePath;
|
|
26
|
-
topic;
|
|
27
|
-
id = 'icm';
|
|
28
|
-
constructor(databasePath, topic) {
|
|
29
|
-
this.databasePath = databasePath;
|
|
30
|
-
this.topic = topic;
|
|
31
|
-
}
|
|
32
|
-
static forProject(projectId, projectRoot) {
|
|
33
|
-
const memoryDir = path.join(os.homedir(), '.ineedcodes', 'projects', projectId, 'memory');
|
|
34
|
-
const db = path.join(memoryDir, 'icm.db');
|
|
35
|
-
const topic = path.basename(projectRoot) || 'project';
|
|
36
|
-
return new ICMAdapter(db, topic);
|
|
37
|
-
}
|
|
38
|
-
async icm(args, timeoutMs = 30_000) {
|
|
39
|
-
// ICM creates the DB file, but the parent directory must exist first.
|
|
40
|
-
const { ensureDir } = await import('../util/fs.js');
|
|
41
|
-
const dbDir = this.databasePath.split(path.sep).slice(0, -1).join(path.sep);
|
|
42
|
-
await ensureDir(dbDir);
|
|
43
|
-
const result = await execShell(`icm ${args} --db ${shellQuote(this.databasePath)}${this.topic ? ` --topic ${shellQuote(this.topic)}` : ''}`, dbDir, timeoutMs);
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
async recall(query, limit = 5) {
|
|
47
|
-
if (!query.trim())
|
|
48
|
-
return [];
|
|
49
|
-
const result = await this.icm(`recall ${shellQuote(query)} --limit ${limit} --read-only`);
|
|
50
|
-
if (result.exitCode !== 0)
|
|
51
|
-
return [];
|
|
52
|
-
return parseRecallOutput(result.stdout);
|
|
53
|
-
}
|
|
54
|
-
async remember(content, tags = []) {
|
|
55
|
-
const keywords = tags.length ? ` -k ${shellQuote(tags.join(','))}` : '';
|
|
56
|
-
const result = await this.icm(`remember ${shellQuote(content)}${keywords}`);
|
|
57
|
-
if (result.exitCode !== 0) {
|
|
58
|
-
throw new Error(`ICM store failed: ${result.stderr.trim() || result.stdout.trim()}`);
|
|
59
|
-
}
|
|
60
|
-
const match = result.stdout.match(/Stored:\s*([A-Za-z0-9]+)/);
|
|
61
|
-
return {
|
|
62
|
-
id: match?.[1] ?? `icm-${Date.now()}`,
|
|
63
|
-
content,
|
|
64
|
-
tags,
|
|
65
|
-
createdAt: new Date().toISOString()
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
async forget(id) {
|
|
69
|
-
const result = await this.icm(`forget ${shellQuote(id)}`);
|
|
70
|
-
return result.exitCode === 0;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
export function parseRecallOutput(stdout) {
|
|
74
|
-
const records = [];
|
|
75
|
-
for (const line of stdout.split('\n')) {
|
|
76
|
-
const trimmed = line.trim();
|
|
77
|
-
if (!trimmed || trimmed.startsWith('memories[') || !/^\d/.test(trimmed))
|
|
78
|
-
continue;
|
|
79
|
-
// Format: score,id,topic,importance,weight,summary
|
|
80
|
-
const parts = trimmed.split(',');
|
|
81
|
-
if (parts.length < 6)
|
|
82
|
-
continue;
|
|
83
|
-
records.push({
|
|
84
|
-
id: parts[1].trim(),
|
|
85
|
-
content: parts.slice(5).join(',').trim(),
|
|
86
|
-
tags: [parts[2].trim(), parts[3].trim()],
|
|
87
|
-
createdAt: '',
|
|
88
|
-
score: Number.parseFloat(parts[0] ?? '') || undefined
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
return records;
|
|
92
|
-
}
|
|
93
|
-
export function createMemoryProvider(backend, projectId, projectRoot) {
|
|
94
|
-
if (backend === 'off')
|
|
95
|
-
return new OffMemoryProvider();
|
|
96
|
-
return ICMAdapter.forProject(projectId, projectRoot);
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=icm-adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icm-adapter.js","sourceRoot":"","sources":["../../src/memory/icm-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { PermissionCategory, PermissionDecision, PermissionMode } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Central permission engine. Permission decisions belong in the runtime,
|
|
4
|
-
* not only in the system prompt.
|
|
5
|
-
*/
|
|
6
|
-
export declare class PermissionEngine {
|
|
7
|
-
private mode;
|
|
8
|
-
private workspaceRoot;
|
|
9
|
-
private allow;
|
|
10
|
-
private deny;
|
|
11
|
-
private approvals;
|
|
12
|
-
constructor(mode: PermissionMode, workspaceRoot: string, allow?: string[], deny?: string[]);
|
|
13
|
-
get currentMode(): PermissionMode;
|
|
14
|
-
setMode(mode: PermissionMode): void;
|
|
15
|
-
/**
|
|
16
|
-
* Check whether an action needing these categories is allowed.
|
|
17
|
-
* `detail` is a human-readable description used in approval prompts.
|
|
18
|
-
*/
|
|
19
|
-
check(categories: PermissionCategory[], detail?: string): Promise<PermissionDecision>;
|
|
20
|
-
private checkOne;
|
|
21
|
-
private workspaceModeCheck;
|
|
22
|
-
private requireApproval;
|
|
23
|
-
/** Mark a category as approved for the rest of the session. */
|
|
24
|
-
approve(category: PermissionCategory): void;
|
|
25
|
-
revoke(category: PermissionCategory): void;
|
|
26
|
-
/** Convenience used by tools to validate a path is within the workspace. */
|
|
27
|
-
isInsideWorkspace(target: string): boolean;
|
|
28
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { isInsideRoot } from '../util/fs.js';
|
|
2
|
-
/**
|
|
3
|
-
* Central permission engine. Permission decisions belong in the runtime,
|
|
4
|
-
* not only in the system prompt.
|
|
5
|
-
*/
|
|
6
|
-
export class PermissionEngine {
|
|
7
|
-
mode;
|
|
8
|
-
workspaceRoot;
|
|
9
|
-
allow;
|
|
10
|
-
deny;
|
|
11
|
-
approvals = new Map();
|
|
12
|
-
constructor(mode, workspaceRoot, allow = [], deny = []) {
|
|
13
|
-
this.mode = mode;
|
|
14
|
-
this.workspaceRoot = workspaceRoot;
|
|
15
|
-
this.allow = allow;
|
|
16
|
-
this.deny = deny;
|
|
17
|
-
}
|
|
18
|
-
get currentMode() {
|
|
19
|
-
return this.mode;
|
|
20
|
-
}
|
|
21
|
-
setMode(mode) {
|
|
22
|
-
this.mode = mode;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Check whether an action needing these categories is allowed.
|
|
26
|
-
* `detail` is a human-readable description used in approval prompts.
|
|
27
|
-
*/
|
|
28
|
-
async check(categories, detail) {
|
|
29
|
-
for (const c of categories) {
|
|
30
|
-
if (this.deny.includes(c)) {
|
|
31
|
-
return { allowed: false, reason: `Permission category "${c}" is denied by configuration.` };
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
for (const c of categories) {
|
|
35
|
-
if (this.allow.includes(c))
|
|
36
|
-
continue;
|
|
37
|
-
const decision = this.checkOne(c, detail);
|
|
38
|
-
if (!decision.allowed)
|
|
39
|
-
return decision;
|
|
40
|
-
}
|
|
41
|
-
return { allowed: true };
|
|
42
|
-
}
|
|
43
|
-
checkOne(category, detail) {
|
|
44
|
-
switch (this.mode) {
|
|
45
|
-
case 'autonomous':
|
|
46
|
-
return { allowed: true };
|
|
47
|
-
case 'workspace':
|
|
48
|
-
return this.workspaceModeCheck(category, detail);
|
|
49
|
-
case 'ask':
|
|
50
|
-
return this.requireApproval(category, detail);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
workspaceModeCheck(category, detail) {
|
|
54
|
-
switch (category) {
|
|
55
|
-
// Safe inside the selected workspace: allowed without interruption.
|
|
56
|
-
case 'read':
|
|
57
|
-
case 'write':
|
|
58
|
-
case 'execute':
|
|
59
|
-
case 'network':
|
|
60
|
-
return { allowed: true };
|
|
61
|
-
// High-impact operations always need approval.
|
|
62
|
-
case 'outside_workspace':
|
|
63
|
-
case 'git_remote':
|
|
64
|
-
case 'destructive':
|
|
65
|
-
case 'secret_access':
|
|
66
|
-
return this.requireApproval(category, detail);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
requireApproval(category, detail) {
|
|
70
|
-
if (this.approvals.get(category))
|
|
71
|
-
return { allowed: true };
|
|
72
|
-
return {
|
|
73
|
-
allowed: false,
|
|
74
|
-
reason: `Action needs approval for "${category}"${detail ? `: ${detail}` : ''}. Approve with /permissions or choose the "autonomous" permission mode.`
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
/** Mark a category as approved for the rest of the session. */
|
|
78
|
-
approve(category) {
|
|
79
|
-
this.approvals.set(category, true);
|
|
80
|
-
}
|
|
81
|
-
revoke(category) {
|
|
82
|
-
this.approvals.delete(category);
|
|
83
|
-
}
|
|
84
|
-
/** Convenience used by tools to validate a path is within the workspace. */
|
|
85
|
-
isInsideWorkspace(target) {
|
|
86
|
-
return isInsideRoot(this.workspaceRoot, target);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=permissions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/permissions/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export declare function isLikelySecretFile(filePath: string): boolean;
|
|
2
|
-
export declare function redactSecrets(text: string): string;
|
|
3
|
-
/** Guard used by read tools: refuse to dump secret file contents to the model. */
|
|
4
|
-
export declare function secretFileNotice(filePath: string): string;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import * as path from 'node:path';
|
|
2
|
-
/**
|
|
3
|
-
* Detect likely secret files and redact secret-looking values from text
|
|
4
|
-
* before that text reaches the model context or logs.
|
|
5
|
-
*/
|
|
6
|
-
const SECRET_FILENAMES = new Set([
|
|
7
|
-
'.env', '.env.local', '.env.production', '.env.development',
|
|
8
|
-
'id_rsa', 'id_ed25519', 'id_ecdsa',
|
|
9
|
-
'credentials', 'credentials.json', '.npmrc', '.netrc'
|
|
10
|
-
]);
|
|
11
|
-
const SECRET_PATTERNS = [
|
|
12
|
-
{ name: 'private key', pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g },
|
|
13
|
-
{ name: 'aws key', pattern: /AKIA[0-9A-Z]{16}/g },
|
|
14
|
-
{ name: 'bearer token', pattern: /\b(?:Bearer|bearer)\s+[A-Za-z0-9\-._~+/]+=*/g },
|
|
15
|
-
{ name: 'api key', pattern: /\b(?:api[_-]?key|apikey|token|secret|password)\b\s*[:=]\s*["']?[A-Za-z0-9\-._~+/]{12,}["']?/gi },
|
|
16
|
-
{ name: 'github token', pattern: /\bgh[pousr]_[A-Za-z0-9]{36,}\b/g },
|
|
17
|
-
{ name: 'openai key', pattern: /\bsk-[A-Za-z0-9\-_]{20,}\b/g },
|
|
18
|
-
{ name: 'jwt', pattern: /\beyJ[A-Za-z0-9\-_]{10,}\.[A-Za-z0-9\-_]{10,}\.[A-Za-z0-9\-_]{10,}\b/g }
|
|
19
|
-
];
|
|
20
|
-
export function isLikelySecretFile(filePath) {
|
|
21
|
-
const base = path.basename(filePath);
|
|
22
|
-
if (SECRET_FILENAMES.has(base))
|
|
23
|
-
return true;
|
|
24
|
-
if (base.startsWith('.env'))
|
|
25
|
-
return true;
|
|
26
|
-
// SSH keys and cloud credential directories.
|
|
27
|
-
if (filePath.includes('/.ssh/') || filePath.includes('/.aws/') || filePath.includes('/.gnupg/'))
|
|
28
|
-
return true;
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
export function redactSecrets(text) {
|
|
32
|
-
let out = text;
|
|
33
|
-
for (const { pattern } of SECRET_PATTERNS) {
|
|
34
|
-
out = out.replace(pattern, '[REDACTED]');
|
|
35
|
-
}
|
|
36
|
-
return out;
|
|
37
|
-
}
|
|
38
|
-
/** Guard used by read tools: refuse to dump secret file contents to the model. */
|
|
39
|
-
export function secretFileNotice(filePath) {
|
|
40
|
-
return `This file (${filePath}) looks like it contains secrets. Its contents are not shown automatically. ` +
|
|
41
|
-
'If you truly need it, ask the user to approve secret access explicitly.';
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=secrets.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/security/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;GAGG;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB;IAC3D,QAAQ,EAAE,YAAY,EAAE,UAAU;IAClC,aAAa,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ;CACtD,CAAC,CAAC;AAEH,MAAM,eAAe,GAAwC;IAC3D,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,6EAA6E,EAAE;IAC/G,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE;IACjD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,8CAA8C,EAAE;IACjF,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,+FAA+F,EAAE;IAC7H,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iCAAiC,EAAE;IACpE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,6BAA6B,EAAE;IAC9D,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,uEAAuE,EAAE;CAClG,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,6CAA6C;IAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7G,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,eAAe,EAAE,CAAC;QAC1C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,cAAc,QAAQ,8EAA8E;QACzG,yEAAyE,CAAC;AAC9E,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { SessionState } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Session persistence. Users can leave and resume work.
|
|
4
|
-
* This is deliberately separate from ICM: sessions are history,
|
|
5
|
-
* memory is durable knowledge.
|
|
6
|
-
*/
|
|
7
|
-
export declare class SessionStore {
|
|
8
|
-
private readonly baseDir;
|
|
9
|
-
constructor(baseDir: string);
|
|
10
|
-
static default(): SessionStore;
|
|
11
|
-
private file;
|
|
12
|
-
save(state: SessionState): Promise<void>;
|
|
13
|
-
load(sessionId: string): Promise<SessionState | undefined>;
|
|
14
|
-
listForProject(projectRoot: string, limit?: number): Promise<SessionState[]>;
|
|
15
|
-
newId(): string;
|
|
16
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import * as path from 'node:path';
|
|
2
|
-
import * as os from 'node:os';
|
|
3
|
-
import { randomUUID } from 'node:crypto';
|
|
4
|
-
import { promises as fs } from 'node:fs';
|
|
5
|
-
import { readJson, writeJson, ensureDir } from '../util/fs.js';
|
|
6
|
-
/**
|
|
7
|
-
* Session persistence. Users can leave and resume work.
|
|
8
|
-
* This is deliberately separate from ICM: sessions are history,
|
|
9
|
-
* memory is durable knowledge.
|
|
10
|
-
*/
|
|
11
|
-
export class SessionStore {
|
|
12
|
-
baseDir;
|
|
13
|
-
constructor(baseDir) {
|
|
14
|
-
this.baseDir = baseDir;
|
|
15
|
-
}
|
|
16
|
-
static default() {
|
|
17
|
-
return new SessionStore(path.join(os.homedir(), '.ineedcodes', 'sessions'));
|
|
18
|
-
}
|
|
19
|
-
file(sessionId) {
|
|
20
|
-
return path.join(this.baseDir, sessionId, 'session.json');
|
|
21
|
-
}
|
|
22
|
-
async save(state) {
|
|
23
|
-
state.updatedAt = new Date().toISOString();
|
|
24
|
-
await writeJson(this.file(state.sessionId), state);
|
|
25
|
-
}
|
|
26
|
-
async load(sessionId) {
|
|
27
|
-
return readJson(this.file(sessionId));
|
|
28
|
-
}
|
|
29
|
-
async listForProject(projectRoot, limit = 10) {
|
|
30
|
-
await ensureDir(this.baseDir);
|
|
31
|
-
let entries;
|
|
32
|
-
try {
|
|
33
|
-
entries = await fs.readdir(this.baseDir, { withFileTypes: true });
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return [];
|
|
37
|
-
}
|
|
38
|
-
const sessions = [];
|
|
39
|
-
for (const entry of entries) {
|
|
40
|
-
if (!entry.isDirectory())
|
|
41
|
-
continue;
|
|
42
|
-
const state = await this.load(entry.name);
|
|
43
|
-
if (state && state.projectRoot === projectRoot) {
|
|
44
|
-
sessions.push(state);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
sessions.sort((a, b) => (a.updatedAt < b.updatedAt ? 1 : -1));
|
|
48
|
-
return sessions.slice(0, limit);
|
|
49
|
-
}
|
|
50
|
-
newId() {
|
|
51
|
-
return randomUUID();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/session/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/D;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAEhD,MAAM,CAAC,OAAO;QACZ,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEO,IAAI,CAAC,SAAiB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAmB;QAC5B,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,OAAO,QAAQ,CAAe,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,KAAK,GAAG,EAAE;QAClD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;gBAC/C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,KAAK;QACH,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { ProcessManagerLike, ShellProcessRecord } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Tracks long-running shell processes so the agent can start a dev server,
|
|
4
|
-
* check on it, read its output, and stop it: without blocking the loop.
|
|
5
|
-
*/
|
|
6
|
-
export declare class ProcessManager implements ProcessManagerLike {
|
|
7
|
-
private processes;
|
|
8
|
-
private children;
|
|
9
|
-
private nextFakePid;
|
|
10
|
-
start(command: string, cwd: string): Promise<ShellProcessRecord>;
|
|
11
|
-
status(pid: number): ShellProcessRecord | undefined;
|
|
12
|
-
list(): ShellProcessRecord[];
|
|
13
|
-
stop(pid: number): boolean;
|
|
14
|
-
/** Kill every tracked child before the runtime shuts down. */
|
|
15
|
-
drain(): void;
|
|
16
|
-
}
|
|
17
|
-
export interface ExecOutcome {
|
|
18
|
-
exitCode: number | null;
|
|
19
|
-
stdout: string;
|
|
20
|
-
stderr: string;
|
|
21
|
-
durationMs: number;
|
|
22
|
-
cwd: string;
|
|
23
|
-
timedOut: boolean;
|
|
24
|
-
}
|
|
25
|
-
/** Run a command to completion with a hard timeout. Output is captured, never fabricated. */
|
|
26
|
-
export declare function execShell(command: string, cwd: string, timeoutMs?: number, maxBuffer?: number): Promise<ExecOutcome>;
|