@felan-ai/felan 0.24.3 → 0.24.5

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 (61) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +101 -16
  3. package/dist/acp/interactions.d.ts +22 -0
  4. package/dist/acp/interactions.d.ts.map +1 -0
  5. package/dist/acp/interactions.js +352 -0
  6. package/dist/acp/interactions.js.map +1 -0
  7. package/dist/acp/login.d.ts +39 -0
  8. package/dist/acp/login.d.ts.map +1 -0
  9. package/dist/acp/login.js +500 -0
  10. package/dist/acp/login.js.map +1 -0
  11. package/dist/acp/server.d.ts +25 -0
  12. package/dist/acp/server.d.ts.map +1 -0
  13. package/dist/acp/server.js +96 -0
  14. package/dist/acp/server.js.map +1 -0
  15. package/dist/acp/session-registry.d.ts +25 -0
  16. package/dist/acp/session-registry.d.ts.map +1 -0
  17. package/dist/acp/session-registry.js +450 -0
  18. package/dist/acp/session-registry.js.map +1 -0
  19. package/dist/acp/session-updates.d.ts +44 -0
  20. package/dist/acp/session-updates.d.ts.map +1 -0
  21. package/dist/acp/session-updates.js +1076 -0
  22. package/dist/acp/session-updates.js.map +1 -0
  23. package/dist/acp/stdio.d.ts +13 -0
  24. package/dist/acp/stdio.d.ts.map +1 -0
  25. package/dist/acp/stdio.js +55 -0
  26. package/dist/acp/stdio.js.map +1 -0
  27. package/dist/cli-main.d.ts +2 -0
  28. package/dist/cli-main.d.ts.map +1 -1
  29. package/dist/cli-main.js +34 -3
  30. package/dist/cli-main.js.map +1 -1
  31. package/dist/dependencies.js +14 -14
  32. package/dist/dependencies.js.map +1 -1
  33. package/dist/extension-settings.js +2 -2
  34. package/dist/extension-settings.js.map +1 -1
  35. package/dist/mcp/oauth-host.js +2 -2
  36. package/dist/mcp/oauth-host.js.map +1 -1
  37. package/dist/memory/coordinator.js +1 -1
  38. package/dist/memory/coordinator.js.map +1 -1
  39. package/dist/process-restart.js +1 -1
  40. package/dist/process-restart.js.map +1 -1
  41. package/dist/restart-command.js +3 -3
  42. package/dist/restart-command.js.map +1 -1
  43. package/dist/runtime.d.ts +8 -2
  44. package/dist/runtime.d.ts.map +1 -1
  45. package/dist/runtime.js +15 -1
  46. package/dist/runtime.js.map +1 -1
  47. package/dist/savings.js +1 -1
  48. package/dist/savings.js.map +1 -1
  49. package/dist/startup-header.js +1 -1
  50. package/dist/startup-header.js.map +1 -1
  51. package/dist/subagents/catalog.js +8 -8
  52. package/dist/subagents/catalog.js.map +1 -1
  53. package/dist/subagents/host.d.ts +4 -0
  54. package/dist/subagents/host.d.ts.map +1 -1
  55. package/dist/subagents/host.js +7 -2
  56. package/dist/subagents/host.js.map +1 -1
  57. package/dist/update-notification.js +2 -2
  58. package/dist/update-notification.js.map +1 -1
  59. package/dist/update.js +8 -8
  60. package/dist/update.js.map +1 -1
  61. package/package.json +8 -7
@@ -0,0 +1,500 @@
1
+ import { emitKeypressEvents, } from 'node:readline';
2
+ import {} from '@felan-ai/agent-core';
3
+ import { createLocalModelRuntime, getLocalAgentDir, } from '../runtime.js';
4
+ import { sanitizeAcpErrorMessage } from './session-updates.js';
5
+ const MAX_AUTH_METHODS = 128;
6
+ const MAX_AUTH_INTERACTIONS = 128;
7
+ const MAX_INFO_LINKS = 32;
8
+ const MAX_PROMPT_OPTIONS = 128;
9
+ const MAX_INPUT_BYTES = 64 * 1024;
10
+ const MAX_URL_BYTES = 16 * 1024;
11
+ const UNSAFE_INLINE_CHARACTERS = /[\u0000-\u001f\u007f]/u;
12
+ class AcpLoginCancelledError extends Error {
13
+ constructor() {
14
+ super('Authentication cancelled');
15
+ this.name = 'AcpLoginCancelledError';
16
+ }
17
+ }
18
+ export async function runLocalFelanAcpLogin(options = {}) {
19
+ const terminal = options.terminal ?? new NodeAcpLoginTerminal();
20
+ const writeError = options.writeError
21
+ ?? ((message) => { process.stderr.write(`${message}\n`); });
22
+ const createRuntime = options.createModelRuntime
23
+ ?? ((agentDir, signal) => createLocalModelRuntime(agentDir, signal));
24
+ const signalSource = options.signalSource ?? process;
25
+ const terminateProcess = options.terminateProcess ?? (options.signalSource === undefined && options.signal === undefined
26
+ ? (exitCode) => process.exit(exitCode)
27
+ : undefined);
28
+ const controller = new AbortController();
29
+ const secrets = new Set();
30
+ const interactionBudget = {
31
+ remaining: MAX_AUTH_INTERACTIONS,
32
+ cancel: () => controller.abort(),
33
+ };
34
+ let interactionActive = true;
35
+ let signalExitCode;
36
+ let forcedExitCode;
37
+ const signalHandlers = [
38
+ ['SIGINT', 130],
39
+ ['SIGTERM', 143],
40
+ ].map(([signal, exitCode]) => {
41
+ const handler = () => {
42
+ signalExitCode ??= exitCode;
43
+ controller.abort();
44
+ };
45
+ signalSource.once(signal, handler);
46
+ return [signal, handler];
47
+ });
48
+ const abortFromCaller = () => controller.abort(options.signal?.reason);
49
+ if (options.signal?.aborted)
50
+ abortFromCaller();
51
+ else
52
+ options.signal?.addEventListener('abort', abortFromCaller, { once: true });
53
+ try {
54
+ controller.signal.throwIfAborted();
55
+ const modelRuntime = await waitForCancellation(createRuntime(options.agentDir ?? getLocalAgentDir(), controller.signal), controller.signal);
56
+ controller.signal.throwIfAborted();
57
+ const methods = loginMethods(modelRuntime, secrets);
58
+ if (methods.length === 0) {
59
+ writeError('No configurable model-provider authentication methods are available.');
60
+ return 1;
61
+ }
62
+ const selectedId = await waitForCancellation(terminal.select('Select a model provider and authentication method:', methods.map(({ id, label, description }) => ({ id, label, description })), controller.signal), controller.signal);
63
+ if (selectedId === undefined)
64
+ throw new AcpLoginCancelledError();
65
+ const selected = methods.find(({ id }) => id === selectedId);
66
+ if (selected === undefined)
67
+ throw new AcpLoginCancelledError();
68
+ controller.signal.throwIfAborted();
69
+ const interaction = {
70
+ signal: controller.signal,
71
+ prompt: (prompt) => interactionActive
72
+ ? answerAuthPrompt(terminal, prompt, selected.authType, controller.signal, secrets, () => controller.abort(), interactionBudget)
73
+ : Promise.reject(new AcpLoginCancelledError()),
74
+ notify: (event) => {
75
+ if (interactionActive)
76
+ notifyAuthEvent(terminal, event, secrets, interactionBudget);
77
+ },
78
+ };
79
+ await waitForCancellation(modelRuntime.login(selected.providerId, selected.authType, interaction), controller.signal);
80
+ controller.signal.throwIfAborted();
81
+ terminal.writeLine(`Authentication saved for ${selected.providerName}.`);
82
+ return 0;
83
+ }
84
+ catch (error) {
85
+ if (controller.signal.aborted || error instanceof AcpLoginCancelledError) {
86
+ if (signalExitCode === undefined)
87
+ terminal.writeLine('Authentication cancelled.');
88
+ const exitCode = signalExitCode ?? 1;
89
+ if (controller.signal.aborted)
90
+ forcedExitCode = exitCode;
91
+ return exitCode;
92
+ }
93
+ writeError(`Authentication failed: ${safeMessage(error, secrets)}`);
94
+ return 1;
95
+ }
96
+ finally {
97
+ interactionActive = false;
98
+ options.signal?.removeEventListener('abort', abortFromCaller);
99
+ for (const [signal, handler] of signalHandlers)
100
+ signalSource.off(signal, handler);
101
+ secrets.clear();
102
+ if (forcedExitCode !== undefined && terminateProcess !== undefined) {
103
+ const exitCode = forcedExitCode;
104
+ // This command runs in a dedicated subprocess; a provider may retain handles after ignoring abort.
105
+ setImmediate(() => terminateProcess(exitCode));
106
+ }
107
+ }
108
+ }
109
+ async function waitForCancellation(operation, signal) {
110
+ if (signal.aborted)
111
+ throw new AcpLoginCancelledError();
112
+ let abortListener;
113
+ const cancelled = new Promise((_resolve, reject) => {
114
+ abortListener = () => reject(new AcpLoginCancelledError());
115
+ signal.addEventListener('abort', abortListener, { once: true });
116
+ if (signal.aborted)
117
+ abortListener();
118
+ });
119
+ try {
120
+ return await Promise.race([operation, cancelled]);
121
+ }
122
+ finally {
123
+ if (abortListener !== undefined)
124
+ signal.removeEventListener('abort', abortListener);
125
+ }
126
+ }
127
+ async function answerAuthPrompt(terminal, prompt, authType, loginSignal, secrets, cancelLogin, budget) {
128
+ consumeAuthInteraction(budget);
129
+ const signal = prompt.signal === undefined
130
+ ? loginSignal
131
+ : AbortSignal.any([loginSignal, prompt.signal]);
132
+ signal.throwIfAborted();
133
+ const message = safePromptMessage(prompt.message, secrets);
134
+ let answer;
135
+ if (prompt.type === 'select') {
136
+ if (prompt.options.length === 0
137
+ || prompt.options.length > MAX_PROMPT_OPTIONS
138
+ || new Set(prompt.options.map(({ id }) => id)).size !== prompt.options.length)
139
+ throw new Error('Authentication provider returned invalid prompt options');
140
+ const choices = prompt.options.map(({ id, label, description }) => ({
141
+ id,
142
+ label: safePromptSingleLine(label, secrets),
143
+ ...(description === undefined
144
+ ? {}
145
+ : { description: safePromptSingleLine(description, secrets) }),
146
+ }));
147
+ answer = await terminal.select(message, choices, signal);
148
+ if (answer !== undefined && !choices.some(({ id }) => id === answer))
149
+ answer = undefined;
150
+ }
151
+ else {
152
+ answer = await terminal.input(message, {
153
+ secret: authType === 'api_key'
154
+ || prompt.type === 'secret'
155
+ || prompt.type === 'manual_code',
156
+ ...(prompt.placeholder === undefined
157
+ ? {}
158
+ : { placeholder: safePromptSingleLine(prompt.placeholder, secrets) }),
159
+ }, signal);
160
+ }
161
+ if (answer === undefined || Buffer.byteLength(answer) > MAX_INPUT_BYTES) {
162
+ if (!signal.aborted)
163
+ cancelLogin();
164
+ throw new AcpLoginCancelledError();
165
+ }
166
+ if (signal.aborted) {
167
+ throw new AcpLoginCancelledError();
168
+ }
169
+ if (prompt.type !== 'select' && answer.length > 0)
170
+ secrets.add(answer);
171
+ return answer;
172
+ }
173
+ function notifyAuthEvent(terminal, event, secrets, budget) {
174
+ consumeAuthInteraction(budget);
175
+ if (event.type === 'auth_url') {
176
+ if (event.instructions)
177
+ terminal.writeLine(safePromptMessage(event.instructions, secrets));
178
+ terminal.writeLine(authUrlLine('Open this URL to continue', event.url, secrets));
179
+ return;
180
+ }
181
+ if (event.type === 'device_code') {
182
+ terminal.writeLine(authUrlLine('Open this URL to continue', event.verificationUri, secrets));
183
+ const code = safeSingleLine(event.userCode, new Set());
184
+ terminal.writeLine(`Device code: ${code}`);
185
+ if (event.userCode)
186
+ secrets.add(event.userCode);
187
+ return;
188
+ }
189
+ terminal.writeLine(safePromptMessage(event.message, secrets));
190
+ if (event.type === 'info') {
191
+ for (const link of (event.links ?? []).slice(0, MAX_INFO_LINKS)) {
192
+ const label = link.label === undefined ? 'More information' : safeSingleLine(link.label, secrets);
193
+ terminal.writeLine(authUrlLine(label, link.url, secrets));
194
+ }
195
+ }
196
+ }
197
+ function consumeAuthInteraction(budget) {
198
+ if (budget.remaining <= 0) {
199
+ budget.cancel();
200
+ throw new Error('Authentication flow exceeded its interaction limit');
201
+ }
202
+ budget.remaining -= 1;
203
+ }
204
+ function authUrlLine(label, value, secrets) {
205
+ const safeUrl = displayAuthUrl(value, secrets);
206
+ return safeUrl === undefined
207
+ ? `${label}: [invalid URL omitted]`
208
+ : `${label}: ${safeUrl}`;
209
+ }
210
+ function displayAuthUrl(value, secrets) {
211
+ if (!value
212
+ || Buffer.byteLength(value) > MAX_URL_BYTES
213
+ || UNSAFE_INLINE_CHARACTERS.test(value)
214
+ || [...secrets].some((secret) => (secret
215
+ && (value.includes(secret) || value.includes(encodeURIComponent(secret))))))
216
+ return undefined;
217
+ let url;
218
+ try {
219
+ url = new URL(value);
220
+ }
221
+ catch {
222
+ return undefined;
223
+ }
224
+ if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password)
225
+ return undefined;
226
+ const sensitiveQueryNames = /^(?:access_token|api_key|client_secret|password|refresh_token|token)$/iu;
227
+ for (const [name, entry] of url.searchParams) {
228
+ if (sensitiveQueryNames.test(name) || [...secrets].some((secret) => secret && entry.includes(secret))) {
229
+ url.searchParams.set(name, '[REDACTED]');
230
+ }
231
+ }
232
+ if (/(?:access_token|refresh_token|client_secret|password|token)=/iu.test(url.hash)
233
+ || [...secrets].some((secret) => secret && url.hash.includes(secret)))
234
+ url.hash = '#[REDACTED]';
235
+ return url.toString();
236
+ }
237
+ function loginMethods(modelRuntime, secrets) {
238
+ const candidates = [];
239
+ for (const provider of modelRuntime.getProviders()) {
240
+ const providerName = safeSingleLine(provider.name || provider.id, secrets);
241
+ const providerIdLabel = safeSingleLine(provider.id, secrets);
242
+ const providerLabel = providerName === providerIdLabel
243
+ ? providerName
244
+ : `${providerName} (${providerIdLabel})`;
245
+ if (provider.auth.oauth) {
246
+ const methodName = provider.auth.oauth.loginLabel ?? provider.auth.oauth.name;
247
+ candidates.push({
248
+ providerId: provider.id,
249
+ providerName,
250
+ authType: 'oauth',
251
+ label: `${providerLabel} — ${safeSingleLine(methodName, secrets)}`,
252
+ description: modelRuntime.hasConfiguredAuth(provider.id)
253
+ ? 'OAuth (currently configured)'
254
+ : 'OAuth',
255
+ });
256
+ }
257
+ if (provider.auth.apiKey?.login) {
258
+ candidates.push({
259
+ providerId: provider.id,
260
+ providerName,
261
+ authType: 'api_key',
262
+ label: `${providerLabel} — ${safeSingleLine(provider.auth.apiKey.name, secrets)}`,
263
+ description: modelRuntime.hasConfiguredAuth(provider.id)
264
+ ? 'API key (currently configured)'
265
+ : 'API key',
266
+ });
267
+ }
268
+ if (candidates.length > MAX_AUTH_METHODS) {
269
+ throw new Error('Too many model-provider authentication methods are configured');
270
+ }
271
+ }
272
+ return candidates
273
+ .sort((left, right) => left.label.localeCompare(right.label))
274
+ .map((method, index) => ({ ...method, id: `method-${index + 1}` }));
275
+ }
276
+ function safeMessage(value, secrets) {
277
+ let message;
278
+ try {
279
+ message = value instanceof Error ? value.message : String(value);
280
+ }
281
+ catch {
282
+ message = 'Operation failed';
283
+ }
284
+ for (const secret of secrets) {
285
+ if (secret)
286
+ message = message.replaceAll(secret, '[REDACTED_SECRET]');
287
+ }
288
+ message = truncateUtf8(message, MAX_INPUT_BYTES);
289
+ return sanitizeAcpErrorMessage(message);
290
+ }
291
+ function safePromptMessage(value, secrets) {
292
+ let message = value;
293
+ for (const secret of secrets) {
294
+ if (secret)
295
+ message = message.replaceAll(secret, '[REDACTED_SECRET]');
296
+ }
297
+ message = truncateUtf8(message, MAX_INPUT_BYTES)
298
+ .replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?-----END [^-]*PRIVATE KEY-----/gu, '[REDACTED_PRIVATE_KEY]')
299
+ .replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*$/gu, '[REDACTED_PRIVATE_KEY]')
300
+ .replace(/\b(?:sk-[A-Za-z0-9_-]{8,}|ghp_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|xox[baprs]-[A-Za-z0-9-]{12,})\b/gu, '[REDACTED_TOKEN]')
301
+ .replace(/(Bearer\s+)[A-Za-z0-9._~+/=-]+/giu, '$1[REDACTED_TOKEN]')
302
+ .replace(/((?:api[-_ ]?key|access[-_ ]?token|refresh[-_ ]?token|password|client[-_ ]?secret)\s*[:=]\s*)[^\s]+/giu, '$1[REDACTED_SECRET]')
303
+ .replace(/([?&](?:access_token|api_key|client_secret|password|refresh_token|token)=)[^&#\s]*/giu, '$1[REDACTED_SECRET]')
304
+ .replace(/\r\n?/gu, '\n')
305
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/gu, '');
306
+ return truncateUtf8(message, MAX_INPUT_BYTES);
307
+ }
308
+ function safePromptSingleLine(value, secrets) {
309
+ return safePromptMessage(value, secrets).replace(/\s+/gu, ' ').trim() || 'Unnamed';
310
+ }
311
+ function truncateUtf8(value, maxBytes) {
312
+ if (Buffer.byteLength(value, 'utf8') <= maxBytes)
313
+ return value;
314
+ return Buffer.from(value, 'utf8')
315
+ .subarray(0, maxBytes)
316
+ .toString('utf8')
317
+ .replace(/�$/u, '');
318
+ }
319
+ function safeSingleLine(value, secrets) {
320
+ return safePromptSingleLine(value, secrets);
321
+ }
322
+ export class NodeAcpLoginTerminal {
323
+ #input;
324
+ #output;
325
+ constructor(input = process.stdin, output = process.stdout) {
326
+ this.#input = input;
327
+ this.#output = output;
328
+ }
329
+ async select(message, options, signal) {
330
+ this.writeLine(message);
331
+ options.forEach((option, index) => {
332
+ const description = option.description ? ` — ${option.description}` : '';
333
+ this.writeLine(` ${index + 1}. ${option.label}${description}`);
334
+ });
335
+ while (!signal.aborted) {
336
+ const answer = await this.#readVisibleLine('Selection (Enter to cancel): ', signal);
337
+ if (answer === undefined || answer.trim() === '')
338
+ return undefined;
339
+ const index = Number(answer.trim());
340
+ if (Number.isSafeInteger(index) && index >= 1 && index <= options.length) {
341
+ return options[index - 1]?.id;
342
+ }
343
+ this.writeLine('Enter one of the listed numbers.');
344
+ }
345
+ return undefined;
346
+ }
347
+ input(message, options, signal) {
348
+ const placeholder = options.placeholder ? ` (${options.placeholder})` : '';
349
+ const prompt = `${message}${placeholder}: `;
350
+ return options.secret
351
+ ? this.#readSecretLine(prompt, signal)
352
+ : this.#readVisibleLine(prompt, signal);
353
+ }
354
+ writeLine(message) {
355
+ this.#output.write(`${message}\n`);
356
+ }
357
+ async #readVisibleLine(prompt, signal) {
358
+ if (signal.aborted)
359
+ return undefined;
360
+ this.#output.write(prompt);
361
+ this.#input.resume();
362
+ return new Promise((resolve, reject) => {
363
+ const chunks = [];
364
+ let size = 0;
365
+ let settled = false;
366
+ const finish = (value, error) => {
367
+ if (settled)
368
+ return;
369
+ settled = true;
370
+ this.#input.off('data', onData);
371
+ this.#input.off('end', onEnd);
372
+ this.#input.off('close', onClose);
373
+ this.#input.off('error', onError);
374
+ signal.removeEventListener('abort', onAbort);
375
+ this.#input.pause();
376
+ if (this.#input.isTTY !== true)
377
+ this.#output.write('\n');
378
+ if (error)
379
+ reject(error);
380
+ else
381
+ resolve(value);
382
+ };
383
+ const onAbort = () => finish(undefined);
384
+ const onEnd = () => finish(undefined);
385
+ const onClose = () => finish(undefined);
386
+ const onError = (error) => finish(undefined, error);
387
+ const onData = (chunk) => {
388
+ const bytes = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
389
+ const lineFeed = bytes.indexOf(10);
390
+ let content = lineFeed < 0 ? bytes : bytes.subarray(0, lineFeed);
391
+ if (lineFeed >= 0 && content.at(-1) === 13)
392
+ content = content.subarray(0, -1);
393
+ if (size + content.byteLength > MAX_INPUT_BYTES) {
394
+ finish(undefined, new Error('Terminal input exceeds the maximum size'));
395
+ return;
396
+ }
397
+ if (content.byteLength > 0) {
398
+ chunks.push(content);
399
+ size += content.byteLength;
400
+ }
401
+ if (lineFeed < 0)
402
+ return;
403
+ const remainder = bytes.subarray(lineFeed + 1);
404
+ if (remainder.byteLength > MAX_INPUT_BYTES) {
405
+ finish(undefined, new Error('Queued terminal input exceeds the maximum size'));
406
+ return;
407
+ }
408
+ try {
409
+ const buffered = Buffer.concat(chunks, size);
410
+ const line = buffered.at(-1) === 13 ? buffered.subarray(0, -1) : buffered;
411
+ const value = new TextDecoder('utf-8', { fatal: true }).decode(line);
412
+ finish(value);
413
+ if (remainder.byteLength > 0)
414
+ this.#input.unshift(remainder);
415
+ }
416
+ catch {
417
+ finish(undefined, new Error('Terminal input is not valid UTF-8'));
418
+ }
419
+ };
420
+ this.#input.on('data', onData);
421
+ this.#input.once('end', onEnd);
422
+ this.#input.once('close', onClose);
423
+ this.#input.once('error', onError);
424
+ signal.addEventListener('abort', onAbort, { once: true });
425
+ if (signal.aborted)
426
+ onAbort();
427
+ });
428
+ }
429
+ #readSecretLine(prompt, signal) {
430
+ if (signal.aborted)
431
+ return Promise.resolve(undefined);
432
+ if (!this.#input.isTTY || typeof this.#input.setRawMode !== 'function') {
433
+ return Promise.reject(new Error('Secret input requires an interactive terminal'));
434
+ }
435
+ this.#output.write(prompt);
436
+ const wasRaw = this.#input.isRaw === true;
437
+ emitKeypressEvents(this.#input);
438
+ this.#input.setRawMode(true);
439
+ this.#input.resume();
440
+ return new Promise((resolve, reject) => {
441
+ let value = '';
442
+ let settled = false;
443
+ const finish = (result, error) => {
444
+ if (settled)
445
+ return;
446
+ settled = true;
447
+ this.#input.off('keypress', onKeypress);
448
+ this.#input.off('end', onEnd);
449
+ this.#input.off('close', onClose);
450
+ this.#input.off('error', onError);
451
+ signal.removeEventListener('abort', onAbort);
452
+ try {
453
+ this.#input.setRawMode?.(wasRaw);
454
+ }
455
+ catch { }
456
+ this.#input.pause();
457
+ this.#output.write('\n');
458
+ if (error)
459
+ reject(error);
460
+ else
461
+ resolve(result);
462
+ };
463
+ const onAbort = () => finish(undefined);
464
+ const onEnd = () => finish(undefined);
465
+ const onClose = () => finish(undefined);
466
+ const onError = () => finish(undefined);
467
+ const onKeypress = (text, key = {}) => {
468
+ if (key.name === 'return' || key.name === 'enter') {
469
+ finish(value);
470
+ return;
471
+ }
472
+ if (key.name === 'escape'
473
+ || (key.ctrl === true && (key.name === 'c' || key.name === 'd'))) {
474
+ finish(undefined);
475
+ return;
476
+ }
477
+ if (key.name === 'backspace') {
478
+ value = [...value].slice(0, -1).join('');
479
+ return;
480
+ }
481
+ if (!text || key.ctrl === true || key.meta === true || UNSAFE_INLINE_CHARACTERS.test(text)) {
482
+ return;
483
+ }
484
+ if (Buffer.byteLength(value) + Buffer.byteLength(text) > MAX_INPUT_BYTES) {
485
+ finish(undefined, new Error('Terminal input exceeds the maximum size'));
486
+ return;
487
+ }
488
+ value += text;
489
+ };
490
+ this.#input.on('keypress', onKeypress);
491
+ this.#input.once('end', onEnd);
492
+ this.#input.once('close', onClose);
493
+ this.#input.once('error', onError);
494
+ signal.addEventListener('abort', onAbort, { once: true });
495
+ if (signal.aborted)
496
+ onAbort();
497
+ });
498
+ }
499
+ }
500
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/acp/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type AgentApp } from '@agentclientprotocol/sdk';
2
+ import { type AcpSessionRegistryOptions } from './session-registry.js';
3
+ import { type AcpStdioOptions } from './stdio.js';
4
+ export declare const ACP_TERMINAL_AUTH_METHOD: {
5
+ readonly id: "felan-terminal-login";
6
+ readonly name: "Log in to Felan Code";
7
+ readonly description: "Configure a model provider for Felan Code in an interactive terminal.";
8
+ readonly type: "terminal";
9
+ readonly args: readonly ["login"];
10
+ };
11
+ export interface RunLocalFelanAcpOptions extends AcpStdioOptions, AcpSessionRegistryOptions {
12
+ readonly writeError?: (message: string) => void;
13
+ readonly signalSource?: AcpSignalSource;
14
+ }
15
+ export interface AcpSignalSource {
16
+ once(signal: 'SIGINT' | 'SIGTERM', listener: () => void): unknown;
17
+ off(signal: 'SIGINT' | 'SIGTERM', listener: () => void): unknown;
18
+ }
19
+ export interface FelanAcpService {
20
+ readonly app: AgentApp;
21
+ dispose(): Promise<void>;
22
+ }
23
+ export declare function createFelanAcpService(options?: AcpSessionRegistryOptions): FelanAcpService;
24
+ export declare function runLocalFelanAcp(options?: RunLocalFelanAcpOptions): Promise<number>;
25
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/acp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,wBAAwB;;;;;;CAM3B,CAAC;AAEX,MAAM,WAAW,uBAAwB,SAAQ,eAAe,EAAE,yBAAyB;IACzF,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;IAClE,GAAG,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;CAClE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,yBAA8B,GAAG,eAAe,CAgC9F;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CA6C7F"}
@@ -0,0 +1,96 @@
1
+ import { PROTOCOL_VERSION, agent, methods, } from '@agentclientprotocol/sdk';
2
+ import { FELAN_VERSION } from '../version.js';
3
+ import { AcpSessionRegistry, } from './session-registry.js';
4
+ import { sanitizeAcpErrorMessage } from './session-updates.js';
5
+ import { createAcpStdioTransport, } from './stdio.js';
6
+ export const ACP_TERMINAL_AUTH_METHOD = {
7
+ id: 'felan-terminal-login',
8
+ name: 'Log in to Felan Code',
9
+ description: 'Configure a model provider for Felan Code in an interactive terminal.',
10
+ type: 'terminal',
11
+ args: ['login'],
12
+ };
13
+ export function createFelanAcpService(options = {}) {
14
+ const sessions = new AcpSessionRegistry(options);
15
+ const app = agent({ name: 'felan' })
16
+ .onRequest(methods.agent.initialize, ({ params }) => {
17
+ sessions.initialize(params.clientCapabilities ?? {});
18
+ // The ACP Registry validator still uses this legacy metadata signal.
19
+ const supportsTerminalAuth = params.clientCapabilities?.auth?.terminal === true
20
+ || params.clientCapabilities?._meta?.['terminal-auth'] === true;
21
+ return {
22
+ protocolVersion: params.protocolVersion === PROTOCOL_VERSION
23
+ ? params.protocolVersion
24
+ : PROTOCOL_VERSION,
25
+ agentCapabilities: {
26
+ loadSession: true,
27
+ sessionCapabilities: { close: {} },
28
+ },
29
+ ...(supportsTerminalAuth
30
+ ? { authMethods: [ACP_TERMINAL_AUTH_METHOD] }
31
+ : {}),
32
+ agentInfo: {
33
+ name: 'felan',
34
+ title: 'Felan Code',
35
+ version: FELAN_VERSION,
36
+ },
37
+ };
38
+ })
39
+ .onRequest(methods.agent.session.new, ({ params, client }) => sessions.newSession(params, client))
40
+ .onRequest(methods.agent.session.load, async ({ params, client }) => sessions.loadSession(params, client))
41
+ .onRequest(methods.agent.session.close, ({ params }) => sessions.closeSession(params))
42
+ .onRequest(methods.agent.session.prompt, ({ params, client }) => sessions.prompt(params, client))
43
+ .onNotification(methods.agent.session.cancel, ({ params }) => sessions.cancel(params.sessionId));
44
+ return { app, dispose: () => sessions.dispose() };
45
+ }
46
+ export async function runLocalFelanAcp(options = {}) {
47
+ const diagnostics = options.diagnostics ?? process.stderr;
48
+ const writeError = options.writeError ?? ((message) => { diagnostics.write(`${message}\n`); });
49
+ let transport;
50
+ let service;
51
+ let removeSignalHandlers = () => { };
52
+ let signalExitCode;
53
+ let exitCode = 0;
54
+ try {
55
+ transport = createAcpStdioTransport(options);
56
+ const signalSource = options.signalSource ?? process;
57
+ service = createFelanAcpService({
58
+ ...options,
59
+ writeDiagnostic: options.writeDiagnostic ?? writeError,
60
+ });
61
+ const connection = service.app.connect(transport.stream);
62
+ const handlers = [
63
+ ['SIGINT', 130],
64
+ ['SIGTERM', 143],
65
+ ].map(([signal, code]) => {
66
+ const handler = () => {
67
+ signalExitCode ??= code;
68
+ connection.close();
69
+ };
70
+ signalSource.once(signal, handler);
71
+ return [signal, handler];
72
+ });
73
+ removeSignalHandlers = () => {
74
+ for (const [signal, handler] of handlers)
75
+ signalSource.off(signal, handler);
76
+ };
77
+ await connection.closed;
78
+ }
79
+ catch (error) {
80
+ exitCode = 1;
81
+ writeError(sanitizeAcpErrorMessage(error));
82
+ }
83
+ removeSignalHandlers();
84
+ try {
85
+ await service?.dispose();
86
+ }
87
+ catch (error) {
88
+ exitCode = 1;
89
+ writeError(sanitizeAcpErrorMessage(error));
90
+ }
91
+ finally {
92
+ transport?.restore();
93
+ }
94
+ return exitCode === 0 ? signalExitCode ?? 0 : exitCode;
95
+ }
96
+ //# sourceMappingURL=server.js.map