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.
Files changed (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -0
  3. package/docs/assets/ineed-logo.svg +161 -0
  4. package/docs/configuration.md +71 -0
  5. package/docs/skills.md +58 -0
  6. package/package.json +41 -0
  7. package/packages/agent/dist/boost.d.ts +34 -0
  8. package/packages/agent/dist/boost.js +138 -0
  9. package/packages/agent/dist/boost.js.map +1 -0
  10. package/packages/agent/dist/events.d.ts +67 -0
  11. package/packages/agent/dist/events.js +16 -0
  12. package/packages/agent/dist/events.js.map +1 -0
  13. package/packages/agent/dist/index.d.ts +6 -0
  14. package/packages/agent/dist/index.js +7 -0
  15. package/packages/agent/dist/index.js.map +1 -0
  16. package/packages/agent/dist/lead-agent.d.ts +85 -0
  17. package/packages/agent/dist/lead-agent.js +235 -0
  18. package/packages/agent/dist/lead-agent.js.map +1 -0
  19. package/packages/agent/dist/orchestrator.d.ts +43 -0
  20. package/packages/agent/dist/orchestrator.js +135 -0
  21. package/packages/agent/dist/orchestrator.js.map +1 -0
  22. package/packages/agent/dist/runtime.d.ts +44 -0
  23. package/packages/agent/dist/runtime.js +265 -0
  24. package/packages/agent/dist/runtime.js.map +1 -0
  25. package/packages/agent/dist/system-prompts.d.ts +24 -0
  26. package/packages/agent/dist/system-prompts.js +91 -0
  27. package/packages/agent/dist/system-prompts.js.map +1 -0
  28. package/packages/agent/package.json +21 -0
  29. package/packages/cli/dist/index.d.ts +3 -0
  30. package/packages/cli/dist/index.js +567 -0
  31. package/packages/cli/dist/index.js.map +1 -0
  32. package/packages/cli/dist/setup.d.ts +37 -0
  33. package/packages/cli/dist/setup.js +240 -0
  34. package/packages/cli/dist/setup.js.map +1 -0
  35. package/packages/cli/dist/tools-setup.d.ts +12 -0
  36. package/packages/cli/dist/tools-setup.js +28 -0
  37. package/packages/cli/dist/tools-setup.js.map +1 -0
  38. package/packages/cli/dist/ui/approval.d.ts +12 -0
  39. package/packages/cli/dist/ui/approval.js +52 -0
  40. package/packages/cli/dist/ui/approval.js.map +1 -0
  41. package/packages/cli/dist/ui/colors.d.ts +14 -0
  42. package/packages/cli/dist/ui/colors.js +21 -0
  43. package/packages/cli/dist/ui/colors.js.map +1 -0
  44. package/packages/cli/dist/ui/prompts.d.ts +46 -0
  45. package/packages/cli/dist/ui/prompts.js +135 -0
  46. package/packages/cli/dist/ui/prompts.js.map +1 -0
  47. package/packages/cli/dist/ui/renderer.d.ts +13 -0
  48. package/packages/cli/dist/ui/renderer.js +95 -0
  49. package/packages/cli/dist/ui/renderer.js.map +1 -0
  50. package/packages/cli/package.json +23 -0
  51. package/packages/core/dist/config/config.d.ts +32 -0
  52. package/packages/core/dist/config/config.js +43 -0
  53. package/packages/core/dist/config/config.js.map +1 -0
  54. package/packages/core/dist/context/engine.d.ts +25 -0
  55. package/packages/core/dist/context/engine.js +98 -0
  56. package/packages/core/dist/context/engine.js.map +1 -0
  57. package/packages/core/dist/index.d.ts +20 -0
  58. package/packages/core/dist/index.js +21 -0
  59. package/packages/core/dist/index.js.map +1 -0
  60. package/packages/core/dist/llm/openai-compatible.d.ts +23 -0
  61. package/packages/core/dist/llm/openai-compatible.js +177 -0
  62. package/packages/core/dist/llm/openai-compatible.js.map +1 -0
  63. package/packages/core/dist/memory/icm-adapter.d.ts +31 -0
  64. package/packages/core/dist/memory/icm-adapter.js +98 -0
  65. package/packages/core/dist/memory/icm-adapter.js.map +1 -0
  66. package/packages/core/dist/permissions/permissions.d.ts +28 -0
  67. package/packages/core/dist/permissions/permissions.js +89 -0
  68. package/packages/core/dist/permissions/permissions.js.map +1 -0
  69. package/packages/core/dist/security/secrets.d.ts +4 -0
  70. package/packages/core/dist/security/secrets.js +43 -0
  71. package/packages/core/dist/security/secrets.js.map +1 -0
  72. package/packages/core/dist/session/store.d.ts +16 -0
  73. package/packages/core/dist/session/store.js +54 -0
  74. package/packages/core/dist/session/store.js.map +1 -0
  75. package/packages/core/dist/shell/process.d.ts +26 -0
  76. package/packages/core/dist/shell/process.js +128 -0
  77. package/packages/core/dist/shell/process.js.map +1 -0
  78. package/packages/core/dist/skills/loader.d.ts +9 -0
  79. package/packages/core/dist/skills/loader.js +163 -0
  80. package/packages/core/dist/skills/loader.js.map +1 -0
  81. package/packages/core/dist/tools/fs.d.ts +10 -0
  82. package/packages/core/dist/tools/fs.js +409 -0
  83. package/packages/core/dist/tools/fs.js.map +1 -0
  84. package/packages/core/dist/tools/git.d.ts +7 -0
  85. package/packages/core/dist/tools/git.js +251 -0
  86. package/packages/core/dist/tools/git.js.map +1 -0
  87. package/packages/core/dist/tools/mcp.d.ts +42 -0
  88. package/packages/core/dist/tools/mcp.js +158 -0
  89. package/packages/core/dist/tools/mcp.js.map +1 -0
  90. package/packages/core/dist/tools/registry.d.ts +21 -0
  91. package/packages/core/dist/tools/registry.js +50 -0
  92. package/packages/core/dist/tools/registry.js.map +1 -0
  93. package/packages/core/dist/tools/search.d.ts +2 -0
  94. package/packages/core/dist/tools/search.js +243 -0
  95. package/packages/core/dist/tools/search.js.map +1 -0
  96. package/packages/core/dist/tools/shell.d.ts +8 -0
  97. package/packages/core/dist/tools/shell.js +164 -0
  98. package/packages/core/dist/tools/shell.js.map +1 -0
  99. package/packages/core/dist/tools/web.d.ts +14 -0
  100. package/packages/core/dist/tools/web.js +125 -0
  101. package/packages/core/dist/tools/web.js.map +1 -0
  102. package/packages/core/dist/types.d.ts +202 -0
  103. package/packages/core/dist/types.js +7 -0
  104. package/packages/core/dist/types.js.map +1 -0
  105. package/packages/core/dist/util/fs.d.ts +5 -0
  106. package/packages/core/dist/util/fs.js +33 -0
  107. package/packages/core/dist/util/fs.js.map +1 -0
  108. package/packages/core/dist/util/shell-quote.d.ts +7 -0
  109. package/packages/core/dist/util/shell-quote.js +20 -0
  110. package/packages/core/dist/util/shell-quote.js.map +1 -0
  111. package/packages/core/dist/workspace/workspace.d.ts +15 -0
  112. package/packages/core/dist/workspace/workspace.js +84 -0
  113. package/packages/core/dist/workspace/workspace.js.map +1 -0
  114. package/packages/core/package.json +21 -0
@@ -0,0 +1,240 @@
1
+ import { bold, dim, green, red, yellow, cyan, truncate } from './ui/colors.js';
2
+ export const PRESETS = [
3
+ { label: 'OmniRoute (running on this machine)', baseUrl: 'http://127.0.0.1:20128/v1', hint: 'local smart router' },
4
+ { label: 'OpenAI', baseUrl: 'https://api.openai.com/v1', hint: 'api.openai.com' },
5
+ { label: 'Other OpenAI-compatible API (custom URL)', baseUrl: '', hint: 'LM Studio, Ollama, vLLM, …' }
6
+ ];
7
+ /** Fetch the model list from an OpenAI-compatible server. */
8
+ export async function fetchModels(baseUrl, apiKey, timeoutMs = 15_000) {
9
+ const controller = new AbortController();
10
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
11
+ try {
12
+ const res = await fetch(`${baseUrl.replace(/\/+$/, '')}/models`, {
13
+ signal: controller.signal,
14
+ headers: apiKey ? { authorization: `Bearer ${apiKey}` } : {}
15
+ });
16
+ if (!res.ok)
17
+ return [];
18
+ const body = (await res.json());
19
+ return (body.data ?? []).map((m) => m.id ?? '').filter(Boolean).sort();
20
+ }
21
+ catch {
22
+ return [];
23
+ }
24
+ finally {
25
+ clearTimeout(timer);
26
+ }
27
+ }
28
+ /** Send one tiny chat completion to prove the setup works. */
29
+ export async function testConnection(baseUrl, apiKey, model, timeoutMs = 45_000) {
30
+ const controller = new AbortController();
31
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
32
+ try {
33
+ const res = await fetch(`${baseUrl.replace(/\/+$/, '')}/chat/completions`, {
34
+ method: 'POST',
35
+ signal: controller.signal,
36
+ headers: { 'content-type': 'application/json', authorization: `Bearer ${apiKey}` },
37
+ body: JSON.stringify({
38
+ model,
39
+ messages: [{ role: 'user', content: 'Reply with exactly: OK' }],
40
+ max_tokens: 20
41
+ })
42
+ });
43
+ if (!res.ok) {
44
+ const text = await res.text().catch(() => '');
45
+ return { ok: false, detail: `HTTP ${res.status}: ${text.slice(0, 200) || res.statusText}` };
46
+ }
47
+ const body = (await res.json());
48
+ const reply = body.choices?.[0]?.message?.content?.trim().slice(0, 40) ?? '';
49
+ return { ok: true, detail: reply ? `model replied "${truncate(reply, 30)}"` : 'model replied', servedBy: body.model };
50
+ }
51
+ catch (err) {
52
+ const message = err instanceof Error ? err.message : String(err);
53
+ return { ok: false, detail: message };
54
+ }
55
+ finally {
56
+ clearTimeout(timer);
57
+ }
58
+ }
59
+ /** Interactive model picker against the live server. Returns a model id. */
60
+ export async function pickModel(lr, baseUrl, apiKey, prefill, curated) {
61
+ // Curated list wins when present: show only those, keep it simple.
62
+ if (curated && curated.length > 0) {
63
+ process.stdout.write(green(`\nAvailable models (${curated.length}):\n`));
64
+ curated.forEach((m, i) => {
65
+ const marker = m === prefill ? green(' ← current') : '';
66
+ process.stdout.write(` ${cyan(String(i + 1).padStart(2))}. ${m}${marker}\n`);
67
+ });
68
+ while (true) {
69
+ const pick = await lr.ask(`Pick a number ${dim('[1]')} (or type a full model id):`);
70
+ if (pick.cancelled)
71
+ return undefined;
72
+ if (!pick.input)
73
+ return curated[0];
74
+ const idx = Number.parseInt(pick.input, 10);
75
+ if (Number.isInteger(idx) && idx >= 1 && idx <= curated.length)
76
+ return curated[idx - 1];
77
+ if (pick.input.includes('/'))
78
+ return pick.input; // escape hatch: any id
79
+ process.stdout.write(red('Not a valid number. Try again.\n'));
80
+ }
81
+ }
82
+ process.stdout.write(dim('\nFetching the model list from your server…\n'));
83
+ const models = await fetchModels(baseUrl, apiKey);
84
+ if (models.length === 0) {
85
+ const r = await lr.ask(`Model id ${prefill ? dim(`[default: ${prefill}]`) : ''}:`);
86
+ if (r.cancelled)
87
+ return undefined;
88
+ return r.input || prefill || undefined;
89
+ }
90
+ process.stdout.write(green(`Found ${models.length} model(s).\n`));
91
+ while (true) {
92
+ const filterR = await lr.ask(`Filter models by typing part of the name ${dim(`(e.g. "fast", "claude"; Enter shows popular ones${prefill ? `; default: ${prefill}` : ''})`)}:`);
93
+ if (filterR.cancelled)
94
+ return undefined;
95
+ const typed = filterR.input.trim();
96
+ if (typed && models.includes(typed))
97
+ return typed;
98
+ if (!typed && prefill && models.includes(prefill)) {
99
+ const keep = await lr.ask(dim(`Keep current model "${prefill}"? [Y/n]:`));
100
+ if (!keep.cancelled && !/^n/i.test(keep.input))
101
+ return prefill;
102
+ }
103
+ const needle = typed.toLowerCase();
104
+ const matches = models.filter((m) => m.toLowerCase().includes(needle));
105
+ if (matches.length === 0) {
106
+ process.stdout.write(red(`No model matches "${typed}". Try another word.\n`));
107
+ continue;
108
+ }
109
+ const shown = matches.slice(0, 15);
110
+ process.stdout.write('\n');
111
+ shown.forEach((m, i) => {
112
+ process.stdout.write(` ${cyan(String(i + 1).padStart(2))}. ${m}\n`);
113
+ });
114
+ if (matches.length > shown.length) {
115
+ process.stdout.write(dim(` … ${matches.length - shown.length} more: type a narrower filter\n`));
116
+ }
117
+ const pick = await lr.ask(`Pick a number ${dim('[1]')}:`);
118
+ if (pick.cancelled)
119
+ return undefined;
120
+ if (!pick.input)
121
+ return shown[0];
122
+ const idx = Number.parseInt(pick.input, 10);
123
+ if (Number.isInteger(idx) && idx >= 1 && idx <= shown.length)
124
+ return shown[idx - 1];
125
+ if (models.includes(pick.input))
126
+ return pick.input;
127
+ process.stdout.write(red('Not a valid number. Try again.\n'));
128
+ }
129
+ }
130
+ /** Classify why a server did not return a model list. */
131
+ async function diagnoseConnection(baseUrl, apiKey) {
132
+ try {
133
+ const controller = new AbortController();
134
+ const timer = setTimeout(() => controller.abort(), 12_000);
135
+ const res = await fetch(`${baseUrl.replace(/\/+$/, '')}/models`, {
136
+ signal: controller.signal,
137
+ headers: apiKey ? { authorization: `Bearer ${apiKey}` } : {}
138
+ });
139
+ clearTimeout(timer);
140
+ if (res.status === 401 || res.status === 403)
141
+ return 'bad_key';
142
+ return 'no_models';
143
+ }
144
+ catch {
145
+ return 'unreachable';
146
+ }
147
+ }
148
+ /**
149
+ * Full first-run wizard. Saves into ~/.ineedcodes/config.json via onSave.
150
+ * Returns the configured values, or undefined if the user cancelled.
151
+ */
152
+ export async function runSetupWizard(lr, existing, onSave) {
153
+ process.stdout.write('\n' + bold('Welcome to iNeedCodes!') + '\n');
154
+ process.stdout.write('Let\'s connect it to an AI provider. You only do this once.\n\n');
155
+ // 1. Preset
156
+ let selected;
157
+ while (true) {
158
+ process.stdout.write(bold('Which provider do you want to use?') + '\n');
159
+ PRESETS.forEach((p, i) => {
160
+ process.stdout.write(` ${cyan(String(i + 1))}. ${p.label} ${dim(`(${p.hint})`)}\n`);
161
+ });
162
+ const choice = await lr.ask(`Your choice ${dim('[1]')}:`);
163
+ if (choice.cancelled)
164
+ return undefined;
165
+ const n = Number.parseInt(choice.input || '1', 10);
166
+ selected = PRESETS[n - 1];
167
+ if (selected)
168
+ break;
169
+ process.stdout.write(red('Pick a number from the list.\n'));
170
+ }
171
+ // 2. Base URL
172
+ let baseUrl = selected.baseUrl;
173
+ while (true) {
174
+ const r = await lr.ask(`API base URL ${dim(`[${selected.baseUrl || existing?.baseUrl || 'https://api.openai.com/v1'}]`)}:`);
175
+ if (r.cancelled)
176
+ return undefined;
177
+ const typed = r.input.trim();
178
+ baseUrl = typed || selected.baseUrl || existing?.baseUrl || 'https://api.openai.com/v1';
179
+ if (/^https?:\/\//.test(baseUrl))
180
+ break;
181
+ process.stdout.write(red('URL must start with http:// or https://\n'));
182
+ }
183
+ // 3. API key
184
+ let apiKey = existing?.apiKey ?? '';
185
+ while (!apiKey) {
186
+ const r = await lr.ask('API key (paste it, then Enter):');
187
+ if (r.cancelled)
188
+ return undefined;
189
+ apiKey = r.input.trim();
190
+ if (!apiKey)
191
+ process.stdout.write(yellow('An API key is required.\n'));
192
+ }
193
+ // 4. Connection check: GET /models proves reachability + auth in one shot.
194
+ process.stdout.write(dim('\nChecking connection…\n'));
195
+ const reachable = await fetchModels(baseUrl, apiKey, 12_000);
196
+ const authProbe = reachable.length > 0
197
+ ? 'ok'
198
+ : await diagnoseConnection(baseUrl, apiKey);
199
+ if (authProbe === 'ok') {
200
+ process.stdout.write(green('✓ Connected.') + dim(` (${reachable.length} model(s) available)\n`));
201
+ }
202
+ else if (authProbe === 'bad_key') {
203
+ process.stdout.write(red('✗ The server rejected the API key. Let\'s fix that.\n'));
204
+ const retry = await lr.ask('Paste the API key again (Enter keeps going anyway):');
205
+ if (retry.cancelled)
206
+ return undefined;
207
+ if (retry.input.trim())
208
+ apiKey = retry.input.trim();
209
+ }
210
+ else if (authProbe === 'unreachable') {
211
+ process.stdout.write(yellow(`⚠ Could not reach ${baseUrl}.\n`));
212
+ const keep = await lr.ask('Keep this URL anyway? [y/N]:');
213
+ if (keep.cancelled || !/^y/i.test(keep.input))
214
+ return undefined;
215
+ }
216
+ else {
217
+ process.stdout.write(yellow('⚠ Server reachable, but no model list endpoint. Continuing anyway.\n'));
218
+ }
219
+ // 5. Model picker
220
+ const model = await pickModel(lr, baseUrl, apiKey, existing?.model ?? '');
221
+ if (!model)
222
+ return undefined;
223
+ // 6. Final verification with the chosen model
224
+ process.stdout.write(dim(`\nTesting ${model}…\n`));
225
+ const final = await testConnection(baseUrl, apiKey, model);
226
+ if (final.ok) {
227
+ process.stdout.write(green('✓ Works!') + (final.servedBy && final.servedBy !== model ? dim(` (routed to ${final.servedBy})`) : '') + '\n');
228
+ }
229
+ else {
230
+ process.stdout.write(yellow(`⚠ Model test did not pass (${final.detail}). Saving anyway: you can change the model later with /model.\n`));
231
+ }
232
+ const values = { baseUrl, apiKey, model };
233
+ if (onSave) {
234
+ await onSave(values);
235
+ process.stdout.write(green('\nSaved to ~/.ineedcodes/config.json') + '\n');
236
+ process.stdout.write('All set! From now on just run ' + bold('ineed') + ' in any project and say what you want.\n');
237
+ }
238
+ return values;
239
+ }
240
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ToolRegistry, ToolContext } from '@ineedcodes/core';
2
+ import { ProcessManager } from '@ineedcodes/core';
3
+ export declare function getProcessManager(): ProcessManager;
4
+ export declare function shutdownProcesses(): void;
5
+ export declare function registerBuiltinTools(registry: ToolRegistry, opts: {
6
+ webSearch?: {
7
+ provider: string;
8
+ apiKey?: string;
9
+ baseUrl?: string;
10
+ };
11
+ }): void;
12
+ export declare function buildToolContext(workspaceRoot: string, cwd: string, permissions: ToolContext['permissions']): ToolContext;
@@ -0,0 +1,28 @@
1
+ import { createFilesystemTools, createSearchTools, createShellTools, createGitTools, createWebTools, ProcessManager } from '@ineedcodes/core';
2
+ let manager;
3
+ export function getProcessManager() {
4
+ if (!manager) {
5
+ manager = new ProcessManager();
6
+ globalThis['__ineedcodesProcessManager'] = manager;
7
+ }
8
+ return manager;
9
+ }
10
+ export function shutdownProcesses() {
11
+ manager?.drain();
12
+ }
13
+ export function registerBuiltinTools(registry, opts) {
14
+ for (const tool of createFilesystemTools())
15
+ registry.register(tool);
16
+ for (const tool of createSearchTools())
17
+ registry.register(tool);
18
+ for (const tool of createShellTools())
19
+ registry.register(tool);
20
+ for (const tool of createGitTools())
21
+ registry.register(tool);
22
+ for (const tool of createWebTools(opts.webSearch))
23
+ registry.register(tool);
24
+ }
25
+ export function buildToolContext(workspaceRoot, cwd, permissions) {
26
+ return { workspaceRoot, cwd, permissions, processManager: getProcessManager() };
27
+ }
28
+ //# sourceMappingURL=tools-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-setup.js","sourceRoot":"","sources":["../src/tools-setup.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,IAAI,OAAmC,CAAC;AAExC,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QAC9B,UAA8D,CAAC,4BAA4B,CAAC,GAAG,OAAO,CAAC;IAC1G,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAsB,EACtB,IAA6E;IAE7E,KAAK,MAAM,IAAI,IAAI,qBAAqB,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/D,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,aAAqB,EAAE,GAAW,EAAE,WAAuC;IAC1G,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,EAAE,CAAC;AAClF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { PermissionCategory, PermissionDecision } from '@ineedcodes/core';
2
+ /**
3
+ * Terminal approval prompt used by the permission engine when a high-impact
4
+ * action needs a decision. Asking is the runtime's job, not the prompt's.
5
+ */
6
+ export declare function askApproval(question: string, detail?: string): Promise<boolean>;
7
+ export declare function askApprovalWithScope(question: string, detail?: string): Promise<{
8
+ approved: boolean;
9
+ always: boolean;
10
+ }>;
11
+ export declare function printDecision(decision: PermissionDecision): void;
12
+ export declare function listCategories(categories: readonly PermissionCategory[]): string;
@@ -0,0 +1,52 @@
1
+ import { bold, dim, green, red, yellow } from './colors.js';
2
+ /**
3
+ * Terminal approval prompt used by the permission engine when a high-impact
4
+ * action needs a decision. Asking is the runtime's job, not the prompt's.
5
+ */
6
+ export async function askApproval(question, detail) {
7
+ const { approved } = await askApprovalWithScope(question, detail);
8
+ return approved;
9
+ }
10
+ export async function askApprovalWithScope(question, detail) {
11
+ process.stdout.write('\n' + bold(yellow('⚠ Approval needed')) + '\n');
12
+ process.stdout.write(` ${question}\n`);
13
+ if (detail)
14
+ process.stdout.write(dim(` ${detail}\n`));
15
+ process.stdout.write(dim(' [y] yes, once · [a] always for this session · [n] no\n'));
16
+ const answer = await readLine('your choice: ');
17
+ const normalized = answer.trim().toLowerCase();
18
+ if (normalized === 'a')
19
+ return { approved: true, always: true };
20
+ return { approved: normalized === 'y', always: false };
21
+ }
22
+ export function printDecision(decision) {
23
+ if (decision.allowed) {
24
+ process.stdout.write(green('✓ allowed') + '\n');
25
+ }
26
+ else {
27
+ process.stdout.write(red('✗ blocked') + ' ' + dim(decision.reason) + '\n');
28
+ }
29
+ }
30
+ export function listCategories(categories) {
31
+ return categories.join(', ');
32
+ }
33
+ function readLine(promptText) {
34
+ return new Promise((resolve) => {
35
+ process.stdout.write(dim(promptText));
36
+ let input = '';
37
+ const onData = (chunk) => {
38
+ input += chunk.toString('utf8');
39
+ if (input.includes('\n')) {
40
+ cleanup();
41
+ resolve(input.trim());
42
+ }
43
+ };
44
+ const cleanup = () => {
45
+ process.stdin.removeListener('data', onData);
46
+ process.stdin.pause();
47
+ };
48
+ process.stdin.resume();
49
+ process.stdin.on('data', onData);
50
+ });
51
+ }
52
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/ui/approval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAe;IACjE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAgB,EAChB,MAAe;IAEf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;IACxC,IAAI,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;IAEtF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChE,OAAO,EAAE,QAAQ,EAAE,UAAU,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAA4B;IACxD,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAyC;IACtE,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,QAAQ,CAAC,UAAkB;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC/B,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Minimal ANSI helpers: zero dependencies, safe on all modern terminals.
3
+ */
4
+ export declare function ansi(code: string, text: string): string;
5
+ export declare const bold: (t: string) => string;
6
+ export declare const dim: (t: string) => string;
7
+ export declare const red: (t: string) => string;
8
+ export declare const green: (t: string) => string;
9
+ export declare const yellow: (t: string) => string;
10
+ export declare const blue: (t: string) => string;
11
+ export declare const magenta: (t: string) => string;
12
+ export declare const cyan: (t: string) => string;
13
+ export declare const gray: (t: string) => string;
14
+ export declare function truncate(text: string, max?: number): string;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Minimal ANSI helpers: zero dependencies, safe on all modern terminals.
3
+ */
4
+ const enabled = process.env['NO_COLOR'] === undefined && process.stdout.isTTY;
5
+ export function ansi(code, text) {
6
+ return enabled ? `\x1b[${code}m${text}\x1b[0m` : text;
7
+ }
8
+ export const bold = (t) => ansi('1', t);
9
+ export const dim = (t) => ansi('2', t);
10
+ export const red = (t) => ansi('31', t);
11
+ export const green = (t) => ansi('32', t);
12
+ export const yellow = (t) => ansi('33', t);
13
+ export const blue = (t) => ansi('34', t);
14
+ export const magenta = (t) => ansi('35', t);
15
+ export const cyan = (t) => ansi('36', t);
16
+ export const gray = (t) => ansi('90', t);
17
+ export function truncate(text, max = 160) {
18
+ const oneLine = text.replaceAll('\n', ' ⏎ ');
19
+ return oneLine.length > max ? oneLine.slice(0, max - 1) + '…' : oneLine;
20
+ }
21
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAE9E,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,IAAY;IAC7C,OAAO,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAEzD,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,GAAG,GAAG,GAAG;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * One shared line reader for the whole process. Lines that arrive while no
3
+ * question is pending are buffered, so piped input works too.
4
+ */
5
+ export declare class LineReader {
6
+ private rl;
7
+ private buffered;
8
+ private pending?;
9
+ private closed;
10
+ constructor();
11
+ ask(label: string): Promise<PromptResult>;
12
+ /** True once stdin hit EOF: no more input will ever arrive. */
13
+ isClosed(): boolean;
14
+ close(): void;
15
+ }
16
+ export interface PromptResult {
17
+ input: string;
18
+ cancelled: boolean;
19
+ }
20
+ /** The main session prompt: `ineedcodes ❯` */
21
+ export declare function createPrompt(): {
22
+ ask(): Promise<PromptResult>;
23
+ question(text: string): Promise<PromptResult>;
24
+ isClosed(): boolean;
25
+ close(): void;
26
+ };
27
+ export declare const BANNER: string;
28
+ export declare function printHelp(): void;
29
+ export declare function printStatus(info: {
30
+ model: string;
31
+ provider: string;
32
+ mode: string;
33
+ depth: string;
34
+ projectRoot: string;
35
+ git: string;
36
+ memory: string;
37
+ skills: string[];
38
+ processes: number;
39
+ agentMode: 'plan' | 'build';
40
+ thinking: 'low' | 'medium' | 'high';
41
+ contextTokens: {
42
+ total: number;
43
+ limit: number;
44
+ compactsAt: number;
45
+ };
46
+ }): void;
@@ -0,0 +1,135 @@
1
+ import * as readline from 'node:readline';
2
+ import { bold, dim, green, cyan, gray, truncate } from './colors.js';
3
+ /**
4
+ * One shared line reader for the whole process. Lines that arrive while no
5
+ * question is pending are buffered, so piped input works too.
6
+ */
7
+ export class LineReader {
8
+ rl;
9
+ buffered = [];
10
+ pending;
11
+ closed = false;
12
+ constructor() {
13
+ this.rl = readline.createInterface({
14
+ input: process.stdin,
15
+ output: process.stdout,
16
+ prompt: '',
17
+ historySize: 200
18
+ });
19
+ this.rl.on('line', (line) => {
20
+ if (this.pending) {
21
+ const resolve = this.pending;
22
+ this.pending = undefined;
23
+ resolve({ input: line, cancelled: false });
24
+ }
25
+ else {
26
+ this.buffered.push(line);
27
+ }
28
+ });
29
+ this.rl.on('SIGINT', () => {
30
+ process.stdout.write('\n');
31
+ if (this.pending) {
32
+ const resolve = this.pending;
33
+ this.pending = undefined;
34
+ resolve({ input: '', cancelled: true });
35
+ }
36
+ });
37
+ this.rl.on('close', () => {
38
+ this.closed = true;
39
+ if (this.pending) {
40
+ const resolve = this.pending;
41
+ this.pending = undefined;
42
+ resolve({ input: '', cancelled: true });
43
+ }
44
+ });
45
+ }
46
+ ask(label) {
47
+ return new Promise((resolve) => {
48
+ if (this.buffered.length > 0) {
49
+ const line = this.buffered.shift() ?? '';
50
+ resolve({ input: line.trim(), cancelled: false });
51
+ return;
52
+ }
53
+ if (this.closed) {
54
+ resolve({ input: '', cancelled: true });
55
+ return;
56
+ }
57
+ process.stdout.write(label + ' ');
58
+ this.pending = resolve;
59
+ });
60
+ }
61
+ /** True once stdin hit EOF: no more input will ever arrive. */
62
+ isClosed() {
63
+ return this.closed;
64
+ }
65
+ close() {
66
+ this.rl.close();
67
+ }
68
+ }
69
+ /** The main session prompt: `ineedcodes ❯` */
70
+ export function createPrompt() {
71
+ const lr = new LineReader();
72
+ const label = () => '\n' + bold(green('ineed')) + dim(' ❯');
73
+ return {
74
+ ask: () => lr.ask(label()),
75
+ question: (text) => lr.ask(text),
76
+ isClosed: () => lr.isClosed(),
77
+ close: () => lr.close()
78
+ };
79
+ }
80
+ export const BANNER = String.raw `
81
+ ██╗███╗ ██╗███████╗███████╗██████╗
82
+ ██║████╗ ██║██╔════╝██╔════╝██╔══██╗
83
+ ██║██╔██╗ ██║█████╗ █████╗ ██║ ██║
84
+ ██║██║╚██╗██║██╔══╝ ██╔══╝ ██║ ██║
85
+ ██║██║ ╚████║███████╗███████╗██████╔╝
86
+ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝╚═════╝
87
+ your terminal, now autonomous
88
+ `;
89
+ export function printHelp() {
90
+ const rows = [
91
+ ['/help', 'show this help'],
92
+ ['/model', 'show current model, or pick one interactively from your provider'],
93
+ ['/context', 'show what the model can see right now (tokens per part)'],
94
+ ['/init', 'scan this project and generate AGENTS.md instructions'],
95
+ ['/status', 'show session status'],
96
+ ['/agents', 'show sub-agents of the last task'],
97
+ ['/memory', 'recall or save memories (e.g. /memory save use pnpm, never npm)'],
98
+ ['/skills', 'list available skills; /skills <name> shows the skill text'],
99
+ ['/permissions', 'show or change permission mode: ask | workspace | autonomous'],
100
+ ['/explain', 'set explanation depth: beginner | balanced | terse'],
101
+ ['/resume', 'resume a previous session'],
102
+ ['/clear', 'start a fresh session (wipes current conversation)'],
103
+ ['/copy', 'copy the last answer to your clipboard'],
104
+ ['/compact', 'compact the conversation context now'],
105
+ ['/doctor', 'check installation, config, model and memory health'],
106
+ ['/setup', 're-run the interactive setup wizard'],
107
+ ['/exit', 'leave iNeedCodes (Ctrl+C twice also works)']
108
+ ];
109
+ process.stdout.write('\n' + bold('Slash commands') + gray(': optional shortcuts; plain language always works:') + '\n');
110
+ for (const [cmd, desc] of rows) {
111
+ process.stdout.write(` ${cyan(cmd.padEnd(14))} ${dim(desc)}\n`);
112
+ }
113
+ process.stdout.write('\n' + dim('Just type what you want. Examples:') + '\n');
114
+ process.stdout.write(dim(' fix the build errors in this project\n') + dim(' explain this repository like I am a beginner\n'));
115
+ }
116
+ export function printStatus(info) {
117
+ process.stdout.write('\n' + bold('Status') + '\n');
118
+ const rows = [
119
+ ['model', `${info.model} (${info.provider})`],
120
+ ['mode', info.agentMode === 'plan' ? 'plan (read-only)' : 'build (full tools)'],
121
+ ['thinking', info.thinking],
122
+ ['permission mode', info.mode],
123
+ ['explanation depth', info.depth],
124
+ ['context', `${info.contextTokens.total}/${info.contextTokens.limit} tokens (compact at ${info.contextTokens.compactsAt})`],
125
+ ['project', info.projectRoot],
126
+ ['git', info.git],
127
+ ['memory', info.memory],
128
+ ['skills', info.skills.join(', ') || '(none)'],
129
+ ['background processes', String(info.processes)]
130
+ ];
131
+ for (const [k, v] of rows) {
132
+ process.stdout.write(` ${dim(k.padEnd(20))} ${truncate(v, 100)}\n`);
133
+ }
134
+ }
135
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { RuntimeEvent } from '@ineedcodes/agent';
2
+ /**
3
+ * Renders agent runtime events into a readable terminal stream.
4
+ * Beginners get plain-English narration; the raw data is there for
5
+ * advanced users in the tool output blocks.
6
+ */
7
+ export declare class Renderer {
8
+ private currentTurn;
9
+ handle(event: RuntimeEvent): Promise<void>;
10
+ private renderToolResult;
11
+ private describeInput;
12
+ private line;
13
+ }