ineedcodes 0.1.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/LICENSE +21 -0
- package/README.md +161 -0
- package/docs/assets/ineed-logo.svg +161 -0
- package/docs/configuration.md +71 -0
- package/docs/skills.md +58 -0
- package/package.json +41 -0
- package/packages/agent/dist/boost.d.ts +34 -0
- package/packages/agent/dist/boost.js +138 -0
- package/packages/agent/dist/boost.js.map +1 -0
- package/packages/agent/dist/events.d.ts +67 -0
- package/packages/agent/dist/events.js +16 -0
- package/packages/agent/dist/events.js.map +1 -0
- package/packages/agent/dist/index.d.ts +6 -0
- package/packages/agent/dist/index.js +7 -0
- package/packages/agent/dist/index.js.map +1 -0
- package/packages/agent/dist/lead-agent.d.ts +85 -0
- package/packages/agent/dist/lead-agent.js +235 -0
- package/packages/agent/dist/lead-agent.js.map +1 -0
- package/packages/agent/dist/orchestrator.d.ts +43 -0
- package/packages/agent/dist/orchestrator.js +135 -0
- package/packages/agent/dist/orchestrator.js.map +1 -0
- package/packages/agent/dist/runtime.d.ts +44 -0
- package/packages/agent/dist/runtime.js +265 -0
- package/packages/agent/dist/runtime.js.map +1 -0
- package/packages/agent/dist/system-prompts.d.ts +24 -0
- package/packages/agent/dist/system-prompts.js +91 -0
- package/packages/agent/dist/system-prompts.js.map +1 -0
- package/packages/agent/package.json +21 -0
- package/packages/cli/dist/index.d.ts +3 -0
- package/packages/cli/dist/index.js +567 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/setup.d.ts +37 -0
- package/packages/cli/dist/setup.js +240 -0
- package/packages/cli/dist/setup.js.map +1 -0
- package/packages/cli/dist/tools-setup.d.ts +12 -0
- package/packages/cli/dist/tools-setup.js +28 -0
- package/packages/cli/dist/tools-setup.js.map +1 -0
- package/packages/cli/dist/ui/approval.d.ts +12 -0
- package/packages/cli/dist/ui/approval.js +52 -0
- package/packages/cli/dist/ui/approval.js.map +1 -0
- package/packages/cli/dist/ui/colors.d.ts +14 -0
- package/packages/cli/dist/ui/colors.js +21 -0
- package/packages/cli/dist/ui/colors.js.map +1 -0
- package/packages/cli/dist/ui/prompts.d.ts +46 -0
- package/packages/cli/dist/ui/prompts.js +135 -0
- package/packages/cli/dist/ui/prompts.js.map +1 -0
- package/packages/cli/dist/ui/renderer.d.ts +13 -0
- package/packages/cli/dist/ui/renderer.js +95 -0
- package/packages/cli/dist/ui/renderer.js.map +1 -0
- package/packages/cli/package.json +23 -0
- package/packages/core/dist/config/config.d.ts +32 -0
- package/packages/core/dist/config/config.js +43 -0
- package/packages/core/dist/config/config.js.map +1 -0
- package/packages/core/dist/context/engine.d.ts +25 -0
- package/packages/core/dist/context/engine.js +98 -0
- package/packages/core/dist/context/engine.js.map +1 -0
- package/packages/core/dist/index.d.ts +20 -0
- package/packages/core/dist/index.js +21 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/llm/openai-compatible.d.ts +23 -0
- package/packages/core/dist/llm/openai-compatible.js +177 -0
- package/packages/core/dist/llm/openai-compatible.js.map +1 -0
- package/packages/core/dist/memory/icm-adapter.d.ts +31 -0
- package/packages/core/dist/memory/icm-adapter.js +98 -0
- package/packages/core/dist/memory/icm-adapter.js.map +1 -0
- package/packages/core/dist/permissions/permissions.d.ts +28 -0
- package/packages/core/dist/permissions/permissions.js +89 -0
- package/packages/core/dist/permissions/permissions.js.map +1 -0
- package/packages/core/dist/security/secrets.d.ts +4 -0
- package/packages/core/dist/security/secrets.js +43 -0
- package/packages/core/dist/security/secrets.js.map +1 -0
- package/packages/core/dist/session/store.d.ts +16 -0
- package/packages/core/dist/session/store.js +54 -0
- package/packages/core/dist/session/store.js.map +1 -0
- package/packages/core/dist/shell/process.d.ts +26 -0
- package/packages/core/dist/shell/process.js +128 -0
- package/packages/core/dist/shell/process.js.map +1 -0
- package/packages/core/dist/skills/loader.d.ts +9 -0
- package/packages/core/dist/skills/loader.js +163 -0
- package/packages/core/dist/skills/loader.js.map +1 -0
- package/packages/core/dist/tools/fs.d.ts +10 -0
- package/packages/core/dist/tools/fs.js +409 -0
- package/packages/core/dist/tools/fs.js.map +1 -0
- package/packages/core/dist/tools/git.d.ts +7 -0
- package/packages/core/dist/tools/git.js +251 -0
- package/packages/core/dist/tools/git.js.map +1 -0
- package/packages/core/dist/tools/mcp.d.ts +42 -0
- package/packages/core/dist/tools/mcp.js +158 -0
- package/packages/core/dist/tools/mcp.js.map +1 -0
- package/packages/core/dist/tools/registry.d.ts +21 -0
- package/packages/core/dist/tools/registry.js +50 -0
- package/packages/core/dist/tools/registry.js.map +1 -0
- package/packages/core/dist/tools/search.d.ts +2 -0
- package/packages/core/dist/tools/search.js +243 -0
- package/packages/core/dist/tools/search.js.map +1 -0
- package/packages/core/dist/tools/shell.d.ts +8 -0
- package/packages/core/dist/tools/shell.js +164 -0
- package/packages/core/dist/tools/shell.js.map +1 -0
- package/packages/core/dist/tools/web.d.ts +14 -0
- package/packages/core/dist/tools/web.js +125 -0
- package/packages/core/dist/tools/web.js.map +1 -0
- package/packages/core/dist/types.d.ts +202 -0
- package/packages/core/dist/types.js +7 -0
- package/packages/core/dist/types.js.map +1 -0
- package/packages/core/dist/util/fs.d.ts +5 -0
- package/packages/core/dist/util/fs.js +33 -0
- package/packages/core/dist/util/fs.js.map +1 -0
- package/packages/core/dist/util/shell-quote.d.ts +7 -0
- package/packages/core/dist/util/shell-quote.js +20 -0
- package/packages/core/dist/util/shell-quote.js.map +1 -0
- package/packages/core/dist/workspace/workspace.d.ts +15 -0
- package/packages/core/dist/workspace/workspace.js +84 -0
- package/packages/core/dist/workspace/workspace.js.map +1 -0
- package/packages/core/package.json +21 -0
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import { loadConfig, defaultConfig, saveConfig, discoverWorkspace, PermissionEngine, ToolRegistry, SessionStore, createProvider, redactSecrets, connectAllMCPServers, execShell } from '@ineedcodes/core';
|
|
6
|
+
import { LeadAgent } from '@ineedcodes/agent';
|
|
7
|
+
import { registerBuiltinTools, getProcessManager, shutdownProcesses } from './tools-setup.js';
|
|
8
|
+
import { Renderer } from './ui/renderer.js';
|
|
9
|
+
import { BANNER, createPrompt, printHelp, printStatus } from './ui/prompts.js';
|
|
10
|
+
import { askApprovalWithScope } from './ui/approval.js';
|
|
11
|
+
import { bold, dim, gray, green, red, yellow, cyan, magenta, truncate } from './ui/colors.js';
|
|
12
|
+
import { runSetupWizard, pickModel, fetchModels } from './setup.js';
|
|
13
|
+
function parseArgs(argv) {
|
|
14
|
+
const args = { depth: 'balanced', help: false, version: false, setup: false };
|
|
15
|
+
const positional = [];
|
|
16
|
+
for (let i = 0; i < argv.length; i++) {
|
|
17
|
+
const a = argv[i] ?? '';
|
|
18
|
+
switch (a) {
|
|
19
|
+
case '--help':
|
|
20
|
+
case '-h':
|
|
21
|
+
args.help = true;
|
|
22
|
+
break;
|
|
23
|
+
case '--version':
|
|
24
|
+
case '-v':
|
|
25
|
+
args.version = true;
|
|
26
|
+
break;
|
|
27
|
+
case '--resume':
|
|
28
|
+
args.resume = true;
|
|
29
|
+
break;
|
|
30
|
+
case '--setup':
|
|
31
|
+
args.setup = true;
|
|
32
|
+
break;
|
|
33
|
+
case '--model':
|
|
34
|
+
case '-m':
|
|
35
|
+
args.model = argv[++i];
|
|
36
|
+
break;
|
|
37
|
+
case '--depth': {
|
|
38
|
+
const d = argv[++i];
|
|
39
|
+
if (d === 'beginner' || d === 'balanced' || d === 'terse')
|
|
40
|
+
args.depth = d;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case '--permissions':
|
|
44
|
+
case '-p': {
|
|
45
|
+
const p = argv[++i];
|
|
46
|
+
if (p === 'ask' || p === 'workspace' || p === 'autonomous')
|
|
47
|
+
args.permissionMode = p;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
default:
|
|
51
|
+
if (a.startsWith('-')) {
|
|
52
|
+
process.stdout.write(red(`Unknown option: ${a}\n`) + dim('Try --help\n'));
|
|
53
|
+
process.exit(2);
|
|
54
|
+
}
|
|
55
|
+
positional.push(a);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (positional.length)
|
|
59
|
+
args.oneShot = positional.join(' ');
|
|
60
|
+
return args;
|
|
61
|
+
}
|
|
62
|
+
function printVersion() {
|
|
63
|
+
let version = '0.1.0';
|
|
64
|
+
try {
|
|
65
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(import.meta.dirname ?? '.', '..', 'package.json'), 'utf8'));
|
|
66
|
+
if (pkg.version)
|
|
67
|
+
version = pkg.version;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// keep fallback
|
|
71
|
+
}
|
|
72
|
+
process.stdout.write(`ineed ${version}\n`);
|
|
73
|
+
}
|
|
74
|
+
function printMainHelp() {
|
|
75
|
+
process.stdout.write(`
|
|
76
|
+
${bold('ineed')}: your terminal, now autonomous
|
|
77
|
+
|
|
78
|
+
${bold('Usage')}
|
|
79
|
+
${cyan('ineed')} open the agent in this directory
|
|
80
|
+
${cyan('ineed "fix the build"')} one-shot task
|
|
81
|
+
${cyan('ineed --resume')} resume your last session here
|
|
82
|
+
${cyan('ineed --setup')} re-run the provider setup wizard
|
|
83
|
+
|
|
84
|
+
${bold('Options')}
|
|
85
|
+
${dim('-m, --model <id>')} switch model (also: /model inside)
|
|
86
|
+
${dim('-p, --permissions <mode>')} ask | workspace | autonomous
|
|
87
|
+
${dim(' --depth <depth>')} beginner | balanced | terse
|
|
88
|
+
${dim('-v, --version')} show version
|
|
89
|
+
${dim('-h, --help')} show help
|
|
90
|
+
|
|
91
|
+
${dim('First run opens a setup wizard. After that, just type what you want.')}
|
|
92
|
+
`);
|
|
93
|
+
}
|
|
94
|
+
/** Build a live provider from config, tolerating missing key (wizard fixes it). */
|
|
95
|
+
function makeProvider(config) {
|
|
96
|
+
return createProvider(config.providers[config.defaultProvider] ?? defaultConfig().providers['default'], config.defaultProvider);
|
|
97
|
+
}
|
|
98
|
+
/** Swap the model at runtime without restarting. */
|
|
99
|
+
async function switchModel(config, provider, model) {
|
|
100
|
+
const key = config.defaultProvider;
|
|
101
|
+
config.providers[key] = { ...config.providers[key], model };
|
|
102
|
+
await saveConfig(config);
|
|
103
|
+
return makeProvider(config);
|
|
104
|
+
}
|
|
105
|
+
async function main() {
|
|
106
|
+
const args = parseArgs(process.argv.slice(2));
|
|
107
|
+
if (args.help) {
|
|
108
|
+
printMainHelp();
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (args.version) {
|
|
112
|
+
printVersion();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
process.stdout.write(bannerText());
|
|
116
|
+
const config = await loadConfig();
|
|
117
|
+
let provider = makeProvider(config);
|
|
118
|
+
// ═══ First run / --setup: interactive wizard ═══
|
|
119
|
+
if (args.setup || !provider.config.apiKey) {
|
|
120
|
+
const { LineReader } = await import('./ui/prompts.js');
|
|
121
|
+
const lr = new LineReader();
|
|
122
|
+
const values = await runSetupWizard(lr, {
|
|
123
|
+
baseUrl: provider.config.baseUrl,
|
|
124
|
+
apiKey: provider.config.apiKey,
|
|
125
|
+
model: provider.config.model
|
|
126
|
+
}, async (v) => {
|
|
127
|
+
const key = config.defaultProvider;
|
|
128
|
+
config.providers[key] = { ...config.providers[key], baseUrl: v.baseUrl, apiKey: v.apiKey, model: v.model };
|
|
129
|
+
await saveConfig(config);
|
|
130
|
+
});
|
|
131
|
+
lr.close();
|
|
132
|
+
if (!values) {
|
|
133
|
+
process.stdout.write(yellow('\nSetup not finished. Run ') + bold('ineed --setup') + yellow(' whenever you\'re ready.\n'));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
provider = makeProvider(config);
|
|
137
|
+
}
|
|
138
|
+
if (args.model) {
|
|
139
|
+
// Agent is created below using this provider, so it picks up the model.
|
|
140
|
+
provider = await switchModel(config, provider, args.model);
|
|
141
|
+
}
|
|
142
|
+
const workspace = await discoverWorkspace(process.cwd());
|
|
143
|
+
const registry = new ToolRegistry();
|
|
144
|
+
registerBuiltinTools(registry, { webSearch: config.webSearch });
|
|
145
|
+
// MCP servers join the same registry; failures are reported, never fatal.
|
|
146
|
+
const mcp = await connectAllMCPServers(config.mcpServers);
|
|
147
|
+
for (const tool of mcp.tools) {
|
|
148
|
+
try {
|
|
149
|
+
registry.register(tool);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// duplicate names from servers are skipped
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const error of mcp.errors) {
|
|
156
|
+
process.stdout.write(yellow(`⚠ ${error}\n`));
|
|
157
|
+
}
|
|
158
|
+
if (mcp.tools.length) {
|
|
159
|
+
process.stdout.write(dim(`Connected ${mcp.tools.length} MCP tool(s).\n`));
|
|
160
|
+
}
|
|
161
|
+
const permissions = new PermissionEngine(args.permissionMode ?? config.permissions.mode, workspace.projectRoot, config.permissions.allow ?? [], config.permissions.deny ?? []);
|
|
162
|
+
const store = SessionStore.default();
|
|
163
|
+
const renderer = new Renderer();
|
|
164
|
+
const agent = new LeadAgent({
|
|
165
|
+
config,
|
|
166
|
+
registry,
|
|
167
|
+
permissions,
|
|
168
|
+
provider,
|
|
169
|
+
workspace,
|
|
170
|
+
eventBus: {
|
|
171
|
+
emit: async (event) => {
|
|
172
|
+
await renderer.handle(event);
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
depth: args.depth,
|
|
176
|
+
requestApproval: async (req) => {
|
|
177
|
+
const { approved, always } = await askApprovalWithScope(req.reason);
|
|
178
|
+
if (approved && always)
|
|
179
|
+
permissions.setMode('autonomous');
|
|
180
|
+
return approved;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
await agent.init();
|
|
184
|
+
// ═══ Slash command state ═══
|
|
185
|
+
let running = true;
|
|
186
|
+
let lastAnswer = '';
|
|
187
|
+
const commands = {
|
|
188
|
+
help: async () => { printHelp(); return true; },
|
|
189
|
+
exit: async () => { running = false; return true; },
|
|
190
|
+
quit: async () => { running = false; return true; },
|
|
191
|
+
clear: async () => {
|
|
192
|
+
agent.resetSession();
|
|
193
|
+
process.stdout.write(green('Fresh session.') + dim(' Conversation cleared; project memory is kept.\n'));
|
|
194
|
+
return true;
|
|
195
|
+
},
|
|
196
|
+
think: async (arg) => {
|
|
197
|
+
const level = arg.trim().toLowerCase();
|
|
198
|
+
if (level === 'low' || level === 'medium' || level === 'high') {
|
|
199
|
+
agent.setReasoningEffort(level);
|
|
200
|
+
const effect = level === 'low' ? 'fast and direct (fewer checks)'
|
|
201
|
+
: level === 'high' ? 'deep and careful (always double-checks, more turns)'
|
|
202
|
+
: 'balanced (default)';
|
|
203
|
+
process.stdout.write(green(`Thinking: ${level}`) + dim(`: ${effect}\n`));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const cur = agent.getReasoningEffort();
|
|
207
|
+
process.stdout.write(`Thinking: ${bold(cur)}\n`);
|
|
208
|
+
process.stdout.write(dim(' low = fast and direct, skips double-checking\n'));
|
|
209
|
+
process.stdout.write(dim(' medium = balanced (default)\n'));
|
|
210
|
+
process.stdout.write(dim(' high = deep reasoning, always verifies before claiming success\n'));
|
|
211
|
+
process.stdout.write(dim('Usage: /think low | medium | high\n'));
|
|
212
|
+
}
|
|
213
|
+
return true;
|
|
214
|
+
},
|
|
215
|
+
mode: async (arg) => {
|
|
216
|
+
const m = arg.trim().toLowerCase();
|
|
217
|
+
if (m === 'plan' || m === 'build') {
|
|
218
|
+
agent.setMode(m);
|
|
219
|
+
process.stdout.write(green(`Mode: ${m}`) + dim(m === 'plan' ? ': read-only: I analyze and propose, no changes.\n' : ': full tools: I can change files and run commands.\n'));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
const cur = agent.getMode();
|
|
223
|
+
process.stdout.write(`Mode: ${bold(cur)}\n`);
|
|
224
|
+
process.stdout.write(dim(' plan = look, don\'t touch (analysis + proposals)\n'));
|
|
225
|
+
process.stdout.write(dim(' build = full tools (default)\n'));
|
|
226
|
+
process.stdout.write(dim('Usage: /mode plan | build (or /plan, /build)\n'));
|
|
227
|
+
}
|
|
228
|
+
return true;
|
|
229
|
+
},
|
|
230
|
+
plan: async () => {
|
|
231
|
+
agent.setMode('plan');
|
|
232
|
+
process.stdout.write(green('Mode: plan') + dim(': read-only: I analyze and propose, no changes. Use /build to apply.\n'));
|
|
233
|
+
return true;
|
|
234
|
+
},
|
|
235
|
+
build: async () => {
|
|
236
|
+
agent.setMode('build');
|
|
237
|
+
process.stdout.write(green('Mode: build') + dim(': full tools enabled.\n'));
|
|
238
|
+
return true;
|
|
239
|
+
},
|
|
240
|
+
context: async () => {
|
|
241
|
+
const s = agent.contextStats();
|
|
242
|
+
const pct = s.limit ? Math.round((s.total / s.limit) * 100) : 0;
|
|
243
|
+
const bar = '█'.repeat(Math.min(20, Math.round((s.total / s.limit) * 20))) + '░'.repeat(Math.max(0, 20 - Math.min(20, Math.round((s.total / s.limit) * 20))));
|
|
244
|
+
process.stdout.write('\n' + bold('Context') + '\n');
|
|
245
|
+
process.stdout.write(` ${dim('system ')} ${String(s.system).padStart(6)} tokens\n`);
|
|
246
|
+
process.stdout.write(` ${dim('conversation')} ${String(s.conversation).padStart(6)} tokens\n`);
|
|
247
|
+
process.stdout.write(` ${dim('tool results')} ${String(s.tools).padStart(6)} tokens\n`);
|
|
248
|
+
process.stdout.write(` ${dim('[')}${bar}${dim(']')} ${s.total}/${s.limit} (${pct}%): auto-compact at ${s.compactsAt}\n`);
|
|
249
|
+
return true;
|
|
250
|
+
},
|
|
251
|
+
setup: async (_arg, lr) => {
|
|
252
|
+
const values = await runSetupWizard(lr, {
|
|
253
|
+
baseUrl: provider.config.baseUrl,
|
|
254
|
+
apiKey: provider.config.apiKey,
|
|
255
|
+
model: provider.config.model
|
|
256
|
+
}, async (v) => {
|
|
257
|
+
const key = config.defaultProvider;
|
|
258
|
+
config.providers[key] = { ...config.providers[key], baseUrl: v.baseUrl, apiKey: v.apiKey, model: v.model };
|
|
259
|
+
await saveConfig(config);
|
|
260
|
+
});
|
|
261
|
+
if (values) {
|
|
262
|
+
provider = makeProvider(config);
|
|
263
|
+
agent.setProvider(provider);
|
|
264
|
+
}
|
|
265
|
+
return true;
|
|
266
|
+
},
|
|
267
|
+
init: async () => {
|
|
268
|
+
process.stdout.write(dim('Scanning the project and writing AGENTS.md…\n'));
|
|
269
|
+
await runTurn('Scan this project: structure, package manifests, build/test/lint commands, conventions, and anything a future ' +
|
|
270
|
+
'session must know. Then write (or improve) AGENTS.md at the project root. Keep it short and factual. ' +
|
|
271
|
+
'Never remove existing rules from AGENTS.md: only add or refine. Show me the final file afterwards.');
|
|
272
|
+
return true;
|
|
273
|
+
},
|
|
274
|
+
doctor: async () => {
|
|
275
|
+
process.stdout.write('\n' + bold('Doctor') + '\n');
|
|
276
|
+
const check = (ok, label, detail) => process.stdout.write(` ${ok ? green('✓') : red('✗')} ${label.padEnd(24)} ${dim(detail)}\n`);
|
|
277
|
+
const cfgFile = path.join(os.homedir(), '.ineedcodes', 'config.json');
|
|
278
|
+
check(fs.existsSync(cfgFile), 'config file', cfgFile);
|
|
279
|
+
const pcfg = config.providers[config.defaultProvider];
|
|
280
|
+
check(Boolean(pcfg?.apiKey), 'API key', pcfg?.apiKey ? `${pcfg.apiKey.slice(0, 8)}…` : 'missing: run /setup');
|
|
281
|
+
try {
|
|
282
|
+
const models = await fetchModels(provider.config.baseUrl, provider.config.apiKey ?? '');
|
|
283
|
+
check(models.length > 0, 'provider reachable', `${models.length} model(s) at ${provider.config.baseUrl}`);
|
|
284
|
+
if (models.length > 0 && !models.includes(provider.model)) {
|
|
285
|
+
process.stdout.write(` ${yellow('⚠')} ${'model on server'.padEnd(24)} ${dim(`${provider.model} is not in the /models list: routers often still route it (test with a real request)`)}\n`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
check(false, 'provider reachable', provider.config.baseUrl);
|
|
290
|
+
}
|
|
291
|
+
const icmProbe = await execShell('icm --version', process.cwd(), 8000);
|
|
292
|
+
check(icmProbe.exitCode === 0, 'ICM memory', icmProbe.exitCode === 0 ? icmProbe.stdout.trim().split('\n')[0] ?? '' : 'icm CLI not found: memory off');
|
|
293
|
+
check(workspace.isGitRepo, 'git repo', workspace.isGitRepo ? `branch ${workspace.gitBranch ?? '?'}` : 'not a repo (git tools limited)');
|
|
294
|
+
check(getProcessManager().list().every((p) => true), 'process manager', `${getProcessManager().list().length} background process(es)`);
|
|
295
|
+
return true;
|
|
296
|
+
},
|
|
297
|
+
copy: async () => {
|
|
298
|
+
if (!lastAnswer) {
|
|
299
|
+
process.stdout.write(dim('Nothing to copy yet.\n'));
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
const encoded = Buffer.from(lastAnswer, 'utf8').toString('base64');
|
|
303
|
+
process.stdout.write(`\x1b]52;c;${encoded}\x07`);
|
|
304
|
+
process.stdout.write(green('Copied the last answer to the clipboard.') + dim(' (requires a terminal with OSC 52 support)\n'));
|
|
305
|
+
return true;
|
|
306
|
+
},
|
|
307
|
+
status: async () => {
|
|
308
|
+
printStatus({
|
|
309
|
+
model: provider.model,
|
|
310
|
+
provider: provider.id,
|
|
311
|
+
mode: permissions.currentMode,
|
|
312
|
+
depth: args.depth,
|
|
313
|
+
projectRoot: workspace.projectRoot,
|
|
314
|
+
git: workspace.isGitRepo ? `on branch ${workspace.gitBranch ?? '?'}` : 'not a repo',
|
|
315
|
+
memory: `${config.memory.backend} (project-isolated)`,
|
|
316
|
+
skills: agent.listSkills().map((s) => s.name),
|
|
317
|
+
processes: getProcessManager().list().length,
|
|
318
|
+
agentMode: agent.getMode(),
|
|
319
|
+
thinking: agent.getReasoningEffort(),
|
|
320
|
+
contextTokens: agent.contextStats()
|
|
321
|
+
});
|
|
322
|
+
return true;
|
|
323
|
+
},
|
|
324
|
+
model: async (arg, lr) => {
|
|
325
|
+
// Always open the interactive picker: /model with no argument included.
|
|
326
|
+
process.stdout.write(`Current model: ${bold(provider.model)}\n`);
|
|
327
|
+
const next = await pickModel(lr, provider.config.baseUrl, provider.config.apiKey ?? '', arg || provider.model, provider.config.models);
|
|
328
|
+
if (next && next !== provider.model) {
|
|
329
|
+
provider = await switchModel(config, provider, next);
|
|
330
|
+
agent.setProvider(provider);
|
|
331
|
+
process.stdout.write(green(`Model switched to ${next}: live, no restart needed.\n`));
|
|
332
|
+
}
|
|
333
|
+
return true;
|
|
334
|
+
},
|
|
335
|
+
permissions: async (arg) => {
|
|
336
|
+
const modes = ['ask', 'workspace', 'autonomous'];
|
|
337
|
+
if (!modes.includes(arg)) {
|
|
338
|
+
process.stdout.write(`Permission mode: ${bold(permissions.currentMode)}\n`);
|
|
339
|
+
process.stdout.write(dim('Modes: ask (always ask) · workspace (safe in-project work is allowed, risky needs approval) · autonomous (no interruptions)\n'));
|
|
340
|
+
process.stdout.write(dim('Change with: /permissions <mode>\n'));
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
permissions.setMode(arg);
|
|
344
|
+
process.stdout.write(green(`Permission mode: ${arg}\n`));
|
|
345
|
+
}
|
|
346
|
+
return true;
|
|
347
|
+
},
|
|
348
|
+
explain: async (arg) => {
|
|
349
|
+
if (arg === 'beginner' || arg === 'balanced' || arg === 'terse') {
|
|
350
|
+
args.depth = arg;
|
|
351
|
+
agent.setDepth(arg);
|
|
352
|
+
process.stdout.write(green(`Explanation depth: ${arg}\n`));
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
process.stdout.write(dim('Usage: /explain beginner | balanced | terse\n'));
|
|
356
|
+
}
|
|
357
|
+
return true;
|
|
358
|
+
},
|
|
359
|
+
skills: async (arg) => {
|
|
360
|
+
const skills = agent.listSkills();
|
|
361
|
+
if (!arg) {
|
|
362
|
+
process.stdout.write(bold('\nSkills') + '\n');
|
|
363
|
+
for (const s of skills) {
|
|
364
|
+
process.stdout.write(` ${cyan(s.name.padEnd(14))} ${dim(`[${s.scope}]`)} ${truncate(s.description, 90)}\n`);
|
|
365
|
+
}
|
|
366
|
+
process.stdout.write(dim('\nProject skills override global and built-in skills with the same name.\n'));
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
const skill = skills.find((s) => s.name.toLowerCase() === arg.toLowerCase());
|
|
370
|
+
process.stdout.write(skill ? `\n${skill.instructions}\n` : red(`No skill named "${arg}".\n`));
|
|
371
|
+
}
|
|
372
|
+
return true;
|
|
373
|
+
},
|
|
374
|
+
memory: async (arg) => {
|
|
375
|
+
const memory = agent.getMemories();
|
|
376
|
+
if (arg.startsWith('save ')) {
|
|
377
|
+
const content = arg.slice(5).trim();
|
|
378
|
+
if (!content) {
|
|
379
|
+
process.stdout.write(dim('Usage: /memory save <thing to remember>\n'));
|
|
380
|
+
return true;
|
|
381
|
+
}
|
|
382
|
+
try {
|
|
383
|
+
await memory.remember(content, ['user-saved']);
|
|
384
|
+
process.stdout.write(green('Saved to project memory.\n'));
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
process.stdout.write(red(`Memory write failed: ${err instanceof Error ? err.message : String(err)}\n`));
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
else if (arg) {
|
|
391
|
+
const records = await memory.recall(arg, 10);
|
|
392
|
+
if (!records.length) {
|
|
393
|
+
process.stdout.write(dim('No memories matched.\n'));
|
|
394
|
+
return true;
|
|
395
|
+
}
|
|
396
|
+
process.stdout.write(bold('\nRecalled') + '\n');
|
|
397
|
+
for (const r of records) {
|
|
398
|
+
process.stdout.write(` ${gray(truncate(r.id, 12))} ${truncate(r.content, 120)}\n`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
process.stdout.write(dim('Usage: /memory <search query> · /memory save <thing>\n'));
|
|
403
|
+
}
|
|
404
|
+
return true;
|
|
405
|
+
},
|
|
406
|
+
agents: async () => {
|
|
407
|
+
const records = agent.getOrchestrator().list();
|
|
408
|
+
if (!records.length) {
|
|
409
|
+
process.stdout.write(dim('No sub-agents were created this session.\n'));
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
process.stdout.write(bold('\nSub-agents') + '\n');
|
|
413
|
+
for (const r of records) {
|
|
414
|
+
process.stdout.write(` ${cyan(r.agentId)} ${dim(`[${r.capability}]`)} ${yellow(r.status)} ${dim(truncate(r.task.objective, 80))}\n`);
|
|
415
|
+
}
|
|
416
|
+
return true;
|
|
417
|
+
},
|
|
418
|
+
compact: async () => {
|
|
419
|
+
process.stdout.write(dim('Compaction happens automatically when the context fills. Force it by asking: "compact the session".\n'));
|
|
420
|
+
return true;
|
|
421
|
+
},
|
|
422
|
+
resume: async () => {
|
|
423
|
+
const sessions = await store.listForProject(workspace.projectRoot, 5);
|
|
424
|
+
if (!sessions.length) {
|
|
425
|
+
process.stdout.write(dim('No previous sessions found for this project.\n'));
|
|
426
|
+
return true;
|
|
427
|
+
}
|
|
428
|
+
for (const [i, s] of sessions.entries()) {
|
|
429
|
+
process.stdout.write(` ${cyan(String(i + 1))}. ${dim(s.updatedAt)} ${truncate(s.objective || '(no objective)', 70)}\n`);
|
|
430
|
+
}
|
|
431
|
+
process.stdout.write(dim('Resume with: ineed --resume\n'));
|
|
432
|
+
return true;
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
async function handleSlash(input) {
|
|
436
|
+
const [cmd, ...rest] = input.slice(1).split(/\s+/);
|
|
437
|
+
const handler = commands[cmd?.toLowerCase() ?? ''];
|
|
438
|
+
if (!handler) {
|
|
439
|
+
process.stdout.write(red(`Unknown command: /${cmd}`) + dim(': try /help\n'));
|
|
440
|
+
return true;
|
|
441
|
+
}
|
|
442
|
+
await handler(rest.join(' '), prompt);
|
|
443
|
+
return running;
|
|
444
|
+
}
|
|
445
|
+
async function runTurn(input) {
|
|
446
|
+
const spinner = startSpinner('thinking…');
|
|
447
|
+
try {
|
|
448
|
+
const outcome = await agent.runObjective(input);
|
|
449
|
+
spinner.stop();
|
|
450
|
+
lastAnswer = outcome.finalMessage.trim();
|
|
451
|
+
const summary = outcome.finalMessage.trim();
|
|
452
|
+
if (summary) {
|
|
453
|
+
process.stdout.write('\n' + bold(green(outcome.stopReason === 'complete' ? 'Done' : statusLabel(outcome.stopReason))) + '\n');
|
|
454
|
+
for (const line of summary.split('\n').slice(0, 30)) {
|
|
455
|
+
process.stdout.write(' ' + line + '\n');
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (outcome.stopReason !== 'complete') {
|
|
459
|
+
process.stdout.write(dim('\nSay "continue" to keep going, or rephrase the task.\n'));
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
catch (err) {
|
|
463
|
+
spinner.stop();
|
|
464
|
+
process.stdout.write(red(`\nSomething went wrong: ${err instanceof Error ? err.message : String(err)}\n`));
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
function statusLabel(reason) {
|
|
468
|
+
switch (reason) {
|
|
469
|
+
case 'needs_approval': return 'Waiting for your approval';
|
|
470
|
+
case 'needs_information': return 'I need more information';
|
|
471
|
+
case 'max_turns': return 'Reached the execution limit';
|
|
472
|
+
case 'aborted': return 'Cancelled';
|
|
473
|
+
case 'error': return 'Hit an error';
|
|
474
|
+
default: return 'Stopped';
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
// ═══ Session bootstrap: resume or fresh ═══
|
|
478
|
+
if (args.resume) {
|
|
479
|
+
const sessions = await store.listForProject(workspace.projectRoot, 1);
|
|
480
|
+
const last = sessions[0];
|
|
481
|
+
if (last) {
|
|
482
|
+
agent.restore(last);
|
|
483
|
+
process.stdout.write(green(`Resumed session from ${last.updatedAt}`) + dim(`: objective: ${truncate(last.objective || '(none)', 80)}\n`));
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
process.stdout.write(yellow('No previous session found for this project; starting fresh.\n'));
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// ═══ One-shot mode ═══
|
|
490
|
+
if (args.oneShot) {
|
|
491
|
+
try {
|
|
492
|
+
await runTurn(args.oneShot);
|
|
493
|
+
}
|
|
494
|
+
finally {
|
|
495
|
+
await store.save(agent.toSessionState(store.newId()));
|
|
496
|
+
shutdownProcesses();
|
|
497
|
+
}
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
// ═══ Interactive TUI loop ═══
|
|
501
|
+
process.stdout.write('\n' + bold('Ready.') + dim(' Describe what you want: plain language, no commands needed.\n'));
|
|
502
|
+
process.stdout.write(dim(`Model: ${provider.model} · permissions: ${permissions.currentMode} · /help for shortcuts · Ctrl+C twice to exit\n`));
|
|
503
|
+
const prompt = createPrompt();
|
|
504
|
+
let interrupts = 0;
|
|
505
|
+
process.on('SIGINT', () => {
|
|
506
|
+
interrupts += 1;
|
|
507
|
+
if (interrupts >= 2) {
|
|
508
|
+
process.stdout.write('\n' + dim('Goodbye.\n'));
|
|
509
|
+
shutdownProcesses();
|
|
510
|
+
process.exit(0);
|
|
511
|
+
}
|
|
512
|
+
process.stdout.write(yellow('\nPress Ctrl+C again to exit. Running work keeps going.\n'));
|
|
513
|
+
setTimeout(() => { interrupts = 0; }, 3000);
|
|
514
|
+
});
|
|
515
|
+
while (running) {
|
|
516
|
+
const { input, cancelled } = await prompt.ask();
|
|
517
|
+
if (cancelled) {
|
|
518
|
+
// EOF (stdin closed) → leave. Ctrl+C → handled by the double-press
|
|
519
|
+
// SIGINT handler above; just re-prompt so one Ctrl+C cancels the line only.
|
|
520
|
+
if (prompt.isClosed()) {
|
|
521
|
+
running = false;
|
|
522
|
+
break;
|
|
523
|
+
}
|
|
524
|
+
continue;
|
|
525
|
+
}
|
|
526
|
+
if (!input)
|
|
527
|
+
continue;
|
|
528
|
+
if (input.startsWith('/')) {
|
|
529
|
+
running = await handleSlash(input);
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
await runTurn(input);
|
|
533
|
+
await store.save(agent.toSessionState(store.newId()));
|
|
534
|
+
}
|
|
535
|
+
prompt.close();
|
|
536
|
+
shutdownProcesses();
|
|
537
|
+
process.stdout.write(dim('Goodbye.\n'));
|
|
538
|
+
}
|
|
539
|
+
function bannerText() {
|
|
540
|
+
return BANNER.replace('╦═╗', green('╦═╗'))
|
|
541
|
+
.replace('╠╦╝', cyan('╠╦╝'))
|
|
542
|
+
.replace('╩╚═', magenta('╩╚═')) + gray(' v0.1.0: https://ineed.codes\n');
|
|
543
|
+
}
|
|
544
|
+
function startSpinner(label) {
|
|
545
|
+
const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
546
|
+
let i = 0;
|
|
547
|
+
const timer = setInterval(() => {
|
|
548
|
+
process.stdout.write(`\r ${cyan(frames[i % frames.length] ?? '⠋')} ${dim(label)} `);
|
|
549
|
+
i += 1;
|
|
550
|
+
}, 90);
|
|
551
|
+
return {
|
|
552
|
+
stop: () => {
|
|
553
|
+
clearInterval(timer);
|
|
554
|
+
process.stdout.write('\r' + ' '.repeat(80) + '\r');
|
|
555
|
+
}
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
process.on('unhandledRejection', (err) => {
|
|
559
|
+
process.stdout.write(red(`\nUnhandled error: ${err instanceof Error ? err.message : String(err)}\n`));
|
|
560
|
+
});
|
|
561
|
+
main().catch((err) => {
|
|
562
|
+
process.stdout.write(red(`Fatal: ${err instanceof Error ? err.message : String(err)}\n`));
|
|
563
|
+
process.exit(1);
|
|
564
|
+
});
|
|
565
|
+
// re-exports for embedders
|
|
566
|
+
export { redactSecrets };
|
|
567
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive first-run setup. The user should never need to hand-edit
|
|
3
|
+
* JSON or set environment variables to get started.
|
|
4
|
+
*/
|
|
5
|
+
export interface ProviderPreset {
|
|
6
|
+
label: string;
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
hint: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const PRESETS: ProviderPreset[];
|
|
11
|
+
export interface ProviderSetup {
|
|
12
|
+
baseUrl: string;
|
|
13
|
+
apiKey: string;
|
|
14
|
+
model: string;
|
|
15
|
+
}
|
|
16
|
+
/** Fetch the model list from an OpenAI-compatible server. */
|
|
17
|
+
export declare function fetchModels(baseUrl: string, apiKey: string, timeoutMs?: number): Promise<string[]>;
|
|
18
|
+
/** Send one tiny chat completion to prove the setup works. */
|
|
19
|
+
export declare function testConnection(baseUrl: string, apiKey: string, model: string, timeoutMs?: number): Promise<{
|
|
20
|
+
ok: boolean;
|
|
21
|
+
detail: string;
|
|
22
|
+
servedBy?: string;
|
|
23
|
+
}>;
|
|
24
|
+
/** Anything that can ask the user a question (LineReader, main prompt, …). */
|
|
25
|
+
export interface Askable {
|
|
26
|
+
ask(label: string): Promise<{
|
|
27
|
+
input: string;
|
|
28
|
+
cancelled: boolean;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
/** Interactive model picker against the live server. Returns a model id. */
|
|
32
|
+
export declare function pickModel(lr: Askable, baseUrl: string, apiKey: string, prefill: string, curated?: string[]): Promise<string | undefined>;
|
|
33
|
+
/**
|
|
34
|
+
* Full first-run wizard. Saves into ~/.ineedcodes/config.json via onSave.
|
|
35
|
+
* Returns the configured values, or undefined if the user cancelled.
|
|
36
|
+
*/
|
|
37
|
+
export declare function runSetupWizard(lr: Askable, existing?: Partial<ProviderSetup>, onSave?: (values: ProviderSetup) => Promise<void>): Promise<ProviderSetup | undefined>;
|