@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
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { AskQuestion, AskAnswers } from '@corenel/protocol';
|
|
3
|
+
export declare function AskUser({ questions, onSubmit, onCancel }: {
|
|
4
|
+
questions: AskQuestion[];
|
|
5
|
+
onSubmit: (answers: AskAnswers) => void;
|
|
6
|
+
onCancel: () => void;
|
|
7
|
+
}): React.JSX.Element;
|
|
8
|
+
//# sourceMappingURL=AskUser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AskUser.d.ts","sourceRoot":"","sources":["../AskUser.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEjE,wBAAgB,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;IACzD,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,qBAkGA"}
|
package/dist/AskUser.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* The agent's ask_user surface: a drawer attached to the chatbox. Each question is
|
|
3
|
+
* a TAB (header = tab label, with an answered dot); the active question shows its
|
|
4
|
+
* options + an optional custom answer. Single- or multi-select per question; Submit
|
|
5
|
+
* is enabled once every question has an answer. On-brand: 1px borders, accent for
|
|
6
|
+
* selection, the cyan→blue spine on Submit, Lucide icons, transform/opacity motion. */
|
|
7
|
+
import { useMemo, useState } from 'react';
|
|
8
|
+
import { IcCheck, IcUser, IcX } from '@corenel/ui-kit/icons';
|
|
9
|
+
export function AskUser({ questions, onSubmit, onCancel }) {
|
|
10
|
+
const [active, setActive] = useState(0);
|
|
11
|
+
// State is keyed by question INDEX (not header) so two questions that happen to
|
|
12
|
+
// share a header don't share selection. Answers are emitted keyed by header.
|
|
13
|
+
const [selected, setSelected] = useState({});
|
|
14
|
+
const [other, setOther] = useState({});
|
|
15
|
+
const answered = (i) => (selected[i]?.length ?? 0) > 0 || (other[i] ?? '').trim() !== '';
|
|
16
|
+
const answeredCount = useMemo(() => questions.filter((_, i) => answered(i)).length, [questions, selected, other]);
|
|
17
|
+
const canSubmit = answeredCount === questions.length;
|
|
18
|
+
const q = questions[active] ?? questions[0];
|
|
19
|
+
const sel = selected[active] ?? [];
|
|
20
|
+
const otherActive = (other[active] ?? '').trim() !== '';
|
|
21
|
+
const pick = (label) => {
|
|
22
|
+
setSelected((s) => {
|
|
23
|
+
const cur = s[active] ?? [];
|
|
24
|
+
if (q.multiSelect) {
|
|
25
|
+
const next = cur.includes(label) ? cur.filter((l) => l !== label) : [...cur, label];
|
|
26
|
+
return { ...s, [active]: next };
|
|
27
|
+
}
|
|
28
|
+
return { ...s, [active]: [label] };
|
|
29
|
+
});
|
|
30
|
+
if (!q.multiSelect)
|
|
31
|
+
setOther((o) => ({ ...o, [active]: '' }));
|
|
32
|
+
};
|
|
33
|
+
const typeOther = (text) => {
|
|
34
|
+
setOther((o) => ({ ...o, [active]: text }));
|
|
35
|
+
if (!q.multiSelect && text.trim())
|
|
36
|
+
setSelected((s) => ({ ...s, [active]: [] }));
|
|
37
|
+
};
|
|
38
|
+
const submit = () => {
|
|
39
|
+
if (!canSubmit)
|
|
40
|
+
return;
|
|
41
|
+
const answers = {};
|
|
42
|
+
questions.forEach((qq, i) => {
|
|
43
|
+
const vals = [...(selected[i] ?? [])];
|
|
44
|
+
const o = (other[i] ?? '').trim();
|
|
45
|
+
if (o)
|
|
46
|
+
vals.push(o);
|
|
47
|
+
answers[qq.header] = vals;
|
|
48
|
+
});
|
|
49
|
+
onSubmit(answers);
|
|
50
|
+
};
|
|
51
|
+
return (_jsxs("div", { style: S.card, className: "ask-card", role: "group", "aria-label": "Questions from the assistant", children: [_jsxs("div", { style: S.head, children: [_jsx("span", { style: S.headIcon, children: _jsx(IcUser, { size: 14 }) }), _jsx("span", { style: S.headTitle, children: questions.length > 1 ? `${questions.length} quick questions` : 'A quick question' }), _jsx("button", { style: S.dismiss, onClick: onCancel, title: "Dismiss", "aria-label": "Dismiss", children: "Skip" })] }), _jsx("div", { style: S.tabs, role: "tablist", children: questions.map((qq, i) => {
|
|
52
|
+
const ok = answered(i);
|
|
53
|
+
return (_jsxs("button", { role: "tab", "aria-selected": i === active, style: S.tab(i === active), onClick: () => setActive(i), children: [_jsx("span", { style: S.tabLabel, children: qq.header }), _jsx("span", { style: { ...S.tabDot, ...(ok ? S.tabDotOk : null) } })] }, i));
|
|
54
|
+
}) }), _jsx("div", { style: S.body, children: _jsxs("div", { className: "ask-q", style: S.q, children: [_jsx("div", { style: S.question, children: q.question }), q.multiSelect && _jsx("div", { style: S.multiHint, children: "select all that apply" }), _jsxs("div", { style: S.opts, children: [q.options.map((opt) => {
|
|
55
|
+
const on = sel.includes(opt.label);
|
|
56
|
+
return (_jsxs("button", { className: "ask-opt", style: { ...S.opt, ...(on ? S.optOn : null) }, onClick: () => pick(opt.label), "aria-pressed": on, children: [_jsx("span", { style: { ...S.mark, ...(q.multiSelect ? S.markBox : S.markDot), ...(on ? S.markOn : null) }, children: on && _jsx(IcCheck, { size: 12 }) }), _jsxs("span", { style: S.optBody, children: [_jsx("span", { style: S.optLabel, children: opt.label }), opt.description && _jsx("span", { style: S.optDesc, children: opt.description })] })] }, opt.label));
|
|
57
|
+
}), _jsxs("div", { style: { ...S.opt, ...S.otherRow, ...(otherActive ? S.optOn : null) }, className: "ask-opt", children: [_jsx("span", { style: { ...S.mark, ...(q.multiSelect ? S.markBox : S.markDot), ...(otherActive ? S.markOn : null) }, children: otherActive && _jsx(IcCheck, { size: 12 }) }), _jsx("input", { style: S.otherInput, placeholder: "Other\u2026", value: other[active] ?? '', onChange: (e) => typeOther(e.target.value) })] })] })] }, active) }), _jsxs("div", { style: S.foot, children: [_jsxs("button", { style: S.cancel, onClick: onCancel, children: [_jsx(IcX, { size: 13 }), " Dismiss"] }), _jsx("div", { style: { flex: 1 } }), questions.length > 1 && _jsxs("span", { style: S.progress, children: [answeredCount, "/", questions.length, " answered"] }), _jsxs("button", { style: { ...S.submit, ...(canSubmit ? null : S.submitOff) }, onClick: submit, disabled: !canSubmit, children: [_jsx(IcCheck, { size: 14 }), " ", questions.length > 1 ? 'Submit answers' : 'Submit answer'] })] })] }));
|
|
58
|
+
}
|
|
59
|
+
const S = {
|
|
60
|
+
// Drawer attached to the top of the chatbox: edge-to-edge, top border + rounded
|
|
61
|
+
// top, lifted with an upward shadow. Slides up via the .ask-card animation.
|
|
62
|
+
card: { display: 'flex', flexDirection: 'column', flexShrink: 0, borderTop: '1px solid var(--border-default)', borderRadius: 'var(--radius-lg) var(--radius-lg) 0 0', background: 'var(--surface-1)', boxShadow: '0 -10px 28px -14px rgba(0,0,0,0.45)', overflow: 'hidden' },
|
|
63
|
+
head: { display: 'flex', alignItems: 'center', gap: 8, padding: '10px 12px', borderBottom: '1px solid var(--border-subtle)' },
|
|
64
|
+
headIcon: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 24, height: 24, borderRadius: 'var(--radius-sm)', background: 'var(--accent-soft)', color: 'var(--accent)', flexShrink: 0 },
|
|
65
|
+
headTitle: { fontSize: 14, fontWeight: 600, color: 'var(--text-primary)' },
|
|
66
|
+
dismiss: { marginLeft: 'auto', height: 26, padding: '0 8px', border: 0, borderRadius: 'var(--radius-sm)', background: 'transparent', color: 'var(--text-tertiary)', fontSize: 12, fontWeight: 600, fontFamily: 'inherit', cursor: 'pointer' },
|
|
67
|
+
tabs: { display: 'flex', alignItems: 'stretch', gap: 2, height: 38, flexShrink: 0, padding: '0 8px', borderBottom: '1px solid var(--border-subtle)', overflowX: 'auto' },
|
|
68
|
+
tab: (on) => ({ display: 'inline-flex', alignItems: 'center', gap: 7, padding: '0 12px', border: 0, borderBottom: `2px solid ${on ? 'var(--accent)' : 'transparent'}`, background: 'transparent', color: on ? 'var(--text-primary)' : 'var(--text-tertiary)', fontSize: 12.5, fontWeight: 600, fontFamily: 'inherit', whiteSpace: 'nowrap', cursor: 'pointer' }),
|
|
69
|
+
tabLabel: { textTransform: 'uppercase', letterSpacing: '0.04em' },
|
|
70
|
+
tabDot: { width: 6, height: 6, borderRadius: 999, background: 'var(--border-default)', flexShrink: 0 },
|
|
71
|
+
tabDotOk: { background: 'var(--accent)' },
|
|
72
|
+
body: { display: 'flex', flexDirection: 'column', padding: 14, maxHeight: 'min(52vh, 420px)', overflowY: 'auto' },
|
|
73
|
+
q: { display: 'flex', flexDirection: 'column', gap: 10 },
|
|
74
|
+
multiHint: { fontSize: 11, color: 'var(--text-tertiary)', marginTop: -4 },
|
|
75
|
+
question: { fontSize: 15, fontWeight: 500, lineHeight: 1.45, color: 'var(--text-primary)' },
|
|
76
|
+
opts: { display: 'flex', flexDirection: 'column', gap: 8 },
|
|
77
|
+
opt: { display: 'flex', alignItems: 'flex-start', gap: 10, width: '100%', padding: '11px 12px', border: '1px solid var(--border-subtle)', borderRadius: 'var(--radius-md)', background: 'var(--surface-1)', color: 'var(--text-primary)', cursor: 'pointer', textAlign: 'left', transition: 'border-color var(--motion-fast), background var(--motion-fast)' },
|
|
78
|
+
optOn: { border: '1px solid var(--border-accent)', background: 'var(--accent-soft)' },
|
|
79
|
+
optBody: { display: 'flex', flexDirection: 'column', gap: 2, minWidth: 0, flex: 1 },
|
|
80
|
+
optLabel: { fontSize: 14, fontWeight: 600 },
|
|
81
|
+
optDesc: { fontSize: 12.5, lineHeight: 1.45, color: 'var(--text-tertiary)' },
|
|
82
|
+
mark: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 18, height: 18, flexShrink: 0, marginTop: 1, color: '#fff', border: '1px solid var(--border-default)', background: 'var(--surface-2)' },
|
|
83
|
+
markDot: { borderRadius: 999 },
|
|
84
|
+
markBox: { borderRadius: 'var(--radius-xs)' },
|
|
85
|
+
markOn: { background: 'var(--accent)', border: '1px solid var(--accent)' },
|
|
86
|
+
otherRow: { alignItems: 'center', cursor: 'text' },
|
|
87
|
+
otherInput: { flex: 1, minWidth: 0, border: 0, outline: 'none', background: 'transparent', color: 'var(--text-primary)', fontSize: 14, fontFamily: 'inherit' },
|
|
88
|
+
foot: { display: 'flex', alignItems: 'center', gap: 10, padding: '10px 12px', borderTop: '1px solid var(--border-subtle)', background: 'var(--surface-1)' },
|
|
89
|
+
progress: { marginLeft: 'auto', fontSize: 11.5, color: 'var(--text-tertiary)', fontFamily: 'var(--font-mono)', fontVariantNumeric: 'tabular-nums' },
|
|
90
|
+
cancel: { display: 'inline-flex', alignItems: 'center', gap: 6, height: 34, padding: '0 12px', border: '1px solid var(--border-subtle)', borderRadius: 'var(--radius-sm)', background: 'transparent', color: 'var(--text-tertiary)', fontSize: 13, fontWeight: 600, fontFamily: 'inherit', cursor: 'pointer' },
|
|
91
|
+
submit: { display: 'inline-flex', alignItems: 'center', gap: 6, height: 34, padding: '0 16px', border: 0, borderRadius: 'var(--radius-sm)', background: 'var(--grad-brand)', color: '#fff', fontSize: 13, fontWeight: 600, fontFamily: 'inherit', cursor: 'pointer', boxShadow: 'var(--shadow-1)' },
|
|
92
|
+
submitOff: { opacity: 0.5, cursor: 'not-allowed', boxShadow: 'none' },
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=AskUser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AskUser.js","sourceRoot":"","sources":["../AskUser.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface PaletteCommand {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
hint?: string;
|
|
6
|
+
section?: string;
|
|
7
|
+
run: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function CommandPalette({ commands, onClose }: {
|
|
10
|
+
commands: PaletteCommand[];
|
|
11
|
+
onClose: () => void;
|
|
12
|
+
}): React.JSX.Element;
|
|
13
|
+
//# sourceMappingURL=CommandPalette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../CommandPalette.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAGpE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,qBA0DxG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { IcSearch, IcArrow } from '@corenel/ui-kit/icons';
|
|
4
|
+
export function CommandPalette({ commands, onClose }) {
|
|
5
|
+
const [q, setQ] = useState('');
|
|
6
|
+
const [active, setActive] = useState(0);
|
|
7
|
+
const inputRef = useRef(null);
|
|
8
|
+
useEffect(() => { inputRef.current?.focus(); }, []);
|
|
9
|
+
const filtered = useMemo(() => {
|
|
10
|
+
const needle = q.trim().toLowerCase();
|
|
11
|
+
if (!needle)
|
|
12
|
+
return commands;
|
|
13
|
+
return commands.filter((c) => `${c.label} ${c.hint || ''} ${c.section || ''}`.toLowerCase().includes(needle));
|
|
14
|
+
}, [q, commands]);
|
|
15
|
+
useEffect(() => { setActive(0); }, [q]);
|
|
16
|
+
const choose = (cmd) => {
|
|
17
|
+
if (!cmd)
|
|
18
|
+
return;
|
|
19
|
+
onClose();
|
|
20
|
+
cmd.run();
|
|
21
|
+
};
|
|
22
|
+
return (_jsx("div", { style: S.backdrop, onClick: onClose, children: _jsxs("div", { style: S.modal, onClick: (e) => e.stopPropagation(), role: "dialog", "aria-label": "Command palette", children: [_jsxs("div", { style: S.inputRow, children: [_jsx(IcSearch, { size: 16 }), _jsx("input", { ref: inputRef, style: S.input, value: q, onChange: (e) => setQ(e.target.value), placeholder: "Type a command\u2026", onKeyDown: (e) => {
|
|
23
|
+
if (e.key === 'ArrowDown') {
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
setActive((a) => Math.min(a + 1, filtered.length - 1));
|
|
26
|
+
}
|
|
27
|
+
else if (e.key === 'ArrowUp') {
|
|
28
|
+
e.preventDefault();
|
|
29
|
+
setActive((a) => Math.max(a - 1, 0));
|
|
30
|
+
}
|
|
31
|
+
else if (e.key === 'Enter') {
|
|
32
|
+
e.preventDefault();
|
|
33
|
+
choose(filtered[active]);
|
|
34
|
+
}
|
|
35
|
+
else if (e.key === 'Escape') {
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
onClose();
|
|
38
|
+
}
|
|
39
|
+
} }), _jsx("span", { style: S.kbd, children: "esc" })] }), _jsxs("div", { style: S.list, children: [filtered.length === 0 && _jsx("div", { style: S.empty, children: "No commands" }), filtered.map((c, i) => (_jsxs("button", { style: S.item(i === active), onMouseEnter: () => setActive(i), onClick: () => choose(c), children: [_jsx("span", { style: S.itemLabel, children: c.label }), c.hint && _jsx("span", { style: S.itemHint, children: c.hint }), i === active && _jsx("span", { style: S.enter, children: _jsx(IcArrow, { size: 12 }) })] }, c.id)))] })] }) }));
|
|
40
|
+
}
|
|
41
|
+
const S = {
|
|
42
|
+
backdrop: { position: 'fixed', inset: 0, background: 'var(--surface-overlay)', backdropFilter: 'blur(4px)', display: 'flex', alignItems: 'flex-start', justifyContent: 'center', paddingTop: '14vh', zIndex: 1100 },
|
|
43
|
+
modal: { width: 'min(560px, 92vw)', background: 'var(--surface-1)', border: '1px solid var(--border-default)', borderRadius: 'var(--radius-lg)', boxShadow: 'var(--shadow-5)', overflow: 'hidden' },
|
|
44
|
+
inputRow: { display: 'flex', alignItems: 'center', gap: 10, padding: '12px 14px', borderBottom: '1px solid var(--border-subtle)', color: 'var(--text-tertiary)' },
|
|
45
|
+
input: { flex: 1, border: 0, outline: 'none', background: 'transparent', color: 'var(--text-primary)', fontSize: 15, fontFamily: 'inherit' },
|
|
46
|
+
kbd: { fontFamily: 'var(--font-mono)', fontSize: 11, color: 'var(--text-disabled)', border: '1px solid var(--border-subtle)', borderRadius: 'var(--radius-xs)', padding: '1px 5px' },
|
|
47
|
+
list: { maxHeight: '50vh', overflowY: 'auto', padding: 6 },
|
|
48
|
+
empty: { padding: '16px', color: 'var(--text-tertiary)', fontSize: 13, textAlign: 'center' },
|
|
49
|
+
item: (active) => ({ position: 'relative', display: 'flex', alignItems: 'baseline', gap: 10, width: '100%', padding: '9px 11px', border: 0, borderRadius: 'var(--radius-sm)', background: active ? 'var(--accent-soft)' : 'transparent', color: 'var(--text-primary)', cursor: 'pointer', textAlign: 'left' }),
|
|
50
|
+
itemLabel: { fontSize: 13.5, fontWeight: 500 },
|
|
51
|
+
itemHint: { fontSize: 12, color: 'var(--text-tertiary)', fontFamily: 'var(--font-mono)' },
|
|
52
|
+
enter: { marginLeft: 'auto', color: 'var(--accent)' },
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=CommandPalette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","sourceRoot":"","sources":["../CommandPalette.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type AgentMode = string;
|
|
3
|
+
/** A selectable agent mode. label/description come from the mode file's
|
|
4
|
+
* frontmatter; accent is the composer gradient (else resolved by id below). */
|
|
5
|
+
export interface ModeEntry {
|
|
6
|
+
id: string;
|
|
7
|
+
label: string;
|
|
8
|
+
description: string;
|
|
9
|
+
accent?: string;
|
|
10
|
+
}
|
|
11
|
+
/** The built-in modes — the fallback list when a host doesn't supply its own. */
|
|
12
|
+
export declare const DEFAULT_MODES: ModeEntry[];
|
|
13
|
+
/** Built-in mode ids, in canonical order (back-compat for older imports). */
|
|
14
|
+
export declare const MODES: string[];
|
|
15
|
+
/** The composer gradient for a mode — its own accent, else the built-in by id, else the default. */
|
|
16
|
+
export declare function modeAccent(m: ModeEntry): string;
|
|
17
|
+
export interface ContextChip {
|
|
18
|
+
id: string;
|
|
19
|
+
label: string;
|
|
20
|
+
removable: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface SlashCommand {
|
|
23
|
+
name: string;
|
|
24
|
+
hint: string;
|
|
25
|
+
section?: string;
|
|
26
|
+
icon?: React.ReactNode;
|
|
27
|
+
}
|
|
28
|
+
export declare function Composer({ value, onChange, onSend, onStop, running, mode, onModeChange, modes, chips, onRemoveChip, onAddContext, slashCommands, onPickSlash, attachments, onAttach, onRemoveAttachment, onImageClick, inPrice, }: {
|
|
29
|
+
value: string;
|
|
30
|
+
onChange: (v: string) => void;
|
|
31
|
+
onSend: () => void;
|
|
32
|
+
onStop: () => void;
|
|
33
|
+
running: boolean;
|
|
34
|
+
mode: AgentMode;
|
|
35
|
+
onModeChange: (m: AgentMode) => void;
|
|
36
|
+
/** The selectable modes (folder-driven). Defaults to the built-ins. */
|
|
37
|
+
modes?: ModeEntry[];
|
|
38
|
+
chips: ContextChip[];
|
|
39
|
+
onRemoveChip: (id: string) => void;
|
|
40
|
+
onAddContext: () => void;
|
|
41
|
+
slashCommands: SlashCommand[];
|
|
42
|
+
onPickSlash: (name: string) => void;
|
|
43
|
+
/** Pasted image previews (data URLs) shown before sending. */
|
|
44
|
+
attachments: string[];
|
|
45
|
+
onAttach: (dataUrls: string[]) => void;
|
|
46
|
+
onRemoveAttachment: (index: number) => void;
|
|
47
|
+
onImageClick: (src: string) => void;
|
|
48
|
+
/** Selected model's input price (USD per 1M tokens) for the live cost estimate. */
|
|
49
|
+
inPrice?: number;
|
|
50
|
+
}): React.JSX.Element;
|
|
51
|
+
//# sourceMappingURL=Composer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../Composer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAO5E,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B;+EAC+E;AAC/E,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAY9F,iFAAiF;AACjF,eAAO,MAAM,aAAa,EAAE,SAAS,EAKpC,CAAC;AACF,6EAA6E;AAC7E,eAAO,MAAM,KAAK,EAAE,MAAM,EAAmC,CAAC;AAE9D,oGAAoG;AACpG,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAA2E;AAK3H,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE;AAC9E,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE;AActG,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EACxC,IAAI,EAAE,YAAY,EAAE,KAAqB,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAC5E,aAAa,EAAE,WAAW,EAC1B,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EACvD,OAAO,GACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,uEAAuE;IACvE,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,8DAA8D;IAC9D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACvC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,qBAgLA"}
|
package/dist/Composer.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useEffect, useLayoutEffect } from 'react';
|
|
3
|
+
import { IcPlay, IcStop, IcX, IcFile, IcCode, IcPlus, IcChevron } from '@corenel/ui-kit/icons';
|
|
4
|
+
import { estimateTokens } from '@corenel/ui-kit/ui-helpers';
|
|
5
|
+
import { fmtCost, fmtTok } from '@corenel/ui-kit/usage';
|
|
6
|
+
// Mode gradients are reserved for the chat composer (per the brand system). These
|
|
7
|
+
// back the built-in ids; a custom mode falls back to the auto gradient (or its own
|
|
8
|
+
// frontmatter `accent`).
|
|
9
|
+
const BUILTIN_MODE_GRAD = {
|
|
10
|
+
auto: 'var(--grad-mode-auto)',
|
|
11
|
+
edit: 'var(--grad-mode-edit)',
|
|
12
|
+
plan: 'var(--grad-mode-plan)',
|
|
13
|
+
brainstorm: 'var(--grad-mode-brainstorm)',
|
|
14
|
+
};
|
|
15
|
+
/** The built-in modes — the fallback list when a host doesn't supply its own. */
|
|
16
|
+
export const DEFAULT_MODES = [
|
|
17
|
+
{ id: 'auto', label: 'Auto', description: 'No extra steering; the agent picks its own approach.' },
|
|
18
|
+
{ id: 'edit', label: 'Edit', description: 'Focus on concrete file changes (prefers propose_edit).' },
|
|
19
|
+
{ id: 'plan', label: 'Plan', description: 'Think and outline before acting; avoids mutating tools.' },
|
|
20
|
+
{ id: 'brainstorm', label: 'Brainstorm', description: 'Explore options; generative, makes no edits.' },
|
|
21
|
+
];
|
|
22
|
+
/** Built-in mode ids, in canonical order (back-compat for older imports). */
|
|
23
|
+
export const MODES = DEFAULT_MODES.map((m) => m.id);
|
|
24
|
+
/** The composer gradient for a mode — its own accent, else the built-in by id, else the default. */
|
|
25
|
+
export function modeAccent(m) { return m.accent || BUILTIN_MODE_GRAD[m.id] || 'var(--grad-mode-auto)'; }
|
|
26
|
+
// Auto-grow cap for the composer textarea: it grows with content up to here, then scrolls.
|
|
27
|
+
const TEXTAREA_MAX_H = 220;
|
|
28
|
+
/** Group commands by section, preserving first-seen order; '' sections render unlabeled. */
|
|
29
|
+
function groupBySection(cmds) {
|
|
30
|
+
const order = [];
|
|
31
|
+
const map = new Map();
|
|
32
|
+
for (const c of cmds) {
|
|
33
|
+
const s = c.section || '';
|
|
34
|
+
if (!map.has(s)) {
|
|
35
|
+
map.set(s, []);
|
|
36
|
+
order.push(s);
|
|
37
|
+
}
|
|
38
|
+
map.get(s).push(c);
|
|
39
|
+
}
|
|
40
|
+
return order.map((s) => [s, map.get(s)]);
|
|
41
|
+
}
|
|
42
|
+
export function Composer({ value, onChange, onSend, onStop, running, mode, onModeChange, modes = DEFAULT_MODES, chips, onRemoveChip, onAddContext, slashCommands, onPickSlash, attachments, onAttach, onRemoveAttachment, onImageClick, inPrice, }) {
|
|
43
|
+
const [slashHidden, setSlashHidden] = useState(false);
|
|
44
|
+
const [slashActive, setSlashActive] = useState(0);
|
|
45
|
+
// Auto-grow the textarea with its content: from a 3-line resting height up to a
|
|
46
|
+
// cap, after which it scrolls. Runs before paint (no flicker) on every value
|
|
47
|
+
// change, so clearing after send snaps back to the resting height.
|
|
48
|
+
const textareaRef = useRef(null);
|
|
49
|
+
useLayoutEffect(() => {
|
|
50
|
+
const el = textareaRef.current;
|
|
51
|
+
if (!el)
|
|
52
|
+
return;
|
|
53
|
+
el.style.height = 'auto';
|
|
54
|
+
el.style.height = `${Math.min(el.scrollHeight, TEXTAREA_MAX_H)}px`;
|
|
55
|
+
}, [value]);
|
|
56
|
+
const showSlash = value.startsWith('/') && !value.includes(' ') && !slashHidden;
|
|
57
|
+
const filtered = showSlash
|
|
58
|
+
? slashCommands.filter((c) => c.name.startsWith(value.slice(1).toLowerCase()))
|
|
59
|
+
: [];
|
|
60
|
+
useEffect(() => { setSlashActive(0); }, [value]);
|
|
61
|
+
const canSend = value.trim().length > 0 || attachments.length > 0;
|
|
62
|
+
// Resolve the mode list + the active entry. If the active id isn't in the list
|
|
63
|
+
// (e.g. a deleted custom mode), synthesize a minimal entry so the control still
|
|
64
|
+
// renders rather than crashing on an undefined accent/label.
|
|
65
|
+
const modeList = modes.length ? modes : DEFAULT_MODES;
|
|
66
|
+
const curMode = modeList.find((mm) => mm.id === mode) ?? { id: mode, label: mode || 'auto', description: '' };
|
|
67
|
+
// Live, rough estimate of THIS message's input cost (text only): est tokens x the
|
|
68
|
+
// selected model's input price. A pre-send sanity check, not a billed figure.
|
|
69
|
+
const estTok = value.trim() ? estimateTokens(value) : 0;
|
|
70
|
+
const estCost = inPrice && estTok ? (estTok / 1e6) * inPrice : null;
|
|
71
|
+
// Paste images straight into the composer → data-URL previews (before upload).
|
|
72
|
+
const readAsDataUrl = (f) => new Promise((res) => {
|
|
73
|
+
const r = new FileReader();
|
|
74
|
+
r.onload = () => res(typeof r.result === 'string' ? r.result : '');
|
|
75
|
+
r.onerror = () => res('');
|
|
76
|
+
r.readAsDataURL(f);
|
|
77
|
+
});
|
|
78
|
+
const onPaste = (e) => {
|
|
79
|
+
const files = Array.from(e.clipboardData?.items || [])
|
|
80
|
+
.filter((it) => it.kind === 'file' && it.type.startsWith('image/'))
|
|
81
|
+
.map((it) => it.getAsFile())
|
|
82
|
+
.filter((f) => !!f);
|
|
83
|
+
if (!files.length)
|
|
84
|
+
return;
|
|
85
|
+
e.preventDefault();
|
|
86
|
+
Promise.all(files.map(readAsDataUrl)).then((urls) => {
|
|
87
|
+
const ok = urls.filter(Boolean);
|
|
88
|
+
if (ok.length)
|
|
89
|
+
onAttach(ok);
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
// The mode (stance) is fused to Send: collapsed it shows the current mode; click
|
|
93
|
+
// expands the four options inline (no popup); pick one, it collapses.
|
|
94
|
+
const [modeOpen, setModeOpen] = useState(false);
|
|
95
|
+
const stanceRef = useRef(null);
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (!modeOpen)
|
|
98
|
+
return;
|
|
99
|
+
const onDoc = (e) => { if (stanceRef.current && !stanceRef.current.contains(e.target))
|
|
100
|
+
setModeOpen(false); };
|
|
101
|
+
document.addEventListener('mousedown', onDoc);
|
|
102
|
+
return () => document.removeEventListener('mousedown', onDoc);
|
|
103
|
+
}, [modeOpen]);
|
|
104
|
+
return (_jsxs("div", { style: S.wrap, children: [showSlash && filtered.length > 0 && (_jsxs("div", { style: S.slash, children: [groupBySection(filtered).map(([section, items]) => (_jsxs("div", { children: [section && _jsx("div", { style: S.slashSection, children: section }), items.map((c) => {
|
|
105
|
+
const idx = filtered.indexOf(c);
|
|
106
|
+
return (_jsxs("button", { style: S.slashItem(idx === slashActive), onMouseEnter: () => setSlashActive(idx), onClick: () => onPickSlash(c.name), children: [_jsx("span", { style: S.slashIcon, children: c.icon }), _jsxs("span", { style: S.slashName, children: ["/", c.name] }), _jsx("span", { style: S.slashHint, children: c.hint })] }, c.name));
|
|
107
|
+
})] }, section || '_'))), _jsxs("div", { style: S.slashFoot, children: [_jsx("span", { children: "\u2191\u2193 navigate" }), _jsx("span", { children: "\u21B5 select" }), _jsx("span", { children: "esc dismiss" })] })] })), _jsxs("div", { style: S.chips, children: [chips.map((c) => (_jsxs("span", { style: S.chip, title: c.label, children: [c.id === 'selection' ? _jsx(IcCode, { size: 11 }) : _jsx(IcFile, { size: 11 }), _jsx("span", { style: S.chipLabel, children: c.label }), c.removable && _jsx("button", { style: S.chipX, onClick: () => onRemoveChip(c.id), "aria-label": "Remove context", children: _jsx(IcX, { size: 10 }) })] }, c.id))), _jsxs("button", { style: S.addCtx, onClick: onAddContext, title: "Add context", children: [_jsx(IcPlus, { size: 11 }), " context"] })] }), attachments.length > 0 && (_jsx("div", { style: S.thumbs, children: attachments.map((src, i) => (_jsxs("div", { style: S.thumbWrap, children: [_jsx("img", { src: src, alt: `Attachment ${i + 1}`, style: S.thumb, className: "ask-thumb", onClick: () => onImageClick(src), title: "Click to expand" }), _jsx("button", { style: S.thumbX, onClick: () => onRemoveAttachment(i), "aria-label": "Remove image", children: _jsx(IcX, { size: 11 }) })] }, i))) })), _jsx("textarea", { ref: textareaRef, style: S.textarea, value: value, onChange: (e) => { setSlashHidden(false); onChange(e.target.value); }, onPaste: onPaste, onKeyDown: (e) => {
|
|
108
|
+
// While the "/" menu is open it owns the arrows + Enter/Tab/Escape, so a
|
|
109
|
+
// command can be navigated and picked without leaving the keyboard.
|
|
110
|
+
if (showSlash && filtered.length > 0) {
|
|
111
|
+
if (e.key === 'ArrowDown') {
|
|
112
|
+
e.preventDefault();
|
|
113
|
+
setSlashActive((a) => Math.min(a + 1, filtered.length - 1));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (e.key === 'ArrowUp') {
|
|
117
|
+
e.preventDefault();
|
|
118
|
+
setSlashActive((a) => Math.max(a - 1, 0));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (e.key === 'Escape') {
|
|
122
|
+
e.preventDefault();
|
|
123
|
+
setSlashHidden(true);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if ((e.key === 'Enter' || e.key === 'Tab') && !e.metaKey && !e.ctrlKey && !e.shiftKey) {
|
|
127
|
+
e.preventDefault();
|
|
128
|
+
onPickSlash(filtered[Math.min(slashActive, filtered.length - 1)].name);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (e.key !== 'Enter')
|
|
133
|
+
return;
|
|
134
|
+
// ⌘/Ctrl+Enter: don't send — let it bubble to the editor's global handler
|
|
135
|
+
// so it runs the prompt. Shift+Enter: newline (default). Enter: send.
|
|
136
|
+
if (e.metaKey || e.ctrlKey || e.shiftKey)
|
|
137
|
+
return;
|
|
138
|
+
if (!canSend)
|
|
139
|
+
return;
|
|
140
|
+
e.preventDefault();
|
|
141
|
+
onSend();
|
|
142
|
+
}, placeholder: "Ask the agent\u2026 \u00B7 paste a screenshot \u00B7 \u21B5 send \u00B7 \u21E7\u21B5 newline \u00B7 \u2318\u21B5 run", rows: 3 }), _jsxs("div", { style: S.bottom, children: [estTok > 0 && (_jsxs("span", { style: S.est, title: "Rough estimate of this message's input tokens and cost (text only)", children: ["~", fmtTok(estTok), " tok", estCost != null ? ` · est ${fmtCost(estCost)}` : ''] })), _jsxs("div", { ref: stanceRef, style: S.stance, children: [modeOpen ? (modeList.map((mm) => (_jsxs("button", { style: S.stanceOpt(mm.id === mode), title: mm.description || mm.label, onClick: () => { onModeChange(mm.id); setModeOpen(false); }, children: [_jsx("span", { style: { ...S.modeDot, background: modeAccent(mm) } }), mm.label] }, mm.id)))) : (_jsxs("button", { style: S.stanceCurrent, onClick: () => setModeOpen(true), title: curMode.description || curMode.label, children: [_jsx("span", { style: { ...S.modeDot, background: modeAccent(curMode) } }), _jsx("span", { style: S.stanceName, children: curMode.label }), _jsx(IcChevron, { size: 12 })] })), _jsx("span", { style: S.stanceDivider }), running ? (_jsxs("button", { style: { ...S.sendBtn, background: 'var(--grad-stop)' }, onClick: onStop, children: [_jsx(IcStop, { size: 12 }), " Stop"] })) : (_jsxs("button", { style: { ...S.sendBtn, background: modeAccent(curMode) }, onClick: onSend, disabled: !canSend, children: [_jsx(IcPlay, { size: 12 }), " Send"] }))] })] })] }));
|
|
143
|
+
}
|
|
144
|
+
const S = {
|
|
145
|
+
wrap: { position: 'relative', borderTop: '1px solid var(--border-subtle)', background: 'var(--surface-1)', padding: 10, display: 'flex', flexDirection: 'column', gap: 8 },
|
|
146
|
+
slash: { position: 'absolute', bottom: 'calc(100% + 6px)', left: 10, right: 10, background: 'var(--surface-1)', border: '1px solid var(--border-default)', borderRadius: 'var(--radius-md)', boxShadow: 'var(--shadow-3)', padding: 4, zIndex: 200, maxHeight: 360, overflow: 'auto' },
|
|
147
|
+
slashItem: (active) => ({ display: 'flex', alignItems: 'center', gap: 9, width: '100%', padding: '7px 9px', border: 0, borderRadius: 'var(--radius-sm)', background: active ? 'var(--accent-soft)' : 'transparent', color: 'var(--text-primary)', cursor: 'pointer', textAlign: 'left' }),
|
|
148
|
+
slashIcon: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 16, color: 'var(--text-tertiary)', flexShrink: 0 },
|
|
149
|
+
slashName: { fontFamily: 'var(--font-mono)', fontSize: 12.5, fontWeight: 600, color: 'var(--accent)', minWidth: 62, flexShrink: 0 },
|
|
150
|
+
slashHint: { fontSize: 12, color: 'var(--text-tertiary)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },
|
|
151
|
+
slashSection: { padding: '6px 9px 3px', fontSize: 10.5, fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.07em', color: 'var(--text-tertiary)' },
|
|
152
|
+
slashFoot: { display: 'flex', gap: 14, padding: '7px 10px 4px', marginTop: 4, borderTop: '1px solid var(--border-subtle)', fontSize: 11, color: 'var(--text-disabled)', fontFamily: 'var(--font-mono)' },
|
|
153
|
+
chips: { display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' },
|
|
154
|
+
chip: { display: 'inline-flex', alignItems: 'center', gap: 5, height: 22, padding: '0 6px 0 8px', borderRadius: 'var(--radius-pill)', background: 'var(--surface-3)', border: '1px solid var(--border-subtle)', color: 'var(--text-secondary)', fontSize: 11.5, fontFamily: 'var(--font-mono)', maxWidth: 200 },
|
|
155
|
+
chipLabel: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },
|
|
156
|
+
chipX: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 14, height: 14, border: 0, borderRadius: 999, background: 'transparent', color: 'var(--text-tertiary)', cursor: 'pointer', padding: 0 },
|
|
157
|
+
addCtx: { display: 'inline-flex', alignItems: 'center', gap: 4, height: 22, padding: '0 8px', borderRadius: 'var(--radius-pill)', background: 'transparent', border: '1px dashed var(--border-default)', color: 'var(--text-tertiary)', fontSize: 11.5, cursor: 'pointer' },
|
|
158
|
+
thumbs: { display: 'flex', flexWrap: 'wrap', gap: 8 },
|
|
159
|
+
thumbWrap: { position: 'relative', width: 60, height: 60 },
|
|
160
|
+
thumb: { width: 60, height: 60, objectFit: 'cover', borderRadius: 'var(--radius-md)', border: '1px solid var(--border-subtle)', cursor: 'zoom-in', display: 'block' },
|
|
161
|
+
thumbX: { position: 'absolute', top: -6, right: -6, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 18, height: 18, borderRadius: 999, border: '1px solid var(--border-default)', background: 'var(--surface-1)', color: 'var(--text-secondary)', cursor: 'pointer', padding: 0, boxShadow: 'var(--shadow-1)' },
|
|
162
|
+
textarea: { width: '100%', boxSizing: 'border-box', resize: 'none', padding: 10, border: '1px solid var(--border-default)', borderRadius: 'var(--radius-md)', background: 'var(--surface-2)', color: 'var(--text-primary)', fontSize: 14, fontFamily: 'inherit', lineHeight: 1.5, outline: 'none', minHeight: 84, maxHeight: TEXTAREA_MAX_H, overflowY: 'auto' },
|
|
163
|
+
bottom: { display: 'flex', alignItems: 'center', gap: 8 },
|
|
164
|
+
est: { fontSize: 11.5, color: 'var(--text-tertiary)', fontFamily: 'var(--font-mono)', fontVariantNumeric: 'tabular-nums' },
|
|
165
|
+
modeDot: { width: 8, height: 8, borderRadius: 999, flexShrink: 0 },
|
|
166
|
+
// Fused stance + Send: one segmented control on the right of the bar.
|
|
167
|
+
stance: { marginLeft: 'auto', display: 'inline-flex', alignItems: 'stretch', height: 34, border: '1px solid var(--border-default)', borderRadius: 'var(--radius-sm)', overflow: 'hidden', background: 'var(--surface-2)', boxShadow: 'var(--shadow-1)' },
|
|
168
|
+
stanceCurrent: { display: 'inline-flex', alignItems: 'center', gap: 6, padding: '0 10px', border: 0, background: 'transparent', color: 'var(--text-primary)', fontSize: 12.5, fontWeight: 600, fontFamily: 'inherit', textTransform: 'capitalize', cursor: 'pointer' },
|
|
169
|
+
stanceName: { textTransform: 'capitalize' },
|
|
170
|
+
stanceOpt: (active) => ({ display: 'inline-flex', alignItems: 'center', gap: 5, padding: '0 9px', border: 0, background: active ? 'var(--surface-1)' : 'transparent', color: active ? 'var(--text-primary)' : 'var(--text-tertiary)', fontSize: 12, fontWeight: 600, fontFamily: 'inherit', textTransform: 'capitalize', cursor: 'pointer' }),
|
|
171
|
+
stanceDivider: { width: 1, alignSelf: 'stretch', background: 'var(--border-subtle)' },
|
|
172
|
+
sendBtn: { display: 'inline-flex', alignItems: 'center', gap: 6, padding: '0 14px', border: 0, color: '#fff', fontSize: 13, fontWeight: 600, fontFamily: 'inherit', cursor: 'pointer' },
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=Composer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Composer.js","sourceRoot":"","sources":["../Composer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SystemParts } from '@corenel/harness/systemParts';
|
|
2
|
+
export declare function ContextBar({ contextWindow, parts, onToggle, systemSource }: {
|
|
3
|
+
contextWindow: number;
|
|
4
|
+
parts: SystemParts;
|
|
5
|
+
onToggle: (k: keyof SystemParts) => void;
|
|
6
|
+
/** Active system prompt filename, shown in the expanded panel. */
|
|
7
|
+
systemSource?: string;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=ContextBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextBar.d.ts","sourceRoot":"","sources":["../ContextBar.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,wBAAgB,UAAU,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,WAAW,KAAK,IAAI,CAAC;IACzC,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,+BA8BA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* A slim context-window bar under the Assistant header: the last run's fill vs
|
|
3
|
+
* the model window + percent. Click to expand into the full Context Manager
|
|
4
|
+
* (composition, system-prompt toggles, warm turns, compression). */
|
|
5
|
+
import { useState } from 'react';
|
|
6
|
+
import { fmtTok } from '@corenel/ui-kit/usage';
|
|
7
|
+
import { ContextManagerBody, useContextProjection } from './ContextManager';
|
|
8
|
+
import { IcChevron } from '@corenel/ui-kit/icons';
|
|
9
|
+
export function ContextBar({ contextWindow, parts, onToggle, systemSource }) {
|
|
10
|
+
const [open, setOpen] = useState(false);
|
|
11
|
+
// Live projection (system prompt + included warm turns), the SAME number the
|
|
12
|
+
// expanded drawer shows — so the bar updates as you chat and toggle context,
|
|
13
|
+
// not just after a completed run.
|
|
14
|
+
const { projected, pct, over } = useContextProjection(contextWindow, parts);
|
|
15
|
+
const color = over ? 'var(--danger)' : pct > 70 ? 'var(--warning)' : 'var(--accent)';
|
|
16
|
+
return (
|
|
17
|
+
// Closed, the bar casts a deep shadow off its bottom edge so it reads as a lid
|
|
18
|
+
// over the chat. Open, the drawer below carries its own shadow, so the bar's is
|
|
19
|
+
// dropped to avoid doubling.
|
|
20
|
+
_jsxs("div", { style: { ...S.wrap, ...(open ? null : { boxShadow: 'var(--shadow-4)' }) }, children: [_jsxs("button", { style: S.bar, onClick: () => setOpen((o) => !o), title: "Context window \u2014 click for details", "aria-expanded": open, children: [_jsx("span", { style: S.track, children: _jsx("span", { style: { ...S.fill, width: `${pct}%`, background: color } }) }), _jsx("span", { style: S.meta, children: `${fmtTok(projected)} / ${fmtTok(contextWindow)} · ${pct}%` }), _jsx("span", { style: { ...S.chev, transform: open ? 'rotate(180deg)' : 'none' }, children: _jsx(IcChevron, { size: 13 }) })] }), open && (_jsxs("div", { style: S.panel, children: [_jsx("div", { style: S.stats, children: _jsx(ContextManagerBody, { contextWindow: contextWindow, parts: parts, onToggle: onToggle, systemSource: systemSource }) }), _jsxs("button", { style: S.collapse, onClick: () => setOpen(false), title: "Collapse", "aria-label": "Collapse context details", children: [_jsx("span", { style: { ...S.chev, transform: 'rotate(180deg)' }, children: _jsx(IcChevron, { size: 13 }) }), "Collapse"] })] }))] }));
|
|
21
|
+
}
|
|
22
|
+
const S = {
|
|
23
|
+
wrap: { position: 'relative', zIndex: 6, display: 'flex', flexDirection: 'column', flexShrink: 0, borderBottom: '1px solid var(--border-subtle)', background: 'var(--surface-1)' },
|
|
24
|
+
bar: { display: 'flex', alignItems: 'center', gap: 10, height: 30, padding: '0 11px', border: 0, background: 'transparent', cursor: 'pointer', width: '100%' },
|
|
25
|
+
track: { flex: 1, height: 6, borderRadius: 999, background: 'var(--surface-3)', overflow: 'hidden' },
|
|
26
|
+
fill: { display: 'block', height: '100%', borderRadius: 999, transition: 'width var(--motion-fast)' },
|
|
27
|
+
meta: { fontSize: 11.5, color: 'var(--text-tertiary)', fontFamily: 'var(--font-mono)', fontVariantNumeric: 'tabular-nums', flexShrink: 0 },
|
|
28
|
+
chev: { display: 'inline-flex', color: 'var(--text-tertiary)', transition: 'transform var(--motion-fast)', flexShrink: 0 },
|
|
29
|
+
// The expanded drawer OVERLAYS the chat — it floats below the bar (absolute) so
|
|
30
|
+
// it doesn't push the transcript down, keeping its original drop-shadow lid.
|
|
31
|
+
panel: { position: 'absolute', top: '100%', left: 0, right: 0, zIndex: 5, display: 'flex', flexDirection: 'column', maxHeight: '60vh', overflow: 'hidden', background: 'var(--surface-2)', borderTop: '1px solid var(--border-default)', borderBottom: '1px solid var(--border-default)', boxShadow: 'var(--shadow-3)' },
|
|
32
|
+
parts: { display: 'flex', flexDirection: 'column', gap: 8, padding: '12px 14px', borderBottom: '1px solid var(--border-subtle)', flexShrink: 0 },
|
|
33
|
+
partsHead: { fontSize: 'var(--fs-eyebrow)', fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.08em', color: 'var(--text-tertiary)' },
|
|
34
|
+
partsRow: { display: 'flex', flexWrap: 'wrap', gap: 8 },
|
|
35
|
+
part: (on) => ({
|
|
36
|
+
display: 'inline-flex', alignItems: 'center', gap: 6, padding: '5px 10px', borderRadius: 'var(--radius-sm)',
|
|
37
|
+
border: `1px solid ${on ? 'var(--border-accent, var(--accent))' : 'var(--border-subtle)'}`,
|
|
38
|
+
background: on ? 'var(--accent-soft)' : 'transparent', color: on ? 'var(--text-primary)' : 'var(--text-tertiary)',
|
|
39
|
+
fontSize: 12.5, fontWeight: 600, cursor: 'pointer',
|
|
40
|
+
}),
|
|
41
|
+
partsHint: { fontSize: 11.5, color: 'var(--text-tertiary)', lineHeight: 1.45 },
|
|
42
|
+
stats: { flex: 1, minHeight: 0, display: 'flex' },
|
|
43
|
+
collapse: { display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 6, height: 34, width: '100%', flexShrink: 0, border: 0, borderTop: '1px solid var(--border-subtle)', background: 'transparent', color: 'var(--text-tertiary)', fontSize: 12, fontWeight: 600, fontFamily: 'inherit', cursor: 'pointer' },
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=ContextBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextBar.js","sourceRoot":"","sources":["../ContextBar.tsx"],"names":[],"mappings":"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"}
|