@corenel/web-ui 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/AskUser.d.ts.map +1 -1
  2. package/dist/AskUser.js +49 -13
  3. package/dist/AskUser.js.map +1 -1
  4. package/dist/CommandTray.d.ts +21 -0
  5. package/dist/CommandTray.d.ts.map +1 -0
  6. package/dist/CommandTray.js +102 -0
  7. package/dist/CommandTray.js.map +1 -0
  8. package/dist/Composer.d.ts +17 -1
  9. package/dist/Composer.d.ts.map +1 -1
  10. package/dist/Composer.js +93 -6
  11. package/dist/Composer.js.map +1 -1
  12. package/dist/ContextBar.d.ts +9 -1
  13. package/dist/ContextBar.d.ts.map +1 -1
  14. package/dist/ContextBar.js +9 -3
  15. package/dist/ContextBar.js.map +1 -1
  16. package/dist/ContextManager.d.ts +78 -2
  17. package/dist/ContextManager.d.ts.map +1 -1
  18. package/dist/ContextManager.js +175 -51
  19. package/dist/ContextManager.js.map +1 -1
  20. package/dist/Lightbox.d.ts.map +1 -1
  21. package/dist/Lightbox.js +2 -10
  22. package/dist/Lightbox.js.map +1 -1
  23. package/dist/ProcessDock.d.ts +45 -0
  24. package/dist/ProcessDock.d.ts.map +1 -0
  25. package/dist/ProcessDock.js +150 -0
  26. package/dist/ProcessDock.js.map +1 -0
  27. package/dist/RichContent.d.ts +4 -2
  28. package/dist/RichContent.d.ts.map +1 -1
  29. package/dist/RichContent.js +12 -7
  30. package/dist/RichContent.js.map +1 -1
  31. package/dist/TodoBar.d.ts +3 -0
  32. package/dist/TodoBar.d.ts.map +1 -0
  33. package/dist/TodoBar.js +163 -0
  34. package/dist/TodoBar.js.map +1 -0
  35. package/dist/Transcript.d.ts +2 -1
  36. package/dist/Transcript.d.ts.map +1 -1
  37. package/dist/Transcript.js +7 -7
  38. package/dist/Transcript.js.map +1 -1
  39. package/dist/agentChat/AgentChat.d.ts +132 -0
  40. package/dist/agentChat/AgentChat.d.ts.map +1 -0
  41. package/dist/agentChat/AgentChat.js +588 -0
  42. package/dist/agentChat/AgentChat.js.map +1 -0
  43. package/dist/agentChat/OptionsDrawer.d.ts +81 -0
  44. package/dist/agentChat/OptionsDrawer.d.ts.map +1 -0
  45. package/dist/agentChat/OptionsDrawer.js +321 -0
  46. package/dist/agentChat/OptionsDrawer.js.map +1 -0
  47. package/dist/agentChat/SkillsSection.d.ts +3 -0
  48. package/dist/agentChat/SkillsSection.d.ts.map +1 -0
  49. package/dist/agentChat/SkillsSection.js +86 -0
  50. package/dist/agentChat/SkillsSection.js.map +1 -0
  51. package/dist/agentChat/controller.d.ts +116 -0
  52. package/dist/agentChat/controller.d.ts.map +1 -0
  53. package/dist/agentChat/controller.js +25 -0
  54. package/dist/agentChat/controller.js.map +1 -0
  55. package/dist/agentChat/skillRunner.d.ts +14 -0
  56. package/dist/agentChat/skillRunner.d.ts.map +1 -0
  57. package/dist/agentChat/skillRunner.js +4 -0
  58. package/dist/agentChat/skillRunner.js.map +1 -0
  59. package/dist/commandTurn.d.ts +47 -0
  60. package/dist/commandTurn.d.ts.map +1 -0
  61. package/dist/commandTurn.js +64 -0
  62. package/dist/commandTurn.js.map +1 -0
  63. package/dist/composerHistory.d.ts +10 -0
  64. package/dist/composerHistory.d.ts.map +1 -0
  65. package/dist/composerHistory.js +44 -0
  66. package/dist/composerHistory.js.map +1 -0
  67. package/dist/sendLater/SendLater.d.ts +31 -0
  68. package/dist/sendLater/SendLater.d.ts.map +1 -0
  69. package/dist/sendLater/SendLater.js +145 -0
  70. package/dist/sendLater/SendLater.js.map +1 -0
  71. package/dist/sendLater/queue.d.ts +69 -0
  72. package/dist/sendLater/queue.d.ts.map +1 -0
  73. package/dist/sendLater/queue.js +216 -0
  74. package/dist/sendLater/queue.js.map +1 -0
  75. package/dist/toolRender.d.ts +8 -0
  76. package/dist/toolRender.d.ts.map +1 -1
  77. package/dist/toolRender.js +7 -1
  78. package/dist/toolRender.js.map +1 -1
  79. package/package.json +16 -21
@@ -1 +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"}
1
+ {"version":3,"file":"AskUser.d.ts","sourceRoot":"","sources":["../AskUser.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAsBjE,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,qBA0HA"}
package/dist/AskUser.js CHANGED
@@ -4,20 +4,40 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  * options + an optional custom answer. Single- or multi-select per question; Submit
5
5
  * is enabled once every question has an answer. On-brand: 1px borders, accent for
6
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';
7
+ import { useEffect, useMemo, useState } from 'react';
8
+ import { IcCheck, IcUser, IcX, IcChevron } from '@corenel/ui-kit/icons';
9
+ const drafts = new Map();
10
+ // The key covers the FULL question shape — options and multiSelect included — so a
11
+ // later ask with the same wording but different options never restores selections
12
+ // whose labels the current UI doesn't offer (invisible, yet submit-enabled).
13
+ const draftKey = (qs) => JSON.stringify(qs.map((q) => [q.header, q.question, q.multiSelect === true, q.options.map((o) => o.label)]));
14
+ function saveDraft(key, d) {
15
+ drafts.delete(key); // re-insert so insertion order tracks recency
16
+ drafts.set(key, d);
17
+ while (drafts.size > 8) {
18
+ const oldest = drafts.keys().next().value;
19
+ if (oldest === undefined)
20
+ break;
21
+ drafts.delete(oldest);
22
+ }
23
+ }
9
24
  export function AskUser({ questions, onSubmit, onCancel }) {
10
- const [active, setActive] = useState(0);
25
+ const key = useMemo(() => draftKey(questions), [questions]);
26
+ const draft = drafts.get(key);
27
+ const [active, setActive] = useState(draft?.active ?? 0);
11
28
  // State is keyed by question INDEX (not header) so two questions that happen to
12
29
  // share a header don't share selection. Answers are emitted keyed by header.
13
- const [selected, setSelected] = useState({});
14
- const [other, setOther] = useState({});
30
+ const [selected, setSelected] = useState(draft?.selected ?? {});
31
+ const [other, setOther] = useState(draft?.other ?? {});
32
+ useEffect(() => { saveDraft(key, { active, selected, other }); }, [key, active, selected, other]);
15
33
  const answered = (i) => (selected[i]?.length ?? 0) > 0 || (other[i] ?? '').trim() !== '';
16
34
  const answeredCount = useMemo(() => questions.filter((_, i) => answered(i)).length, [questions, selected, other]);
17
35
  const canSubmit = answeredCount === questions.length;
18
36
  const q = questions[active] ?? questions[0];
19
37
  const sel = selected[active] ?? [];
20
38
  const otherActive = (other[active] ?? '').trim() !== '';
39
+ const isLast = active >= questions.length - 1;
40
+ const goNext = () => setActive((a) => Math.min(a + 1, questions.length - 1));
21
41
  const pick = (label) => {
22
42
  setSelected((s) => {
23
43
  const cur = s[active] ?? [];
@@ -27,8 +47,15 @@ export function AskUser({ questions, onSubmit, onCancel }) {
27
47
  }
28
48
  return { ...s, [active]: [label] };
29
49
  });
30
- if (!q.multiSelect)
50
+ if (!q.multiSelect) {
31
51
  setOther((o) => ({ ...o, [active]: '' }));
52
+ // Single-select: once the choice registers, reveal the next question. (Multi-select
53
+ // and free text have no "done" signal, so those advance via the Next button.)
54
+ if (!isLast) {
55
+ const cur = active;
56
+ setTimeout(() => setActive((a) => (a === cur ? cur + 1 : a)), 220);
57
+ }
58
+ }
32
59
  };
33
60
  const typeOther = (text) => {
34
61
  setOther((o) => ({ ...o, [active]: text }));
@@ -46,21 +73,29 @@ export function AskUser({ questions, onSubmit, onCancel }) {
46
73
  vals.push(o);
47
74
  answers[qq.header] = vals;
48
75
  });
76
+ drafts.delete(key);
49
77
  onSubmit(answers);
50
78
  };
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) => {
79
+ const cancel = () => {
80
+ drafts.delete(key);
81
+ onCancel();
82
+ };
83
+ 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: cancel, title: "Dismiss", "aria-label": "Dismiss", children: "Skip" })] }), _jsx("div", { style: S.tabs, role: "tablist", children: questions.map((qq, i) => {
52
84
  const ok = answered(i);
53
85
  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
86
  }) }), _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
87
  const on = sel.includes(opt.label);
56
88
  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'] })] })] }));
89
+ }), _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: cancel, children: [_jsx(IcX, { size: 13 }), " Dismiss"] }), _jsx("div", { style: { flex: 1 } }), questions.length > 1 && _jsxs("span", { style: S.progress, children: [answeredCount, "/", questions.length, " answered"] }), isLast ? (_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'] })) : (_jsxs("button", { style: { ...S.submit, ...(answered(active) ? null : S.submitOff) }, onClick: goNext, disabled: !answered(active), children: ["Next ", _jsx("span", { style: S.nextChevron, children: _jsx(IcChevron, { size: 14 }) })] }))] })] }));
58
90
  }
59
91
  const S = {
60
92
  // Drawer attached to the top of the chatbox: edge-to-edge, top border + rounded
61
93
  // 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)' },
94
+ // The card may SHRINK (options scroll inside body) so the foot with Next/Submit
95
+ // never gets pushed off a short viewport (landscape phone) — head/tabs/foot are
96
+ // fixed, body is the flexible region.
97
+ card: { display: 'flex', flexDirection: 'column', flexShrink: 1, minHeight: 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' },
98
+ head: { display: 'flex', alignItems: 'center', gap: 8, padding: '10px 12px', borderBottom: '1px solid var(--border-subtle)', flexShrink: 0 },
64
99
  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
100
  headTitle: { fontSize: 14, fontWeight: 600, color: 'var(--text-primary)' },
66
101
  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' },
@@ -69,7 +104,7 @@ const S = {
69
104
  tabLabel: { textTransform: 'uppercase', letterSpacing: '0.04em' },
70
105
  tabDot: { width: 6, height: 6, borderRadius: 999, background: 'var(--border-default)', flexShrink: 0 },
71
106
  tabDotOk: { background: 'var(--accent)' },
72
- body: { display: 'flex', flexDirection: 'column', padding: 14, maxHeight: 'min(52vh, 420px)', overflowY: 'auto' },
107
+ body: { display: 'flex', flexDirection: 'column', padding: 14, flex: '0 1 auto', minHeight: 0, maxHeight: 'min(52vh, 420px)', overflowY: 'auto' },
73
108
  q: { display: 'flex', flexDirection: 'column', gap: 10 },
74
109
  multiHint: { fontSize: 11, color: 'var(--text-tertiary)', marginTop: -4 },
75
110
  question: { fontSize: 15, fontWeight: 500, lineHeight: 1.45, color: 'var(--text-primary)' },
@@ -85,10 +120,11 @@ const S = {
85
120
  markOn: { background: 'var(--accent)', border: '1px solid var(--accent)' },
86
121
  otherRow: { alignItems: 'center', cursor: 'text' },
87
122
  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)' },
123
+ foot: { display: 'flex', alignItems: 'center', gap: 10, padding: '10px 12px', borderTop: '1px solid var(--border-subtle)', background: 'var(--surface-1)', flexShrink: 0 },
89
124
  progress: { marginLeft: 'auto', fontSize: 11.5, color: 'var(--text-tertiary)', fontFamily: 'var(--font-mono)', fontVariantNumeric: 'tabular-nums' },
90
125
  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)' },
126
+ submit: { display: 'inline-flex', alignItems: 'center', gap: 6, height: 34, padding: '0 16px', border: 0, borderRadius: 'var(--radius-sm)', background: 'var(--grad-brand)', color: 'var(--text-on-accent, #fff)', fontSize: 13, fontWeight: 600, fontFamily: 'inherit', cursor: 'pointer', boxShadow: 'var(--shadow-1)' },
92
127
  submitOff: { opacity: 0.5, cursor: 'not-allowed', boxShadow: 'none' },
128
+ nextChevron: { display: 'inline-flex', transform: 'rotate(180deg)' },
93
129
  };
94
130
  //# sourceMappingURL=AskUser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AskUser.js","sourceRoot":"","sources":["../AskUser.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AskUser.js","sourceRoot":"","sources":["../AskUser.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type ReactElement } from 'react';
2
+ import type { CommandTurnInfo } from './commandTurn';
3
+ /** A command that is still running.
4
+ *
5
+ * The elapsed counter is the load-bearing part. "Running" alone cannot
6
+ * distinguish a command that is working from one that is stuck, and the
7
+ * difference is exactly what you want to know at four seconds. A number that
8
+ * keeps climbing says "still waiting" in a way a spinner cannot. */
9
+ export declare function RunningCommand({ command, startedAt }: {
10
+ command: string;
11
+ startedAt: number;
12
+ }): ReactElement;
13
+ export interface CommandTrayProps {
14
+ command: CommandTurnInfo | null;
15
+ /** Promote it into the transcript and the context window. */
16
+ onKeep: (turnId: string) => void;
17
+ /** Drop the card. The turn stays on disk, out of context. */
18
+ onDismiss: (turnId: string) => void;
19
+ }
20
+ export declare function CommandTray({ command, onKeep, onDismiss }: CommandTrayProps): ReactElement | null;
21
+ //# sourceMappingURL=CommandTray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandTray.d.ts","sourceRoot":"","sources":["../CommandTray.tsx"],"names":[],"mappings":"AAuBA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;oEAKoE;AACpE,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAiB3G;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,6DAA6D;IAC7D,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,6DAA6D;IAC7D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CA+BjG"}
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* Console output above the composer, until you decide to keep it.
3
+ *
4
+ * A `>pd` command in the chat is written to the session log immediately, but out
5
+ * of context (AgentRuntime.recordCommand). This is where it surfaces: a tray
6
+ * card holding the LAST command's output, which the next command replaces.
7
+ *
8
+ * WHY IT IS NOT A TRANSCRIPT TURN BY DEFAULT. The transcript is the record of a
9
+ * conversation, and its messages are re-sent to the model on every subsequent
10
+ * turn for the rest of the session. Twenty exploratory verbs in a row would turn
11
+ * that record into a terminal log AND charge for it forever. So a command lands
12
+ * here first, and Keep is the one act that promotes it into both the transcript
13
+ * and the model's context - the same decision, which is why it is one button.
14
+ *
15
+ * DISMISS DOES NOT DESTROY ANYTHING. The turn is already on disk and stays
16
+ * listed in the context drawer's excluded turns. The mockup called this variant
17
+ * "ephemeral" on the assumption that dropping it lost the output; it does not,
18
+ * which is what makes defaulting to out-of-context a safe trade rather than a
19
+ * decision you have to get right before the next keystroke.
20
+ *
21
+ * Output is CLAMPED to a short scroller. A directory listing is hundreds of
22
+ * lines, and a tray that grows with its content pushes the composer down - the
23
+ * one control that must never move under your hands.
24
+ */
25
+ import { useEffect, useState } from 'react';
26
+ import { IcCheck, IcX, IcAlert } from '@corenel/ui-kit/icons';
27
+ /** A command that is still running.
28
+ *
29
+ * The elapsed counter is the load-bearing part. "Running" alone cannot
30
+ * distinguish a command that is working from one that is stuck, and the
31
+ * difference is exactly what you want to know at four seconds. A number that
32
+ * keeps climbing says "still waiting" in a way a spinner cannot. */
33
+ export function RunningCommand({ command, startedAt }) {
34
+ const [now, setNow] = useState(() => Date.now());
35
+ useEffect(() => {
36
+ const t = setInterval(() => setNow(Date.now()), 500);
37
+ return () => clearInterval(t);
38
+ }, []);
39
+ const secs = Math.max(0, Math.round((now - startedAt) / 100) / 10);
40
+ return (_jsxs("div", { style: S.running, role: "status", "aria-live": "polite", "data-testid": "command-running", children: [_jsx("span", { style: S.spinner, "aria-hidden": true }), _jsx("span", { style: S.prompt, "aria-hidden": true, children: ">" }), _jsx("code", { style: S.cmd, children: command }), _jsx("div", { style: S.spacer }), _jsxs("span", { style: S.elapsed, children: [secs.toFixed(1), "s"] })] }));
41
+ }
42
+ export function CommandTray({ command, onKeep, onDismiss }) {
43
+ const [copied, setCopied] = useState(false);
44
+ if (!command)
45
+ return null;
46
+ const copy = () => {
47
+ void navigator.clipboard?.writeText(command.output).then(() => setCopied(true)).catch(() => { });
48
+ };
49
+ return (_jsxs("div", { style: S.tray, role: "status", "aria-label": "Command output", "data-testid": "command-tray", children: [_jsxs("div", { style: S.head, children: [_jsx("span", { style: S.prompt, "aria-hidden": true, children: ">" }), _jsx("code", { style: S.cmd, children: command.command }), !command.ok && (_jsxs("span", { style: S.failed, children: [_jsx(IcAlert, { size: 12 }), " failed"] })), _jsx("div", { style: S.spacer }), _jsxs("button", { style: { ...S.btn, ...S.keep }, onClick: () => onKeep(command.turnId), title: "Add this output to the transcript and the agent's context", children: [_jsx(IcCheck, { size: 12 }), " Keep in context"] }), _jsx("button", { style: S.btn, onClick: copy, title: "Copy output", children: copied ? 'Copied' : 'Copy' }), _jsx("button", { style: S.icon, onClick: () => onDismiss(command.turnId), "aria-label": "dismiss", title: "Dismiss (stays in the session log, out of context)", children: _jsx(IcX, { size: 13 }) })] }), _jsx("pre", { style: S.out, children: command.output || (command.ok ? '(no output)' : '(failed, no output)') })] }));
50
+ }
51
+ const S = {
52
+ running: {
53
+ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0,
54
+ margin: '0 10px 8px', padding: '6px 10px', flexShrink: 0,
55
+ border: '1px solid var(--border-subtle)', borderRadius: 10,
56
+ background: 'var(--surface-2)', color: 'var(--text-secondary)', fontSize: 11.5,
57
+ },
58
+ spinner: {
59
+ width: 9, height: 9, flex: 'none', borderRadius: '50%',
60
+ border: '1.5px solid var(--accent)', borderTopColor: 'transparent',
61
+ // The app's existing keyframe. Reduced-motion is safe to ignore here only
62
+ // because the elapsed counter carries the same information without moving.
63
+ animation: 'spin 700ms linear infinite',
64
+ },
65
+ elapsed: { flex: 'none', fontVariantNumeric: 'tabular-nums', color: 'var(--text-tertiary)' },
66
+ tray: {
67
+ display: 'flex', flexDirection: 'column', minWidth: 0,
68
+ border: '1px solid var(--border-subtle)', borderRadius: 10,
69
+ background: 'var(--surface-2)', overflow: 'hidden',
70
+ // Matches the other above-composer notices' gutter, and never shrinks: a
71
+ // squeezed tray would clip the output it exists to show.
72
+ margin: '0 10px 8px', flexShrink: 0,
73
+ },
74
+ head: {
75
+ display: 'flex', alignItems: 'center', gap: 8, padding: '6px 8px 6px 10px',
76
+ borderBottom: '1px solid var(--border-subtle)', minWidth: 0,
77
+ },
78
+ prompt: { color: 'var(--accent)', fontFamily: 'var(--font-mono, monospace)', fontSize: 12, flex: 'none' },
79
+ cmd: {
80
+ fontFamily: 'var(--font-mono, monospace)', fontSize: 12, color: 'var(--text-primary)',
81
+ minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',
82
+ },
83
+ failed: { display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 11, color: 'var(--warning)', flex: 'none' },
84
+ spacer: { marginLeft: 'auto' },
85
+ btn: {
86
+ display: 'inline-flex', alignItems: 'center', gap: 4, flex: 'none',
87
+ padding: '3px 8px', borderRadius: 999, border: '1px solid var(--border-subtle)',
88
+ background: 'transparent', color: 'var(--text-secondary)', font: 'inherit', fontSize: 11.5, cursor: 'pointer',
89
+ },
90
+ keep: { color: 'var(--text-primary)', borderColor: 'var(--border-default)' },
91
+ icon: {
92
+ display: 'inline-flex', flex: 'none', padding: 3, borderRadius: 6, border: '1px solid transparent',
93
+ background: 'transparent', color: 'var(--text-tertiary)', cursor: 'pointer',
94
+ },
95
+ // Capped: the tray must not grow with its output and shove the composer down.
96
+ out: {
97
+ margin: 0, padding: '8px 10px', maxHeight: 160, overflow: 'auto',
98
+ fontFamily: 'var(--font-mono, monospace)', fontSize: 11.5, lineHeight: 1.5,
99
+ color: 'var(--text-secondary)', whiteSpace: 'pre-wrap', wordBreak: 'break-word',
100
+ },
101
+ };
102
+ //# sourceMappingURL=CommandTray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandTray.js","sourceRoot":"","sources":["../CommandTray.tsx"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ export interface SlashCommand {
25
25
  section?: string;
26
26
  icon?: React.ReactNode;
27
27
  }
28
- export declare function Composer({ value, onChange, onSend, onStop, running, mode, onModeChange, modes, chips, onRemoveChip, onAddContext, slashCommands, onPickSlash, attachments, onAttach, onRemoveAttachment, onImageClick, inPrice, }: {
28
+ export declare function Composer({ value, onChange, onSend, onStop, running, mode, onModeChange, modes, chips, onRemoveChip, onAddContext, slashCommands, onPickSlash, attachments, onAttach, onRemoveAttachment, onImageClick, inPrice, showContext, onDropFiles, rightSlot, history, sendLater, }: {
29
29
  value: string;
30
30
  onChange: (v: string) => void;
31
31
  onSend: () => void;
@@ -36,6 +36,9 @@ export declare function Composer({ value, onChange, onSend, onStop, running, mod
36
36
  /** The selectable modes (folder-driven). Defaults to the built-ins. */
37
37
  modes?: ModeEntry[];
38
38
  chips: ContextChip[];
39
+ /** Rendered at the right end of the chip row. Injected rather than imported so
40
+ * this component stays presentational and a host can leave it out. */
41
+ rightSlot?: React.ReactNode;
39
42
  onRemoveChip: (id: string) => void;
40
43
  onAddContext: () => void;
41
44
  slashCommands: SlashCommand[];
@@ -47,5 +50,18 @@ export declare function Composer({ value, onChange, onSend, onStop, running, mod
47
50
  onImageClick: (src: string) => void;
48
51
  /** Selected model's input price (USD per 1M tokens) for the live cost estimate. */
49
52
  inPrice?: number;
53
+ /** Show the context chips + "+ context" affordance. Off for surfaces with no context
54
+ * concept (e.g. Craft), so the row doesn't render a dead button. Default on. */
55
+ showContext?: boolean;
56
+ /** Files dropped onto the composer (the host routes text->context docs,
57
+ * images->attachments). Omitted = drops are ignored as before. */
58
+ onDropFiles?: (files: File[]) => void;
59
+ /** Everything Up/Down recall, oldest first. Omitted = no recall, so a surface
60
+ * without a transcript is unaffected. */
61
+ history?: string[];
62
+ /** Rendered immediately before Send -- the send-later control. Injected rather
63
+ * than imported so this component stays presentational and a surface with no
64
+ * queue (Craft) simply omits it. */
65
+ sendLater?: React.ReactNode;
50
66
  }): React.JSX.Element;
51
67
  //# sourceMappingURL=Composer.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../Composer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgE,MAAM,OAAO,CAAC;AAOrF,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;AAU3H,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,EAAE,WAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GACxE,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;0EACsE;IACtE,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,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;IACjB;oFACgF;IAChF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;sEACkE;IAClE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACtC;6CACyC;IACzC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;wCAEoC;IACpC,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B,qBA4QA"}
package/dist/Composer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useRef, useEffect, useLayoutEffect } from 'react';
2
+ import { useState, useRef, useEffect, useLayoutEffect, useMemo } from 'react';
3
3
  import { IcPlay, IcStop, IcX, IcFile, IcCode, IcPlus, IcChevron } from '@corenel/ui-kit/icons';
4
4
  import { estimateTokens } from '@corenel/ui-kit/ui-helpers';
5
5
  import { fmtCost, fmtTok } from '@corenel/ui-kit/usage';
@@ -25,6 +25,10 @@ export const MODES = DEFAULT_MODES.map((m) => m.id);
25
25
  export function modeAccent(m) { return m.accent || BUILTIN_MODE_GRAD[m.id] || 'var(--grad-mode-auto)'; }
26
26
  // Auto-grow cap for the composer textarea: it grows with content up to here, then scrolls.
27
27
  const TEXTAREA_MAX_H = 220;
28
+ // Touch devices get a placeholder without the keyboard-shortcut hints (⏎/⇧⏎/⌘⏎).
29
+ // Primary-pointer coarseness doesn't change at runtime, so a module const is enough
30
+ // (same pattern as editor/inlineAssist).
31
+ const COARSE_POINTER = typeof matchMedia !== 'undefined' && matchMedia('(pointer: coarse)').matches;
28
32
  /** Group commands by section, preserving first-seen order; '' sections render unlabeled. */
29
33
  function groupBySection(cmds) {
30
34
  const order = [];
@@ -39,8 +43,19 @@ function groupBySection(cmds) {
39
43
  }
40
44
  return order.map((s) => [s, map.get(s)]);
41
45
  }
42
- export function Composer({ value, onChange, onSend, onStop, running, mode, onModeChange, modes = DEFAULT_MODES, chips, onRemoveChip, onAddContext, slashCommands, onPickSlash, attachments, onAttach, onRemoveAttachment, onImageClick, inPrice, }) {
46
+ export function Composer({ value, onChange, onSend, onStop, running, mode, onModeChange, modes = DEFAULT_MODES, chips, onRemoveChip, onAddContext, slashCommands, onPickSlash, attachments, onAttach, onRemoveAttachment, onImageClick, inPrice, showContext = true, onDropFiles, rightSlot, history, sendLater, }) {
47
+ // Named because it is used to decide which LINE the caret sits on, which is
48
+ // the whole of the Up/Down rule below.
49
+ const NEWLINE = '\n';
43
50
  const [slashHidden, setSlashHidden] = useState(false);
51
+ /* Where we are in the recalled history. -1 is "not recalling" - the live
52
+ * draft. Held in a ref rather than state because it is read inside the key
53
+ * handler and must reflect the last keystroke, not the last render. */
54
+ const histIdx = useRef(-1);
55
+ /* The draft stashed when recall started, restored on the way back past the
56
+ * newest entry. Losing a half-typed message to a stray Up is the failure that
57
+ * would make people stop trusting the key. */
58
+ const histDraft = useRef('');
44
59
  const [slashActive, setSlashActive] = useState(0);
45
60
  // Auto-grow the textarea with its content: from a 3-line resting height up to a
46
61
  // cap, after which it scrolls. Runs before paint (no flicker) on every value
@@ -66,7 +81,9 @@ export function Composer({ value, onChange, onSend, onStop, running, mode, onMod
66
81
  const curMode = modeList.find((mm) => mm.id === mode) ?? { id: mode, label: mode || 'auto', description: '' };
67
82
  // Live, rough estimate of THIS message's input cost (text only): est tokens x the
68
83
  // selected model's input price. A pre-send sanity check, not a billed figure.
69
- const estTok = value.trim() ? estimateTokens(value) : 0;
84
+ // Memoized on the draft: with BPE counts enabled a count is a real encode, and
85
+ // the composer re-renders for plenty of non-text reasons (mode, run state).
86
+ const estTok = useMemo(() => (value.trim() ? estimateTokens(value) : 0), [value]);
70
87
  const estCost = inPrice && estTok ? (estTok / 1e6) * inPrice : null;
71
88
  // Paste images straight into the composer → data-URL previews (before upload).
72
89
  const readAsDataUrl = (f) => new Promise((res) => {
@@ -101,10 +118,23 @@ export function Composer({ value, onChange, onSend, onStop, running, mode, onMod
101
118
  document.addEventListener('mousedown', onDoc);
102
119
  return () => document.removeEventListener('mousedown', onDoc);
103
120
  }, [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) => {
121
+ return (_jsxs("div", { style: S.wrap, "data-testid": "composer-wrap", onDragOver: onDropFiles ? (e) => { e.preventDefault(); } : undefined, onDrop: onDropFiles ? (e) => {
122
+ const files = Array.from(e.dataTransfer?.files ?? []);
123
+ if (files.length) {
124
+ e.preventDefault();
125
+ onDropFiles(files);
126
+ }
127
+ } : undefined, 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
128
  const idx = filtered.indexOf(c);
106
129
  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) => {
130
+ })] }, section || '_'))), _jsxs("div", { style: S.slashFoot, children: [_jsx("span", { children: "\u2191\u2193 navigate" }), _jsx("span", { children: "\u21B5 select" }), _jsx("span", { children: "esc dismiss" })] })] })), (showContext || chips.length > 0 || rightSlot) && (_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))), showContext && _jsxs("button", { style: S.addCtx, onClick: onAddContext, title: "Add context", children: [_jsx(IcPlus, { size: 11 }), " context"] }), rightSlot && _jsx("span", { style: S.chipsRight, children: rightSlot })] })), 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) => {
131
+ setSlashHidden(false);
132
+ // Typing leaves the history: what is in the box is now a draft, and a
133
+ // later Down should not jump to an entry the user has since edited
134
+ // away from.
135
+ histIdx.current = -1;
136
+ onChange(e.target.value);
137
+ }, onPaste: onPaste, onKeyDown: (e) => {
108
138
  // While the "/" menu is open it owns the arrows + Enter/Tab/Escape, so a
109
139
  // command can be navigated and picked without leaving the keyboard.
110
140
  if (showSlash && filtered.length > 0) {
@@ -129,6 +159,51 @@ export function Composer({ value, onChange, onSend, onStop, running, mode, onMod
129
159
  return;
130
160
  }
131
161
  }
162
+ /* Up/Down recall previous messages, the way a shell does.
163
+ *
164
+ * ONLY FROM THE EDGES OF THE DRAFT. Up recalls when the caret is on
165
+ * the first line and Down when it is on the last, because otherwise
166
+ * the arrows could not move through a multi-line message you are
167
+ * still writing - and a composer that will not let you navigate your
168
+ * own text is a worse trade than no history at all. A selection is
169
+ * left alone for the same reason.
170
+ *
171
+ * The slash menu above claims the arrows first while it is open, so
172
+ * this cannot steal them from command navigation.
173
+ */
174
+ if ((e.key === 'ArrowUp' || e.key === 'ArrowDown') && history && history.length > 0
175
+ && !e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey) {
176
+ const el = e.currentTarget;
177
+ const at = el.selectionStart;
178
+ const noSelection = at === el.selectionEnd;
179
+ const onFirstLine = !value.slice(0, at).includes(NEWLINE);
180
+ const onLastLine = !value.slice(at).includes(NEWLINE);
181
+ const stepBack = e.key === 'ArrowUp' && noSelection && onFirstLine;
182
+ const stepForward = e.key === 'ArrowDown' && noSelection && onLastLine && histIdx.current >= 0;
183
+ if (stepBack || stepForward) {
184
+ e.preventDefault();
185
+ // Stash the live draft on the way in, so stepping back past the
186
+ // newest entry returns what you were writing.
187
+ if (histIdx.current < 0)
188
+ histDraft.current = value;
189
+ const next = stepBack
190
+ ? Math.min(histIdx.current + 1, history.length - 1)
191
+ : histIdx.current - 1;
192
+ histIdx.current = next;
193
+ const text = next < 0 ? histDraft.current : history[history.length - 1 - next];
194
+ onChange(text);
195
+ setSlashHidden(true);
196
+ // Caret to the end, as a shell does: the common case is a
197
+ // single-line entry you want to edit or resend immediately, and
198
+ // end-of-text leaves the next Up still on the first line.
199
+ requestAnimationFrame(() => {
200
+ const t = textareaRef.current;
201
+ if (t)
202
+ t.setSelectionRange(text.length, text.length);
203
+ });
204
+ return;
205
+ }
206
+ }
132
207
  if (e.key !== 'Enter')
133
208
  return;
134
209
  // ⌘/Ctrl+Enter: don't send — let it bubble to the editor's global handler
@@ -138,8 +213,17 @@ export function Composer({ value, onChange, onSend, onStop, running, mode, onMod
138
213
  if (!canSend)
139
214
  return;
140
215
  e.preventDefault();
216
+ histIdx.current = -1;
217
+ histDraft.current = '';
141
218
  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"] }))] })] })] }));
219
+ }, placeholder: COARSE_POINTER
220
+ ? 'Ask the agent… · paste a screenshot'
221
+ : 'Ask the agent… · paste a screenshot · ↵ send · ⇧↵ newline · ⌘↵ run', rows: 3 }), _jsxs("div", { style: S.bottom, children: [!running && sendLater, 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"] })) : (
222
+ // One primary per app: a host that declares --grad-send (corenel.ai)
223
+ // paints Send like every other primary button, and mode colour stays
224
+ // on the dot. Without it (prompd.app) this falls back to the mode
225
+ // gradient, which is the historical behaviour.
226
+ _jsxs("button", { style: { ...S.sendBtn, background: `var(--grad-send, ${modeAccent(curMode)})`, color: 'var(--text-on-accent, #fff)' }, onClick: onSend, disabled: !canSend, children: [_jsx(IcPlay, { size: 12 }), " Send"] }))] })] })] }));
143
227
  }
144
228
  const S = {
145
229
  wrap: { position: 'relative', borderTop: '1px solid var(--border-subtle)', background: 'var(--surface-1)', padding: 10, display: 'flex', flexDirection: 'column', gap: 8 },
@@ -151,6 +235,9 @@ const S = {
151
235
  slashSection: { padding: '6px 9px 3px', fontSize: 10.5, fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.07em', color: 'var(--text-tertiary)' },
152
236
  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
237
  chips: { display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' },
238
+ // marginLeft:auto pushes it to the right edge; minWidth:0 lets its own contents
239
+ // truncate rather than shoving the context chips off the row.
240
+ chipsRight: { marginLeft: 'auto', minWidth: 0, maxWidth: '60%', display: 'flex', justifyContent: 'flex-end' },
154
241
  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
242
  chipLabel: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },
156
243
  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 },