@zhijiewang/openharness 0.6.1 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +10 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/components/CybergotchiPanelConnected.d.ts +5 -1
- package/dist/components/CybergotchiPanelConnected.d.ts.map +1 -1
- package/dist/components/CybergotchiPanelConnected.js +2 -2
- package/dist/components/CybergotchiPanelConnected.js.map +1 -1
- package/dist/components/DiffView.d.ts +1 -18
- package/dist/components/DiffView.d.ts.map +1 -1
- package/dist/components/DiffView.js +1 -54
- package/dist/components/DiffView.js.map +1 -1
- package/dist/components/PermissionPrompt.d.ts.map +1 -1
- package/dist/components/PermissionPrompt.js +7 -49
- package/dist/components/PermissionPrompt.js.map +1 -1
- package/dist/components/REPL.d.ts.map +1 -1
- package/dist/components/REPL.js +41 -20
- package/dist/components/REPL.js.map +1 -1
- package/dist/components/Spinner.d.ts.map +1 -1
- package/dist/components/Spinner.js +3 -9
- package/dist/components/Spinner.js.map +1 -1
- package/dist/cybergotchi/useCybergotchi.d.ts +1 -1
- package/dist/cybergotchi/useCybergotchi.d.ts.map +1 -1
- package/dist/cybergotchi/useCybergotchi.js +3 -1
- package/dist/cybergotchi/useCybergotchi.js.map +1 -1
- package/dist/harness/config.d.ts +1 -0
- package/dist/harness/config.d.ts.map +1 -1
- package/dist/harness/config.js.map +1 -1
- package/dist/harness/context-warning.d.ts +12 -0
- package/dist/harness/context-warning.d.ts.map +1 -0
- package/dist/harness/context-warning.js +36 -0
- package/dist/harness/context-warning.js.map +1 -0
- package/dist/harness/context-warning.test.d.ts +2 -0
- package/dist/harness/context-warning.test.d.ts.map +1 -0
- package/dist/harness/context-warning.test.js +72 -0
- package/dist/harness/context-warning.test.js.map +1 -0
- package/dist/harness/submit-handler.d.ts +35 -0
- package/dist/harness/submit-handler.d.ts.map +1 -0
- package/dist/harness/submit-handler.js +86 -0
- package/dist/harness/submit-handler.js.map +1 -0
- package/dist/harness/submit-handler.test.d.ts +2 -0
- package/dist/harness/submit-handler.test.d.ts.map +1 -0
- package/dist/harness/submit-handler.test.js +62 -0
- package/dist/harness/submit-handler.test.js.map +1 -0
- package/dist/main.js +26 -3
- package/dist/main.js.map +1 -1
- package/dist/renderer/cells.d.ts +37 -0
- package/dist/renderer/cells.d.ts.map +1 -0
- package/dist/renderer/cells.js +122 -0
- package/dist/renderer/cells.js.map +1 -0
- package/dist/renderer/cells.test.d.ts +2 -0
- package/dist/renderer/cells.test.d.ts.map +1 -0
- package/dist/renderer/cells.test.js +69 -0
- package/dist/renderer/cells.test.js.map +1 -0
- package/dist/renderer/diff.d.ts +33 -0
- package/dist/renderer/diff.d.ts.map +1 -0
- package/dist/renderer/diff.js +104 -0
- package/dist/renderer/diff.js.map +1 -0
- package/dist/renderer/differ.d.ts +25 -0
- package/dist/renderer/differ.d.ts.map +1 -0
- package/dist/renderer/differ.js +91 -0
- package/dist/renderer/differ.js.map +1 -0
- package/dist/renderer/e2e.test.d.ts +6 -0
- package/dist/renderer/e2e.test.d.ts.map +1 -0
- package/dist/renderer/e2e.test.js +237 -0
- package/dist/renderer/e2e.test.js.map +1 -0
- package/dist/renderer/image.d.ts +21 -0
- package/dist/renderer/image.d.ts.map +1 -0
- package/dist/renderer/image.js +97 -0
- package/dist/renderer/image.js.map +1 -0
- package/dist/renderer/index.d.ts +76 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +350 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/input.d.ts +17 -0
- package/dist/renderer/input.d.ts.map +1 -0
- package/dist/renderer/input.js +101 -0
- package/dist/renderer/input.js.map +1 -0
- package/dist/renderer/layout.d.ts +67 -0
- package/dist/renderer/layout.d.ts.map +1 -0
- package/dist/renderer/layout.js +439 -0
- package/dist/renderer/layout.js.map +1 -0
- package/dist/renderer/markdown.d.ts +19 -0
- package/dist/renderer/markdown.d.ts.map +1 -0
- package/dist/renderer/markdown.js +431 -0
- package/dist/renderer/markdown.js.map +1 -0
- package/dist/renderer/markdown.test.d.ts +2 -0
- package/dist/renderer/markdown.test.d.ts.map +1 -0
- package/dist/renderer/markdown.test.js +81 -0
- package/dist/renderer/markdown.test.js.map +1 -0
- package/dist/renderer/perf.test.d.ts +2 -0
- package/dist/renderer/perf.test.d.ts.map +1 -0
- package/dist/renderer/perf.test.js +123 -0
- package/dist/renderer/perf.test.js.map +1 -0
- package/dist/renderer/session-browser.d.ts +34 -0
- package/dist/renderer/session-browser.d.ts.map +1 -0
- package/dist/renderer/session-browser.js +130 -0
- package/dist/renderer/session-browser.js.map +1 -0
- package/dist/repl.d.ts +20 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +535 -0
- package/dist/repl.js.map +1 -0
- package/dist/tools/GrepTool/index.d.ts +2 -2
- package/dist/types/message.d.ts +1 -0
- package/dist/types/message.d.ts.map +1 -1
- package/dist/utils/diff-algorithm.d.ts +24 -0
- package/dist/utils/diff-algorithm.d.ts.map +1 -0
- package/dist/utils/diff-algorithm.js +58 -0
- package/dist/utils/diff-algorithm.js.map +1 -0
- package/dist/utils/diff-algorithm.test.d.ts +2 -0
- package/dist/utils/diff-algorithm.test.d.ts.map +1 -0
- package/dist/utils/diff-algorithm.test.js +49 -0
- package/dist/utils/diff-algorithm.test.js.map +1 -0
- package/dist/utils/format.d.ts +6 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +12 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/theme-data.d.ts +31 -0
- package/dist/utils/theme-data.d.ts.map +1 -0
- package/dist/utils/theme-data.js +55 -0
- package/dist/utils/theme-data.js.map +1 -0
- package/dist/utils/theme.d.ts +4 -21
- package/dist/utils/theme.d.ts.map +1 -1
- package/dist/utils/theme.js +4 -36
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/tool-summary.d.ts +15 -0
- package/dist/utils/tool-summary.d.ts.map +1 -0
- package/dist/utils/tool-summary.js +55 -0
- package/dist/utils/tool-summary.js.map +1 -0
- package/dist/utils/tool-summary.test.d.ts +2 -0
- package/dist/utils/tool-summary.test.d.ts.map +1 -0
- package/dist/utils/tool-summary.test.js +67 -0
- package/dist/utils/tool-summary.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure diff algorithm — no framework dependencies.
|
|
3
|
+
* Extracted from DiffView.tsx so it can be used by both
|
|
4
|
+
* the Ink component and the cell-level renderer.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Compute a simple unified diff between two strings.
|
|
8
|
+
* Returns an array of { type, line } entries.
|
|
9
|
+
*/
|
|
10
|
+
export function computeDiff(oldText, newText) {
|
|
11
|
+
const oldLines = oldText.split('\n');
|
|
12
|
+
const newLines = newText.split('\n');
|
|
13
|
+
const result = [];
|
|
14
|
+
let oi = 0;
|
|
15
|
+
let ni = 0;
|
|
16
|
+
while (oi < oldLines.length || ni < newLines.length) {
|
|
17
|
+
if (oi < oldLines.length && ni < newLines.length && oldLines[oi] === newLines[ni]) {
|
|
18
|
+
result.push({ type: 'context', line: oldLines[oi] });
|
|
19
|
+
oi++;
|
|
20
|
+
ni++;
|
|
21
|
+
}
|
|
22
|
+
else if (ni < newLines.length && (oi >= oldLines.length || !oldLines.slice(oi).includes(newLines[ni]))) {
|
|
23
|
+
result.push({ type: 'add', line: newLines[ni] });
|
|
24
|
+
ni++;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
result.push({ type: 'remove', line: oldLines[oi] });
|
|
28
|
+
oi++;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Filter diff to show only changed lines with N lines of context.
|
|
35
|
+
*/
|
|
36
|
+
export function filterWithContext(diff, contextLines = 3) {
|
|
37
|
+
const changed = new Set();
|
|
38
|
+
diff.forEach((d, i) => {
|
|
39
|
+
if (d.type !== 'context') {
|
|
40
|
+
for (let j = Math.max(0, i - contextLines); j <= Math.min(diff.length - 1, i + contextLines); j++) {
|
|
41
|
+
changed.add(j);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
const result = [];
|
|
46
|
+
let lastShown = -2;
|
|
47
|
+
diff.forEach((d, i) => {
|
|
48
|
+
if (changed.has(i)) {
|
|
49
|
+
if (i > lastShown + 1 && lastShown >= 0) {
|
|
50
|
+
result.push({ type: 'separator', line: '...' });
|
|
51
|
+
}
|
|
52
|
+
result.push(d);
|
|
53
|
+
lastShown = i;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=diff-algorithm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-algorithm.js","sourceRoot":"","sources":["../../src/utils/diff-algorithm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-algorithm.test.d.ts","sourceRoot":"","sources":["../../src/utils/diff-algorithm.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { computeDiff, filterWithContext } from './diff-algorithm.js';
|
|
4
|
+
describe('computeDiff', () => {
|
|
5
|
+
it('returns empty for identical strings', () => {
|
|
6
|
+
const diff = computeDiff('hello', 'hello');
|
|
7
|
+
assert.strictEqual(diff.length, 1);
|
|
8
|
+
assert.strictEqual(diff[0].type, 'context');
|
|
9
|
+
});
|
|
10
|
+
it('detects added lines', () => {
|
|
11
|
+
const diff = computeDiff('a\nb', 'a\nb\nc');
|
|
12
|
+
const adds = diff.filter(d => d.type === 'add');
|
|
13
|
+
assert.strictEqual(adds.length, 1);
|
|
14
|
+
assert.strictEqual(adds[0].line, 'c');
|
|
15
|
+
});
|
|
16
|
+
it('detects removed lines', () => {
|
|
17
|
+
const diff = computeDiff('a\nb\nc', 'a\nc');
|
|
18
|
+
const removes = diff.filter(d => d.type === 'remove');
|
|
19
|
+
assert.strictEqual(removes.length, 1);
|
|
20
|
+
assert.strictEqual(removes[0].line, 'b');
|
|
21
|
+
});
|
|
22
|
+
it('handles empty old text', () => {
|
|
23
|
+
const diff = computeDiff('', 'new content');
|
|
24
|
+
assert.ok(diff.some(d => d.type === 'add'));
|
|
25
|
+
});
|
|
26
|
+
it('handles empty new text', () => {
|
|
27
|
+
const diff = computeDiff('old content', '');
|
|
28
|
+
assert.ok(diff.some(d => d.type === 'remove'));
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('filterWithContext', () => {
|
|
32
|
+
it('shows context around changes', () => {
|
|
33
|
+
const diff = computeDiff('a\nb\nc\nd\ne\nf\ng', 'a\nb\nX\nd\ne\nf\ng');
|
|
34
|
+
const filtered = filterWithContext(diff, 1);
|
|
35
|
+
// Should show b (context), remove c, add X, d (context)
|
|
36
|
+
assert.ok(filtered.length < diff.length);
|
|
37
|
+
assert.ok(filtered.some(d => d.line === 'X' && d.type === 'add'));
|
|
38
|
+
});
|
|
39
|
+
it('adds separator between distant changes', () => {
|
|
40
|
+
const old = Array.from({ length: 20 }, (_, i) => `line${i}`).join('\n');
|
|
41
|
+
const lines = old.split('\n');
|
|
42
|
+
lines[2] = 'CHANGED2';
|
|
43
|
+
lines[18] = 'CHANGED18';
|
|
44
|
+
const diff = computeDiff(old, lines.join('\n'));
|
|
45
|
+
const filtered = filterWithContext(diff, 1);
|
|
46
|
+
assert.ok(filtered.some(d => d.type === 'separator'));
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=diff-algorithm.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-algorithm.test.js","sourceRoot":"","sources":["../../src/utils/diff-algorithm.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIlD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared formatting utilities.
|
|
3
|
+
*/
|
|
4
|
+
/** Format a token count for display (e.g., 1500 → "1.5K") */
|
|
5
|
+
export function formatTokenCount(n) {
|
|
6
|
+
if (n >= 1_000_000)
|
|
7
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
8
|
+
if (n >= 1_000)
|
|
9
|
+
return `${(n / 1_000).toFixed(1)}K`;
|
|
10
|
+
return `${n}`;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,GAAG,CAAC,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme data — framework-agnostic, no React dependency.
|
|
3
|
+
* Import this in the cell renderer instead of theme.ts.
|
|
4
|
+
*/
|
|
5
|
+
export type Theme = {
|
|
6
|
+
primary: string;
|
|
7
|
+
primaryShimmer: string;
|
|
8
|
+
user: string;
|
|
9
|
+
assistant: string;
|
|
10
|
+
tool: string;
|
|
11
|
+
error: string;
|
|
12
|
+
success: string;
|
|
13
|
+
warning: string;
|
|
14
|
+
border: string;
|
|
15
|
+
dim: string;
|
|
16
|
+
text: string;
|
|
17
|
+
diffAdded: string;
|
|
18
|
+
diffRemoved: string;
|
|
19
|
+
stall: string;
|
|
20
|
+
stallShimmer: string;
|
|
21
|
+
heading: string;
|
|
22
|
+
codeBlock: string;
|
|
23
|
+
codeFence: string;
|
|
24
|
+
bullet: string;
|
|
25
|
+
};
|
|
26
|
+
export declare const darkTheme: Theme;
|
|
27
|
+
export declare const lightTheme: Theme;
|
|
28
|
+
export declare function getTheme(): Theme;
|
|
29
|
+
/** Set the active theme. Must be called before renderer modules initialize. */
|
|
30
|
+
export declare function setActiveTheme(name: 'dark' | 'light'): void;
|
|
31
|
+
//# sourceMappingURL=theme-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-data.d.ts","sourceRoot":"","sources":["../../src/utils/theme-data.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,KAAK,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAoBvB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAoBxB,CAAC;AAIF,wBAAgB,QAAQ,IAAI,KAAK,CAEhC;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAE3D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme data — framework-agnostic, no React dependency.
|
|
3
|
+
* Import this in the cell renderer instead of theme.ts.
|
|
4
|
+
*/
|
|
5
|
+
export const darkTheme = {
|
|
6
|
+
primary: "magenta",
|
|
7
|
+
primaryShimmer: "magentaBright",
|
|
8
|
+
user: "cyan",
|
|
9
|
+
assistant: "magenta",
|
|
10
|
+
tool: "yellow",
|
|
11
|
+
error: "red",
|
|
12
|
+
success: "green",
|
|
13
|
+
warning: "yellow",
|
|
14
|
+
border: "gray",
|
|
15
|
+
dim: "gray",
|
|
16
|
+
text: "white",
|
|
17
|
+
diffAdded: "green",
|
|
18
|
+
diffRemoved: "red",
|
|
19
|
+
stall: "yellow",
|
|
20
|
+
stallShimmer: "redBright",
|
|
21
|
+
heading: "cyan",
|
|
22
|
+
codeBlock: "gray",
|
|
23
|
+
codeFence: "gray",
|
|
24
|
+
bullet: "cyan",
|
|
25
|
+
};
|
|
26
|
+
export const lightTheme = {
|
|
27
|
+
primary: "magentaBright",
|
|
28
|
+
primaryShimmer: "magenta",
|
|
29
|
+
user: "cyanBright",
|
|
30
|
+
assistant: "magentaBright",
|
|
31
|
+
tool: "yellowBright",
|
|
32
|
+
error: "redBright",
|
|
33
|
+
success: "greenBright",
|
|
34
|
+
warning: "yellowBright",
|
|
35
|
+
border: "blackBright",
|
|
36
|
+
dim: "blackBright",
|
|
37
|
+
text: "black",
|
|
38
|
+
diffAdded: "greenBright",
|
|
39
|
+
diffRemoved: "redBright",
|
|
40
|
+
stall: "yellowBright",
|
|
41
|
+
stallShimmer: "red",
|
|
42
|
+
heading: "cyanBright",
|
|
43
|
+
codeBlock: "blackBright",
|
|
44
|
+
codeFence: "blackBright",
|
|
45
|
+
bullet: "cyanBright",
|
|
46
|
+
};
|
|
47
|
+
let activeTheme = darkTheme;
|
|
48
|
+
export function getTheme() {
|
|
49
|
+
return activeTheme;
|
|
50
|
+
}
|
|
51
|
+
/** Set the active theme. Must be called before renderer modules initialize. */
|
|
52
|
+
export function setActiveTheme(name) {
|
|
53
|
+
activeTheme = name === 'light' ? lightTheme : darkTheme;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=theme-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-data.js","sourceRoot":"","sources":["../../src/utils/theme-data.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,MAAM,CAAC,MAAM,SAAS,GAAU;IAC9B,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,eAAe;IAC/B,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,KAAK;IAClB,KAAK,EAAE,QAAQ;IACf,YAAY,EAAE,WAAW;IACzB,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,OAAO,EAAE,eAAe;IACxB,cAAc,EAAE,SAAS;IACzB,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,aAAa;IACtB,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,aAAa;IAClB,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,aAAa;IACxB,WAAW,EAAE,WAAW;IACxB,KAAK,EAAE,cAAc;IACrB,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,aAAa;IACxB,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF,IAAI,WAAW,GAAU,SAAS,CAAC;AAEnC,MAAM,UAAU,QAAQ;IACtB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,IAAsB;IACnD,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC"}
|
package/dist/utils/theme.d.ts
CHANGED
|
@@ -1,27 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Theme system with React context for Ink components.
|
|
3
|
+
* Re-exports theme data from theme-data.ts (no React dependency).
|
|
4
4
|
*/
|
|
5
5
|
import React from "react";
|
|
6
|
-
export type Theme
|
|
7
|
-
|
|
8
|
-
primaryShimmer: string;
|
|
9
|
-
user: string;
|
|
10
|
-
assistant: string;
|
|
11
|
-
tool: string;
|
|
12
|
-
error: string;
|
|
13
|
-
success: string;
|
|
14
|
-
warning: string;
|
|
15
|
-
border: string;
|
|
16
|
-
dim: string;
|
|
17
|
-
text: string;
|
|
18
|
-
diffAdded: string;
|
|
19
|
-
diffRemoved: string;
|
|
20
|
-
stall: string;
|
|
21
|
-
stallShimmer: string;
|
|
22
|
-
};
|
|
23
|
-
export declare const darkTheme: Theme;
|
|
24
|
-
export declare const lightTheme: Theme;
|
|
6
|
+
export { type Theme, darkTheme, lightTheme, getTheme, setActiveTheme } from "./theme-data.js";
|
|
7
|
+
import type { Theme } from "./theme-data.js";
|
|
25
8
|
export declare const ThemeProvider: React.Provider<Theme>;
|
|
26
9
|
export declare function useTheme(): Theme;
|
|
27
10
|
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAI7C,eAAO,MAAM,aAAa,uBAAwB,CAAC;AAEnD,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
|
package/dist/utils/theme.js
CHANGED
|
@@ -1,42 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Theme system with React context for Ink components.
|
|
3
|
+
* Re-exports theme data from theme-data.ts (no React dependency).
|
|
4
4
|
*/
|
|
5
5
|
import React from "react";
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
primaryShimmer: "magentaBright",
|
|
9
|
-
user: "cyan",
|
|
10
|
-
assistant: "magenta",
|
|
11
|
-
tool: "yellow",
|
|
12
|
-
error: "red",
|
|
13
|
-
success: "green",
|
|
14
|
-
warning: "yellow",
|
|
15
|
-
border: "gray",
|
|
16
|
-
dim: "gray",
|
|
17
|
-
text: "white",
|
|
18
|
-
diffAdded: "green",
|
|
19
|
-
diffRemoved: "red",
|
|
20
|
-
stall: "yellow",
|
|
21
|
-
stallShimmer: "redBright",
|
|
22
|
-
};
|
|
23
|
-
export const lightTheme = {
|
|
24
|
-
primary: "magentaBright",
|
|
25
|
-
primaryShimmer: "magenta",
|
|
26
|
-
user: "cyanBright",
|
|
27
|
-
assistant: "magentaBright",
|
|
28
|
-
tool: "yellowBright",
|
|
29
|
-
error: "redBright",
|
|
30
|
-
success: "greenBright",
|
|
31
|
-
warning: "yellowBright",
|
|
32
|
-
border: "blackBright",
|
|
33
|
-
dim: "blackBright",
|
|
34
|
-
text: "black",
|
|
35
|
-
diffAdded: "greenBright",
|
|
36
|
-
diffRemoved: "redBright",
|
|
37
|
-
stall: "yellowBright",
|
|
38
|
-
stallShimmer: "red",
|
|
39
|
-
};
|
|
6
|
+
export { darkTheme, lightTheme, getTheme, setActiveTheme } from "./theme-data.js";
|
|
7
|
+
import { darkTheme } from "./theme-data.js";
|
|
40
8
|
const ThemeContext = React.createContext(darkTheme);
|
|
41
9
|
export const ThemeProvider = ThemeContext.Provider;
|
|
42
10
|
export function useTheme() {
|
package/dist/utils/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAc,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAQ,SAAS,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC;AAEnD,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared tool argument summary utilities.
|
|
3
|
+
* Used by both the cell renderer and Ink permission prompt.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract a human-readable suggestion from tool name + args JSON.
|
|
7
|
+
* Returns null if no meaningful suggestion can be derived.
|
|
8
|
+
*/
|
|
9
|
+
export declare function summarizeToolArgs(toolName: string, argsJson: string): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Extract a readable summary of tool arguments for display.
|
|
12
|
+
* Simpler version for inline display (tool call rows).
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatToolArgs(toolName: string, args: Record<string, unknown>): string;
|
|
15
|
+
//# sourceMappingURL=tool-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-summary.d.ts","sourceRoot":"","sources":["../../src/utils/tool-summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BnF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAKtF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared tool argument summary utilities.
|
|
3
|
+
* Used by both the cell renderer and Ink permission prompt.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract a human-readable suggestion from tool name + args JSON.
|
|
7
|
+
* Returns null if no meaningful suggestion can be derived.
|
|
8
|
+
*/
|
|
9
|
+
export function summarizeToolArgs(toolName, argsJson) {
|
|
10
|
+
const lower = toolName.toLowerCase();
|
|
11
|
+
if (lower === 'bash' || lower === 'shell' || lower === 'execute') {
|
|
12
|
+
const cmdMatch = argsJson.match(/command[:\s]+["`]?(.+?)["`]?(?:\n|$)/i);
|
|
13
|
+
if (cmdMatch)
|
|
14
|
+
return `$ ${cmdMatch[1]}`;
|
|
15
|
+
try {
|
|
16
|
+
const args = JSON.parse(argsJson);
|
|
17
|
+
if (args.command)
|
|
18
|
+
return `$ ${args.command.slice(0, 60)}`;
|
|
19
|
+
}
|
|
20
|
+
catch { /* ignore */ }
|
|
21
|
+
}
|
|
22
|
+
if (lower.includes('read') || lower.includes('write') || lower.includes('edit') || lower.includes('glob') || lower.includes('grep')) {
|
|
23
|
+
try {
|
|
24
|
+
const args = JSON.parse(argsJson);
|
|
25
|
+
if (args.file_path) {
|
|
26
|
+
const action = lower.includes('read') ? 'reading' : lower.includes('write') ? 'writing' : lower.includes('edit') ? 'editing' : lower;
|
|
27
|
+
return `${action} ${args.file_path}`;
|
|
28
|
+
}
|
|
29
|
+
if (args.pattern)
|
|
30
|
+
return `pattern: ${args.pattern}`;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
const pathMatch = argsJson.match(/(?:path|file)[:\s]+["`]?([^\s"`]+)/i);
|
|
34
|
+
if (pathMatch) {
|
|
35
|
+
const action = lower.includes('read') ? 'reading' : lower.includes('write') ? 'writing' : lower.includes('edit') ? 'editing' : lower;
|
|
36
|
+
return `${action} ${pathMatch[1]}`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Extract a readable summary of tool arguments for display.
|
|
44
|
+
* Simpler version for inline display (tool call rows).
|
|
45
|
+
*/
|
|
46
|
+
export function formatToolArgs(toolName, args) {
|
|
47
|
+
if (args.file_path)
|
|
48
|
+
return args.file_path;
|
|
49
|
+
if (args.command)
|
|
50
|
+
return `$ ${args.command.slice(0, 60)}`;
|
|
51
|
+
if (args.pattern)
|
|
52
|
+
return `pattern: ${args.pattern}`;
|
|
53
|
+
return JSON.stringify(args).slice(0, 80);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=tool-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-summary.js","sourceRoot":"","sources":["../../src/utils/tool-summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-summary.test.d.ts","sourceRoot":"","sources":["../../src/utils/tool-summary.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { summarizeToolArgs, formatToolArgs } from './tool-summary.js';
|
|
4
|
+
describe('summarizeToolArgs', () => {
|
|
5
|
+
it('extracts command from Bash tool', () => {
|
|
6
|
+
const result = summarizeToolArgs('Bash', JSON.stringify({ command: 'ls -la' }));
|
|
7
|
+
assert.ok(result !== null);
|
|
8
|
+
assert.ok(result.includes('ls -la'));
|
|
9
|
+
assert.ok(result.startsWith('$'));
|
|
10
|
+
});
|
|
11
|
+
it('extracts file_path from Read tool', () => {
|
|
12
|
+
const result = summarizeToolArgs('Read', JSON.stringify({ file_path: '/src/index.ts' }));
|
|
13
|
+
assert.ok(result !== null);
|
|
14
|
+
assert.ok(result.includes('/src/index.ts'));
|
|
15
|
+
assert.ok(result.includes('reading'));
|
|
16
|
+
});
|
|
17
|
+
it('extracts file_path from Write tool', () => {
|
|
18
|
+
const result = summarizeToolArgs('Write', JSON.stringify({ file_path: '/out/file.txt' }));
|
|
19
|
+
assert.ok(result !== null);
|
|
20
|
+
assert.ok(result.includes('/out/file.txt'));
|
|
21
|
+
assert.ok(result.includes('writing'));
|
|
22
|
+
});
|
|
23
|
+
it('extracts file_path from Edit tool', () => {
|
|
24
|
+
const result = summarizeToolArgs('Edit', JSON.stringify({ file_path: '/src/app.ts' }));
|
|
25
|
+
assert.ok(result !== null);
|
|
26
|
+
assert.ok(result.includes('/src/app.ts'));
|
|
27
|
+
assert.ok(result.includes('editing'));
|
|
28
|
+
});
|
|
29
|
+
it('extracts pattern from Grep tool', () => {
|
|
30
|
+
const result = summarizeToolArgs('Grep', JSON.stringify({ pattern: 'TODO' }));
|
|
31
|
+
assert.ok(result !== null);
|
|
32
|
+
assert.ok(result.includes('pattern: TODO'));
|
|
33
|
+
});
|
|
34
|
+
it('returns null for unknown tool', () => {
|
|
35
|
+
const result = summarizeToolArgs('UnknownTool', JSON.stringify({ foo: 'bar' }));
|
|
36
|
+
assert.strictEqual(result, null);
|
|
37
|
+
});
|
|
38
|
+
it('returns null for malformed JSON', () => {
|
|
39
|
+
const result = summarizeToolArgs('Bash', 'not valid json {{');
|
|
40
|
+
assert.strictEqual(result, null);
|
|
41
|
+
});
|
|
42
|
+
it('returns null for malformed JSON on file tools', () => {
|
|
43
|
+
const result = summarizeToolArgs('Read', '{broken json');
|
|
44
|
+
// Falls back to regex; if no path/file match, returns null
|
|
45
|
+
assert.ok(result === null || typeof result === 'string');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('formatToolArgs', () => {
|
|
49
|
+
it('returns file_path when present', () => {
|
|
50
|
+
const result = formatToolArgs('Read', { file_path: '/src/index.ts' });
|
|
51
|
+
assert.strictEqual(result, '/src/index.ts');
|
|
52
|
+
});
|
|
53
|
+
it('returns command prefixed with $ when present', () => {
|
|
54
|
+
const result = formatToolArgs('Bash', { command: 'echo hello' });
|
|
55
|
+
assert.strictEqual(result, '$ echo hello');
|
|
56
|
+
});
|
|
57
|
+
it('returns pattern when present', () => {
|
|
58
|
+
const result = formatToolArgs('Grep', { pattern: 'TODO' });
|
|
59
|
+
assert.strictEqual(result, 'pattern: TODO');
|
|
60
|
+
});
|
|
61
|
+
it('falls back to JSON.stringify for unknown args', () => {
|
|
62
|
+
const args = { foo: 'bar' };
|
|
63
|
+
const result = formatToolArgs('UnknownTool', args);
|
|
64
|
+
assert.strictEqual(result, JSON.stringify(args));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=tool-summary.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-summary.test.js","sourceRoot":"","sources":["../../src/utils/tool-summary.test.ts"],"names":[],"mappings":"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"}
|