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.
Files changed (70) hide show
  1. package/README.md +88 -0
  2. package/dist/config.d.ts +12 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +26 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/engine/permissions.d.ts +9 -0
  7. package/dist/engine/permissions.d.ts.map +1 -0
  8. package/dist/engine/permissions.js +40 -0
  9. package/dist/engine/permissions.js.map +1 -0
  10. package/dist/engine/queryEngine.d.ts +16 -0
  11. package/dist/engine/queryEngine.d.ts.map +1 -0
  12. package/dist/engine/queryEngine.js +154 -0
  13. package/dist/engine/queryEngine.js.map +1 -0
  14. package/dist/engine/systemPrompt.d.ts +2 -0
  15. package/dist/engine/systemPrompt.d.ts.map +1 -0
  16. package/dist/engine/systemPrompt.js +53 -0
  17. package/dist/engine/systemPrompt.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +108 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/llm/openaiClient.d.ts +26 -0
  23. package/dist/llm/openaiClient.d.ts.map +1 -0
  24. package/dist/llm/openaiClient.js +69 -0
  25. package/dist/llm/openaiClient.js.map +1 -0
  26. package/dist/tools/bashTool.d.ts +2 -0
  27. package/dist/tools/bashTool.d.ts.map +1 -0
  28. package/dist/tools/bashTool.js +31 -0
  29. package/dist/tools/bashTool.js.map +1 -0
  30. package/dist/tools/fileEditTool.d.ts +2 -0
  31. package/dist/tools/fileEditTool.d.ts.map +1 -0
  32. package/dist/tools/fileEditTool.js +33 -0
  33. package/dist/tools/fileEditTool.js.map +1 -0
  34. package/dist/tools/fileReadTool.d.ts +2 -0
  35. package/dist/tools/fileReadTool.d.ts.map +1 -0
  36. package/dist/tools/fileReadTool.js +32 -0
  37. package/dist/tools/fileReadTool.js.map +1 -0
  38. package/dist/tools/fileWriteTool.d.ts +2 -0
  39. package/dist/tools/fileWriteTool.d.ts.map +1 -0
  40. package/dist/tools/fileWriteTool.js +26 -0
  41. package/dist/tools/fileWriteTool.js.map +1 -0
  42. package/dist/tools/globTool.d.ts +2 -0
  43. package/dist/tools/globTool.d.ts.map +1 -0
  44. package/dist/tools/globTool.js +65 -0
  45. package/dist/tools/globTool.js.map +1 -0
  46. package/dist/tools/grepTool.d.ts +2 -0
  47. package/dist/tools/grepTool.d.ts.map +1 -0
  48. package/dist/tools/grepTool.js +92 -0
  49. package/dist/tools/grepTool.js.map +1 -0
  50. package/dist/tools/listDirTool.d.ts +2 -0
  51. package/dist/tools/listDirTool.d.ts.map +1 -0
  52. package/dist/tools/listDirTool.js +57 -0
  53. package/dist/tools/listDirTool.js.map +1 -0
  54. package/dist/tools/tool.d.ts +28 -0
  55. package/dist/tools/tool.d.ts.map +1 -0
  56. package/dist/tools/tool.js +101 -0
  57. package/dist/tools/tool.js.map +1 -0
  58. package/dist/types.d.ts +27 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +27 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/ui/display.d.ts +13 -0
  63. package/dist/ui/display.d.ts.map +1 -0
  64. package/dist/ui/display.js +79 -0
  65. package/dist/ui/display.js.map +1 -0
  66. package/dist/ui/input.d.ts +7 -0
  67. package/dist/ui/input.d.ts.map +1 -0
  68. package/dist/ui/input.js +39 -0
  69. package/dist/ui/input.js.map +1 -0
  70. 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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"}
@@ -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,7 @@
1
+ export declare class Input {
2
+ private rl;
3
+ constructor();
4
+ getInput(): Promise<string | null>;
5
+ close(): void;
6
+ }
7
+ //# sourceMappingURL=input.d.ts.map
@@ -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"}
@@ -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
+ }