contextos-mcp 0.4.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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +260 -0
  3. package/bin/mcp.mjs +61 -0
  4. package/bin/swarm.mjs +45 -0
  5. package/dist/agents/aider.d.ts +12 -0
  6. package/dist/agents/aider.js +192 -0
  7. package/dist/agents/aider.js.map +1 -0
  8. package/dist/agents/claude-code.d.ts +9 -0
  9. package/dist/agents/claude-code.js +236 -0
  10. package/dist/agents/claude-code.js.map +1 -0
  11. package/dist/agents/codex.d.ts +14 -0
  12. package/dist/agents/codex.js +203 -0
  13. package/dist/agents/codex.js.map +1 -0
  14. package/dist/agents/direct-llm.d.ts +22 -0
  15. package/dist/agents/direct-llm.js +254 -0
  16. package/dist/agents/direct-llm.js.map +1 -0
  17. package/dist/agents/mock.d.ts +10 -0
  18. package/dist/agents/mock.js +170 -0
  19. package/dist/agents/mock.js.map +1 -0
  20. package/dist/agents/opencode.d.ts +23 -0
  21. package/dist/agents/opencode.js +631 -0
  22. package/dist/agents/opencode.js.map +1 -0
  23. package/dist/agents/provider.d.ts +11 -0
  24. package/dist/agents/provider.js +31 -0
  25. package/dist/agents/provider.js.map +1 -0
  26. package/dist/compression/compressor.d.ts +28 -0
  27. package/dist/compression/compressor.js +268 -0
  28. package/dist/compression/compressor.js.map +1 -0
  29. package/dist/config.d.ts +43 -0
  30. package/dist/config.js +172 -0
  31. package/dist/config.js.map +1 -0
  32. package/dist/contextos/loader.d.ts +46 -0
  33. package/dist/contextos/loader.js +120 -0
  34. package/dist/contextos/loader.js.map +1 -0
  35. package/dist/contextos/selector.d.ts +46 -0
  36. package/dist/contextos/selector.js +80 -0
  37. package/dist/contextos/selector.js.map +1 -0
  38. package/dist/core/action-dispatcher.d.ts +15 -0
  39. package/dist/core/action-dispatcher.js +28 -0
  40. package/dist/core/action-dispatcher.js.map +1 -0
  41. package/dist/core/action-schema.d.ts +72 -0
  42. package/dist/core/action-schema.js +86 -0
  43. package/dist/core/action-schema.js.map +1 -0
  44. package/dist/core/repl-interface.d.ts +48 -0
  45. package/dist/core/repl-interface.js +5 -0
  46. package/dist/core/repl-interface.js.map +1 -0
  47. package/dist/core/repl.d.ts +59 -0
  48. package/dist/core/repl.js +353 -0
  49. package/dist/core/repl.js.map +1 -0
  50. package/dist/core/rlm.d.ts +65 -0
  51. package/dist/core/rlm.js +564 -0
  52. package/dist/core/rlm.js.map +1 -0
  53. package/dist/core/runtime.py +470 -0
  54. package/dist/core/types.d.ts +265 -0
  55. package/dist/core/types.js +19 -0
  56. package/dist/core/types.js.map +1 -0
  57. package/dist/env.d.ts +10 -0
  58. package/dist/env.js +75 -0
  59. package/dist/env.js.map +1 -0
  60. package/dist/hooks/runner.d.ts +43 -0
  61. package/dist/hooks/runner.js +173 -0
  62. package/dist/hooks/runner.js.map +1 -0
  63. package/dist/labs/cli.d.ts +15 -0
  64. package/dist/labs/cli.js +295 -0
  65. package/dist/labs/cli.js.map +1 -0
  66. package/dist/labs/episodic-memory.d.ts +132 -0
  67. package/dist/labs/episodic-memory.js +391 -0
  68. package/dist/labs/episodic-memory.js.map +1 -0
  69. package/dist/labs/interactive-swarm.d.ts +20 -0
  70. package/dist/labs/interactive-swarm.js +1173 -0
  71. package/dist/labs/interactive-swarm.js.map +1 -0
  72. package/dist/labs/interactive.d.ts +10 -0
  73. package/dist/labs/interactive.js +2099 -0
  74. package/dist/labs/interactive.js.map +1 -0
  75. package/dist/labs/ts-analyzer.d.ts +74 -0
  76. package/dist/labs/ts-analyzer.js +379 -0
  77. package/dist/labs/ts-analyzer.js.map +1 -0
  78. package/dist/labs/viewer.d.ts +12 -0
  79. package/dist/labs/viewer.js +1284 -0
  80. package/dist/labs/viewer.js.map +1 -0
  81. package/dist/main.d.ts +15 -0
  82. package/dist/main.js +247 -0
  83. package/dist/main.js.map +1 -0
  84. package/dist/mcp/server.d.ts +16 -0
  85. package/dist/mcp/server.js +192775 -0
  86. package/dist/mcp/server.js.map +1 -0
  87. package/dist/mcp/session.d.ts +117 -0
  88. package/dist/mcp/session.js +450 -0
  89. package/dist/mcp/session.js.map +1 -0
  90. package/dist/mcp/state.d.ts +42 -0
  91. package/dist/mcp/state.js +537 -0
  92. package/dist/mcp/state.js.map +1 -0
  93. package/dist/mcp/tools/contextos.d.ts +17 -0
  94. package/dist/mcp/tools/contextos.js +583 -0
  95. package/dist/mcp/tools/contextos.js.map +1 -0
  96. package/dist/mcp/tools.d.ts +15 -0
  97. package/dist/mcp/tools.js +393 -0
  98. package/dist/mcp/tools.js.map +1 -0
  99. package/dist/orchestration/reviewer-gate.d.ts +43 -0
  100. package/dist/orchestration/reviewer-gate.js +280 -0
  101. package/dist/orchestration/reviewer-gate.js.map +1 -0
  102. package/dist/orchestration/reviewer-prompt.d.ts +18 -0
  103. package/dist/orchestration/reviewer-prompt.js +67 -0
  104. package/dist/orchestration/reviewer-prompt.js.map +1 -0
  105. package/dist/orchestration/verification-runner.d.ts +53 -0
  106. package/dist/orchestration/verification-runner.js +352 -0
  107. package/dist/orchestration/verification-runner.js.map +1 -0
  108. package/dist/plugins/adapter.d.ts +11 -0
  109. package/dist/plugins/adapter.js +11 -0
  110. package/dist/plugins/adapter.js.map +1 -0
  111. package/dist/plugins/core/archive.d.ts +9 -0
  112. package/dist/plugins/core/archive.js +128 -0
  113. package/dist/plugins/core/archive.js.map +1 -0
  114. package/dist/plugins/core/digest.d.ts +11 -0
  115. package/dist/plugins/core/digest.js +70 -0
  116. package/dist/plugins/core/digest.js.map +1 -0
  117. package/dist/plugins/core/grants.d.ts +22 -0
  118. package/dist/plugins/core/grants.js +90 -0
  119. package/dist/plugins/core/grants.js.map +1 -0
  120. package/dist/plugins/core/index.d.ts +10 -0
  121. package/dist/plugins/core/index.js +11 -0
  122. package/dist/plugins/core/index.js.map +1 -0
  123. package/dist/plugins/core/pinning.d.ts +15 -0
  124. package/dist/plugins/core/pinning.js +86 -0
  125. package/dist/plugins/core/pinning.js.map +1 -0
  126. package/dist/plugins/core/types.d.ts +105 -0
  127. package/dist/plugins/core/types.js +22 -0
  128. package/dist/plugins/core/types.js.map +1 -0
  129. package/dist/plugins/core/updater.d.ts +16 -0
  130. package/dist/plugins/core/updater.js +64 -0
  131. package/dist/plugins/core/updater.js.map +1 -0
  132. package/dist/plugins/loader.d.ts +65 -0
  133. package/dist/plugins/loader.js +110 -0
  134. package/dist/plugins/loader.js.map +1 -0
  135. package/dist/prompts/orchestrator.d.ts +6 -0
  136. package/dist/prompts/orchestrator.js +114 -0
  137. package/dist/prompts/orchestrator.js.map +1 -0
  138. package/dist/routing/model-resolver.d.ts +27 -0
  139. package/dist/routing/model-resolver.js +265 -0
  140. package/dist/routing/model-resolver.js.map +1 -0
  141. package/dist/routing/model-router.d.ts +130 -0
  142. package/dist/routing/model-router.js +515 -0
  143. package/dist/routing/model-router.js.map +1 -0
  144. package/dist/runtime/attestations.cjs +260 -0
  145. package/dist/runtime/reviewer-pipeline.cjs +319 -0
  146. package/dist/runtime/sandbox.cjs +468 -0
  147. package/dist/runtime/state-machine.cjs +885 -0
  148. package/dist/runtime/thread-store.cjs +175 -0
  149. package/dist/runtime/transactional-git.cjs +315 -0
  150. package/dist/runtime/verification-pipeline.cjs +435 -0
  151. package/dist/sandbox/execution.d.ts +165 -0
  152. package/dist/sandbox/execution.js +497 -0
  153. package/dist/sandbox/execution.js.map +1 -0
  154. package/dist/security/file-policy.d.ts +22 -0
  155. package/dist/security/file-policy.js +53 -0
  156. package/dist/security/file-policy.js.map +1 -0
  157. package/dist/security/repository-boundary.d.ts +21 -0
  158. package/dist/security/repository-boundary.js +119 -0
  159. package/dist/security/repository-boundary.js.map +1 -0
  160. package/dist/security/secret-filter.d.ts +36 -0
  161. package/dist/security/secret-filter.js +149 -0
  162. package/dist/security/secret-filter.js.map +1 -0
  163. package/dist/swarm.d.ts +14 -0
  164. package/dist/swarm.js +624 -0
  165. package/dist/swarm.js.map +1 -0
  166. package/dist/threads/cache.d.ts +64 -0
  167. package/dist/threads/cache.js +241 -0
  168. package/dist/threads/cache.js.map +1 -0
  169. package/dist/threads/manager.d.ts +94 -0
  170. package/dist/threads/manager.js +914 -0
  171. package/dist/threads/manager.js.map +1 -0
  172. package/dist/ui/banner.d.ts +14 -0
  173. package/dist/ui/banner.js +42 -0
  174. package/dist/ui/banner.js.map +1 -0
  175. package/dist/ui/dashboard.d.ts +33 -0
  176. package/dist/ui/dashboard.js +135 -0
  177. package/dist/ui/dashboard.js.map +1 -0
  178. package/dist/ui/index.d.ts +11 -0
  179. package/dist/ui/index.js +12 -0
  180. package/dist/ui/index.js.map +1 -0
  181. package/dist/ui/log.d.ts +39 -0
  182. package/dist/ui/log.js +126 -0
  183. package/dist/ui/log.js.map +1 -0
  184. package/dist/ui/onboarding.d.ts +14 -0
  185. package/dist/ui/onboarding.js +755 -0
  186. package/dist/ui/onboarding.js.map +1 -0
  187. package/dist/ui/run-log.d.ts +50 -0
  188. package/dist/ui/run-log.js +60 -0
  189. package/dist/ui/run-log.js.map +1 -0
  190. package/dist/ui/spinner.d.ts +41 -0
  191. package/dist/ui/spinner.js +172 -0
  192. package/dist/ui/spinner.js.map +1 -0
  193. package/dist/ui/streaming-feed.d.ts +72 -0
  194. package/dist/ui/streaming-feed.js +386 -0
  195. package/dist/ui/streaming-feed.js.map +1 -0
  196. package/dist/ui/summary.d.ts +18 -0
  197. package/dist/ui/summary.js +113 -0
  198. package/dist/ui/summary.js.map +1 -0
  199. package/dist/ui/text-input.d.ts +19 -0
  200. package/dist/ui/text-input.js +266 -0
  201. package/dist/ui/text-input.js.map +1 -0
  202. package/dist/ui/theme.d.ts +63 -0
  203. package/dist/ui/theme.js +97 -0
  204. package/dist/ui/theme.js.map +1 -0
  205. package/dist/utils/command-exists.d.ts +11 -0
  206. package/dist/utils/command-exists.js +41 -0
  207. package/dist/utils/command-exists.js.map +1 -0
  208. package/dist/utils/process-security.d.ts +19 -0
  209. package/dist/utils/process-security.js +90 -0
  210. package/dist/utils/process-security.js.map +1 -0
  211. package/dist/utils/rolling-buffer.d.ts +16 -0
  212. package/dist/utils/rolling-buffer.js +30 -0
  213. package/dist/utils/rolling-buffer.js.map +1 -0
  214. package/dist/utils/safe-spawn.d.ts +13 -0
  215. package/dist/utils/safe-spawn.js +49 -0
  216. package/dist/utils/safe-spawn.js.map +1 -0
  217. package/dist/worktree/manager.d.ts +69 -0
  218. package/dist/worktree/manager.js +593 -0
  219. package/dist/worktree/manager.js.map +1 -0
  220. package/dist/worktree/merge.d.ts +58 -0
  221. package/dist/worktree/merge.js +389 -0
  222. package/dist/worktree/merge.js.map +1 -0
  223. package/package.json +63 -0
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Bordered text input for the interactive REPL.
3
+ *
4
+ * Visual style inspired by OpenCode — full-width bordered text area with
5
+ * a darker background row, accent-colored bottom border, and multi-line
6
+ * paste support.
7
+ *
8
+ * Keys:
9
+ * - Enter: submit
10
+ * - Escape / Ctrl+C: exit
11
+ * - Ctrl+D: submit
12
+ * - Backspace, left/right, home/end: editing
13
+ * - Paste (multi-char with newlines): captured as multi-line
14
+ */
15
+ import { coral, dim, isTTY, termWidth } from "./theme.js";
16
+ // ── ANSI helpers ─────────────────────────────────────────────────────────────
17
+ const BG_DARK = "\x1b[48;2;30;33;39m"; // dark background for input row
18
+ const RESET = "\x1b[0m";
19
+ const HIDE_CURSOR = "\x1b[?25l";
20
+ const SHOW_CURSOR = "\x1b[?25h";
21
+ const BORDER_COLOR = "\x1b[38;2;60;63;68m"; // subtle gray for top border
22
+ const ACCENT_COLOR = "\x1b[38;2;215;119;87m"; // coral for bottom border
23
+ export function readTextInput(_prompt) {
24
+ if (!isTTY) {
25
+ return new Promise((resolve) => {
26
+ let data = "";
27
+ process.stdin.setEncoding("utf-8");
28
+ const onData = (chunk) => {
29
+ data += chunk;
30
+ if (data.includes("\n")) {
31
+ process.stdin.removeListener("data", onData);
32
+ resolve({ text: data.trim(), action: "submit" });
33
+ }
34
+ };
35
+ process.stdin.on("data", onData);
36
+ process.stdin.resume();
37
+ });
38
+ }
39
+ return new Promise((resolve) => {
40
+ const linesBuf = [""];
41
+ let cursorPos = 0;
42
+ const origRawMode = process.stdin.isRaw;
43
+ const w = termWidth();
44
+ process.stdin.setRawMode(true);
45
+ process.stdin.resume();
46
+ process.stdin.setEncoding("utf-8");
47
+ // Tracks cursor position relative to top border after each drawBox()
48
+ let cursorRowFromTop = 0;
49
+ let prevTotalRows = 0;
50
+ function buildRows() {
51
+ const promptVisibleLen = 2;
52
+ const rows = [];
53
+ // Top border
54
+ rows.push(`${BORDER_COLOR}${"─".repeat(w)}${RESET}`);
55
+ // Content rows
56
+ const promptChar = `${ACCENT_COLOR}❯${RESET} `;
57
+ for (let i = 0; i < linesBuf.length; i++) {
58
+ const lineText = linesBuf[i];
59
+ const prefix = i === 0 ? promptChar : `${dim("·")} `;
60
+ const contentWidth = w - promptVisibleLen;
61
+ const displayText = lineText.length > contentWidth ? `${lineText.slice(0, contentWidth - 1)}…` : lineText;
62
+ const padding = Math.max(0, contentWidth - displayText.length);
63
+ rows.push(`${BG_DARK}${prefix}${displayText}${" ".repeat(padding)}${RESET}`);
64
+ }
65
+ // Bottom border
66
+ rows.push(`${ACCENT_COLOR}${"─".repeat(w)}${RESET}`);
67
+ // Hints — pad to full width so it fully overwrites old content
68
+ const hintsText = " enter submit esc exit";
69
+ const hintsPad = Math.max(0, w - hintsText.length);
70
+ rows.push(`${dim(hintsText)}${" ".repeat(hintsPad)}`);
71
+ return rows;
72
+ }
73
+ function drawBox() {
74
+ const out = process.stderr;
75
+ const promptVisibleLen = 2;
76
+ const rows = buildRows();
77
+ const totalRows = rows.length;
78
+ if (prevTotalRows > 0) {
79
+ // ── Redraw: overwrite rows in place (no \n, no scrolling) ──
80
+ // Move cursor to top border row
81
+ if (cursorRowFromTop > 0) {
82
+ out.write(`\x1b[${cursorRowFromTop}A`);
83
+ }
84
+ out.write("\r");
85
+ // Overwrite each row in place
86
+ const commonRows = Math.min(totalRows, prevTotalRows);
87
+ for (let i = 0; i < commonRows; i++) {
88
+ out.write(`\x1b[2K${rows[i]}`);
89
+ if (i < commonRows - 1) {
90
+ out.write("\x1b[1B\r"); // cursor down 1 (no scroll), start of line
91
+ }
92
+ }
93
+ if (totalRows > prevTotalRows) {
94
+ // More rows than before (multi-line paste) — append with \n
95
+ for (let i = commonRows; i < totalRows; i++) {
96
+ out.write(`\n\x1b[2K${rows[i]}`);
97
+ }
98
+ }
99
+ else if (prevTotalRows > totalRows) {
100
+ // Fewer rows than before — erase leftover old rows
101
+ for (let i = totalRows; i < prevTotalRows; i++) {
102
+ out.write("\x1b[1B\r\x1b[2K");
103
+ }
104
+ // Move back to last new row
105
+ const extra = prevTotalRows - totalRows;
106
+ if (extra > 0)
107
+ out.write(`\x1b[${extra}A`);
108
+ }
109
+ // Cursor is now on the last row (hints).
110
+ }
111
+ else {
112
+ // ── Initial draw: use \n between rows, no trailing \n ──
113
+ for (let i = 0; i < totalRows; i++) {
114
+ if (i > 0)
115
+ out.write("\n");
116
+ out.write(rows[i]);
117
+ }
118
+ // Cursor is on the hints line (last row).
119
+ }
120
+ prevTotalRows = totalRows;
121
+ // Position cursor at the active content row
122
+ // Cursor is currently on the hints line (last row = index totalRows-1).
123
+ // Content cursor is on row (1 + currentLineIdx).
124
+ const currentLineIdx = linesBuf.length - 1;
125
+ const targetRow = 1 + currentLineIdx;
126
+ const hintsRow = totalRows - 1;
127
+ const rowsUp = hintsRow - targetRow;
128
+ if (rowsUp > 0)
129
+ out.write(`\x1b[${rowsUp}A`);
130
+ // Set column
131
+ const col = promptVisibleLen + cursorPos + 1;
132
+ out.write(`\x1b[${col}G`);
133
+ cursorRowFromTop = targetRow;
134
+ }
135
+ // Initial draw
136
+ process.stderr.write(HIDE_CURSOR);
137
+ drawBox();
138
+ process.stderr.write(SHOW_CURSOR);
139
+ const onData = (data) => {
140
+ const hasNewlines = data.includes("\n") || data.includes("\r");
141
+ const isMultiChar = data.length > 1;
142
+ const isPaste = hasNewlines && isMultiChar;
143
+ if (isPaste) {
144
+ const pastedLines = data.split(/\r\n|\r|\n/);
145
+ const currentLine = linesBuf[linesBuf.length - 1];
146
+ linesBuf[linesBuf.length - 1] = currentLine.slice(0, cursorPos) + pastedLines[0] + currentLine.slice(cursorPos);
147
+ cursorPos = (currentLine.slice(0, cursorPos) + pastedLines[0]).length;
148
+ for (let i = 1; i < pastedLines.length; i++) {
149
+ const line = pastedLines[i];
150
+ if (i === pastedLines.length - 1 && line === "")
151
+ break;
152
+ linesBuf.push(line);
153
+ cursorPos = line.length;
154
+ }
155
+ drawBox();
156
+ return;
157
+ }
158
+ for (let i = 0; i < data.length; i++) {
159
+ const ch = data[i];
160
+ // Escape sequences
161
+ if (ch === "\x1b") {
162
+ if (data[i + 1] === "[") {
163
+ const code = data[i + 2];
164
+ if (code === "C" && cursorPos < linesBuf[linesBuf.length - 1].length) {
165
+ cursorPos++;
166
+ i += 2;
167
+ drawBox();
168
+ continue;
169
+ }
170
+ if (code === "D" && cursorPos > 0) {
171
+ cursorPos--;
172
+ i += 2;
173
+ drawBox();
174
+ continue;
175
+ }
176
+ if (code === "H") {
177
+ cursorPos = 0;
178
+ i += 2;
179
+ drawBox();
180
+ continue;
181
+ }
182
+ if (code === "F") {
183
+ cursorPos = linesBuf[linesBuf.length - 1].length;
184
+ i += 2;
185
+ drawBox();
186
+ continue;
187
+ }
188
+ i += 2;
189
+ continue;
190
+ }
191
+ // Bare Escape — exit
192
+ finishAndClear();
193
+ resolve({ text: "", action: "escape" });
194
+ return;
195
+ }
196
+ // Ctrl+D — submit
197
+ if (ch === "\x04") {
198
+ const text = linesBuf.join("\n").trim();
199
+ finishAndClear();
200
+ resolve({ text, action: "submit" });
201
+ return;
202
+ }
203
+ // Ctrl+C — exit
204
+ if (ch === "\x03") {
205
+ finishAndClear();
206
+ resolve({ text: "", action: "escape" });
207
+ return;
208
+ }
209
+ // Enter — submit
210
+ if (ch === "\r" || ch === "\n") {
211
+ const text = linesBuf.join("\n").trim();
212
+ finishAndClear();
213
+ resolve({ text, action: "submit" });
214
+ return;
215
+ }
216
+ // Backspace
217
+ if (ch === "\x7f" || ch === "\b") {
218
+ if (cursorPos > 0) {
219
+ const line = linesBuf[linesBuf.length - 1];
220
+ linesBuf[linesBuf.length - 1] = line.slice(0, cursorPos - 1) + line.slice(cursorPos);
221
+ cursorPos--;
222
+ drawBox();
223
+ }
224
+ continue;
225
+ }
226
+ // Tab — insert spaces
227
+ if (ch === "\t") {
228
+ const line = linesBuf[linesBuf.length - 1];
229
+ linesBuf[linesBuf.length - 1] = `${line.slice(0, cursorPos)} ${line.slice(cursorPos)}`;
230
+ cursorPos += 2;
231
+ drawBox();
232
+ continue;
233
+ }
234
+ // Regular printable character
235
+ if (ch >= " ") {
236
+ const line = linesBuf[linesBuf.length - 1];
237
+ linesBuf[linesBuf.length - 1] = line.slice(0, cursorPos) + ch + line.slice(cursorPos);
238
+ cursorPos++;
239
+ drawBox();
240
+ }
241
+ }
242
+ };
243
+ function finishAndClear() {
244
+ process.stdin.removeListener("data", onData);
245
+ if (origRawMode !== undefined) {
246
+ process.stdin.setRawMode(origRawMode);
247
+ }
248
+ // Move cursor to top of box
249
+ if (cursorRowFromTop > 0) {
250
+ process.stderr.write(`\x1b[${cursorRowFromTop}A`);
251
+ }
252
+ process.stderr.write("\r\x1b[J"); // erase from here to end of screen
253
+ // Write the submitted text as a clean line (so it's visible in scrollback)
254
+ const fullText = linesBuf.join("\n").trim();
255
+ if (fullText) {
256
+ const displayLines = fullText.split("\n");
257
+ for (let i = 0; i < displayLines.length; i++) {
258
+ const prefix = i === 0 ? ` ${coral("swarm")}${dim(">")} ` : ` ${dim(".")} `;
259
+ process.stderr.write(`${prefix}${displayLines[i]}\n`);
260
+ }
261
+ }
262
+ }
263
+ process.stdin.on("data", onData);
264
+ });
265
+ }
266
+ //# sourceMappingURL=text-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-input.js","sourceRoot":"","sources":["../../src/ui/text-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Centralized color/formatting system with TTY detection.
3
+ *
4
+ * All terminal styling flows through this module. When output is piped
5
+ * (not a TTY), colors are automatically stripped.
6
+ */
7
+ declare const isTTY: boolean;
8
+ declare const stdoutTTY: boolean;
9
+ /** Brand coral — spinner, accents (inspired by Claude Code's coral orange). */
10
+ export declare const coral: (text: string) => string;
11
+ /** Primary accent — headers, borders. */
12
+ export declare const cyan: (text: string) => string;
13
+ /** Success — completed operations. */
14
+ export declare const green: (text: string) => string;
15
+ /** Warning — non-fatal issues. */
16
+ export declare const yellow: (text: string) => string;
17
+ /** Error — failures. */
18
+ export declare const red: (text: string) => string;
19
+ /** Secondary info — timestamps, ids, hints. */
20
+ export declare const dim: (text: string) => string;
21
+ /** Emphasis. */
22
+ export declare const bold: (text: string) => string;
23
+ /** Subtle emphasis. */
24
+ export declare const italic: (text: string) => string;
25
+ /** De-emphasized text. */
26
+ export declare const gray: (text: string) => string;
27
+ /** Magenta — sub-queries, memory. */
28
+ export declare const magenta: (text: string) => string;
29
+ /** White — primary content. */
30
+ export declare const white: (text: string) => string;
31
+ export declare const heading: (text: string) => string;
32
+ export declare const success: (text: string) => string;
33
+ export declare const warn: (text: string) => string;
34
+ export declare const error: (text: string) => string;
35
+ export declare const info: (text: string) => string;
36
+ export declare const hint: (text: string) => string;
37
+ export declare const symbols: {
38
+ readonly check: "✔" | "[OK]";
39
+ readonly cross: "✘" | "[ERR]";
40
+ readonly warn: "⚠" | "[WARN]";
41
+ readonly info: "●" | "[*]";
42
+ readonly arrow: "▶" | ">";
43
+ readonly dot: "·" | ".";
44
+ readonly dash: "─" | "-";
45
+ readonly vertLine: "│" | "|";
46
+ readonly topLeft: "╭" | "+";
47
+ readonly topRight: "+" | "╮";
48
+ readonly bottomLeft: "+" | "╰";
49
+ readonly bottomRight: "+" | "╯";
50
+ readonly horizontal: "─" | "-";
51
+ readonly spinner: string[];
52
+ };
53
+ /** Get terminal width, with a sensible fallback. */
54
+ export declare function termWidth(): number;
55
+ /** Draw a horizontal rule. */
56
+ export declare function hr(char?: string): string;
57
+ /** Right-pad a string to a given width. */
58
+ export declare function pad(text: string, width: number): string;
59
+ /** Strip ANSI escape codes from a string. */
60
+ export declare function stripAnsi(text: string): string;
61
+ /** Truncate a string to maxLen, adding ellipsis if needed. */
62
+ export declare function truncate(text: string, maxLen: number): string;
63
+ export { isTTY, stdoutTTY };
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Centralized color/formatting system with TTY detection.
3
+ *
4
+ * All terminal styling flows through this module. When output is piped
5
+ * (not a TTY), colors are automatically stripped.
6
+ */
7
+ const isTTY = process.stderr.isTTY ?? false;
8
+ const stdoutTTY = process.stdout.isTTY ?? false;
9
+ // ── ANSI helpers ────────────────────────────────────────────────────────────
10
+ function ansi(code) {
11
+ if (!isTTY)
12
+ return (text) => text;
13
+ return (text) => `\x1b[${code}m${text}\x1b[0m`;
14
+ }
15
+ function ansiFg(r, g, b) {
16
+ if (!isTTY)
17
+ return (text) => text;
18
+ return (text) => `\x1b[38;2;${r};${g};${b}m${text}\x1b[0m`;
19
+ }
20
+ // ── Theme colors ────────────────────────────────────────────────────────────
21
+ /** Brand coral — spinner, accents (inspired by Claude Code's coral orange). */
22
+ export const coral = ansiFg(215, 119, 87);
23
+ /** Primary accent — headers, borders. */
24
+ export const cyan = ansi("36");
25
+ /** Success — completed operations. */
26
+ export const green = ansi("32");
27
+ /** Warning — non-fatal issues. */
28
+ export const yellow = ansi("33");
29
+ /** Error — failures. */
30
+ export const red = ansi("31");
31
+ /** Secondary info — timestamps, ids, hints. */
32
+ export const dim = ansi("2");
33
+ /** Emphasis. */
34
+ export const bold = ansi("1");
35
+ /** Subtle emphasis. */
36
+ export const italic = ansi("3");
37
+ /** De-emphasized text. */
38
+ export const gray = ansiFg(128, 128, 128);
39
+ /** Magenta — sub-queries, memory. */
40
+ export const magenta = ansi("35");
41
+ /** White — primary content. */
42
+ export const white = ansi("37");
43
+ // ── Compound styles ─────────────────────────────────────────────────────────
44
+ export const heading = (text) => bold(cyan(text));
45
+ export const success = (text) => green(`${symbols.check} ${text}`);
46
+ export const warn = (text) => yellow(`${symbols.warn} ${text}`);
47
+ export const error = (text) => red(`${symbols.cross} ${text}`);
48
+ export const info = (text) => cyan(`${symbols.info} ${text}`);
49
+ export const hint = (text) => dim(` ${text}`);
50
+ // ── Symbols ─────────────────────────────────────────────────────────────────
51
+ export const symbols = {
52
+ check: isTTY ? "\u2714" : "[OK]",
53
+ cross: isTTY ? "\u2718" : "[ERR]",
54
+ warn: isTTY ? "\u26A0" : "[WARN]",
55
+ info: isTTY ? "\u25CF" : "[*]",
56
+ arrow: isTTY ? "\u25B6" : ">",
57
+ dot: isTTY ? "\u00B7" : ".",
58
+ dash: isTTY ? "\u2500" : "-",
59
+ vertLine: isTTY ? "\u2502" : "|",
60
+ topLeft: isTTY ? "\u256D" : "+",
61
+ topRight: isTTY ? "\u256E" : "+",
62
+ bottomLeft: isTTY ? "\u2570" : "+",
63
+ bottomRight: isTTY ? "\u256F" : "+",
64
+ horizontal: isTTY ? "\u2500" : "-",
65
+ spinner: isTTY ? ["\u00B7", "\u2726", "\u2733", "\u2736", "\u273B", "\u273D"] : ["*"],
66
+ };
67
+ // ── Layout helpers ──────────────────────────────────────────────────────────
68
+ /** Get terminal width, with a sensible fallback. */
69
+ export function termWidth() {
70
+ return process.stderr.columns || 80;
71
+ }
72
+ /** Draw a horizontal rule. */
73
+ export function hr(char) {
74
+ const c = char || symbols.horizontal;
75
+ return dim(c.repeat(Math.min(termWidth(), 60)));
76
+ }
77
+ /** Right-pad a string to a given width. */
78
+ export function pad(text, width) {
79
+ const stripped = stripAnsi(text);
80
+ if (stripped.length >= width)
81
+ return text;
82
+ return text + " ".repeat(width - stripped.length);
83
+ }
84
+ /** Strip ANSI escape codes from a string. */
85
+ export function stripAnsi(text) {
86
+ // eslint-disable-next-line no-control-regex
87
+ return text.replace(/\x1b\[[0-9;]*m/g, "");
88
+ }
89
+ /** Truncate a string to maxLen, adding ellipsis if needed. */
90
+ export function truncate(text, maxLen) {
91
+ if (text.length <= maxLen)
92
+ return text;
93
+ return `${text.slice(0, maxLen - 1)}\u2026`;
94
+ }
95
+ // ── Exports ─────────────────────────────────────────────────────────────────
96
+ export { isTTY, stdoutTTY };
97
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Checks if a command/executable exists on the system PATH in a cross-platform manner.
3
+ * On Windows, uses `where.exe`.
4
+ * On POSIX (Linux/macOS), uses `which`.
5
+ */
6
+ export declare function commandExists(cmd: string): Promise<boolean>;
7
+ /**
8
+ * Resolves the full path to an executable from PATH.
9
+ * On Windows, resolves .cmd, .bat, or .exe paths so they can be executed without shell: true.
10
+ */
11
+ export declare function resolveExecutablePath(cmd: string): Promise<string | null>;
@@ -0,0 +1,41 @@
1
+ import { spawn } from "node:child_process";
2
+ /**
3
+ * Checks if a command/executable exists on the system PATH in a cross-platform manner.
4
+ * On Windows, uses `where.exe`.
5
+ * On POSIX (Linux/macOS), uses `which`.
6
+ */
7
+ export async function commandExists(cmd) {
8
+ const resolved = await resolveExecutablePath(cmd);
9
+ return resolved !== null;
10
+ }
11
+ /**
12
+ * Resolves the full path to an executable from PATH.
13
+ * On Windows, resolves .cmd, .bat, or .exe paths so they can be executed without shell: true.
14
+ */
15
+ export async function resolveExecutablePath(cmd) {
16
+ if (!cmd || typeof cmd !== "string")
17
+ return null;
18
+ const isWindows = process.platform === "win32";
19
+ const checkTool = isWindows ? "where.exe" : "which";
20
+ return new Promise((resolve) => {
21
+ try {
22
+ const proc = spawn(checkTool, [cmd], { stdio: ["ignore", "pipe", "ignore"] });
23
+ let stdout = "";
24
+ proc.stdout?.on("data", (d) => (stdout += d.toString()));
25
+ proc.on("close", (code) => {
26
+ if (code === 0 && stdout.trim()) {
27
+ const firstLine = stdout.trim().split(/\r?\n/)[0].trim();
28
+ resolve(firstLine || null);
29
+ }
30
+ else {
31
+ resolve(null);
32
+ }
33
+ });
34
+ proc.on("error", () => resolve(null));
35
+ }
36
+ catch {
37
+ resolve(null);
38
+ }
39
+ });
40
+ }
41
+ //# sourceMappingURL=command-exists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-exists.js","sourceRoot":"","sources":["../../src/utils/command-exists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC9C,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAClD,OAAO,QAAQ,KAAK,IAAI,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACtD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;IAEpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC9E,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBACjC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzD,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CAAC,CAAC;gBACf,CAAC;YACF,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Process isolation and security utilities:
3
+ * - Environment sanitation (strips credentials, tokens, secrets)
4
+ * - Sensitive output redaction (API keys, passwords, bearer tokens)
5
+ * - Cross-platform bounded process tree termination (Windows taskkill, Unix process groups)
6
+ */
7
+ export declare const STRICT_ENV_ALLOWLIST: Set<string>;
8
+ /**
9
+ * Strips high-privilege credentials and tokens from process environment.
10
+ */
11
+ export declare function getSanitizedEnv(customEnv?: Record<string, string>): NodeJS.ProcessEnv;
12
+ /**
13
+ * Masks API keys, bearer tokens, passwords, and sensitive credentials in command outputs.
14
+ */
15
+ export declare function redactSensitiveOutput(text?: string): string;
16
+ /**
17
+ * Recursively terminates a process and all its children across Windows, macOS, and Linux.
18
+ */
19
+ export declare function killProcessTree(pid: number | undefined): void;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Process isolation and security utilities:
3
+ * - Environment sanitation (strips credentials, tokens, secrets)
4
+ * - Sensitive output redaction (API keys, passwords, bearer tokens)
5
+ * - Cross-platform bounded process tree termination (Windows taskkill, Unix process groups)
6
+ */
7
+ import { execFileSync } from "node:child_process";
8
+ export const STRICT_ENV_ALLOWLIST = new Set([
9
+ "PATH",
10
+ "HOME",
11
+ "USERPROFILE",
12
+ "SYSTEMROOT",
13
+ "WINDIR",
14
+ "TEMP",
15
+ "TMP",
16
+ "NODE_ENV",
17
+ "LANG",
18
+ "LC_ALL",
19
+ "CI",
20
+ ]);
21
+ /**
22
+ * Strips high-privilege credentials and tokens from process environment.
23
+ */
24
+ export function getSanitizedEnv(customEnv = {}) {
25
+ const sanitized = {
26
+ CI: "true",
27
+ NODE_ENV: "test",
28
+ };
29
+ for (const key of STRICT_ENV_ALLOWLIST) {
30
+ if (process.env[key] !== undefined) {
31
+ sanitized[key] = process.env[key];
32
+ }
33
+ }
34
+ for (const [k, v] of Object.entries(customEnv)) {
35
+ if (!/TOKEN|SECRET|KEY|PASSWORD|AUTH|CREDENTIAL/i.test(k) && !/^(GIT_|NODE_OPTIONS|LD_PRELOAD|DYLD_)/i.test(k)) {
36
+ sanitized[k] = v;
37
+ }
38
+ }
39
+ return sanitized;
40
+ }
41
+ /**
42
+ * Masks API keys, bearer tokens, passwords, and sensitive credentials in command outputs.
43
+ */
44
+ export function redactSensitiveOutput(text = "") {
45
+ if (!text)
46
+ return "";
47
+ return (text
48
+ // Secret tokens and API keys
49
+ .replace(/(?:sk-[a-zA-Z0-9]{20,}|gh[pousr]-[a-zA-Z0-9]{30,}|AIza[a-zA-Z0-9_-]{30,45})/g, "[REDACTED_API_KEY]")
50
+ // Bearer / Authorization headers
51
+ .replace(/(?:Authorization:\s*)?(Bearer\s+)[^\s\n]+/gi, "$1[REDACTED_TOKEN]")
52
+ // Password fields
53
+ .replace(/(password[\s:=]+)[^\s\n&]+/gi, "$1[REDACTED_PASSWORD]")
54
+ // Generic high-entropy hex/base64 tokens (32+ chars)
55
+ .replace(/(["']?[a-zA-Z0-9_-]*(?:token|secret|password|key)["']?\s*[:=]\s*["']?)[a-zA-Z0-9_.+/=-]{32,}(["']?)/gi, "$1[REDACTED]$2")
56
+ .replace(/-----BEGIN (?:RSA|OPENSSH|DSA|EC)? ?PRIVATE KEY-----[\s\S]*?-----END (?:RSA|OPENSSH|DSA|EC)? ?PRIVATE KEY-----/g, "[REDACTED_PRIVATE_KEY]"));
57
+ }
58
+ /**
59
+ * Recursively terminates a process and all its children across Windows, macOS, and Linux.
60
+ */
61
+ export function killProcessTree(pid) {
62
+ if (!pid)
63
+ return;
64
+ if (process.platform === "win32") {
65
+ try {
66
+ execFileSync("taskkill", ["/PID", String(pid), "/T", "/F"], {
67
+ stdio: "ignore",
68
+ windowsHide: true,
69
+ });
70
+ }
71
+ catch {
72
+ // Process might have already exited
73
+ }
74
+ }
75
+ else {
76
+ try {
77
+ // Kill entire process group
78
+ process.kill(-pid, "SIGKILL");
79
+ }
80
+ catch {
81
+ try {
82
+ process.kill(pid, "SIGKILL");
83
+ }
84
+ catch {
85
+ // Process already exited
86
+ }
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=process-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-security.js","sourceRoot":"","sources":["../../src/utils/process-security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IAC3C,MAAM;IACN,MAAM;IACN,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,KAAK;IACL,UAAU;IACV,MAAM;IACN,QAAQ;IACR,IAAI;CACJ,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoC,EAAE;IACrE,MAAM,SAAS,GAAsB;QACpC,EAAE,EAAE,MAAM;QACV,QAAQ,EAAE,MAAM;KAChB,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACpC,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,4CAA4C,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAChH,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAI,GAAG,EAAE;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,CACN,IAAI;QACH,6BAA6B;SAC5B,OAAO,CAAC,8EAA8E,EAAE,oBAAoB,CAAC;QAC9G,iCAAiC;SAChC,OAAO,CAAC,6CAA6C,EAAE,oBAAoB,CAAC;QAC7E,kBAAkB;SACjB,OAAO,CAAC,8BAA8B,EAAE,uBAAuB,CAAC;QACjE,qDAAqD;SACpD,OAAO,CACP,uGAAuG,EACvG,gBAAgB,CAChB;SACA,OAAO,CACP,iHAAiH,EACjH,wBAAwB,CACxB,CACF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAuB;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC;YACJ,YAAY,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;gBAC3D,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,IAAI;aACjB,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,oCAAoC;QACrC,CAAC;IACF,CAAC;SAAM,CAAC;QACP,IAAI,CAAC;YACJ,4BAA4B;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACR,IAAI,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACR,yBAAyB;YAC1B,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Rolling string buffer with a maximum byte limit.
3
+ *
4
+ * Drops oldest chunks when the total accumulated length exceeds `maxBytes`.
5
+ * Used by agent backends to prevent OOM when a runaway child process
6
+ * produces unbounded stdout/stderr output.
7
+ */
8
+ export declare class RollingBuffer {
9
+ private readonly maxBytes;
10
+ private chunks;
11
+ private totalLength;
12
+ constructor(maxBytes?: number);
13
+ append(text: string): void;
14
+ toString(): string;
15
+ get length(): number;
16
+ }