@molecule/app-ide-react 1.21.1 → 1.22.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/README.md +2127 -2374
- package/dist/components/BackgroundTasksStrip.d.ts.map +1 -1
- package/dist/components/BackgroundTasksStrip.js +33 -5
- package/dist/components/BackgroundTasksStrip.js.map +1 -1
- package/dist/components/ChatPanel.d.ts.map +1 -1
- package/dist/components/ChatPanel.js +45 -77
- package/dist/components/ChatPanel.js.map +1 -1
- package/dist/components/ContextUsageIndicator.d.ts +11 -0
- package/dist/components/ContextUsageIndicator.d.ts.map +1 -0
- package/dist/components/ContextUsageIndicator.js +101 -0
- package/dist/components/ContextUsageIndicator.js.map +1 -0
- package/dist/components/PreviewPanel.d.ts.map +1 -1
- package/dist/components/PreviewPanel.js +24 -8
- package/dist/components/PreviewPanel.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackgroundTasksStrip.d.ts","sourceRoot":"","sources":["../../src/components/BackgroundTasksStrip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAuB,MAAM,OAAO,CAAA;AAErD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAMhE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,GACN,EAAE;IACD,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAC7B,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"BackgroundTasksStrip.d.ts","sourceRoot":"","sources":["../../src/components/BackgroundTasksStrip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAuB,MAAM,OAAO,CAAA;AAErD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAMhE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,GACN,EAAE;IACD,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAC7B,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAqIrB"}
|
|
@@ -32,22 +32,39 @@ export function BackgroundTasksStrip({ tasks, }) {
|
|
|
32
32
|
if (tasks.length === 0)
|
|
33
33
|
return null;
|
|
34
34
|
const failed = tasks.filter((task) => task.status === 'failed');
|
|
35
|
+
const cancelled = tasks.filter((task) => task.status === 'cancelled');
|
|
35
36
|
const summary = running.length > 0
|
|
36
37
|
? t('ide.chat.backgroundRunning', { count: running.length }, { defaultValue: '{{count}} task running in the background' })
|
|
37
38
|
: failed.length > 0
|
|
38
39
|
? t('ide.chat.backgroundFailed', { count: failed.length }, { defaultValue: '{{count}} background task failed' })
|
|
39
|
-
:
|
|
40
|
+
: cancelled.length === tasks.length
|
|
41
|
+
? t('ide.chat.backgroundCancelled', { count: cancelled.length }, {
|
|
42
|
+
defaultValue: '{{count}} background task cancelled',
|
|
43
|
+
})
|
|
44
|
+
: t('ide.chat.backgroundDone', { count: tasks.length }, { defaultValue: '{{count}} background task finished' });
|
|
40
45
|
// Collapsed, name what the strip is about: the purpose of the task in flight.
|
|
41
|
-
const lead = running[0] ?? failed[0];
|
|
42
|
-
return (_jsx(DockStrip, { molId: "chat-background-tasks", toggleMolId: "chat-background-tasks-toggle", expanded: expanded, onToggle: () => setExpanded((open) => !open), icon: _jsx(StatusMark, { state: running.length > 0
|
|
46
|
+
const lead = running[0] ?? failed[0] ?? cancelled[0];
|
|
47
|
+
return (_jsx(DockStrip, { molId: "chat-background-tasks", toggleMolId: "chat-background-tasks-toggle", expanded: expanded, onToggle: () => setExpanded((open) => !open), icon: _jsx(StatusMark, { state: running.length > 0
|
|
48
|
+
? 'active'
|
|
49
|
+
: failed.length > 0
|
|
50
|
+
? 'failed'
|
|
51
|
+
: cancelled.length === tasks.length
|
|
52
|
+
? 'stopped'
|
|
53
|
+
: 'done', size: 14 }), label: summary, chipLabel: running.length > 0
|
|
43
54
|
? t('ide.work.running', { count: running.length }, { defaultValue: '{{count}} running' })
|
|
44
55
|
: failed.length > 0
|
|
45
56
|
? t('ide.work.failed', { count: failed.length }, { defaultValue: '{{count}} failed' })
|
|
46
|
-
:
|
|
57
|
+
: cancelled.length === tasks.length
|
|
58
|
+
? t('ide.work.cancelled', { count: cancelled.length }, { defaultValue: '{{count}} cancelled' })
|
|
59
|
+
: t('ide.work.finishedCount', { count: tasks.length }, { defaultValue: '{{count}} finished' }), chipTitle: lead ? purpose(lead) : undefined, hint: !expanded && lead
|
|
60
|
+
? `· ${purpose(lead)}${progress(lead) ? ` · ${progress(lead)}` : ''}`
|
|
61
|
+
: undefined, children: _jsx("ul", { style: { listStyle: 'none', margin: 0, padding: 0 }, children: tasks.map((task) => (_jsxs("li", { "data-mol-id": "chat-background-task", className: cm.textSize('xs'), style: { display: 'flex', alignItems: 'flex-start', gap: 8, padding: '3px 0' }, children: [_jsx("span", { style: { flexShrink: 0, display: 'inline-flex', paddingTop: 1 }, children: _jsx(StatusMark, { state: task.status === 'running'
|
|
47
62
|
? 'active'
|
|
48
63
|
: task.status === 'failed'
|
|
49
64
|
? 'failed'
|
|
50
|
-
:
|
|
65
|
+
: task.status === 'cancelled'
|
|
66
|
+
? 'stopped'
|
|
67
|
+
: 'done', size: 14 }) }), _jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [_jsx("div", { children: purpose(task) }), progress(task) && _jsx("div", { className: cm.textMuted, children: progress(task) }), task.description ? (_jsx("code", { className: cm.textMuted, style: { display: 'block', whiteSpace: 'pre-wrap', overflowWrap: 'anywhere' }, children: task.command })) : null] }), _jsx("span", { className: cm.textMuted, style: { flexShrink: 0, whiteSpace: 'nowrap' }, children: describe(task) })] }, task.id))) }) }));
|
|
51
68
|
}
|
|
52
69
|
/** What a task is for: the executor's own reason, else the command itself. */
|
|
53
70
|
function purpose(task) {
|
|
@@ -63,6 +80,17 @@ function describe(task) {
|
|
|
63
80
|
if (task.status === 'failed') {
|
|
64
81
|
return t('ide.chat.backgroundExit', { code: task.exitCode ?? 1, elapsed }, { defaultValue: 'exit {{code}} · {{elapsed}}' });
|
|
65
82
|
}
|
|
83
|
+
if (task.status === 'cancelled') {
|
|
84
|
+
return t('ide.chat.backgroundCancelledElapsed', { elapsed }, { defaultValue: 'cancelled · {{elapsed}}' });
|
|
85
|
+
}
|
|
66
86
|
return t('ide.chat.backgroundOk', { elapsed }, { defaultValue: 'done · {{elapsed}}' });
|
|
67
87
|
}
|
|
88
|
+
/** A worker's observed output is useful progress without inventing a total or percentage. */
|
|
89
|
+
function progress(task) {
|
|
90
|
+
if (task.outputChars == null)
|
|
91
|
+
return null;
|
|
92
|
+
return t('ide.chat.backgroundOutput', { count: task.outputChars.toLocaleString() }, {
|
|
93
|
+
defaultValue: '{{count}} characters produced',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
68
96
|
//# sourceMappingURL=BackgroundTasksStrip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackgroundTasksStrip.js","sourceRoot":"","sources":["../../src/components/BackgroundTasksStrip.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAY,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGrD,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,GAGN;IACC,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IACxB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,8EAA8E;IAC9E,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAA;IACjE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACzD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IAEpB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;IAC/D,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,CAAC,CAAC,CACC,4BAA4B,EAC5B,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EACzB,EAAE,YAAY,EAAE,0CAA0C,EAAE,CAC7D;QACH,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YACjB,CAAC,CAAC,CAAC,CACC,2BAA2B,EAC3B,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EACxB,EAAE,YAAY,EAAE,kCAAkC,EAAE,CACrD;YACH,CAAC,CAAC,CAAC,CACC,yBAAyB,EACzB,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,EACvB,EAAE,YAAY,EAAE,oCAAoC,EAAE,CACvD,CAAA;
|
|
1
|
+
{"version":3,"file":"BackgroundTasksStrip.js","sourceRoot":"","sources":["../../src/components/BackgroundTasksStrip.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAY,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGrD,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,GAGN;IACC,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IACxB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,8EAA8E;IAC9E,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAA;IACjE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACzD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IAEpB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;IAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAA;IACrE,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,CAAC,CAAC,CACC,4BAA4B,EAC5B,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EACzB,EAAE,YAAY,EAAE,0CAA0C,EAAE,CAC7D;QACH,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YACjB,CAAC,CAAC,CAAC,CACC,2BAA2B,EAC3B,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EACxB,EAAE,YAAY,EAAE,kCAAkC,EAAE,CACrD;YACH,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBACjC,CAAC,CAAC,CAAC,CACC,8BAA8B,EAC9B,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,EAC3B;oBACE,YAAY,EAAE,qCAAqC;iBACpD,CACF;gBACH,CAAC,CAAC,CAAC,CACC,yBAAyB,EACzB,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,EACvB,EAAE,YAAY,EAAE,oCAAoC,EAAE,CACvD,CAAA;IAEX,8EAA8E;IAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAA;IAEpD,OAAO,CACL,KAAC,SAAS,IACR,KAAK,EAAC,uBAAuB,EAC7B,WAAW,EAAC,8BAA8B,EAC1C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAC5C,IAAI,EACF,KAAC,UAAU,IACT,KAAK,EACH,OAAO,CAAC,MAAM,GAAG,CAAC;gBAChB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;oBACjB,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;wBACjC,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,MAAM,EAEhB,IAAI,EAAE,EAAE,GACR,EAEJ,KAAK,EAAE,OAAO,EACd,SAAS,EACP,OAAO,CAAC,MAAM,GAAG,CAAC;YAChB,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC;YACzF,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBACjB,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;gBACtF,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;oBACjC,CAAC,CAAC,CAAC,CACC,oBAAoB,EACpB,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,EAC3B,EAAE,YAAY,EAAE,qBAAqB,EAAE,CACxC;oBACH,CAAC,CAAC,CAAC,CACC,wBAAwB,EACxB,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,EACvB,EAAE,YAAY,EAAE,oBAAoB,EAAE,CACvC,EAEX,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC3C,IAAI,EACF,CAAC,QAAQ,IAAI,IAAI;YACf,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YACrE,CAAC,CAAC,SAAS,YAGf,aAAI,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YACpD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,6BAEc,sBAAsB,EAClC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC5B,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,aAE9E,eAAM,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE,YACnE,KAAC,UAAU,IACT,KAAK,EACH,IAAI,CAAC,MAAM,KAAK,SAAS;gCACvB,CAAC,CAAC,QAAQ;gCACV,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ;oCACxB,CAAC,CAAC,QAAQ;oCACV,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW;wCAC3B,CAAC,CAAC,SAAS;wCACX,CAAC,CAAC,MAAM,EAEhB,IAAI,EAAE,EAAE,GACR,GACG,EACP,eAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,aAClC,wBAAM,OAAO,CAAC,IAAI,CAAC,GAAO,EACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,cAAK,SAAS,EAAE,EAAE,CAAC,SAAS,YAAG,QAAQ,CAAC,IAAI,CAAC,GAAO,EACtE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAClB,eACE,SAAS,EAAE,EAAE,CAAC,SAAS,EACvB,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,YAE5E,IAAI,CAAC,OAAO,GACR,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,eAAM,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,YAC1E,QAAQ,CAAC,IAAI,CAAC,GACV,KAjCF,IAAI,CAAC,EAAE,CAkCT,CACN,CAAC,GACC,GACK,CACb,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS,OAAO,CAAC,IAAyB;IACxC,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAA;AACzC,CAAC;AAED,gFAAgF;AAChF,SAAS,QAAQ,CAAC,IAAyB;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAClG,MAAM,OAAO,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,EAAE,GAAG,CAAA;IAC9F,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,uBAAuB,EAAE,CAAC,CAAA;IAChG,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,CACN,yBAAyB,EACzB,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,OAAO,EAAE,EACrC,EAAE,YAAY,EAAE,6BAA6B,EAAE,CAChD,CAAA;IACH,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,CAAC,CACN,qCAAqC,EACrC,EAAE,OAAO,EAAE,EACX,EAAE,YAAY,EAAE,yBAAyB,EAAE,CAC5C,CAAA;IACH,CAAC;IACD,OAAO,CAAC,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,oBAAoB,EAAE,CAAC,CAAA;AACxF,CAAC;AAED,6FAA6F;AAC7F,SAAS,QAAQ,CAAC,IAAyB;IACzC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IACzC,OAAO,CAAC,CACN,2BAA2B,EAC3B,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,EAC5C;QACE,YAAY,EAAE,+BAA+B;KAC9C,CACF,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAa3C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,7 @@ import { getChatTimestampsVisible, parseTimestampsCommand, planChatTimestamps, r
|
|
|
37
37
|
import { ENTRY_TIP, pickIdleTip, shouldShowIdleTip, TIP_IDLE_MS, TIP_MIN_MESSAGES, } from './chat-tips-utilities.js';
|
|
38
38
|
import { ChatItemBoundary } from './ChatItemBoundary.js';
|
|
39
39
|
import { ChatTimestamp } from './ChatTimestamp.js';
|
|
40
|
+
import { ContextUsageIndicator, mergeContextHistory } from './ContextUsageIndicator.js';
|
|
40
41
|
import { DockStrip } from './DockStrip.js';
|
|
41
42
|
import { HelpCard } from './HelpCard.js';
|
|
42
43
|
import { Icon } from './Icon.js';
|
|
@@ -1363,6 +1364,8 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1363
1364
|
const soundsConfigRef = useRef({ ...DEFAULT_SOUNDS_CONFIG });
|
|
1364
1365
|
// ── Context usage tracking (ring indicator) ─────────────────────────────
|
|
1365
1366
|
const [contextUsage, setContextUsage] = useState(null);
|
|
1367
|
+
const [contextHistory, setContextHistory] = useState([]);
|
|
1368
|
+
const [contextCompactions, setContextCompactions] = useState([]);
|
|
1366
1369
|
// Restore context usage from the history endpoint on mount. Retries a few
|
|
1367
1370
|
// times on failure: this used to be one-shot, so a single transient error at
|
|
1368
1371
|
// mount (an API deploy restart, a rate-limit blip) silently cost the context
|
|
@@ -1370,6 +1373,9 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1370
1373
|
// turn's `done` event (observed live 2026-08-29: ring gone, server data fine,
|
|
1371
1374
|
// reload fixed it).
|
|
1372
1375
|
useEffect(() => {
|
|
1376
|
+
setContextUsage(null);
|
|
1377
|
+
setContextHistory([]);
|
|
1378
|
+
setContextCompactions([]);
|
|
1373
1379
|
if (!hasConversation)
|
|
1374
1380
|
return;
|
|
1375
1381
|
let cancelled = false;
|
|
@@ -1380,8 +1386,18 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1380
1386
|
.then((res) => {
|
|
1381
1387
|
if (cancelled)
|
|
1382
1388
|
return;
|
|
1383
|
-
|
|
1384
|
-
|
|
1389
|
+
const restored = res.data.contextUsage;
|
|
1390
|
+
if (restored)
|
|
1391
|
+
setContextUsage((current) => {
|
|
1392
|
+
if (!current)
|
|
1393
|
+
return restored;
|
|
1394
|
+
return mergeContextHistory([restored], [current]).at(-1) ?? current;
|
|
1395
|
+
});
|
|
1396
|
+
setContextHistory((current) => mergeContextHistory(res.data.contextHistory ?? [], current));
|
|
1397
|
+
setContextCompactions((current) => {
|
|
1398
|
+
const entries = new Map([...(res.data.compactions ?? []), ...current].map((entry) => [entry.at, entry]));
|
|
1399
|
+
return [...entries.values()].sort((a, b) => a.at.localeCompare(b.at)).slice(-32);
|
|
1400
|
+
});
|
|
1385
1401
|
})
|
|
1386
1402
|
.catch((_error) => {
|
|
1387
1403
|
// Transient failure — retry with backoff (bounded); after the budget,
|
|
@@ -1434,12 +1450,33 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
1434
1450
|
const onLoadingChangeRef = useRef(onLoadingChange);
|
|
1435
1451
|
onLoadingChangeRef.current = onLoadingChange;
|
|
1436
1452
|
const handleStreamEvent = useCallback((event) => {
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1453
|
+
if ((event.type === 'context_usage' || event.type === 'done') &&
|
|
1454
|
+
typeof event.usage?.inputTokens === 'number' &&
|
|
1455
|
+
typeof event.usage.contextWindow === 'number') {
|
|
1456
|
+
const usage = event.usage;
|
|
1457
|
+
setContextUsage((previous) => {
|
|
1458
|
+
if (!previous)
|
|
1459
|
+
return usage;
|
|
1460
|
+
if (usage.requestId || usage.at)
|
|
1461
|
+
return mergeContextHistory([previous], [usage]).at(-1) ?? usage;
|
|
1462
|
+
return event.type === 'done' ? { ...previous, ...usage } : usage;
|
|
1442
1463
|
});
|
|
1464
|
+
setContextHistory((previous) => mergeContextHistory(previous, [usage]));
|
|
1465
|
+
}
|
|
1466
|
+
if (event.type === 'compaction' &&
|
|
1467
|
+
typeof event.at === 'string' &&
|
|
1468
|
+
typeof event.compactedCount === 'number' &&
|
|
1469
|
+
typeof event.elapsedMs === 'number' &&
|
|
1470
|
+
typeof event.beforeChars === 'number' &&
|
|
1471
|
+
typeof event.afterChars === 'number') {
|
|
1472
|
+
const compaction = {
|
|
1473
|
+
at: event.at,
|
|
1474
|
+
compactedCount: event.compactedCount,
|
|
1475
|
+
elapsedMs: event.elapsedMs,
|
|
1476
|
+
beforeChars: event.beforeChars,
|
|
1477
|
+
afterChars: event.afterChars,
|
|
1478
|
+
};
|
|
1479
|
+
setContextCompactions((previous) => [...previous.filter((item) => item.at !== compaction.at), compaction].slice(-32));
|
|
1443
1480
|
}
|
|
1444
1481
|
// Capture verification errors to trigger countdown after stream ends —
|
|
1445
1482
|
// SENDER-ONLY: a pushed frame from a teammate's turn must not arm this
|
|
@@ -7925,76 +7962,7 @@ function ChatInner({ projectId, endpoint, initialMessage, onInitialMessageSent,
|
|
|
7925
7962
|
e.currentTarget.style.opacity = '0.85';
|
|
7926
7963
|
}, onMouseLeave: (e) => {
|
|
7927
7964
|
e.currentTarget.style.opacity = '0.4';
|
|
7928
|
-
}, children: sym === 'slash' ? (_jsx("svg", { width: "9", height: "13", viewBox: "0 0 9 13", style: { display: 'block', position: 'relative', top: `${nudgeY}px` }, children: _jsx("line", { x1: "8", y1: "1", x2: "1", y2: "12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) })) : (_jsx("span", { style: { position: 'relative', top: `${nudgeY}px` }, children: sym })) }, sym))), canEdit !== false &&
|
|
7929
|
-
contextUsage &&
|
|
7930
|
-
(() => {
|
|
7931
|
-
// The ring represents usage toward the auto-compaction threshold,
|
|
7932
|
-
// not the raw context window. 100% = compaction will trigger.
|
|
7933
|
-
const RESERVE = 0.15;
|
|
7934
|
-
const COMPACT_THRESHOLD = 0.75;
|
|
7935
|
-
const budget = Math.floor(contextUsage.contextWindow * (1 - RESERVE));
|
|
7936
|
-
const compactAt = Math.floor(budget * COMPACT_THRESHOLD);
|
|
7937
|
-
const ratio = Math.min(contextUsage.inputTokens / compactAt, 1);
|
|
7938
|
-
const thresholdRatio = COMPACT_THRESHOLD;
|
|
7939
|
-
const size = 18;
|
|
7940
|
-
const stroke = 2;
|
|
7941
|
-
const r = (size - stroke) / 2;
|
|
7942
|
-
const c = 2 * Math.PI * r;
|
|
7943
|
-
const dashOffset = c * (1 - ratio);
|
|
7944
|
-
const color = ratio < 0.5
|
|
7945
|
-
? isLight
|
|
7946
|
-
? 'rgb(22,163,74)'
|
|
7947
|
-
: 'rgb(74,222,128)'
|
|
7948
|
-
: ratio < thresholdRatio
|
|
7949
|
-
? isLight
|
|
7950
|
-
? 'rgb(161,98,7)'
|
|
7951
|
-
: 'rgb(250,204,21)'
|
|
7952
|
-
: ratio < 0.9
|
|
7953
|
-
? isLight
|
|
7954
|
-
? 'rgb(194,65,12)'
|
|
7955
|
-
: 'rgb(251,146,60)'
|
|
7956
|
-
: isLight
|
|
7957
|
-
? 'rgb(220,38,38)'
|
|
7958
|
-
: 'rgb(248,113,113)';
|
|
7959
|
-
const pct = Math.round(ratio * 100);
|
|
7960
|
-
const label = `${formatTokenCount(contextUsage.inputTokens)} / ${formatTokenCount(compactAt)} tokens (${pct}%) — auto-compacts at 100%`;
|
|
7961
|
-
return (_jsxs("span", { title: label, style: {
|
|
7962
|
-
display: 'inline-flex',
|
|
7963
|
-
alignItems: 'center',
|
|
7964
|
-
gap: '4px',
|
|
7965
|
-
marginLeft: 'auto',
|
|
7966
|
-
opacity: 0.7,
|
|
7967
|
-
cursor: 'default',
|
|
7968
|
-
},
|
|
7969
|
-
// Hover-reveal is meaningless without hover: on coarse pointers
|
|
7970
|
-
// the % stays visible (rendered below), so no handlers to fight.
|
|
7971
|
-
onMouseEnter: isCoarse
|
|
7972
|
-
? undefined
|
|
7973
|
-
: (e) => {
|
|
7974
|
-
const pctEl = e.currentTarget.querySelector('[data-ctx-pct]');
|
|
7975
|
-
if (pctEl) {
|
|
7976
|
-
pctEl.style.opacity = '1';
|
|
7977
|
-
pctEl.style.width = 'auto';
|
|
7978
|
-
}
|
|
7979
|
-
}, onMouseLeave: isCoarse
|
|
7980
|
-
? undefined
|
|
7981
|
-
: (e) => {
|
|
7982
|
-
const pctEl = e.currentTarget.querySelector('[data-ctx-pct]');
|
|
7983
|
-
if (pctEl) {
|
|
7984
|
-
pctEl.style.opacity = '0';
|
|
7985
|
-
pctEl.style.width = '0';
|
|
7986
|
-
}
|
|
7987
|
-
}, children: [_jsxs("span", { "data-ctx-pct": "", style: {
|
|
7988
|
-
color,
|
|
7989
|
-
fontSize: '10px',
|
|
7990
|
-
lineHeight: 1,
|
|
7991
|
-
opacity: isCoarse ? 1 : 0,
|
|
7992
|
-
width: isCoarse ? 'auto' : 0,
|
|
7993
|
-
overflow: 'hidden',
|
|
7994
|
-
whiteSpace: 'nowrap',
|
|
7995
|
-
transition: 'opacity 150ms',
|
|
7996
|
-
}, children: [pct, "%"] }), _jsxs("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, style: { display: 'block', transform: 'rotate(-90deg)', flexShrink: 0 }, children: [_jsx("circle", { cx: size / 2, cy: size / 2, r: r, fill: "none", stroke: "currentColor", strokeWidth: stroke, opacity: 0.15 }), _jsx("circle", { cx: size / 2, cy: size / 2, r: r, fill: "none", stroke: color, strokeWidth: stroke, strokeDasharray: `${c}`, strokeDashoffset: `${dashOffset}`, strokeLinecap: "round" })] })] }));
|
|
7997
|
-
})(), _jsxs("div", { style: {
|
|
7965
|
+
}, children: sym === 'slash' ? (_jsx("svg", { width: "9", height: "13", viewBox: "0 0 9 13", style: { display: 'block', position: 'relative', top: `${nudgeY}px` }, children: _jsx("line", { x1: "8", y1: "1", x2: "1", y2: "12", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) })) : (_jsx("span", { style: { position: 'relative', top: `${nudgeY}px` }, children: sym })) }, sym))), canEdit !== false && contextUsage && (_jsx(ContextUsageIndicator, { usage: contextUsage, history: contextHistory, compactions: contextCompactions })), _jsxs("div", { style: {
|
|
7998
7966
|
// 'auto' pins the stop/send cluster right; the context ring
|
|
7999
7967
|
// (hidden for viewers even when contextUsage exists) otherwise
|
|
8000
7968
|
// carries the auto margin and this becomes a 4px gap.
|