@elasto/nyx-cli 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 (167) hide show
  1. package/README.md +136 -0
  2. package/bin/nyx.js +3 -0
  3. package/dist/agent/index.d.ts +29 -0
  4. package/dist/agent/index.d.ts.map +1 -0
  5. package/dist/agent/index.js +362 -0
  6. package/dist/agent/index.js.map +1 -0
  7. package/dist/agent/prompt.d.ts +16 -0
  8. package/dist/agent/prompt.d.ts.map +1 -0
  9. package/dist/agent/prompt.js +487 -0
  10. package/dist/agent/prompt.js.map +1 -0
  11. package/dist/agent/templates/index.d.ts +2 -0
  12. package/dist/agent/templates/index.d.ts.map +1 -0
  13. package/dist/agent/templates/index.js +44 -0
  14. package/dist/agent/templates/index.js.map +1 -0
  15. package/dist/auth/index.d.ts +23 -0
  16. package/dist/auth/index.d.ts.map +1 -0
  17. package/dist/auth/index.js +161 -0
  18. package/dist/auth/index.js.map +1 -0
  19. package/dist/commands/login.d.ts +3 -0
  20. package/dist/commands/login.d.ts.map +1 -0
  21. package/dist/commands/login.js +32 -0
  22. package/dist/commands/login.js.map +1 -0
  23. package/dist/commands/logout.d.ts +3 -0
  24. package/dist/commands/logout.d.ts.map +1 -0
  25. package/dist/commands/logout.js +13 -0
  26. package/dist/commands/logout.js.map +1 -0
  27. package/dist/commands/logs.d.ts +3 -0
  28. package/dist/commands/logs.d.ts.map +1 -0
  29. package/dist/commands/logs.js +29 -0
  30. package/dist/commands/logs.js.map +1 -0
  31. package/dist/commands/root.d.ts +3 -0
  32. package/dist/commands/root.d.ts.map +1 -0
  33. package/dist/commands/root.js +27 -0
  34. package/dist/commands/root.js.map +1 -0
  35. package/dist/commands/run.d.ts +3 -0
  36. package/dist/commands/run.d.ts.map +1 -0
  37. package/dist/commands/run.js +74 -0
  38. package/dist/commands/run.js.map +1 -0
  39. package/dist/commands/session.d.ts +3 -0
  40. package/dist/commands/session.d.ts.map +1 -0
  41. package/dist/commands/session.js +61 -0
  42. package/dist/commands/session.js.map +1 -0
  43. package/dist/config/index.d.ts +22 -0
  44. package/dist/config/index.d.ts.map +1 -0
  45. package/dist/config/index.js +110 -0
  46. package/dist/config/index.js.map +1 -0
  47. package/dist/db/index.d.ts +5 -0
  48. package/dist/db/index.d.ts.map +1 -0
  49. package/dist/db/index.js +72 -0
  50. package/dist/db/index.js.map +1 -0
  51. package/dist/events/index.d.ts +3 -0
  52. package/dist/events/index.d.ts.map +1 -0
  53. package/dist/events/index.js +45 -0
  54. package/dist/events/index.js.map +1 -0
  55. package/dist/filetracker/index.d.ts +8 -0
  56. package/dist/filetracker/index.d.ts.map +1 -0
  57. package/dist/filetracker/index.js +21 -0
  58. package/dist/filetracker/index.js.map +1 -0
  59. package/dist/hooks/index.d.ts +13 -0
  60. package/dist/hooks/index.d.ts.map +1 -0
  61. package/dist/hooks/index.js +42 -0
  62. package/dist/hooks/index.js.map +1 -0
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +140 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/logging/index.d.ts +16 -0
  68. package/dist/logging/index.d.ts.map +1 -0
  69. package/dist/logging/index.js +76 -0
  70. package/dist/logging/index.js.map +1 -0
  71. package/dist/lsp/index.d.ts +10 -0
  72. package/dist/lsp/index.d.ts.map +1 -0
  73. package/dist/lsp/index.js +130 -0
  74. package/dist/lsp/index.js.map +1 -0
  75. package/dist/mcp/index.d.ts +11 -0
  76. package/dist/mcp/index.d.ts.map +1 -0
  77. package/dist/mcp/index.js +102 -0
  78. package/dist/mcp/index.js.map +1 -0
  79. package/dist/permissions/index.d.ts +13 -0
  80. package/dist/permissions/index.d.ts.map +1 -0
  81. package/dist/permissions/index.js +96 -0
  82. package/dist/permissions/index.js.map +1 -0
  83. package/dist/session/index.d.ts +25 -0
  84. package/dist/session/index.d.ts.map +1 -0
  85. package/dist/session/index.js +100 -0
  86. package/dist/session/index.js.map +1 -0
  87. package/dist/shell/index.d.ts +8 -0
  88. package/dist/shell/index.d.ts.map +1 -0
  89. package/dist/shell/index.js +29 -0
  90. package/dist/shell/index.js.map +1 -0
  91. package/dist/skills/index.d.ts +9 -0
  92. package/dist/skills/index.d.ts.map +1 -0
  93. package/dist/skills/index.js +53 -0
  94. package/dist/skills/index.js.map +1 -0
  95. package/dist/tools/bash.d.ts +35 -0
  96. package/dist/tools/bash.d.ts.map +1 -0
  97. package/dist/tools/bash.js +44 -0
  98. package/dist/tools/bash.js.map +1 -0
  99. package/dist/tools/diagnostics.d.ts +19 -0
  100. package/dist/tools/diagnostics.d.ts.map +1 -0
  101. package/dist/tools/diagnostics.js +45 -0
  102. package/dist/tools/diagnostics.js.map +1 -0
  103. package/dist/tools/edit.d.ts +31 -0
  104. package/dist/tools/edit.d.ts.map +1 -0
  105. package/dist/tools/edit.js +72 -0
  106. package/dist/tools/edit.js.map +1 -0
  107. package/dist/tools/glob.d.ts +23 -0
  108. package/dist/tools/glob.d.ts.map +1 -0
  109. package/dist/tools/glob.js +40 -0
  110. package/dist/tools/glob.js.map +1 -0
  111. package/dist/tools/grep.d.ts +31 -0
  112. package/dist/tools/grep.d.ts.map +1 -0
  113. package/dist/tools/grep.js +72 -0
  114. package/dist/tools/grep.js.map +1 -0
  115. package/dist/tools/index.d.ts +9 -0
  116. package/dist/tools/index.d.ts.map +1 -0
  117. package/dist/tools/index.js +78 -0
  118. package/dist/tools/index.js.map +1 -0
  119. package/dist/tools/job_output.d.ts +49 -0
  120. package/dist/tools/job_output.d.ts.map +1 -0
  121. package/dist/tools/job_output.js +57 -0
  122. package/dist/tools/job_output.js.map +1 -0
  123. package/dist/tools/ls.d.ts +19 -0
  124. package/dist/tools/ls.d.ts.map +1 -0
  125. package/dist/tools/ls.js +55 -0
  126. package/dist/tools/ls.js.map +1 -0
  127. package/dist/tools/todos.d.ts +41 -0
  128. package/dist/tools/todos.d.ts.map +1 -0
  129. package/dist/tools/todos.js +54 -0
  130. package/dist/tools/todos.js.map +1 -0
  131. package/dist/tools/view.d.ts +27 -0
  132. package/dist/tools/view.d.ts.map +1 -0
  133. package/dist/tools/view.js +59 -0
  134. package/dist/tools/view.js.map +1 -0
  135. package/dist/tools/web_fetch.d.ts +24 -0
  136. package/dist/tools/web_fetch.d.ts.map +1 -0
  137. package/dist/tools/web_fetch.js +43 -0
  138. package/dist/tools/web_fetch.js.map +1 -0
  139. package/dist/tools/web_search.d.ts +23 -0
  140. package/dist/tools/web_search.d.ts.map +1 -0
  141. package/dist/tools/web_search.js +41 -0
  142. package/dist/tools/web_search.js.map +1 -0
  143. package/dist/tools/write.d.ts +23 -0
  144. package/dist/tools/write.d.ts.map +1 -0
  145. package/dist/tools/write.js +39 -0
  146. package/dist/tools/write.js.map +1 -0
  147. package/dist/types/index.d.ts +136 -0
  148. package/dist/types/index.d.ts.map +1 -0
  149. package/dist/types/index.js +3 -0
  150. package/dist/types/index.js.map +1 -0
  151. package/dist/ui/index.d.ts +3 -0
  152. package/dist/ui/index.d.ts.map +1 -0
  153. package/dist/ui/index.js +318 -0
  154. package/dist/ui/index.js.map +1 -0
  155. package/dist/util/diff.d.ts +17 -0
  156. package/dist/util/diff.d.ts.map +1 -0
  157. package/dist/util/diff.js +74 -0
  158. package/dist/util/diff.js.map +1 -0
  159. package/dist/util/index.d.ts +6 -0
  160. package/dist/util/index.d.ts.map +1 -0
  161. package/dist/util/index.js +33 -0
  162. package/dist/util/index.js.map +1 -0
  163. package/dist/workspace/index.d.ts +6 -0
  164. package/dist/workspace/index.d.ts.map +1 -0
  165. package/dist/workspace/index.js +133 -0
  166. package/dist/workspace/index.js.map +1 -0
  167. package/package.json +47 -0
package/README.md ADDED
@@ -0,0 +1,136 @@
1
+ # Nyx
2
+
3
+ **Your AI pair programmer — right in the terminal.**
4
+
5
+ Nyx is an AI-powered coding assistant that lives in your CLI. It reads your codebase, understands your project, and helps you write, edit, debug, and refactor code — all without leaving your terminal.
6
+
7
+ Think of it as an engineering teammate that never sleeps, installed via npm.
8
+
9
+ ## Why Nyx?
10
+
11
+ Instead of copying errors into ChatGPT or switching context to a web browser, Nyx works **where you already are**:
12
+
13
+ ```
14
+ cd your-project
15
+ nyx
16
+ ❯ add input validation to the login endpoint
17
+ ```
18
+
19
+ Nyx reads the relevant files, plans the change, and executes it — writing code, running tests, fixing errors — all autonomously.
20
+
21
+ ## How It Works
22
+
23
+ ```
24
+ You type a prompt → Nyx analyzes your codebase
25
+ → Plans the change
26
+ → Edits files, runs commands
27
+ → Summarizes what was done
28
+ ```
29
+
30
+ Nyx has access to tools — `view`, `write`, `edit`, `grep`, `bash`, and more — and uses them to get work done. It's like having a senior engineer iterating on your feedback loop in real time.
31
+
32
+ ## Installation
33
+
34
+ ```bash
35
+ npm install -g @elasto/nyx-cli
36
+ ```
37
+
38
+ Requires **Node.js 20+**.
39
+
40
+ ## Quick Start
41
+
42
+ ```bash
43
+ # Create an account via browser
44
+ nyx login --signup
45
+
46
+ # Log in
47
+ nyx login
48
+
49
+ # Start an interactive session
50
+ cd your-project
51
+ nyx
52
+
53
+ # Or run a one-off prompt
54
+ nyx run "explain the architecture of this project"
55
+ ```
56
+
57
+ ## What Nyx Can Do
58
+
59
+ | Task | Example |
60
+ |---|---|
61
+ | **Understand your codebase** | `nyx run "what does this project do?"` |
62
+ | **Write new code** | `nyx run "add a healthcheck endpoint"` |
63
+ | **Debug errors** | Paste an error log and ask Nyx to find the root cause |
64
+ | **Fix issues** | `nyx run "fix the TypeScript errors in src/"` |
65
+ | **Refactor** | `nyx run "extract the database logic into a separate module"` |
66
+ | **Install deps + run tests** | Nyx runs `npm install` and `npm test` automatically |
67
+ | **Continue after interruptions** | `nyx -C` picks up where you left off |
68
+
69
+ ## Commands
70
+
71
+ | Command | Description |
72
+ |---|---|
73
+ | `nyx` | Start interactive TUI session |
74
+ | `nyx run <prompt>` | Run a prompt non-interactively |
75
+ | `nyx login` | Log in via browser |
76
+ | `nyx logout` | Log out |
77
+ | `nyx -C` | Continue the most recent session |
78
+ | `nyx -S <id>` | Continue a specific session |
79
+
80
+ ### Interactive (inside `nyx`)
81
+
82
+ | Command | Description |
83
+ |---|---|
84
+ | `/login` | Log in |
85
+ | `/logout` | Log out |
86
+ | `/continue` | Resume last session |
87
+ | `/plan` | View current task plan |
88
+ | `/usage` | Check token usage |
89
+ | `/subscribe` | View plans and upgrade |
90
+ | `/exit` | Quit |
91
+
92
+ ## Features
93
+
94
+ - **Streaming AI responses** — see the AI think in real time
95
+ - **Autonomous tool use** — Nyx runs shell commands, edits files, installs packages
96
+ - **Session persistence** — conversation history saved locally, resume anytime
97
+ - **Smart summaries** — structured recap after every task
98
+ - **Plan tracking** — automatically creates todo lists for complex multi-step tasks
99
+ - **Permission system** — approve or deny each action (or use `--yolo`)
100
+ - **Color-coded actions** — green (view), cyan (write), yellow (edit), red (delete), magenta (bash)
101
+
102
+ ## Plans
103
+
104
+ | Tier | Tokens / month | Price |
105
+ |---|---|---|
106
+ | Free | 10,000 | $0 |
107
+ | Starter | 200,000 | $7.99 |
108
+ | Pro | 1,000,000 | $14.99 |
109
+ | Enterprise | 10,000,000 | $99.99 |
110
+
111
+ ## Dashboard
112
+
113
+ Manage your account, view usage, and upgrade at [nyx.elasto.ng](https://nyx.elasto.ng).
114
+
115
+ ## Configuration
116
+
117
+ No configuration needed. Nyx works out of the box pointing to `nyx.elasto.ng`.
118
+
119
+ To use a self-hosted backend, create a `nyx.json`:
120
+
121
+ ```json
122
+ {
123
+ "web_url": "https://your-instance.com",
124
+ "api_url": "https://api.your-instance.com"
125
+ }
126
+ ```
127
+
128
+ ## Requirements
129
+
130
+ - Node.js 20+
131
+ - A Nyx account ([sign up](https://nyx.elasto.ng))
132
+ - Internet connection
133
+
134
+ ## License
135
+
136
+ MIT
package/bin/nyx.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/index.js');
3
+
@@ -0,0 +1,29 @@
1
+ import { Config } from '../config/index.js';
2
+ import type { ChatMessage, AgentEvent } from '../types/index.js';
3
+ export interface AgentCall {
4
+ prompt: string;
5
+ history?: ChatMessage[];
6
+ projectPath: string;
7
+ openFiles?: {
8
+ path: string;
9
+ content?: string;
10
+ }[];
11
+ sessionId?: string;
12
+ onEvent?: (event: AgentEvent) => void;
13
+ }
14
+ export declare class Agent {
15
+ private auth;
16
+ private config;
17
+ private permissions;
18
+ private fileTracker;
19
+ private sessions;
20
+ private abortController;
21
+ constructor(config: Config, yolo?: boolean);
22
+ execute(call: AgentCall): Promise<void>;
23
+ private detectPlan;
24
+ private streamNyx;
25
+ private parseToolCalls;
26
+ private extractToolCalls;
27
+ cancel(): void;
28
+ }
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAS3C,OAAO,KAAK,EAAE,WAAW,EAAY,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE1E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,WAAW,EAAE,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;CACtC;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,eAAe,CAA+B;gBAE1C,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,OAAe;IAQ3C,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA8I7C,OAAO,CAAC,UAAU;YAsBJ,SAAS;IA4IvB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,gBAAgB;IAiBxB,MAAM;CAGP"}
@@ -0,0 +1,362 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Agent = void 0;
4
+ const index_js_1 = require("../auth/index.js");
5
+ const index_js_2 = require("../logging/index.js");
6
+ const index_js_3 = require("../tools/index.js");
7
+ const index_js_4 = require("../permissions/index.js");
8
+ const index_js_5 = require("../workspace/index.js");
9
+ const index_js_6 = require("../filetracker/index.js");
10
+ const index_js_7 = require("../session/index.js");
11
+ const prompt_js_1 = require("./prompt.js");
12
+ const todos_js_1 = require("../tools/todos.js");
13
+ class Agent {
14
+ auth;
15
+ config;
16
+ permissions;
17
+ fileTracker;
18
+ sessions;
19
+ abortController = null;
20
+ constructor(config, yolo = false) {
21
+ this.auth = new index_js_1.Auth();
22
+ this.config = config;
23
+ this.permissions = new index_js_4.PermissionManager(config.raw, yolo);
24
+ this.fileTracker = new index_js_6.FileTracker();
25
+ this.sessions = new index_js_7.SessionService();
26
+ }
27
+ async execute(call) {
28
+ const emit = call.onEvent || (() => { });
29
+ const maxIterations = 15;
30
+ let iterations = 0;
31
+ const toolHistory = [];
32
+ const summary = [];
33
+ this.abortController = new AbortController();
34
+ let workspaceContext = '';
35
+ try {
36
+ const index = (0, index_js_5.indexWorkspace)(call.projectPath);
37
+ workspaceContext = (0, index_js_5.buildContextSummary)(index);
38
+ index_js_2.logger.info(`Indexed ${index.totalFiles} files`);
39
+ }
40
+ catch (err) {
41
+ index_js_2.logger.warn('Indexing failed', err);
42
+ }
43
+ // Build Nyx-like system prompt with dynamic env data
44
+ const promptData = (0, prompt_js_1.buildPromptData)(call.projectPath, this.config.raw);
45
+ const skillsXML = promptData.availableSkills.length > 0
46
+ ? promptData.availableSkills.map((s) => ` <skill name="${s.name}" type="builtin" location="${s.path}/SKILL.md" description="${s.description}"/>`).join('\n')
47
+ : '';
48
+ const systemPrompt = (0, prompt_js_1.buildSystemPrompt)(promptData, skillsXML);
49
+ let sessionId = call.sessionId;
50
+ if (!sessionId) {
51
+ const session = this.sessions.create();
52
+ sessionId = session.id;
53
+ }
54
+ // Load previous conversation history from session
55
+ const previousMessages = this.sessions.getMessages(sessionId);
56
+ const messages = [
57
+ { role: 'system', content: systemPrompt },
58
+ ...previousMessages.slice(-20),
59
+ ...(call.history || []).slice(-8),
60
+ { role: 'user', content: call.prompt },
61
+ ];
62
+ this.sessions.addMessage(sessionId, messages[messages.length - 1]);
63
+ // Agent loop
64
+ while (iterations < maxIterations) {
65
+ iterations++;
66
+ index_js_2.logger.info(`Agent iteration ${iterations}`);
67
+ if (this.abortController.signal.aborted) {
68
+ emit({ type: 'content', data: { text: '\n\n(Operation cancelled)' } });
69
+ return;
70
+ }
71
+ // Loop detection
72
+ if (toolHistory.length >= 4) {
73
+ const last4 = toolHistory.slice(-4);
74
+ if (last4.every((t) => t === last4[0])) {
75
+ index_js_2.logger.warn('Detected repeated same action, breaking loop');
76
+ emit({ type: 'content', data: { text: '\n\n(I notice this action is repeating. Moving on.)\n\n' } });
77
+ break;
78
+ }
79
+ }
80
+ emit({ type: 'plan', data: { text: 'Thinking...' } });
81
+ // Stream response from Nyx backend (only user/assistant/system messages)
82
+ const apiMessages = messages.filter((m) => m.role !== 'tool');
83
+ const responseContent = await this.streamNyx(apiMessages, emit);
84
+ if (responseContent === null)
85
+ break;
86
+ // Check for native API tool_calls + text-parsed tool calls
87
+ const nativeToolCalls = (this._nativeToolCalls || []).map((tc) => ({
88
+ ...tc,
89
+ tool: tc.tool.includes('.') ? tc.tool.split('.').pop() : tc.tool,
90
+ }));
91
+ const textToolCalls = this.parseToolCalls(responseContent).map((tc) => ({
92
+ ...tc,
93
+ tool: tc.tool.includes('.') ? tc.tool.split('.').pop() : tc.tool,
94
+ }));
95
+ const toolCalls = nativeToolCalls.length > 0 ? nativeToolCalls : textToolCalls;
96
+ // Auto-detect text plans on first iteration and create todos
97
+ if (iterations === 1 && responseContent && toolCalls.length > 0) {
98
+ const planItems = this.detectPlan(responseContent);
99
+ for (const item of planItems) {
100
+ await todos_js_1.todosTool.execute({ action: 'add', content: item }, call.projectPath);
101
+ }
102
+ if (planItems.length > 0) {
103
+ emit({ type: 'content', data: { text: `\n (plan: ${planItems.length} steps tracked)\n` } });
104
+ }
105
+ }
106
+ if (toolCalls.length === 0) {
107
+ this.sessions.addMessage(sessionId, { role: 'assistant', content: responseContent });
108
+ break;
109
+ }
110
+ this.sessions.addMessage(sessionId, { role: 'assistant', content: responseContent });
111
+ // Execute each tool
112
+ for (const tool of toolCalls) {
113
+ const toolKey = `${tool.tool}:${JSON.stringify(tool.args)}`;
114
+ toolHistory.push(toolKey);
115
+ const allowed = await this.permissions.requestPermission(tool.tool, tool.args);
116
+ if (!allowed) {
117
+ emit({ type: 'tool_result', data: { id: tool.id, success: false, output: '', error: 'Permission denied', tool: tool.tool, args: tool.args } });
118
+ messages.push({ role: 'user', content: `Tool ${tool.tool} was denied by user.` });
119
+ this.sessions.addMessage(sessionId, messages[messages.length - 1]);
120
+ continue;
121
+ }
122
+ index_js_2.logger.info(`Tool: ${tool.tool}`, tool.args);
123
+ emit({ type: 'tool_call', data: { id: tool.id, tool: tool.tool, args: tool.args } });
124
+ const result = await (0, index_js_3.executeTool)(tool, call.projectPath);
125
+ const trackedPath = tool.args.file_path || tool.args.command || tool.args.path || '';
126
+ this.fileTracker.track(trackedPath);
127
+ summary.push({ tool: tool.tool, file: tool.args.file_path || tool.args.path, success: result.success });
128
+ emit({ type: 'tool_result', data: { id: tool.id, success: result.success, output: result.output, error: result.error, tool: tool.tool, args: tool.args } });
129
+ if (!result.success) {
130
+ messages.push({ role: 'user', content: `Tool ${tool.tool} failed: ${result.error}. Let me try a different approach.` });
131
+ }
132
+ else {
133
+ const resultContent = result.tool === 'bash'
134
+ ? `Command completed:\n\`\`\`\n${result.output.substring(0, 1500)}\n\`\`\``
135
+ : `Tool ${result.tool} result:\n${result.output.substring(0, 2000)}`;
136
+ messages.push({ role: 'user', content: resultContent });
137
+ }
138
+ this.sessions.addMessage(sessionId, messages[messages.length - 1]);
139
+ }
140
+ }
141
+ if (iterations >= maxIterations) {
142
+ emit({ type: 'content', data: { text: '\n\n(Maximum iterations reached)' } });
143
+ }
144
+ emit({ type: 'done', data: { sessionId, summary } });
145
+ }
146
+ detectPlan(text) {
147
+ // Detect numbered list plans like "1. Do this\n2. Do that"
148
+ const items = [];
149
+ const lines = text.split('\n');
150
+ let inPlan = false;
151
+ for (const line of lines) {
152
+ const trimmed = line.trim();
153
+ const match = trimmed.match(/^\d+[\.\)]\s+(.+)/);
154
+ if (match) {
155
+ inPlan = true;
156
+ items.push(match[1].trim());
157
+ }
158
+ else if (inPlan && trimmed.startsWith('- ')) {
159
+ items.push(trimmed.slice(2).trim());
160
+ }
161
+ else if (inPlan && trimmed === '') {
162
+ // continue collecting
163
+ }
164
+ else if (inPlan && items.length > 0) {
165
+ break; // stop at the first non-plan line after plan started
166
+ }
167
+ }
168
+ return items;
169
+ }
170
+ async streamNyx(messages, emit) {
171
+ const headers = this.auth.getHeaders();
172
+ if (!headers.Authorization) {
173
+ emit({ type: 'error', data: { message: 'Not logged in. Run `nyx login` first.' } });
174
+ return null;
175
+ }
176
+ // Build native tool definitions to send to the API
177
+ const toolDefs = (0, index_js_3.getToolDefinitions)(this.config.getDisabledTools());
178
+ const apiTools = toolDefs.map((t) => ({
179
+ type: 'function',
180
+ function: {
181
+ name: t.name,
182
+ description: t.description,
183
+ parameters: t.parameters,
184
+ },
185
+ }));
186
+ const body = {
187
+ messages: messages.map((m) => ({ role: m.role, content: m.content })),
188
+ stream: true,
189
+ provider: process.env.NYX_PROVIDER || '',
190
+ model: process.env.NYX_MODEL || '',
191
+ maxTokens: 8192,
192
+ tools: apiTools,
193
+ };
194
+ // Retry loop with exponential backoff
195
+ const maxRetries = 2;
196
+ let lastError = '';
197
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
198
+ if (attempt > 0) {
199
+ const delay = Math.min(1000 * Math.pow(2, attempt - 1), 8000);
200
+ emit({ type: 'content', data: { text: `\n(retry ${attempt}/${maxRetries} in ${delay / 1000}s...)\n` } });
201
+ await new Promise((r) => setTimeout(r, delay));
202
+ }
203
+ const controller = new AbortController();
204
+ const timeout = setTimeout(() => controller.abort(), 90000);
205
+ let res;
206
+ try {
207
+ res = await fetch(`${this.auth.getApiUrl()}/api/ai/chat`, {
208
+ method: 'POST',
209
+ headers: { ...headers, Accept: 'text/event-stream' },
210
+ body: JSON.stringify(body),
211
+ signal: this.abortController?.signal,
212
+ });
213
+ }
214
+ catch (err) {
215
+ lastError = err.message;
216
+ clearTimeout(timeout);
217
+ continue;
218
+ }
219
+ clearTimeout(timeout);
220
+ if (!res.ok) {
221
+ const errText = await res.text().catch(() => 'Unknown error');
222
+ if (res.status >= 400 && res.status < 500) {
223
+ emit({ type: 'error', data: { message: `API error ${res.status}: ${errText}` } });
224
+ return null;
225
+ }
226
+ lastError = `API error ${res.status}: ${errText}`;
227
+ continue;
228
+ }
229
+ const reader = res.body?.getReader();
230
+ if (!reader) {
231
+ lastError = 'No response body';
232
+ continue;
233
+ }
234
+ const decoder = new TextDecoder();
235
+ let fullContent = '';
236
+ let buffer = '';
237
+ const nativeToolCalls = new Map();
238
+ let lastEmittedPos = 0;
239
+ const emitInterval = setInterval(() => {
240
+ const clean = fullContent.replace(/```(?:json)?[\s\S]*?(?:```|$)/g, '').replace(/\u0060{3,}/g, '');
241
+ const newPart = clean.slice(lastEmittedPos);
242
+ if (newPart.trim()) {
243
+ emit({ type: 'content', data: { text: newPart } });
244
+ lastEmittedPos = clean.length;
245
+ }
246
+ }, 150);
247
+ try {
248
+ while (true) {
249
+ const { done, value } = await reader.read();
250
+ if (done)
251
+ break;
252
+ buffer += decoder.decode(value, { stream: true });
253
+ const lines = buffer.split('\n');
254
+ buffer = lines.pop() || '';
255
+ for (const line of lines) {
256
+ const trimmed = line.trim();
257
+ if (!trimmed || trimmed === 'data: [DONE]')
258
+ continue;
259
+ if (!trimmed.startsWith('data: '))
260
+ continue;
261
+ try {
262
+ const json = JSON.parse(trimmed.slice(6));
263
+ const delta = json.choices?.[0]?.delta;
264
+ const chunk = delta?.content || delta?.text || '';
265
+ if (chunk)
266
+ fullContent += chunk;
267
+ if (delta?.tool_calls) {
268
+ for (const tc of delta.tool_calls) {
269
+ const idx = tc.index ?? 0;
270
+ let tName = tc.function?.name || '';
271
+ if (tName.includes('.'))
272
+ tName = tName.split('.').pop() || tName;
273
+ if (!nativeToolCalls.has(idx))
274
+ nativeToolCalls.set(idx, { id: tc.id || '', name: tName, args: '' });
275
+ const existing = nativeToolCalls.get(idx);
276
+ if (tc.id)
277
+ existing.id = tc.id;
278
+ if (tc.function?.name)
279
+ existing.name = tName;
280
+ if (tc.function?.arguments)
281
+ existing.args += tc.function.arguments;
282
+ }
283
+ }
284
+ }
285
+ catch { }
286
+ }
287
+ }
288
+ }
289
+ catch (err) {
290
+ lastError = err.message;
291
+ clearInterval(emitInterval);
292
+ continue;
293
+ }
294
+ finally {
295
+ clearInterval(emitInterval);
296
+ }
297
+ const final = fullContent.replace(/```(?:json)?[\s\S]*?(?:```|$)/g, '').replace(/\u0060{3,}/g, '');
298
+ const trail = final.slice(lastEmittedPos);
299
+ if (trail.trim())
300
+ emit({ type: 'content', data: { text: trail } });
301
+ const nativeParsed = [];
302
+ for (const [, tc] of nativeToolCalls) {
303
+ if (tc.name && tc.args) {
304
+ try {
305
+ nativeParsed.push({ id: tc.id || `tc-${Date.now()}`, tool: tc.name, args: JSON.parse(tc.args) });
306
+ }
307
+ catch { }
308
+ }
309
+ }
310
+ ;
311
+ this._nativeToolCalls = nativeParsed;
312
+ return fullContent;
313
+ }
314
+ emit({ type: 'error', data: { message: lastError || 'Request failed after retries' } });
315
+ return null;
316
+ }
317
+ parseToolCalls(text) {
318
+ const toolCalls = [];
319
+ const seen = new Set();
320
+ const jsonBlockRegex = /```(?:json)?\s*(\[[\s\S]*?\]|\{[\s\S]*?\})\s*```/g;
321
+ let match;
322
+ while ((match = jsonBlockRegex.exec(text)) !== null) {
323
+ this.extractToolCalls(match[1], toolCalls, seen);
324
+ }
325
+ const inlineRegex = /\{(?:[^{}]|(?:\{[^{}]*\}))*\}/g;
326
+ while ((match = inlineRegex.exec(text)) !== null) {
327
+ if (match[0].includes('"tool"')) {
328
+ this.extractToolCalls(match[0], toolCalls, seen);
329
+ }
330
+ }
331
+ const arrayRegex = /\[(?:[^\[\]]|(?:\[[^\[\]]*\]))*\]/g;
332
+ while ((match = arrayRegex.exec(text)) !== null) {
333
+ if (match[0].includes('"tool"')) {
334
+ this.extractToolCalls(match[0], toolCalls, seen);
335
+ }
336
+ }
337
+ return toolCalls;
338
+ }
339
+ extractToolCalls(jsonStr, result, seen) {
340
+ try {
341
+ const parsed = JSON.parse(jsonStr);
342
+ if (Array.isArray(parsed)) {
343
+ for (const item of parsed) {
344
+ if (item.tool && !seen.has(item.tool + JSON.stringify(item.args || {}))) {
345
+ seen.add(item.tool + JSON.stringify(item.args || {}));
346
+ result.push({ id: `tc-${Date.now()}-${result.length}`, tool: item.tool, args: item.args || {} });
347
+ }
348
+ }
349
+ }
350
+ else if (parsed.tool && !seen.has(parsed.tool + JSON.stringify(parsed.args || {}))) {
351
+ seen.add(parsed.tool + JSON.stringify(parsed.args || {}));
352
+ result.push({ id: `tc-${Date.now()}-${result.length}`, tool: parsed.tool, args: parsed.args || {} });
353
+ }
354
+ }
355
+ catch { }
356
+ }
357
+ cancel() {
358
+ this.abortController?.abort();
359
+ }
360
+ }
361
+ exports.Agent = Agent;
362
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Skill } from '../skills/index.js';
2
+ import type { NyxConfig } from '../types/index.js';
3
+ export interface PromptData {
4
+ workingDir: string;
5
+ isGitRepo: boolean;
6
+ platform: string;
7
+ date: string;
8
+ gitBranch: string;
9
+ gitStatus: string;
10
+ recentCommits: string;
11
+ contextFiles: string;
12
+ availableSkills: Skill[];
13
+ }
14
+ export declare function buildPromptData(projectPath: string, config: NyxConfig): PromptData;
15
+ export declare function buildSystemPrompt(data: PromptData, skillsXML: string): string;
16
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/agent/prompt.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,KAAK,EAAE,CAAA;CACzB;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,CAsClF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAgb7E"}