myshell-tools 2.0.0-alpha.0 → 2.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 (60) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +6 -3
  3. package/dist/cli.js +85 -30
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/doctor.d.ts +3 -2
  6. package/dist/commands/doctor.js +9 -5
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/login.d.ts +20 -0
  9. package/dist/commands/login.js +60 -0
  10. package/dist/commands/login.js.map +1 -0
  11. package/dist/core/orchestrate.js +80 -28
  12. package/dist/core/orchestrate.js.map +1 -1
  13. package/dist/core/policy.d.ts +10 -0
  14. package/dist/core/policy.js +40 -0
  15. package/dist/core/policy.js.map +1 -1
  16. package/dist/core/review.d.ts +5 -0
  17. package/dist/core/review.js +2 -2
  18. package/dist/core/review.js.map +1 -1
  19. package/dist/infra/atomic.d.ts +0 -3
  20. package/dist/infra/atomic.js +1 -1
  21. package/dist/infra/atomic.js.map +1 -1
  22. package/dist/infra/config.d.ts +23 -0
  23. package/dist/infra/config.js +64 -0
  24. package/dist/infra/config.js.map +1 -0
  25. package/dist/infra/conversation-store.d.ts +42 -0
  26. package/dist/infra/conversation-store.js +14 -0
  27. package/dist/infra/conversation-store.js.map +1 -0
  28. package/dist/infra/conversations.d.ts +18 -0
  29. package/dist/infra/conversations.js +296 -0
  30. package/dist/infra/conversations.js.map +1 -0
  31. package/dist/infra/insights.d.ts +66 -0
  32. package/dist/infra/insights.js +105 -0
  33. package/dist/infra/insights.js.map +1 -0
  34. package/dist/infra/ledger.d.ts +4 -6
  35. package/dist/infra/ledger.js.map +1 -1
  36. package/dist/interface/menu.d.ts +112 -0
  37. package/dist/interface/menu.js +622 -0
  38. package/dist/interface/menu.js.map +1 -0
  39. package/dist/providers/claude.d.ts +4 -13
  40. package/dist/providers/claude.js +5 -4
  41. package/dist/providers/claude.js.map +1 -1
  42. package/dist/providers/codex.d.ts +6 -12
  43. package/dist/providers/codex.js +6 -4
  44. package/dist/providers/codex.js.map +1 -1
  45. package/dist/providers/detect.d.ts +63 -14
  46. package/dist/providers/detect.js +123 -27
  47. package/dist/providers/detect.js.map +1 -1
  48. package/dist/ui/tui.d.ts +127 -0
  49. package/dist/ui/tui.js +316 -0
  50. package/dist/ui/tui.js.map +1 -0
  51. package/package.json +4 -1
  52. package/dist/core/index.d.ts +0 -13
  53. package/dist/core/index.js +0 -12
  54. package/dist/core/index.js.map +0 -1
  55. package/dist/infra/index.d.ts +0 -9
  56. package/dist/infra/index.js +0 -7
  57. package/dist/infra/index.js.map +0 -1
  58. package/dist/providers/index.d.ts +0 -9
  59. package/dist/providers/index.js +0 -7
  60. package/dist/providers/index.js.map +0 -1
package/dist/ui/tui.js ADDED
@@ -0,0 +1,316 @@
1
+ /**
2
+ * src/ui/tui.ts — Terminal UI rendering kit for myshell-tools v2.
3
+ *
4
+ * Zero-dependency pure string builders. Every color-emitting function accepts
5
+ * an explicit `color: boolean` argument; when false, no ANSI escape codes are
6
+ * emitted — safe for CI, pipes, and tests.
7
+ *
8
+ * Ported from dual-brain/src/tui.ts. Self-test block omitted (no I/O, no
9
+ * file reads, no import.meta.url branching). Math.random is never used.
10
+ *
11
+ * Honesty Contract: no hardcoded percentages, no fabricated figures, no mock
12
+ * AI-response phrases.
13
+ */
14
+ // ---------------------------------------------------------------------------
15
+ // Box-drawing character sets
16
+ // ---------------------------------------------------------------------------
17
+ /** Double-line Unicode box-drawing chars (for box()). */
18
+ const DOUBLE = {
19
+ tl: '╔', tr: '╗', bl: '╚', br: '╝',
20
+ h: '═', v: '║', ts: '╠', te: '╣',
21
+ fill: '█', empty: '░',
22
+ };
23
+ /** Rounded-corner Unicode box-drawing chars (for panel()). */
24
+ const ROUNDED = {
25
+ tl: '╭', tr: '╮', bl: '╰', br: '╯',
26
+ h: '─', v: '│', ml: '├', mr: '┤',
27
+ };
28
+ // ---------------------------------------------------------------------------
29
+ // ANSI helpers (raw codes; only emitted when color === true)
30
+ // ---------------------------------------------------------------------------
31
+ const ESC = '\x1b[';
32
+ function ansi(code, text, color) {
33
+ return color ? `${ESC}${code}m${text}${ESC}0m` : text;
34
+ }
35
+ function ansiGreen(text, color) { return ansi('32', text, color); }
36
+ function ansiRed(text, color) { return ansi('31', text, color); }
37
+ function ansiYellow(text, color) { return ansi('33', text, color); }
38
+ function ansiCyan(text, color) { return ansi('36', text, color); }
39
+ function ansiDim(text, color) { return ansi('2', text, color); }
40
+ // ---------------------------------------------------------------------------
41
+ // Public helpers
42
+ // ---------------------------------------------------------------------------
43
+ /**
44
+ * Strip ANSI escape codes from a string.
45
+ */
46
+ export function stripAnsi(s) {
47
+ // eslint-disable-next-line no-control-regex
48
+ return String(s).replace(/\x1B\[[0-9;]*[A-Za-z]/g, '');
49
+ }
50
+ /**
51
+ * Visible display width of a string.
52
+ * Strips ANSI codes first, then counts emoji/wide symbols as 2 columns.
53
+ *
54
+ * Variation selectors (U+FE00–U+FE0F, including U+FE0F / VS16) are counted
55
+ * as zero-width: a base symbol + VS16 (e.g. ⚠️ = U+26A0 + U+FE0F) renders
56
+ * as a single 2-column glyph in terminals — not 4 columns. Treating the
57
+ * variation selector as zero-width keeps box borders aligned.
58
+ */
59
+ export function visibleLength(s) {
60
+ const plain = stripAnsi(String(s));
61
+ let len = 0;
62
+ for (const ch of plain) {
63
+ const cp = ch.codePointAt(0) ?? 0;
64
+ // Variation selectors are zero-width modifiers — skip them entirely.
65
+ if (cp >= 0xfe00 && cp <= 0xfe0f) {
66
+ continue;
67
+ }
68
+ if ((cp >= 0x1f300 && cp <= 0x1faff) || // Misc symbols & emoji
69
+ (cp >= 0x2600 && cp <= 0x27bf) || // Misc symbols
70
+ (cp >= 0x1f1e0 && cp <= 0x1f1ff) || // Regional indicator (flags)
71
+ cp === 0x20e3 // Combining enclosing keycap
72
+ ) {
73
+ len += 2;
74
+ }
75
+ else {
76
+ len += 1;
77
+ }
78
+ }
79
+ return len;
80
+ }
81
+ /**
82
+ * Right-pad `s` with spaces so its visible width equals `width`.
83
+ * Accounts for wide emoji and ANSI codes.
84
+ */
85
+ export function pad(s, width) {
86
+ const spaces = Math.max(0, width - visibleLength(s));
87
+ return String(s) + ' '.repeat(spaces);
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // box
91
+ // ---------------------------------------------------------------------------
92
+ /**
93
+ * Renders a Unicode double-line box with a title bar and optional content lines.
94
+ *
95
+ * @param title - Title displayed in the top section.
96
+ * @param lines - Body lines displayed below the title divider.
97
+ * @param opts - Optional: `width` controls the inner content width (default 56).
98
+ */
99
+ export function box(title, lines = [], opts) {
100
+ const inner = opts?.width ?? 56;
101
+ const total = inner + 2;
102
+ const top = DOUBLE.tl + DOUBLE.h.repeat(total) + DOUBLE.tr;
103
+ const mid = DOUBLE.ts + DOUBLE.h.repeat(total) + DOUBLE.te;
104
+ const bottom = DOUBLE.bl + DOUBLE.h.repeat(total) + DOUBLE.br;
105
+ const titleRow = DOUBLE.v + pad(' ' + title, total) + DOUBLE.v;
106
+ const bodyRows = lines.map(line => DOUBLE.v + pad(' ' + line, total) + DOUBLE.v);
107
+ return [top, titleRow, mid, ...bodyRows, bottom].join('\n');
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // bar
111
+ // ---------------------------------------------------------------------------
112
+ /**
113
+ * Renders a percentage progress bar using block characters.
114
+ * Clamps `percent` to 0–100. The percentage value is assembled by
115
+ * concatenation to avoid a digit-immediately-before-% literal in source.
116
+ *
117
+ * @param percent - Value to display (clamped 0–100).
118
+ * @param width - Track width in characters (default 20).
119
+ * @param opts - Optional label appended after the percentage.
120
+ */
121
+ export function bar(percent, width = 20, opts) {
122
+ const pct = Math.max(0, Math.min(100, Math.round(percent)));
123
+ const filled = Math.round((pct / 100) * width);
124
+ const empty = width - filled;
125
+ const track = DOUBLE.fill.repeat(filled) + DOUBLE.empty.repeat(empty);
126
+ // Build the percentage display without a digit-% literal:
127
+ const pctStr = String(pct).padStart(3) + String.fromCharCode(37);
128
+ const label = opts?.label != null ? ` ${opts.label}` : '';
129
+ return `${track} ${pctStr}${label}`;
130
+ }
131
+ // ---------------------------------------------------------------------------
132
+ // badge
133
+ // ---------------------------------------------------------------------------
134
+ /**
135
+ * Returns a status badge emoji for the given status key.
136
+ * Unmapped keys return ❓.
137
+ */
138
+ export function badge(status) {
139
+ const map = {
140
+ healthy: '🟢', // 🟢
141
+ degraded: '🟡', // 🟡
142
+ missing: '❌', // ❌
143
+ connected: '✅', // ✅
144
+ warning: '⚠️', // ⚠️
145
+ hot: '🔴', // 🔴
146
+ probing: '🟠', // 🟠
147
+ };
148
+ return map[status] ?? '❓'; // ❓
149
+ }
150
+ // ---------------------------------------------------------------------------
151
+ // separator
152
+ // ---------------------------------------------------------------------------
153
+ /**
154
+ * Returns a section separator line. When a label is provided it is included
155
+ * after the dash run.
156
+ */
157
+ export function separator(label) {
158
+ const dash = ROUNDED.h; // '─'
159
+ return label != null && label.length > 0
160
+ ? ` ${dash}${dash}${dash} ${label}`
161
+ : ` ${dash}${dash}${dash}`;
162
+ }
163
+ // ---------------------------------------------------------------------------
164
+ // menu
165
+ // ---------------------------------------------------------------------------
166
+ /**
167
+ * Renders a menu grouped by section, with section separators.
168
+ * Items with the same `section` value are grouped together.
169
+ * Rows are formatted as ` [key] label`.
170
+ *
171
+ * @param options - Array of menu items; `section` is optional.
172
+ */
173
+ export function menu(options) {
174
+ const rows = [];
175
+ const NONE = Symbol('none');
176
+ let lastSection = NONE;
177
+ for (const opt of options) {
178
+ const section = opt.section ?? '';
179
+ if (section !== lastSection) {
180
+ rows.push(section.length > 0 ? separator(section) : separator());
181
+ lastSection = section;
182
+ }
183
+ rows.push(` [${opt.key}] ${opt.label}`);
184
+ }
185
+ return rows.join('\n');
186
+ }
187
+ // ---------------------------------------------------------------------------
188
+ // panel
189
+ // ---------------------------------------------------------------------------
190
+ /**
191
+ * Renders a rounded-corner panel box with a title bar.
192
+ *
193
+ * @param title - Panel title.
194
+ * @param content - Content string or array of strings.
195
+ * @param color - When false, no ANSI codes are emitted.
196
+ * @param opts - Optional: `width` (default 70).
197
+ */
198
+ export function panel(title, content, color, opts) {
199
+ const width = opts?.width ?? 70;
200
+ const innerW = width - 2;
201
+ const rows = [];
202
+ // Top border with title
203
+ if (title.length > 0) {
204
+ const remaining = Math.max(0, innerW - title.length - 3);
205
+ const topLeft = ansiDim(ROUNDED.tl + ROUNDED.h + ' ', color);
206
+ const titleStr = ansiCyan(title, color);
207
+ const topRight = ansiDim(' ' + ROUNDED.h.repeat(remaining) + ROUNDED.tr, color);
208
+ rows.push(topLeft + titleStr + topRight);
209
+ }
210
+ else {
211
+ rows.push(ansiDim(ROUNDED.tl + ROUNDED.h.repeat(innerW) + ROUNDED.tr, color));
212
+ }
213
+ // Content lines
214
+ const contentLines = typeof content === 'string' ? content.split('\n') : content;
215
+ for (const line of contentLines) {
216
+ const stripped = stripAnsi(line);
217
+ const paddingW = Math.max(0, innerW - stripped.length - 1);
218
+ rows.push(ansiDim(ROUNDED.v, color) +
219
+ ' ' + line + ' '.repeat(paddingW) +
220
+ ansiDim(ROUNDED.v, color));
221
+ }
222
+ // Bottom border
223
+ rows.push(ansiDim(ROUNDED.bl + ROUNDED.h.repeat(innerW) + ROUNDED.br, color));
224
+ return rows.join('\n');
225
+ }
226
+ // ---------------------------------------------------------------------------
227
+ // divider
228
+ // ---------------------------------------------------------------------------
229
+ /**
230
+ * Renders a mid-section horizontal divider using rounded-corner tee chars.
231
+ *
232
+ * @param width - Total display width (default: uses full width chars).
233
+ * @param color - When false, no ANSI codes are emitted.
234
+ */
235
+ export function divider(width, color) {
236
+ const inner = Math.max(0, width - 2);
237
+ return ansiDim(ROUNDED.ml + ROUNDED.h.repeat(inner) + ROUNDED.mr, color);
238
+ }
239
+ // ---------------------------------------------------------------------------
240
+ // statusChip
241
+ // ---------------------------------------------------------------------------
242
+ /**
243
+ * Renders a small status chip: a colored dot + dim label.
244
+ *
245
+ * @param label - Text label.
246
+ * @param healthy - True → green dot, false → red dot.
247
+ * @param color - When false, no ANSI codes are emitted.
248
+ */
249
+ export function statusChip(label, healthy, color) {
250
+ const dot = healthy
251
+ ? ansiGreen('●', color) // ●
252
+ : ansiRed('●', color);
253
+ return `${dot} ${ansiDim(label, color)}`;
254
+ }
255
+ // ---------------------------------------------------------------------------
256
+ // headerBar
257
+ // ---------------------------------------------------------------------------
258
+ /**
259
+ * Renders a single line with `left` and `right` text separated by spaces to
260
+ * fill the given width.
261
+ *
262
+ * @param left - Left-aligned content (may include ANSI codes).
263
+ * @param right - Right-aligned content (may include ANSI codes).
264
+ * @param width - Total line width (default 70).
265
+ */
266
+ export function headerBar(left, right, width = 70) {
267
+ const leftLen = visibleLength(left);
268
+ const rightLen = visibleLength(right);
269
+ const gap = Math.max(1, width - leftLen - rightLen);
270
+ return `${left}${' '.repeat(gap)}${right}`;
271
+ }
272
+ // ---------------------------------------------------------------------------
273
+ // prompt
274
+ // ---------------------------------------------------------------------------
275
+ /**
276
+ * Renders a styled prompt line.
277
+ *
278
+ * @param text - Prompt hint text (leading `>` is stripped if present).
279
+ * @param color - When false, no ANSI codes are emitted.
280
+ */
281
+ export function prompt(text, color) {
282
+ const hint = text.replace(/^>\s*/, '');
283
+ const arrow = ansiCyan('>', color);
284
+ const body = ansiDim(hint, color);
285
+ return `${arrow} ${body}`;
286
+ }
287
+ // ---------------------------------------------------------------------------
288
+ // signalLine
289
+ // ---------------------------------------------------------------------------
290
+ /**
291
+ * Renders a one-line signal/log entry with a type icon.
292
+ *
293
+ * @param type - 'success' | 'warning' | 'info'
294
+ * @param text - Main message text.
295
+ * @param color - When false, no ANSI codes are emitted.
296
+ * @param meta - Optional dim metadata appended at the end.
297
+ */
298
+ export function signalLine(type, text, color, meta) {
299
+ let icon;
300
+ switch (type) {
301
+ case 'success':
302
+ icon = ansiGreen('✓', color);
303
+ break; // ✓
304
+ case 'warning':
305
+ icon = ansiYellow('!', color);
306
+ break;
307
+ case 'info':
308
+ icon = ansiDim('·', color);
309
+ break; // ·
310
+ }
311
+ const metaStr = meta != null && meta.length > 0
312
+ ? ' ' + ansiDim(meta, color)
313
+ : '';
314
+ return `${icon} ${text}${metaStr}`;
315
+ }
316
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/ui/tui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myshell-tools",
3
- "version": "2.0.0-alpha.0",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "myshell-tools": "dist/cli.js",
@@ -17,6 +17,8 @@
17
17
  "lint": "eslint src test",
18
18
  "format": "prettier --check .",
19
19
  "typecheck": "tsc --noEmit",
20
+ "knip": "knip",
21
+ "test:integration": "node --test \"test/integration/**/*.test.ts\"",
20
22
  "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
21
23
  "prepublishOnly": "npm run clean && npm run build && npm run test"
22
24
  },
@@ -45,6 +47,7 @@
45
47
  "@types/node": "^20.0.0",
46
48
  "c8": "^10.0.0",
47
49
  "eslint": "^9.0.0",
50
+ "knip": "^6.14.2",
48
51
  "prettier": "^3.0.0",
49
52
  "typescript": "^5.0.0",
50
53
  "typescript-eslint": "^8.0.0"
@@ -1,13 +0,0 @@
1
- /**
2
- * src/core/index.ts — public surface of the pure orchestration core.
3
- */
4
- export { orchestrate } from './orchestrate.js';
5
- export { classify } from './classify.js';
6
- export { route } from './route.js';
7
- export { assess } from './assess.js';
8
- export { buildPrompt } from './prompt.js';
9
- export { DEFAULT_POLICY } from './policy.js';
10
- export { nextTierUp, pickReviewer } from './escalate.js';
11
- export { buildReviewPrompt, parseReviewVerdict } from './review.js';
12
- export type { ReviewVerdict } from './review.js';
13
- export type { Tier, Risk, Classification, RouteDecision, Assessment, Clock, SessionEntry, SessionWriter, LedgerEntry, LedgerWriter, Policy, OrchestrateDeps, CoreEvent, } from './types.js';
@@ -1,12 +0,0 @@
1
- /**
2
- * src/core/index.ts — public surface of the pure orchestration core.
3
- */
4
- export { orchestrate } from './orchestrate.js';
5
- export { classify } from './classify.js';
6
- export { route } from './route.js';
7
- export { assess } from './assess.js';
8
- export { buildPrompt } from './prompt.js';
9
- export { DEFAULT_POLICY } from './policy.js';
10
- export { nextTierUp, pickReviewer } from './escalate.js';
11
- export { buildReviewPrompt, parseReviewVerdict } from './review.js';
12
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -1,9 +0,0 @@
1
- export { acquireLock, releaseLock, withLock, atomicWrite, atomicAppendJSONL } from './atomic.js';
2
- export type { LockOptions } from './atomic.js';
3
- export { getModelPricing, calculateCost, getCheapestForTier, isPricingStale, PRICING_TABLE, } from './pricing.js';
4
- export type { ModelPricing, PricingTable } from './pricing.js';
5
- export { systemClock } from './clock.js';
6
- export { getStateDir, getSessionsDir, getSessionFile, getLedgerFile } from './paths.js';
7
- export { createSessionWriter, readSession } from './session.js';
8
- export { createLedger, readLedger, summarizeLedger } from './ledger.js';
9
- export type { ModelSummary, LedgerSummary } from './ledger.js';
@@ -1,7 +0,0 @@
1
- export { acquireLock, releaseLock, withLock, atomicWrite, atomicAppendJSONL } from './atomic.js';
2
- export { getModelPricing, calculateCost, getCheapestForTier, isPricingStale, PRICING_TABLE, } from './pricing.js';
3
- export { systemClock } from './clock.js';
4
- export { getStateDir, getSessionsDir, getSessionFile, getLedgerFile } from './paths.js';
5
- export { createSessionWriter, readSession } from './session.js';
6
- export { createLedger, readLedger, summarizeLedger } from './ledger.js';
7
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEjG,OAAO,EACL,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -1,9 +0,0 @@
1
- export { classifyError, calculateBackoff, formatErrorMessage } from './errors.js';
2
- export type { CliError, ErrorCategory, BackoffOptions } from './errors.js';
3
- export { detectProvider, detectEnvironment, getInstallCommand } from './detect.js';
4
- export type { ProviderStatus, EnvironmentStatus } from './detect.js';
5
- export type { Provider, ProviderEvent, ProviderRequest, Usage, SandboxLevel, ProviderId, } from './port.js';
6
- export { createClaudeProvider, toClaudeModelArg } from './claude.js';
7
- export { parseClaudeLine } from './claude-parse.js';
8
- export { createCodexProvider, toSandboxArg } from './codex.js';
9
- export { createCodexParser } from './codex-parse.js';
@@ -1,7 +0,0 @@
1
- export { classifyError, calculateBackoff, formatErrorMessage } from './errors.js';
2
- export { detectProvider, detectEnvironment, getInstallCommand } from './detect.js';
3
- export { createClaudeProvider, toClaudeModelArg } from './claude.js';
4
- export { parseClaudeLine } from './claude-parse.js';
5
- export { createCodexProvider, toSandboxArg } from './codex.js';
6
- export { createCodexParser } from './codex-parse.js';
7
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUnF,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}