@corenel/web-ui 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.
- package/dist/AskUser.d.ts +8 -0
- package/dist/AskUser.d.ts.map +1 -0
- package/dist/AskUser.js +94 -0
- package/dist/AskUser.js.map +1 -0
- package/dist/CommandPalette.d.ts +13 -0
- package/dist/CommandPalette.d.ts.map +1 -0
- package/dist/CommandPalette.js +54 -0
- package/dist/CommandPalette.js.map +1 -0
- package/dist/Composer.d.ts +51 -0
- package/dist/Composer.d.ts.map +1 -0
- package/dist/Composer.js +174 -0
- package/dist/Composer.js.map +1 -0
- package/dist/ContextBar.d.ts +9 -0
- package/dist/ContextBar.d.ts.map +1 -0
- package/dist/ContextBar.js +45 -0
- package/dist/ContextBar.js.map +1 -0
- package/dist/ContextManager.d.ts +33 -0
- package/dist/ContextManager.d.ts.map +1 -0
- package/dist/ContextManager.js +145 -0
- package/dist/ContextManager.js.map +1 -0
- package/dist/Lightbox.d.ts +6 -0
- package/dist/Lightbox.d.ts.map +1 -0
- package/dist/Lightbox.js +22 -0
- package/dist/Lightbox.js.map +1 -0
- package/dist/RichContent.d.ts +27 -0
- package/dist/RichContent.d.ts.map +1 -0
- package/dist/RichContent.js +267 -0
- package/dist/RichContent.js.map +1 -0
- package/dist/SummaryTranscript.d.ts +17 -0
- package/dist/SummaryTranscript.d.ts.map +1 -0
- package/dist/SummaryTranscript.js +23 -0
- package/dist/SummaryTranscript.js.map +1 -0
- package/dist/TodoPanel.d.ts +2 -0
- package/dist/TodoPanel.d.ts.map +1 -0
- package/dist/TodoPanel.js +173 -0
- package/dist/TodoPanel.js.map +1 -0
- package/dist/Transcript.d.ts +27 -0
- package/dist/Transcript.d.ts.map +1 -0
- package/dist/Transcript.js +179 -0
- package/dist/Transcript.js.map +1 -0
- package/dist/diff.d.ts +10 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +52 -0
- package/dist/diff.js.map +1 -0
- package/dist/editDecisions.d.ts +14 -0
- package/dist/editDecisions.d.ts.map +1 -0
- package/dist/editDecisions.js +77 -0
- package/dist/editDecisions.js.map +1 -0
- package/dist/liveEdit.d.ts +18 -0
- package/dist/liveEdit.d.ts.map +1 -0
- package/dist/liveEdit.js +71 -0
- package/dist/liveEdit.js.map +1 -0
- package/dist/toolRender.d.ts +31 -0
- package/dist/toolRender.d.ts.map +1 -0
- package/dist/toolRender.js +163 -0
- package/dist/toolRender.js.map +1 -0
- package/dist/transcriptView.d.ts +16 -0
- package/dist/transcriptView.d.ts.map +1 -0
- package/dist/transcriptView.js +69 -0
- package/dist/transcriptView.js.map +1 -0
- package/package.json +42 -0
package/dist/diff.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export function lineDiff(a, b) {
|
|
2
|
+
const oldLines = a.split('\n');
|
|
3
|
+
const newLines = b.split('\n');
|
|
4
|
+
const n = oldLines.length;
|
|
5
|
+
const m = newLines.length;
|
|
6
|
+
// LCS length table
|
|
7
|
+
const lcs = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
8
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
9
|
+
for (let j = m - 1; j >= 0; j--) {
|
|
10
|
+
lcs[i][j] = oldLines[i] === newLines[j]
|
|
11
|
+
? lcs[i + 1][j + 1] + 1
|
|
12
|
+
: Math.max(lcs[i + 1][j], lcs[i][j + 1]);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const out = [];
|
|
16
|
+
let i = 0;
|
|
17
|
+
let j = 0;
|
|
18
|
+
while (i < n && j < m) {
|
|
19
|
+
if (oldLines[i] === newLines[j]) {
|
|
20
|
+
out.push({ kind: 'ctx', text: oldLines[i] });
|
|
21
|
+
i++;
|
|
22
|
+
j++;
|
|
23
|
+
}
|
|
24
|
+
else if (lcs[i + 1][j] >= lcs[i][j + 1]) {
|
|
25
|
+
out.push({ kind: 'del', text: oldLines[i] });
|
|
26
|
+
i++;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
out.push({ kind: 'add', text: newLines[j] });
|
|
30
|
+
j++;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
while (i < n) {
|
|
34
|
+
out.push({ kind: 'del', text: oldLines[i++] });
|
|
35
|
+
}
|
|
36
|
+
while (j < m) {
|
|
37
|
+
out.push({ kind: 'add', text: newLines[j++] });
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
export function diffStat(lines) {
|
|
42
|
+
let added = 0;
|
|
43
|
+
let removed = 0;
|
|
44
|
+
for (const l of lines) {
|
|
45
|
+
if (l.kind === 'add')
|
|
46
|
+
added++;
|
|
47
|
+
else if (l.kind === 'del')
|
|
48
|
+
removed++;
|
|
49
|
+
}
|
|
50
|
+
return { added, removed };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=diff.js.map
|
package/dist/diff.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EditReviewOutcome } from '@corenel/protocol';
|
|
2
|
+
export type EditDecision = EditReviewOutcome['decision'];
|
|
3
|
+
export type EditDecisionRecord = EditReviewOutcome;
|
|
4
|
+
export declare function getEditDecision(callId: string): EditDecision | undefined;
|
|
5
|
+
export declare function getEditDecisionRecord(callId: string): EditDecisionRecord | undefined;
|
|
6
|
+
export declare function setEditDecision(callId: string, decision: EditDecision, note?: string): void;
|
|
7
|
+
/** Notified when a decision is recorded — lets the chat card reflect a resolution
|
|
8
|
+
* made elsewhere (e.g. Accept/Reject from the editor's inline review). */
|
|
9
|
+
export declare function onEditDecision(cb: (callId: string, rec: EditDecisionRecord) => void): () => void;
|
|
10
|
+
/** Resolve once a decision exists for `callId` (immediately when it already
|
|
11
|
+
* does), or with null when `signal` aborts first. This is the main-thread half
|
|
12
|
+
* of the blocking propose_edit: the worker suspends the tool on it. */
|
|
13
|
+
export declare function awaitEditDecision(callId: string, signal?: AbortSignal): Promise<EditDecisionRecord | null>;
|
|
14
|
+
//# sourceMappingURL=editDecisions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editDecisions.d.ts","sourceRoot":"","sources":["../editDecisions.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACzD,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAsBnD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAExE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEpF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAM3F;AAED;0EAC0E;AAC1E,wBAAgB,cAAc,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,MAAM,IAAI,CAGhG;AAED;;uEAEuE;AACvE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAc1G"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* Remembers the user's verdict on a propose_edit, keyed by the tool-call id. The
|
|
2
|
+
* DiffProposal card holds its resolved state in local component state, so it
|
|
3
|
+
* would reset to "Apply / Reject" whenever the card re-mounts — e.g. when the
|
|
4
|
+
* assistant panel loses focus, collapses, or the transcript re-renders. The call
|
|
5
|
+
* id is stable (it's the LLM tool_call id, persisted in the session), so a
|
|
6
|
+
* decision recorded here survives re-mounts and reloads.
|
|
7
|
+
*
|
|
8
|
+
* This store is also what UNBLOCKS the agent: propose_edit suspends until the
|
|
9
|
+
* decision lands (awaitEditDecision, bridged into the worker), and its tool
|
|
10
|
+
* result reports the verdict — including, for a partial apply, the rejected
|
|
11
|
+
* hunks carried in `note`. */
|
|
12
|
+
import { safeLocalStorageSet } from '@corenel/tools-web/storageHealth';
|
|
13
|
+
const KEY = 'prompd.web.editDecisions.v1';
|
|
14
|
+
function load() {
|
|
15
|
+
try {
|
|
16
|
+
const raw = (JSON.parse(localStorage.getItem(KEY) || '{}') || {});
|
|
17
|
+
const out = {};
|
|
18
|
+
for (const [k, v] of Object.entries(raw)) {
|
|
19
|
+
// Pre-partial entries were bare strings.
|
|
20
|
+
if (v === 'applied' || v === 'rejected' || v === 'partial')
|
|
21
|
+
out[k] = { decision: v };
|
|
22
|
+
else if (v && typeof v === 'object' && 'decision' in v)
|
|
23
|
+
out[k] = v;
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let map = load();
|
|
32
|
+
const subs = new Set();
|
|
33
|
+
export function getEditDecision(callId) {
|
|
34
|
+
return map[callId]?.decision;
|
|
35
|
+
}
|
|
36
|
+
export function getEditDecisionRecord(callId) {
|
|
37
|
+
return map[callId];
|
|
38
|
+
}
|
|
39
|
+
export function setEditDecision(callId, decision, note) {
|
|
40
|
+
if (map[callId]?.decision === decision && map[callId]?.note === note)
|
|
41
|
+
return;
|
|
42
|
+
const rec = note ? { decision, note } : { decision };
|
|
43
|
+
map = { ...map, [callId]: rec };
|
|
44
|
+
safeLocalStorageSet(KEY, JSON.stringify(map));
|
|
45
|
+
subs.forEach((f) => { try {
|
|
46
|
+
f(callId, rec);
|
|
47
|
+
}
|
|
48
|
+
catch { /* ignore */ } });
|
|
49
|
+
}
|
|
50
|
+
/** Notified when a decision is recorded — lets the chat card reflect a resolution
|
|
51
|
+
* made elsewhere (e.g. Accept/Reject from the editor's inline review). */
|
|
52
|
+
export function onEditDecision(cb) {
|
|
53
|
+
subs.add(cb);
|
|
54
|
+
return () => { subs.delete(cb); };
|
|
55
|
+
}
|
|
56
|
+
/** Resolve once a decision exists for `callId` (immediately when it already
|
|
57
|
+
* does), or with null when `signal` aborts first. This is the main-thread half
|
|
58
|
+
* of the blocking propose_edit: the worker suspends the tool on it. */
|
|
59
|
+
export function awaitEditDecision(callId, signal) {
|
|
60
|
+
const existing = map[callId];
|
|
61
|
+
if (existing)
|
|
62
|
+
return Promise.resolve(existing);
|
|
63
|
+
if (signal?.aborted)
|
|
64
|
+
return Promise.resolve(null);
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
const off = onEditDecision((id, rec) => {
|
|
67
|
+
if (id !== callId)
|
|
68
|
+
return;
|
|
69
|
+
off();
|
|
70
|
+
signal?.removeEventListener('abort', onAbort);
|
|
71
|
+
resolve(rec);
|
|
72
|
+
});
|
|
73
|
+
const onAbort = () => { off(); resolve(null); };
|
|
74
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=editDecisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editDecisions.js","sourceRoot":"","sources":["../editDecisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface LiveEdit {
|
|
2
|
+
/** propose_edit tool-call id — ties the editor review to the chat card + editDecisions. */
|
|
3
|
+
callId: string;
|
|
4
|
+
/** The document content the edit was computed against. */
|
|
5
|
+
base: string;
|
|
6
|
+
/** The proposed new content. */
|
|
7
|
+
next: string;
|
|
8
|
+
explanation?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function isLiveEditsOn(): boolean;
|
|
11
|
+
export declare function setLiveEditsOn(on: boolean): void;
|
|
12
|
+
export declare function onLiveEditsSetting(cb: (on: boolean) => void): () => void;
|
|
13
|
+
export declare function getLiveEdit(): LiveEdit | null;
|
|
14
|
+
export declare function setLiveEdit(e: LiveEdit | null): void;
|
|
15
|
+
export declare function onLiveEdit(cb: (e: LiveEdit | null) => void): () => void;
|
|
16
|
+
export declare function useLiveEditsSetting(): [boolean, (on: boolean) => void];
|
|
17
|
+
export declare function useLiveEdit(): LiveEdit | null;
|
|
18
|
+
//# sourceMappingURL=liveEdit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liveEdit.d.ts","sourceRoot":"","sources":["../liveEdit.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,QAAQ;IACvB,2FAA2F;IAC3F,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAUD,wBAAgB,aAAa,IAAI,OAAO,CAAoB;AAC5D,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAMhD;AACD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAGxE;AAMD,wBAAgB,WAAW,IAAI,QAAQ,GAAG,IAAI,CAAoB;AAClE,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAIpD;AACD,wBAAgB,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI,CAGvE;AAGD,wBAAgB,mBAAmB,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC,CAItE;AACD,wBAAgB,WAAW,IAAI,QAAQ,GAAG,IAAI,CAI7C"}
|
package/dist/liveEdit.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* "Show live edits" — a setting plus the single pending AI edit, shared between the
|
|
2
|
+
* chat (which proposes via propose_edit) and the editor pane (which reviews it
|
|
3
|
+
* inline). The two live in different dock panels, so a module store decouples them.
|
|
4
|
+
*
|
|
5
|
+
* Setting ON → a propose_edit surfaces here; the editor shows an inline Monaco
|
|
6
|
+
* diff with Accept / Reject, and the chat card collapses with no
|
|
7
|
+
* in-chat apply (the editor owns the decision).
|
|
8
|
+
* Setting OFF → edits stay as today: in-chat Apply / Reject diff cards; this
|
|
9
|
+
* store's `current` is never set. */
|
|
10
|
+
import { useEffect, useState } from 'react';
|
|
11
|
+
/* ---- setting: persisted toggle ---- */
|
|
12
|
+
const SETTING_KEY = 'prompd.web.liveEdits';
|
|
13
|
+
function readSetting() {
|
|
14
|
+
try {
|
|
15
|
+
return localStorage.getItem(SETTING_KEY) === '1';
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
let enabled = readSetting();
|
|
22
|
+
const settingSubs = new Set();
|
|
23
|
+
export function isLiveEditsOn() { return enabled; }
|
|
24
|
+
export function setLiveEditsOn(on) {
|
|
25
|
+
if (on === enabled)
|
|
26
|
+
return;
|
|
27
|
+
enabled = on;
|
|
28
|
+
try {
|
|
29
|
+
localStorage.setItem(SETTING_KEY, on ? '1' : '0');
|
|
30
|
+
}
|
|
31
|
+
catch { /* ignore */ }
|
|
32
|
+
if (!on)
|
|
33
|
+
setLiveEdit(null); // turning it off drops any in-flight review
|
|
34
|
+
settingSubs.forEach((f) => { try {
|
|
35
|
+
f(on);
|
|
36
|
+
}
|
|
37
|
+
catch { /* ignore */ } });
|
|
38
|
+
}
|
|
39
|
+
export function onLiveEditsSetting(cb) {
|
|
40
|
+
settingSubs.add(cb);
|
|
41
|
+
return () => { settingSubs.delete(cb); };
|
|
42
|
+
}
|
|
43
|
+
/* ---- the pending edit ---- */
|
|
44
|
+
let current = null;
|
|
45
|
+
const editSubs = new Set();
|
|
46
|
+
export function getLiveEdit() { return current; }
|
|
47
|
+
export function setLiveEdit(e) {
|
|
48
|
+
if (current?.callId === e?.callId && current?.next === e?.next)
|
|
49
|
+
return;
|
|
50
|
+
current = e;
|
|
51
|
+
editSubs.forEach((f) => { try {
|
|
52
|
+
f(current);
|
|
53
|
+
}
|
|
54
|
+
catch { /* ignore */ } });
|
|
55
|
+
}
|
|
56
|
+
export function onLiveEdit(cb) {
|
|
57
|
+
editSubs.add(cb);
|
|
58
|
+
return () => { editSubs.delete(cb); };
|
|
59
|
+
}
|
|
60
|
+
/* ---- React hooks ---- */
|
|
61
|
+
export function useLiveEditsSetting() {
|
|
62
|
+
const [on, setOn] = useState(isLiveEditsOn);
|
|
63
|
+
useEffect(() => onLiveEditsSetting(setOn), []);
|
|
64
|
+
return [on, setLiveEditsOn];
|
|
65
|
+
}
|
|
66
|
+
export function useLiveEdit() {
|
|
67
|
+
const [e, setE] = useState(getLiveEdit);
|
|
68
|
+
useEffect(() => onLiveEdit(setE), []);
|
|
69
|
+
return e;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=liveEdit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liveEdit.js","sourceRoot":"","sources":["../liveEdit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/** A tool call normalized for rendering — surface-agnostic. */
|
|
3
|
+
export interface ToolInvocation {
|
|
4
|
+
name: string;
|
|
5
|
+
args: Record<string, unknown>;
|
|
6
|
+
result: string;
|
|
7
|
+
isError?: boolean;
|
|
8
|
+
running?: boolean;
|
|
9
|
+
/** Duration in ms, when the surface tracks it. */
|
|
10
|
+
ms?: number;
|
|
11
|
+
}
|
|
12
|
+
type ToolStatus = 'running' | 'ok' | 'warn' | 'error';
|
|
13
|
+
export declare function toolStatusOf(name: string, result: string, isError: boolean): ToolStatus;
|
|
14
|
+
/** One tool's glanceable status line. Shared by the card header, the summary
|
|
15
|
+
* renderer, and AgentPanel's live (in-flight) list so a call resolves in place. */
|
|
16
|
+
export declare function ToolLine({ name, args, result, isError, running, ms }: {
|
|
17
|
+
name: string;
|
|
18
|
+
args: Record<string, unknown>;
|
|
19
|
+
result?: string;
|
|
20
|
+
isError?: boolean;
|
|
21
|
+
running?: boolean;
|
|
22
|
+
ms?: number;
|
|
23
|
+
}): React.JSX.Element;
|
|
24
|
+
/** STANDARD tool renderer (normal + expanded): a collapsible card. `defaultOpen`
|
|
25
|
+
* is the only difference between the two views — expanded opens every card. */
|
|
26
|
+
export declare function ToolResultCard({ inv, defaultOpen }: {
|
|
27
|
+
inv: ToolInvocation;
|
|
28
|
+
defaultOpen?: boolean;
|
|
29
|
+
}): React.JSX.Element;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=toolRender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolRender.d.ts","sourceRoot":"","sources":["../toolRender.tsx"],"names":[],"mappings":"AAcA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAOnD,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,KAAK,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;AAkDtD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAIvF;AAuBD;mFACmF;AACnF,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE;IACrE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACjH,qBAuBA;AAED;+EAC+E;AAC/E,wBAAgB,cAAc,CAAC,EAAE,GAAG,EAAE,WAAmB,EAAE,EAAE;IAAE,GAAG,EAAE,cAAc,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,qBAwB1G"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* Tool renderer layer — the single place that knows how a tool call/result looks.
|
|
3
|
+
*
|
|
4
|
+
* Both chat surfaces (the main agent `Transcript` and the DAG `NodeChat`) speak
|
|
5
|
+
* different data shapes (OpenAI messages vs the NodeEvent transcript), so each
|
|
6
|
+
* normalizes its tool calls into a `ToolInvocation` and hands it here. That keeps
|
|
7
|
+
* one renderer, one set of status/label/metric rules, one highlighting path.
|
|
8
|
+
*
|
|
9
|
+
* Two renderings, picked by the transcript view (see transcriptView.tsx):
|
|
10
|
+
* - `ToolResultCard` — the STANDARD renderer (normal + expanded). A collapsible
|
|
11
|
+
* card: glanceable status line + arguments + highlighted result (RichResult).
|
|
12
|
+
* normal vs expanded differ only by `defaultOpen`.
|
|
13
|
+
* - `ToolLine` — the dense status line the SUMMARY renderer uses on its own (and
|
|
14
|
+
* the card header reuses), plus the live in-flight list in AgentPanel.
|
|
15
|
+
*/
|
|
16
|
+
import { useEffect, useState } from 'react';
|
|
17
|
+
import { RichResult, CodeBlock, CopyBtn } from './RichContent';
|
|
18
|
+
import { IcCheck, IcChevronRight, IcZap, IcGit, IcRefresh, IcAlert, IcCode, IcPackage, IcSave, IcSearch, IcFileText, IcFile, IcFilePlus, IcTrash, IcEdit, IcFolder, IcDownload, IcHelp, } from '@corenel/ui-kit/icons';
|
|
19
|
+
const TOOLS = {
|
|
20
|
+
compile_prompd: { label: 'Compile', icon: IcCode },
|
|
21
|
+
propose_edit: { label: 'Propose edit', icon: IcGit },
|
|
22
|
+
search_packages: { label: 'Search packages', icon: IcPackage },
|
|
23
|
+
save_memory: { label: 'Save memory', icon: IcSave },
|
|
24
|
+
recall_memory: { label: 'Recall memory', icon: IcSearch },
|
|
25
|
+
kv_get: { label: 'Read value', icon: IcFileText },
|
|
26
|
+
kv_set: { label: 'Set value', icon: IcSave },
|
|
27
|
+
recall_result: { label: 'Recall result', icon: IcDownload },
|
|
28
|
+
ask_user: { label: 'Ask you', icon: IcHelp },
|
|
29
|
+
spawn_agent: { label: 'Sub-agent', icon: IcZap },
|
|
30
|
+
spawn_agents: { label: 'Sub-agents', icon: IcZap },
|
|
31
|
+
web_search: { label: 'Web search', icon: IcSearch },
|
|
32
|
+
todo_write: { label: 'Update tasks', icon: IcCheck },
|
|
33
|
+
list_files: { label: 'List files', icon: IcFolder },
|
|
34
|
+
read_file: { label: 'Read file', icon: IcFileText },
|
|
35
|
+
stat_file: { label: 'Check path', icon: IcFile },
|
|
36
|
+
search_files: { label: 'Search files', icon: IcSearch },
|
|
37
|
+
write_file: { label: 'Write file', icon: IcSave },
|
|
38
|
+
create_file: { label: 'Create file', icon: IcFilePlus },
|
|
39
|
+
delete_file: { label: 'Delete file', icon: IcTrash },
|
|
40
|
+
rename_file: { label: 'Rename', icon: IcEdit },
|
|
41
|
+
};
|
|
42
|
+
const sv = (args, k) => (typeof args[k] === 'string' ? args[k] : '');
|
|
43
|
+
const basename = (p) => { const x = p.split('/').filter(Boolean); return x[x.length - 1] || p; };
|
|
44
|
+
const byteLen = (x) => { try {
|
|
45
|
+
return new TextEncoder().encode(x).length;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return x.length;
|
|
49
|
+
} };
|
|
50
|
+
const fmtBytes = (n) => (n < 1024 ? `${n} B` : n < 1048576 ? `${(n / 1024).toFixed(n < 10240 ? 1 : 0)} KB` : `${(n / 1048576).toFixed(1)} MB`);
|
|
51
|
+
const lineCount = (x) => { const t = x.trim(); return t ? t.split('\n').length : 0; };
|
|
52
|
+
const firstLine = (x) => (x.split('\n').find((l) => l.trim()) || '').replace(/^error:\s*/i, '').trim();
|
|
53
|
+
const truncate = (x, n) => (x.length > n ? `${x.slice(0, n - 1)}…` : x);
|
|
54
|
+
const fmtMs = (ms) => (ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(ms < 10000 ? 1 : 0)}s`);
|
|
55
|
+
/** The target identifier (path / query / key) a tool acted on, from its arguments. */
|
|
56
|
+
function toolDetail(name, args) {
|
|
57
|
+
switch (name) {
|
|
58
|
+
case 'read_file':
|
|
59
|
+
case 'write_file':
|
|
60
|
+
case 'create_file':
|
|
61
|
+
case 'delete_file':
|
|
62
|
+
case 'stat_file': return sv(args, 'path');
|
|
63
|
+
case 'rename_file': return sv(args, 'from') && sv(args, 'to') ? `${basename(sv(args, 'from'))} → ${basename(sv(args, 'to'))}` : '';
|
|
64
|
+
case 'list_files': return sv(args, 'dir') || 'workspace';
|
|
65
|
+
case 'search_files':
|
|
66
|
+
case 'search_packages':
|
|
67
|
+
case 'recall_memory':
|
|
68
|
+
case 'web_search': {
|
|
69
|
+
const q = sv(args, 'query');
|
|
70
|
+
return q ? `“${q}”` : '';
|
|
71
|
+
}
|
|
72
|
+
case 'compile_prompd': return sv(args, 'path') || 'inline source';
|
|
73
|
+
case 'kv_get':
|
|
74
|
+
case 'kv_set': return sv(args, 'key');
|
|
75
|
+
case 'recall_result': return sv(args, 'id');
|
|
76
|
+
default: return '';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export function toolStatusOf(name, result, isError) {
|
|
80
|
+
if (isError)
|
|
81
|
+
return 'error';
|
|
82
|
+
if (name === 'compile_prompd' && /\n\nErrors:\n/.test(result))
|
|
83
|
+
return 'warn';
|
|
84
|
+
return 'ok';
|
|
85
|
+
}
|
|
86
|
+
/** A concise outcome metric for a settled tool (size, count, …). */
|
|
87
|
+
function toolMeta(name, args, result) {
|
|
88
|
+
const r = result || '';
|
|
89
|
+
switch (name) {
|
|
90
|
+
case 'read_file': return r ? fmtBytes(byteLen(r)) : '';
|
|
91
|
+
case 'list_files': {
|
|
92
|
+
const n = r === '(empty)' ? 0 : lineCount(r);
|
|
93
|
+
return n ? `${n} item${n > 1 ? 's' : ''}` : 'empty';
|
|
94
|
+
}
|
|
95
|
+
case 'search_files': return /^no matches/i.test(r) ? 'no matches' : `${lineCount(r)} match${lineCount(r) !== 1 ? 'es' : ''}`;
|
|
96
|
+
case 'search_packages': return /^no packages/i.test(r) ? 'none found' : `${lineCount(r)} found`;
|
|
97
|
+
case 'recall_memory': return /^no relevant/i.test(r) ? 'none' : `${lineCount(r)} note${lineCount(r) !== 1 ? 's' : ''}`;
|
|
98
|
+
case 'compile_prompd': return /\n\nErrors:\n/.test(r) ? 'errors' : (r ? fmtBytes(byteLen(r)) : '');
|
|
99
|
+
case 'todo_write': {
|
|
100
|
+
const a = args.todos;
|
|
101
|
+
const n = Array.isArray(a) ? a.length : 0;
|
|
102
|
+
return n ? `${n} task${n > 1 ? 's' : ''}` : '';
|
|
103
|
+
}
|
|
104
|
+
default: return '';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function StatusGlyph({ status }) {
|
|
108
|
+
if (status === 'running')
|
|
109
|
+
return _jsx("span", { style: S.glyph('running'), className: "tool-spin", children: _jsx(IcRefresh, { size: 11 }) });
|
|
110
|
+
if (status === 'ok')
|
|
111
|
+
return _jsx("span", { style: S.glyph('ok'), children: _jsx(IcCheck, { size: 10 }) });
|
|
112
|
+
return _jsx("span", { style: S.glyph(status), children: _jsx(IcAlert, { size: 11 }) });
|
|
113
|
+
}
|
|
114
|
+
/** One tool's glanceable status line. Shared by the card header, the summary
|
|
115
|
+
* renderer, and AgentPanel's live (in-flight) list so a call resolves in place. */
|
|
116
|
+
export function ToolLine({ name, args, result, isError, running, ms }) {
|
|
117
|
+
const def = TOOLS[name];
|
|
118
|
+
const Icon = def?.icon ?? IcZap;
|
|
119
|
+
const label = def?.label ?? name;
|
|
120
|
+
const status = running ? 'running' : toolStatusOf(name, result || '', !!isError);
|
|
121
|
+
const base = toolDetail(name, args);
|
|
122
|
+
const detail = status === 'error' ? (truncate(firstLine(result || ''), 72) || base) : base;
|
|
123
|
+
const outcome = running ? '' : toolMeta(name, args, result || '');
|
|
124
|
+
const dur = !running && typeof ms === 'number' ? fmtMs(ms) : '';
|
|
125
|
+
return (_jsxs("span", { style: S.toolLine, children: [_jsx(StatusGlyph, { status: status }), _jsx("span", { style: S.toolIcon, children: _jsx(Icon, { size: 13 }) }), _jsx("span", { style: S.toolName, children: label }), detail && _jsx("span", { style: status === 'error' ? S.toolDetailErr : S.toolDetail, children: detail }), (outcome || dur) && (_jsxs("span", { style: S.toolRight, children: [outcome && _jsx("span", { style: S.toolMeta, children: outcome }), dur && _jsx("span", { style: S.toolDur, title: "Time the tool took to run", children: dur })] }))] }));
|
|
126
|
+
}
|
|
127
|
+
/** STANDARD tool renderer (normal + expanded): a collapsible card. `defaultOpen`
|
|
128
|
+
* is the only difference between the two views — expanded opens every card. */
|
|
129
|
+
export function ToolResultCard({ inv, defaultOpen = false }) {
|
|
130
|
+
const status = inv.running ? 'running' : toolStatusOf(inv.name, inv.result || '', !!inv.isError);
|
|
131
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
132
|
+
// Switching the transcript view re-syncs every card's open state.
|
|
133
|
+
useEffect(() => setOpen(defaultOpen), [defaultOpen]);
|
|
134
|
+
return (_jsxs("div", { style: S.tool(status), children: [_jsxs("button", { style: S.toolHead, onClick: () => setOpen((o) => !o), "aria-expanded": open, children: [_jsx(ToolLine, { name: inv.name, args: inv.args, result: inv.result, isError: inv.isError, running: inv.running, ms: inv.ms }), _jsx("span", { style: { ...S.chev, marginLeft: 8, transform: open ? 'rotate(90deg)' : 'none' }, children: _jsx(IcChevronRight, { size: 12 }) })] }), open && (_jsxs("div", { style: S.toolBody, children: [_jsx("div", { style: S.toolLabel, children: "arguments" }), _jsx(CodeBlock, { lang: "json", code: JSON.stringify(inv.args, null, 2) }), _jsxs("div", { style: S.resultHead, children: [_jsx("span", { style: S.toolLabel, children: "result" }), _jsx(CopyBtn, { text: inv.result || '', title: "Copy result" })] }), _jsx(RichResult, { name: inv.name, args: inv.args, result: inv.result })] }))] }));
|
|
135
|
+
}
|
|
136
|
+
const mono = 'var(--font-mono)';
|
|
137
|
+
const S = {
|
|
138
|
+
tool: (status) => ({
|
|
139
|
+
border: `1px solid ${status === 'error' ? 'var(--danger)' : status === 'warn' ? 'var(--warning, #f59e0b)' : 'var(--border-subtle)'}`,
|
|
140
|
+
borderRadius: 'var(--radius-md)',
|
|
141
|
+
background: status === 'error' ? 'var(--danger-soft)' : 'var(--surface-2)',
|
|
142
|
+
overflow: 'hidden',
|
|
143
|
+
}),
|
|
144
|
+
toolHead: { display: 'flex', alignItems: 'center', width: '100%', padding: '6px 10px', border: 0, background: 'transparent', cursor: 'pointer', fontFamily: 'inherit', textAlign: 'left' },
|
|
145
|
+
toolLine: { display: 'flex', alignItems: 'center', gap: 8, flex: 1, minWidth: 0 },
|
|
146
|
+
toolIcon: { display: 'inline-flex', color: 'var(--text-tertiary)', flexShrink: 0 },
|
|
147
|
+
toolName: { fontSize: 12.5, fontWeight: 600, color: 'var(--text-primary)', flexShrink: 0 },
|
|
148
|
+
toolDetail: { fontFamily: mono, fontSize: 11.5, color: 'var(--text-secondary)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', minWidth: 0 },
|
|
149
|
+
toolDetailErr: { fontFamily: mono, fontSize: 11.5, color: 'var(--danger)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', minWidth: 0 },
|
|
150
|
+
toolRight: { marginLeft: 'auto', display: 'inline-flex', alignItems: 'center', gap: 8, flexShrink: 0, paddingLeft: 8 },
|
|
151
|
+
toolMeta: { fontSize: 11, color: 'var(--text-tertiary)', fontVariantNumeric: 'tabular-nums', flexShrink: 0 },
|
|
152
|
+
toolDur: { fontSize: 10.5, color: 'var(--text-disabled)', fontFamily: mono, fontVariantNumeric: 'tabular-nums', flexShrink: 0 },
|
|
153
|
+
resultHead: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginTop: 8 },
|
|
154
|
+
glyph: (status) => ({
|
|
155
|
+
display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 16, height: 16, borderRadius: 999, flexShrink: 0,
|
|
156
|
+
color: status === 'running' ? 'var(--accent)' : '#fff',
|
|
157
|
+
background: status === 'error' ? 'var(--danger)' : status === 'warn' ? 'var(--warning, #f59e0b)' : status === 'running' ? 'transparent' : 'var(--success)',
|
|
158
|
+
}),
|
|
159
|
+
chev: { display: 'inline-flex', color: 'var(--text-tertiary)', transition: 'transform var(--motion-fast)', flexShrink: 0 },
|
|
160
|
+
toolBody: { padding: '0 10px 10px', display: 'flex', flexDirection: 'column', gap: 4 },
|
|
161
|
+
toolLabel: { fontSize: 10.5, textTransform: 'uppercase', letterSpacing: '0.06em', color: 'var(--text-disabled)', marginTop: 6 },
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=toolRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolRender.js","sourceRoot":"","sources":["../toolRender.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type TranscriptView = 'summary' | 'normal' | 'expanded';
|
|
3
|
+
/** How the toggle renders its segments — mirrors the editor-controls setting. */
|
|
4
|
+
export type ToggleDisplay = 'labels' | 'icons' | 'both';
|
|
5
|
+
/** Read/write the persisted transcript view. Cross-instance updates sync via a
|
|
6
|
+
* `storage` event + a same-tab custom event, so the main chat and a NodeChat
|
|
7
|
+
* toggle stay in lockstep. */
|
|
8
|
+
export declare function useTranscriptView(): [TranscriptView, (v: TranscriptView) => void];
|
|
9
|
+
/** Compact 3-segment control. `display` mirrors the editor-controls setting:
|
|
10
|
+
* labels = text only, icons = icon only, both = icon + label. */
|
|
11
|
+
export declare function TranscriptViewToggle({ view, onChange, display }: {
|
|
12
|
+
view: TranscriptView;
|
|
13
|
+
onChange: (v: TranscriptView) => void;
|
|
14
|
+
display?: ToggleDisplay;
|
|
15
|
+
}): React.JSX.Element;
|
|
16
|
+
//# sourceMappingURL=transcriptView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcriptView.d.ts","sourceRoot":"","sources":["../transcriptView.tsx"],"names":[],"mappings":"AAOA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAGhE,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC/D,iFAAiF;AACjF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAkBxD;;8BAE8B;AAC9B,wBAAgB,iBAAiB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC,CAoBjF;AAED;iEACiE;AACjE,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAkB,EAAE,EAAE;IAC3E,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,qBAsBA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* Transcript verbosity — a shared Summary / Normal / Expanded preference for how
|
|
3
|
+
* tool calls render across the chat surfaces (main agent transcript + the DAG
|
|
4
|
+
* NodeChat). Persisted so the choice sticks across runs and panels.
|
|
5
|
+
*
|
|
6
|
+
* - summary: one status line per tool, no body, not expandable (densest).
|
|
7
|
+
* - normal: collapsible card, collapsed by default (click to open).
|
|
8
|
+
* - expanded: cards open by default — arguments + highlighted result inline. */
|
|
9
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
10
|
+
import { IcCollapseAll, IcLayout, IcExpandAll } from '@corenel/ui-kit/icons';
|
|
11
|
+
const KEY = 'prompd.web.transcriptView';
|
|
12
|
+
const ALL = ['summary', 'normal', 'expanded'];
|
|
13
|
+
const LABELS = { summary: 'Summary', normal: 'Normal', expanded: 'Expanded' };
|
|
14
|
+
const ICONS = {
|
|
15
|
+
summary: IcCollapseAll, normal: IcLayout, expanded: IcExpandAll,
|
|
16
|
+
};
|
|
17
|
+
function read() {
|
|
18
|
+
try {
|
|
19
|
+
const v = localStorage.getItem(KEY);
|
|
20
|
+
return v === 'summary' || v === 'normal' || v === 'expanded' ? v : 'normal';
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return 'normal';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Read/write the persisted transcript view. Cross-instance updates sync via a
|
|
27
|
+
* `storage` event + a same-tab custom event, so the main chat and a NodeChat
|
|
28
|
+
* toggle stay in lockstep. */
|
|
29
|
+
export function useTranscriptView() {
|
|
30
|
+
const [view, setViewState] = useState(read);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const sync = () => setViewState(read());
|
|
33
|
+
window.addEventListener('storage', sync);
|
|
34
|
+
window.addEventListener('prompd:transcriptView', sync);
|
|
35
|
+
return () => {
|
|
36
|
+
window.removeEventListener('storage', sync);
|
|
37
|
+
window.removeEventListener('prompd:transcriptView', sync);
|
|
38
|
+
};
|
|
39
|
+
}, []);
|
|
40
|
+
const setView = useCallback((v) => {
|
|
41
|
+
setViewState(v);
|
|
42
|
+
try {
|
|
43
|
+
localStorage.setItem(KEY, v);
|
|
44
|
+
}
|
|
45
|
+
catch { /* ignore */ }
|
|
46
|
+
window.dispatchEvent(new CustomEvent('prompd:transcriptView'));
|
|
47
|
+
}, []);
|
|
48
|
+
return [view, setView];
|
|
49
|
+
}
|
|
50
|
+
/** Compact 3-segment control. `display` mirrors the editor-controls setting:
|
|
51
|
+
* labels = text only, icons = icon only, both = icon + label. */
|
|
52
|
+
export function TranscriptViewToggle({ view, onChange, display = 'labels' }) {
|
|
53
|
+
return (_jsx("div", { style: S.wrap, role: "group", "aria-label": "Transcript detail", children: ALL.map((v) => {
|
|
54
|
+
const Icon = ICONS[v];
|
|
55
|
+
return (_jsxs("button", { type: "button", style: S.seg(v === view), onClick: () => onChange(v), title: `${LABELS[v]} tool detail`, "aria-label": LABELS[v], "aria-pressed": v === view, children: [display !== 'labels' && _jsx(Icon, { size: 13 }), display !== 'icons' && _jsx("span", { children: LABELS[v] })] }, v));
|
|
56
|
+
}) }));
|
|
57
|
+
}
|
|
58
|
+
const S = {
|
|
59
|
+
wrap: { display: 'inline-flex', alignItems: 'center', gap: 1, padding: 2, borderRadius: 'var(--radius-sm)', background: 'var(--surface-2)', border: '1px solid var(--border-subtle)' },
|
|
60
|
+
seg: (active) => ({
|
|
61
|
+
display: 'inline-flex', alignItems: 'center', gap: 5,
|
|
62
|
+
height: 22, padding: '0 8px', border: 0, borderRadius: 'var(--radius-xs, 4px)',
|
|
63
|
+
background: active ? 'var(--surface-1)' : 'transparent',
|
|
64
|
+
color: active ? 'var(--text-primary)' : 'var(--text-tertiary)',
|
|
65
|
+
fontSize: 11, fontWeight: 600, fontFamily: 'inherit', cursor: 'pointer',
|
|
66
|
+
boxShadow: active ? 'var(--shadow-1, none)' : 'none',
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=transcriptView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcriptView.js","sourceRoot":"","sources":["../transcriptView.tsx"],"names":[],"mappings":"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"}
|