de-agent 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/README.md +88 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +26 -0
- package/dist/config.js.map +1 -0
- package/dist/engine/permissions.d.ts +9 -0
- package/dist/engine/permissions.d.ts.map +1 -0
- package/dist/engine/permissions.js +40 -0
- package/dist/engine/permissions.js.map +1 -0
- package/dist/engine/queryEngine.d.ts +16 -0
- package/dist/engine/queryEngine.d.ts.map +1 -0
- package/dist/engine/queryEngine.js +154 -0
- package/dist/engine/queryEngine.js.map +1 -0
- package/dist/engine/systemPrompt.d.ts +2 -0
- package/dist/engine/systemPrompt.d.ts.map +1 -0
- package/dist/engine/systemPrompt.js +53 -0
- package/dist/engine/systemPrompt.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/openaiClient.d.ts +26 -0
- package/dist/llm/openaiClient.d.ts.map +1 -0
- package/dist/llm/openaiClient.js +69 -0
- package/dist/llm/openaiClient.js.map +1 -0
- package/dist/tools/bashTool.d.ts +2 -0
- package/dist/tools/bashTool.d.ts.map +1 -0
- package/dist/tools/bashTool.js +31 -0
- package/dist/tools/bashTool.js.map +1 -0
- package/dist/tools/fileEditTool.d.ts +2 -0
- package/dist/tools/fileEditTool.d.ts.map +1 -0
- package/dist/tools/fileEditTool.js +33 -0
- package/dist/tools/fileEditTool.js.map +1 -0
- package/dist/tools/fileReadTool.d.ts +2 -0
- package/dist/tools/fileReadTool.d.ts.map +1 -0
- package/dist/tools/fileReadTool.js +32 -0
- package/dist/tools/fileReadTool.js.map +1 -0
- package/dist/tools/fileWriteTool.d.ts +2 -0
- package/dist/tools/fileWriteTool.d.ts.map +1 -0
- package/dist/tools/fileWriteTool.js +26 -0
- package/dist/tools/fileWriteTool.js.map +1 -0
- package/dist/tools/globTool.d.ts +2 -0
- package/dist/tools/globTool.d.ts.map +1 -0
- package/dist/tools/globTool.js +65 -0
- package/dist/tools/globTool.js.map +1 -0
- package/dist/tools/grepTool.d.ts +2 -0
- package/dist/tools/grepTool.d.ts.map +1 -0
- package/dist/tools/grepTool.js +92 -0
- package/dist/tools/grepTool.js.map +1 -0
- package/dist/tools/listDirTool.d.ts +2 -0
- package/dist/tools/listDirTool.d.ts.map +1 -0
- package/dist/tools/listDirTool.js +57 -0
- package/dist/tools/listDirTool.js.map +1 -0
- package/dist/tools/tool.d.ts +28 -0
- package/dist/tools/tool.d.ts.map +1 -0
- package/dist/tools/tool.js +101 -0
- package/dist/tools/tool.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +27 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/display.d.ts +13 -0
- package/dist/ui/display.d.ts.map +1 -0
- package/dist/ui/display.js +79 -0
- package/dist/ui/display.js.map +1 -0
- package/dist/ui/input.d.ts +7 -0
- package/dist/ui/input.d.ts.map +1 -0
- package/dist/ui/input.js +39 -0
- package/dist/ui/input.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
function zodToJsonSchema(schema) {
|
|
3
|
+
if (schema instanceof z.ZodString) {
|
|
4
|
+
return { type: 'string' };
|
|
5
|
+
}
|
|
6
|
+
else if (schema instanceof z.ZodNumber) {
|
|
7
|
+
return { type: 'number' };
|
|
8
|
+
}
|
|
9
|
+
else if (schema instanceof z.ZodBoolean) {
|
|
10
|
+
return { type: 'boolean' };
|
|
11
|
+
}
|
|
12
|
+
else if (schema instanceof z.ZodEnum) {
|
|
13
|
+
return { type: 'string', enum: schema.options };
|
|
14
|
+
}
|
|
15
|
+
else if (schema instanceof z.ZodObject) {
|
|
16
|
+
const shape = schema.shape;
|
|
17
|
+
const properties = {};
|
|
18
|
+
const required = [];
|
|
19
|
+
for (const key in shape) {
|
|
20
|
+
let propSchema = shape[key];
|
|
21
|
+
let isOptional = false;
|
|
22
|
+
if (propSchema instanceof z.ZodOptional) {
|
|
23
|
+
isOptional = true;
|
|
24
|
+
propSchema = propSchema.unwrap();
|
|
25
|
+
}
|
|
26
|
+
else if (propSchema instanceof z.ZodDefault) {
|
|
27
|
+
isOptional = true;
|
|
28
|
+
propSchema = propSchema._def.innerType;
|
|
29
|
+
}
|
|
30
|
+
properties[key] = zodToJsonSchema(propSchema);
|
|
31
|
+
if (!isOptional) {
|
|
32
|
+
required.push(key);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { type: 'object', properties, required };
|
|
36
|
+
}
|
|
37
|
+
else if (schema instanceof z.ZodArray) {
|
|
38
|
+
return { type: 'array', items: zodToJsonSchema(schema.element) };
|
|
39
|
+
}
|
|
40
|
+
else if (schema instanceof z.ZodOptional) {
|
|
41
|
+
return zodToJsonSchema(schema.unwrap());
|
|
42
|
+
}
|
|
43
|
+
else if (schema instanceof z.ZodDefault) {
|
|
44
|
+
return zodToJsonSchema(schema._def.innerType);
|
|
45
|
+
}
|
|
46
|
+
return { type: 'string' };
|
|
47
|
+
}
|
|
48
|
+
export function buildTool(def) {
|
|
49
|
+
return {
|
|
50
|
+
...def,
|
|
51
|
+
permissionLevel: def.permissionLevel ?? 'ask',
|
|
52
|
+
isReadOnly: def.isReadOnly ?? false,
|
|
53
|
+
validateInput(args) {
|
|
54
|
+
if (def.validateInput) {
|
|
55
|
+
return def.validateInput(args);
|
|
56
|
+
}
|
|
57
|
+
const parsed = def.inputSchema.safeParse(args);
|
|
58
|
+
if (parsed.success) {
|
|
59
|
+
return { valid: true };
|
|
60
|
+
}
|
|
61
|
+
return { valid: false, error: parsed.error.message };
|
|
62
|
+
},
|
|
63
|
+
getOpenAISchema() {
|
|
64
|
+
return {
|
|
65
|
+
type: 'function',
|
|
66
|
+
function: {
|
|
67
|
+
name: this.name,
|
|
68
|
+
description: this.description,
|
|
69
|
+
parameters: zodToJsonSchema(this.inputSchema)
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export class ToolRegistry {
|
|
76
|
+
tools = new Map();
|
|
77
|
+
register(tool) {
|
|
78
|
+
this.tools.set(tool.name, tool);
|
|
79
|
+
}
|
|
80
|
+
get(name) {
|
|
81
|
+
let tool = this.tools.get(name);
|
|
82
|
+
if (!tool) {
|
|
83
|
+
// Fallback: try case-insensitive or exact mapping
|
|
84
|
+
const lowerName = name.toLowerCase();
|
|
85
|
+
for (const t of this.tools.values()) {
|
|
86
|
+
if (t.name.toLowerCase() === lowerName ||
|
|
87
|
+
t.name.toLowerCase() === lowerName.replace(/tool$/, '')) {
|
|
88
|
+
return t;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return tool;
|
|
93
|
+
}
|
|
94
|
+
getAll() {
|
|
95
|
+
return Array.from(this.tools.values());
|
|
96
|
+
}
|
|
97
|
+
getAllSchemas() {
|
|
98
|
+
return this.getAll().map(t => t.getOpenAISchema());
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type Role = 'system' | 'user' | 'assistant' | 'tool';
|
|
2
|
+
export interface ToolCall {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
arguments: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface ToolResult {
|
|
8
|
+
toolCallId: string;
|
|
9
|
+
name: string;
|
|
10
|
+
output: string;
|
|
11
|
+
isError: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface Message {
|
|
14
|
+
role: Role;
|
|
15
|
+
content?: string;
|
|
16
|
+
toolCalls?: ToolCall[];
|
|
17
|
+
toolCallId?: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class ConversationHistory {
|
|
21
|
+
private messages;
|
|
22
|
+
addMessage(msg: Message): void;
|
|
23
|
+
getMessages(): Message[];
|
|
24
|
+
estimateTokens(): number;
|
|
25
|
+
truncateToFit(maxTokens: number): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAiB;IAEjC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI9B,WAAW,IAAI,OAAO,EAAE;IAIxB,cAAc,IAAI,MAAM;IAQxB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CASvC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export class ConversationHistory {
|
|
2
|
+
messages = [];
|
|
3
|
+
addMessage(msg) {
|
|
4
|
+
this.messages.push(msg);
|
|
5
|
+
}
|
|
6
|
+
getMessages() {
|
|
7
|
+
return [...this.messages];
|
|
8
|
+
}
|
|
9
|
+
estimateTokens() {
|
|
10
|
+
return this.messages.reduce((acc, msg) => {
|
|
11
|
+
const content = msg.content || '';
|
|
12
|
+
const toolCalls = msg.toolCalls ? JSON.stringify(msg.toolCalls) : '';
|
|
13
|
+
return acc + Math.ceil((content.length + toolCalls.length) / 4) + 10;
|
|
14
|
+
}, 0);
|
|
15
|
+
}
|
|
16
|
+
truncateToFit(maxTokens) {
|
|
17
|
+
while (this.estimateTokens() > maxTokens && this.messages.length > 1) {
|
|
18
|
+
if (this.messages[0].role === 'system') {
|
|
19
|
+
this.messages.splice(1, 1);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
this.messages.shift();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAuBA,MAAM,OAAO,mBAAmB;IACtB,QAAQ,GAAc,EAAE,CAAC;IAEjC,UAAU,CAAC,GAAY;QACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACvE,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class Display {
|
|
2
|
+
printWelcome(): void;
|
|
3
|
+
printUserMessage(msg: string): void;
|
|
4
|
+
streamText(delta: string): void;
|
|
5
|
+
endStream(): void;
|
|
6
|
+
printToolUse(name: string, args: Record<string, unknown>): void;
|
|
7
|
+
printToolResult(name: string, result: string, isError: boolean): void;
|
|
8
|
+
printDiff(diff: string): void;
|
|
9
|
+
askPermission(toolName: string, description: string): Promise<boolean>;
|
|
10
|
+
printError(msg: string): void;
|
|
11
|
+
printCost(tokensIn: number, tokensOut: number): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"AAGA,qBAAa,OAAO;IAClB,YAAY,IAAI,IAAI;IAgBpB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAInC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI/B,SAAS,IAAI,IAAI;IAIjB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAO/D,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAUrE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASvB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB5E,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CAGrD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import * as readline from 'readline';
|
|
3
|
+
export class Display {
|
|
4
|
+
printWelcome() {
|
|
5
|
+
const logo = `
|
|
6
|
+
__ __
|
|
7
|
+
____/ /__ ____ _____ ____ ____ / /_
|
|
8
|
+
/ __ / _ \\______/ __ \`/ __ \`/ _ \\/ __ \\/ __/
|
|
9
|
+
/ /_/ / __/_____/ /_/ / /_/ / __/ / / / /_
|
|
10
|
+
\\__,_/\\___/ \\__,_/\\__, /\\___/_/ /_/\\__/
|
|
11
|
+
/____/
|
|
12
|
+
`;
|
|
13
|
+
console.log(chalk.cyan.bold(logo));
|
|
14
|
+
console.log(chalk.dim('==================================================='));
|
|
15
|
+
console.log(chalk.green.bold('✨ Welcome to de-agent!'));
|
|
16
|
+
console.log(chalk.gray('Your terminal AI Coding Assistant is ready to help.'));
|
|
17
|
+
console.log(chalk.dim('===================================================\n'));
|
|
18
|
+
}
|
|
19
|
+
printUserMessage(msg) {
|
|
20
|
+
console.log(chalk.magenta.bold('\nUser: ') + msg);
|
|
21
|
+
}
|
|
22
|
+
streamText(delta) {
|
|
23
|
+
process.stdout.write(delta);
|
|
24
|
+
}
|
|
25
|
+
endStream() {
|
|
26
|
+
process.stdout.write('\n');
|
|
27
|
+
}
|
|
28
|
+
printToolUse(name, args) {
|
|
29
|
+
console.log(chalk.cyan(`\n┌─ Tool Call: ${name} ────────`));
|
|
30
|
+
const argsStr = JSON.stringify(args, null, 2).split('\n').map(l => chalk.cyan('│ ') + l).join('\n');
|
|
31
|
+
console.log(argsStr);
|
|
32
|
+
console.log(chalk.cyan(`└────────────────────────────────`));
|
|
33
|
+
}
|
|
34
|
+
printToolResult(name, result, isError) {
|
|
35
|
+
const lines = result.split('\n');
|
|
36
|
+
const color = isError ? chalk.red : chalk.gray;
|
|
37
|
+
const prefix = color(isError ? '✖' : '✔') + ' ' + color.bold(name) + ' ';
|
|
38
|
+
console.log(prefix + color(lines[0] || ''));
|
|
39
|
+
if (lines.length > 1) {
|
|
40
|
+
console.log(color(' ' + lines.slice(1).join('\n ')));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
printDiff(diff) {
|
|
44
|
+
const lines = diff.split('\n');
|
|
45
|
+
for (const line of lines) {
|
|
46
|
+
if (line.startsWith('+'))
|
|
47
|
+
console.log(chalk.green(line));
|
|
48
|
+
else if (line.startsWith('-'))
|
|
49
|
+
console.log(chalk.red(line));
|
|
50
|
+
else
|
|
51
|
+
console.log(line);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async askPermission(toolName, description) {
|
|
55
|
+
const rl = readline.createInterface({
|
|
56
|
+
input: process.stdin,
|
|
57
|
+
output: process.stdout
|
|
58
|
+
});
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
rl.question(chalk.yellow(`\nAllow tool '${toolName}' to run? [Y/n]\n${description}\n> `), (answer) => {
|
|
61
|
+
rl.close();
|
|
62
|
+
const normalized = answer.trim().toLowerCase();
|
|
63
|
+
if (normalized === 'n' || normalized === 'no') {
|
|
64
|
+
resolve(false);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
resolve(true);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
printError(msg) {
|
|
73
|
+
console.log(chalk.red.bold('\nError: ') + chalk.red(msg));
|
|
74
|
+
}
|
|
75
|
+
printCost(tokensIn, tokensOut) {
|
|
76
|
+
console.log(chalk.gray(`Tokens: ${tokensIn} in, ${tokensOut} out`));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/ui/input.ts"],"names":[],"mappings":"AAGA,qBAAa,KAAK;IAChB,OAAO,CAAC,EAAE,CAAqB;;IAezB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBxC,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/ui/input.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as readline from 'readline/promises';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
export class Input {
|
|
4
|
+
rl;
|
|
5
|
+
constructor() {
|
|
6
|
+
this.rl = readline.createInterface({
|
|
7
|
+
input: process.stdin,
|
|
8
|
+
output: process.stdout,
|
|
9
|
+
prompt: chalk.blue.bold('> ')
|
|
10
|
+
});
|
|
11
|
+
this.rl.on('SIGINT', () => {
|
|
12
|
+
console.log(chalk.yellow('\nInput cancelled. Use Ctrl+D or type "exit" to quit.'));
|
|
13
|
+
this.rl.prompt();
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async getInput() {
|
|
17
|
+
try {
|
|
18
|
+
const line = await this.rl.question(chalk.blue.bold('> '));
|
|
19
|
+
const trimmed = line.trim();
|
|
20
|
+
if (trimmed === 'exit' || trimmed === 'quit') {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
if (trimmed.length > 0) {
|
|
24
|
+
return trimmed;
|
|
25
|
+
}
|
|
26
|
+
return this.getInput(); // recursive retry if empty
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
if (e.code === 'ABORT_ERR') {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
close() {
|
|
36
|
+
this.rl.close();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/ui/input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,KAAK;IACR,EAAE,CAAqB;IAE/B;QACE,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC,CAAC;YACnF,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,2BAA2B;QACrD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "de-agent",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI Coding Agent - A Claude Code inspired terminal AI assistant",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"de-agent": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "bun run src/index.ts",
|
|
17
|
+
"start": "bun run dist/index.js",
|
|
18
|
+
"typecheck": "tsc --noEmit",
|
|
19
|
+
"test": "bun test tests/**/*.test.ts",
|
|
20
|
+
"prepublishOnly": "bun run build",
|
|
21
|
+
"postinstall": "echo '\\n de-agent installed! Run: de-agent --help\\n'"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"ai",
|
|
25
|
+
"coding-agent",
|
|
26
|
+
"cli",
|
|
27
|
+
"llm",
|
|
28
|
+
"openai",
|
|
29
|
+
"claude",
|
|
30
|
+
"deepseek",
|
|
31
|
+
"terminal"
|
|
32
|
+
],
|
|
33
|
+
"author": "",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"chalk": "^5.3.0",
|
|
37
|
+
"openai": "^4.0.0",
|
|
38
|
+
"ora": "^8.0.0",
|
|
39
|
+
"zod": "^3.23.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^22.0.0",
|
|
43
|
+
"typescript": "^5.6.0"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18.0.0"
|
|
47
|
+
}
|
|
48
|
+
}
|