zelari-code 1.7.1 → 1.8.2

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 (42) hide show
  1. package/dist/cli/app.js +48 -19
  2. package/dist/cli/app.js.map +1 -1
  3. package/dist/cli/browser/driver.js +58 -10
  4. package/dist/cli/browser/driver.js.map +1 -1
  5. package/dist/cli/browser/tools.js +4 -1
  6. package/dist/cli/browser/tools.js.map +1 -1
  7. package/dist/cli/budget/tokenBudget.js +92 -0
  8. package/dist/cli/budget/tokenBudget.js.map +1 -0
  9. package/dist/cli/components/LiveRegion.js +9 -1
  10. package/dist/cli/components/LiveRegion.js.map +1 -1
  11. package/dist/cli/components/PluginGate.js +24 -1
  12. package/dist/cli/components/PluginGate.js.map +1 -1
  13. package/dist/cli/components/Sidebar.js +44 -37
  14. package/dist/cli/components/Sidebar.js.map +1 -1
  15. package/dist/cli/components/StatusBar.js +18 -3
  16. package/dist/cli/components/StatusBar.js.map +1 -1
  17. package/dist/cli/components/brandArt.js +62 -0
  18. package/dist/cli/components/brandArt.js.map +1 -0
  19. package/dist/cli/councilDispatcher.js +3 -0
  20. package/dist/cli/councilDispatcher.js.map +1 -1
  21. package/dist/cli/hooks/conversationContext.js +136 -0
  22. package/dist/cli/hooks/conversationContext.js.map +1 -0
  23. package/dist/cli/hooks/useChatTurn.js +193 -74
  24. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  25. package/dist/cli/hooks/useSlashDispatch.js +55 -0
  26. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  27. package/dist/cli/hooks/useTerminalSize.js +17 -10
  28. package/dist/cli/hooks/useTerminalSize.js.map +1 -1
  29. package/dist/cli/main.bundled.js +1386 -493
  30. package/dist/cli/main.bundled.js.map +4 -4
  31. package/dist/cli/phase.js +52 -0
  32. package/dist/cli/phase.js.map +1 -0
  33. package/dist/cli/phaseState.js +12 -0
  34. package/dist/cli/phaseState.js.map +1 -0
  35. package/dist/cli/plugins/registry.js +90 -37
  36. package/dist/cli/plugins/registry.js.map +1 -1
  37. package/dist/cli/slashCommands.js +22 -0
  38. package/dist/cli/slashCommands.js.map +1 -1
  39. package/dist/cli/slashHandlers/provider.js.map +1 -1
  40. package/dist/cli/toolRegistry.js +3 -2
  41. package/dist/cli/toolRegistry.js.map +1 -1
  42. package/package.json +2 -2
@@ -1,36 +1,50 @@
1
1
  import React from 'react';
2
2
  import { Box, Text } from 'ink';
3
- /**
4
- * The N-THEM emblem as Braille art (v0.7.9). Each Braille cell packs a 2×4
5
- * dot grid, so this reads ~4× denser than the ASCII `EMBLEM_MICRO` it
6
- * replaces while using fewer rows (9 vs 12). Generated by thresholding the
7
- * splash `EMBLEM_LARGE` glyph densities and resampling to 48×36 dots.
8
- */
9
- const EMBLEM_BRAILLE = `⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣷⣆⡀
10
- ⠀⠀⠀⠀⠀⠀⠀⢀⣶⣿⣿⣿⣿⣿⣿⣦⡀
11
- ⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦
12
- ⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄
13
- ⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⠙⠻⣿⣿⣿⣿⣿⣿⠆
14
- ⠀⠀⠀⠀⣈⣿⣿⣿⣿⣿⣿⣿⠀⣷⣬⡛⢿⣿⣟⣁
15
- ⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⡿⢿⡿⢃⣈⣻⣿⣿⣶
16
- ⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣠⣴⣆⠻⠎⢿⣿⣿⣿⣿⣧
17
- ⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇`;
18
3
  /** Column width of the sidebar (border + padding included). */
19
4
  export const SIDEBAR_WIDTH = 28;
20
5
  /** Sidebar only renders on terminals at least this wide. */
21
6
  export const SIDEBAR_MIN_COLUMNS = 96;
22
- /** The Braille emblem is added only when the terminal is at least this tall. */
23
- const EMBLEM_MIN_ROWS = 26;
7
+ /**
8
+ * Hysteresis floor: once visible, stay visible until width drops below this.
9
+ * Prevents show/hide thrash while the user drags the window across 96 cols
10
+ * (each toggle reflows the dynamic region and can trash Static scrollback).
11
+ */
12
+ export const SIDEBAR_HIDE_COLUMNS = 88;
13
+ /** Min rows to show; hide below this. */
14
+ export const SIDEBAR_MIN_ROWS = 16;
15
+ export const SIDEBAR_HIDE_ROWS = 14;
24
16
  /** Max file rows before collapsing to "+N more". */
25
- const MAX_FILES_SHORT = 6;
26
- const MAX_FILES_TALL = 10;
17
+ const MAX_FILES_SHORT = 4;
18
+ const MAX_FILES_TALL = 8;
19
+ /** Absolute cap: sidebar chrome + files must stay short vs terminal rows. */
20
+ const SIDEBAR_CHROME_LINES = 4;
27
21
  /**
28
22
  * Pure helper: should the sidebar render at all? It lives in the dynamic
29
23
  * region (Ink repaints it), so it must never make that region taller than
30
24
  * the terminal — narrow or tiny panes skip it entirely.
25
+ *
26
+ * Prefer {@link sidebarVisibility} when you have the previous visibility
27
+ * (hysteresis). This boolean form is the strict "enter" threshold.
31
28
  */
32
29
  export function shouldShowSidebar(columns, rows) {
33
- return columns >= SIDEBAR_MIN_COLUMNS && rows >= 16;
30
+ return columns >= SIDEBAR_MIN_COLUMNS && rows >= SIDEBAR_MIN_ROWS;
31
+ }
32
+ /**
33
+ * Hysteresis visibility: once shown, requires a clearer "leave" signal
34
+ * (narrower / shorter) before hiding — stops resize-edge flicker.
35
+ */
36
+ export function sidebarVisibility(columns, rows, currentlyVisible) {
37
+ if (currentlyVisible) {
38
+ return columns >= SIDEBAR_HIDE_COLUMNS && rows >= SIDEBAR_HIDE_ROWS;
39
+ }
40
+ return shouldShowSidebar(columns, rows);
41
+ }
42
+ /** How many file rows fit without blowing the dynamic-region budget. */
43
+ export function maxSidebarFiles(rows) {
44
+ // Reserve room for LiveRegion (~12) + input + status + chrome.
45
+ const budget = Math.max(2, rows - 14 - SIDEBAR_CHROME_LINES);
46
+ const cap = rows >= 28 ? MAX_FILES_TALL : MAX_FILES_SHORT;
47
+ return Math.min(cap, budget);
34
48
  }
35
49
  /** Truncate a repo-relative path to `max` chars keeping the tail (filename). */
36
50
  export function truncatePath(p, max) {
@@ -39,32 +53,25 @@ export function truncatePath(p, max) {
39
53
  return `…${p.slice(-(max - 1))}`;
40
54
  }
41
55
  /**
42
- * Sidebar — right-hand column of the dynamic region (v0.7.9).
56
+ * Sidebar — right-hand column of the dynamic region (v0.7.9 / v1.8.0).
43
57
  *
44
- * Shows the Braille N-THEM emblem (on tall terminals), the wordmark + version, and
45
- * the current git working-tree changes with +added/-removed line counts
46
- * (from `useGitChanges`). It CANNOT span the scrollback area — finalized
47
- * messages are printed natively via <Static> — so it docks next to the
48
- * live/status/input block at the bottom, which Ink owns and repaints.
58
+ * v1.8.0: brand (logo + version) moved to StatusBar top-right strip. This
59
+ * panel is now **git changes only** so it stays short in the dynamic region
60
+ * (static-scrollback model cannot float a logo over the scrollback).
49
61
  */
50
62
  export function Sidebar({ version, changes, rows }) {
51
- const showEmblem = rows >= EMBLEM_MIN_ROWS;
52
- const maxFiles = rows >= EMBLEM_MIN_ROWS + 8 ? MAX_FILES_TALL : MAX_FILES_SHORT;
63
+ void version; // brand lives in StatusBar; keep prop for API stability
64
+ const maxFiles = maxSidebarFiles(rows);
53
65
  const visible = changes.files.slice(0, maxFiles);
54
66
  const hidden = changes.files.length - visible.length;
55
67
  // Width available for the path inside the box: total − border(2) − padding(2)
56
68
  // − the " +NNN -NNN" tail (~11 chars).
57
69
  const innerWidth = SIDEBAR_WIDTH - 4;
58
- return (React.createElement(Box, { flexDirection: "column", width: SIDEBAR_WIDTH, borderStyle: "single", borderColor: "gray", paddingX: 1, flexShrink: 0 },
59
- showEmblem && (React.createElement(Box, { justifyContent: "center" },
60
- React.createElement(Text, { color: "cyan" }, EMBLEM_BRAILLE))),
70
+ return (React.createElement(Box, { flexDirection: "column", width: SIDEBAR_WIDTH, borderStyle: "single", borderColor: "gray", paddingX: 1, flexShrink: 0,
71
+ // Hard cap so a huge git status never makes Ink clear the whole screen.
72
+ height: Math.min(rows - 8, SIDEBAR_CHROME_LINES + maxFiles + 2), overflow: "hidden" },
61
73
  React.createElement(Box, { justifyContent: "center" },
62
- React.createElement(Text, { bold: true, color: "white" }, "ZELARI CODE")),
63
- React.createElement(Box, { justifyContent: "center" },
64
- React.createElement(Text, { dimColor: true },
65
- "v",
66
- version,
67
- changes.branch ? ` · ${truncatePath(changes.branch, 12)}` : '')),
74
+ React.createElement(Text, { dimColor: true }, changes.branch ? truncatePath(changes.branch, 18) : 'git')),
68
75
  React.createElement(Text, { dimColor: true }, '─'.repeat(innerWidth)),
69
76
  !changes.isRepo ? (React.createElement(Text, { dimColor: true, italic: true }, "not a git repo")) : changes.files.length === 0 ? (React.createElement(Text, { dimColor: true, italic: true }, "no changes")) : (React.createElement(React.Fragment, null,
70
77
  React.createElement(Text, { dimColor: true },
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/cli/components/Sidebar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/cli/components/Sidebar.tsx"],"names":[],"mappings":"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"}
@@ -16,14 +16,20 @@ import { Spinner } from './Spinner.js';
16
16
  * region as short as possible. A single status line + the input bar + the
17
17
  * streaming tail is always well under a screen, so no full repaint.
18
18
  */
19
- export function StatusBar({ model, provider, sessionId, sessionActive, queueCount = 0, busy = false, mode = 'agent', cwd, elapsedMs = null, lastMs = null, costUsd = 0, cachedTokens = 0, }) {
19
+ export function StatusBar({ model, provider, sessionId, sessionActive, queueCount = 0, busy = false, mode = 'agent', phase = 'build', cwd, elapsedMs = null, lastMs = null, costUsd = 0, cachedTokens = 0, contextUsed = 0, contextLimit = 0, brandVersion, }) {
20
+ const ctxLabel = contextLimit > 0
21
+ ? `${formatTokens(contextUsed)}/${formatTokens(contextLimit)}`
22
+ : contextUsed > 0
23
+ ? formatTokens(contextUsed)
24
+ : null;
20
25
  return (React.createElement(Box, { paddingX: 1, width: "100%", justifyContent: "space-between", gap: 2 },
21
26
  React.createElement(Box, { flexShrink: 2 },
22
27
  React.createElement(Text, { wrap: "truncate" },
23
28
  React.createElement(Text, { color: sessionActive ? 'green' : 'gray' }, sessionActive ? '●' : '○'),
24
29
  React.createElement(Text, { dimColor: true }, " "),
25
- React.createElement(Text, { bold: true, color: mode === 'council' ? 'magenta' : mode === 'zelari' ? 'green' : 'cyan' }, mode === 'council' ? ' council' : mode === 'zelari' ? '⚡ zelari' : '⏵ agent'),
26
- React.createElement(Text, { dimColor: true }, " (shift+tab)"),
30
+ React.createElement(Text, { bold: true, color: phase === 'plan' ? 'yellow' : 'green' }, phase === 'plan' ? ' plan' : ' build'),
31
+ React.createElement(Text, { dimColor: true }, " \u00B7 "),
32
+ React.createElement(Text, { bold: true, color: mode === 'council' ? 'magenta' : mode === 'zelari' ? 'green' : 'cyan' }, mode === 'council' ? 'council' : mode === 'zelari' ? 'zelari' : 'agent'),
27
33
  React.createElement(Text, { dimColor: true }, " \u00B7 "),
28
34
  React.createElement(Text, { bold: true, color: "cyan" }, provider),
29
35
  React.createElement(Text, { dimColor: true }, " \u00B7 "),
@@ -48,6 +54,9 @@ export function StatusBar({ model, provider, sessionId, sessionActive, queueCoun
48
54
  "queue ",
49
55
  queueCount),
50
56
  React.createElement(Text, { dimColor: true }, " \u00B7 "))) : null,
57
+ ctxLabel ? (React.createElement(React.Fragment, null,
58
+ React.createElement(Text, { color: "cyan" }, ctxLabel),
59
+ React.createElement(Text, { dimColor: true }, " \u00B7 "))) : null,
51
60
  costUsd > 0 ? (React.createElement(React.Fragment, null,
52
61
  React.createElement(Text, { color: "green" }, formatCost(costUsd)),
53
62
  cachedTokens > 0 ? (React.createElement(Text, { dimColor: true },
@@ -55,6 +64,12 @@ export function StatusBar({ model, provider, sessionId, sessionActive, queueCoun
55
64
  formatTokens(cachedTokens),
56
65
  " cached)")) : null,
57
66
  React.createElement(Text, { dimColor: true }, " \u00B7 "))) : null,
67
+ brandVersion ? (React.createElement(React.Fragment, null,
68
+ React.createElement(Text, { bold: true, color: "white" }, "ZELARI"),
69
+ React.createElement(Text, { dimColor: true },
70
+ " v",
71
+ brandVersion),
72
+ React.createElement(Text, { dimColor: true }, " \u00B7 "))) : null,
58
73
  React.createElement(Text, { dimColor: true },
59
74
  "session ",
60
75
  sessionId)))));
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/cli/components/StatusBar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/cli/components/StatusBar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * brandArt — Zelari CODE ASCII emblem for the TUI banner (top-right).
3
+ *
4
+ * Kept pure (no React) so the Static banner can compose a multi-line string
5
+ * with the logo right-aligned without Ink layout constraints.
6
+ *
7
+ * Source: compact splash art (EMBLEM_MICRO lineage) — the classic %-glyph logo.
8
+ */
9
+ /** Classic ASCII emblem (trimmed for right-alignment). */
10
+ export const BRAND_LOGO_ASCII = [
11
+ ' -#%=',
12
+ ' +%%%%#.',
13
+ ' :#%%%%%%%-',
14
+ ':%%@@@@@@@@=',
15
+ '-%@@@@@@@@@@@+',
16
+ ':%@@@@@@%@@@@@@=',
17
+ '-%%@@@@@.+%@@%@+',
18
+ ' -@@@@@@:%++%@=',
19
+ '=*%@@@@@@:@@%=*@#+.',
20
+ '%%%%%@@@@:+++-*%@@*',
21
+ '.%%%%%@@@@@+%+=:%@@@@:',
22
+ '*@@@@@@@@@@@@@%@@@@@@*',
23
+ ].join('\n');
24
+ /** Compact 4-line mark for narrow terminals. */
25
+ export const BRAND_LOGO_COMPACT = [
26
+ ' -#%=',
27
+ ' +%%%%#.',
28
+ ':%%@@@@=',
29
+ '*@@@@@@*',
30
+ ].join('\n');
31
+ /**
32
+ * Compose a multi-line banner: left column (meta) top-aligned, logo block
33
+ * right-aligned within `columns`.
34
+ */
35
+ export function formatBannerWithLogoRight(opts) {
36
+ const logoSrc = opts.compact ? BRAND_LOGO_COMPACT : BRAND_LOGO_ASCII;
37
+ const logoLines = logoSrc.split('\n');
38
+ const logoWidth = Math.max(...logoLines.map((l) => l.length));
39
+ const cols = Math.max(logoWidth + 20, Math.min(opts.columns, 120));
40
+ const left = [...opts.leftLines];
41
+ // Wordmark under the logo, right-aligned with the art.
42
+ const wordmark = `ZELARI CODE v${opts.version}`;
43
+ const rightExtra = [wordmark];
44
+ const rightBlock = [...logoLines, ...rightExtra];
45
+ const rows = Math.max(left.length, rightBlock.length);
46
+ const out = [];
47
+ for (let i = 0; i < rows; i++) {
48
+ const L = left[i] ?? '';
49
+ const R = rightBlock[i] ?? '';
50
+ if (!R) {
51
+ out.push(L);
52
+ continue;
53
+ }
54
+ // Right-align R within cols; leave at least 2 spaces after L when both present.
55
+ const maxLeft = Math.max(0, cols - R.length - 2);
56
+ const leftClipped = L.length > maxLeft ? L.slice(0, Math.max(0, maxLeft - 1)) + '…' : L;
57
+ const pad = Math.max(2, cols - leftClipped.length - R.length);
58
+ out.push(leftClipped + ' '.repeat(pad) + R);
59
+ }
60
+ return out.join('\n');
61
+ }
62
+ //# sourceMappingURL=brandArt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brandArt.js","sourceRoot":"","sources":["../../../src/cli/components/brandArt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,YAAY;IACZ,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,qBAAqB;IACrB,qBAAqB;IACrB,wBAAwB;IACxB,wBAAwB;CACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,gDAAgD;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ;IACR,UAAU;IACV,UAAU;IACV,UAAU;CACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAMzC;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEnE,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,uDAAuD;IACvD,MAAM,QAAQ,GAAG,iBAAiB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE9B,MAAM,UAAU,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QACD,gFAAgF;QAChF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -79,6 +79,9 @@ export async function* dispatchCouncil(userMessage, options) {
79
79
  if (options.onCouncilStatus) {
80
80
  callbacks.onCouncilStatus = options.onCouncilStatus;
81
81
  }
82
+ if (options.onClarification) {
83
+ callbacks.onClarification = options.onClarification;
84
+ }
82
85
  yield* runCouncilPure(userMessage, config, callbacks);
83
86
  }
84
87
  //# sourceMappingURL=councilDispatcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"councilDispatcher.js","sourceRoot":"","sources":["../../src/cli/councilDispatcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"councilDispatcher.js","sourceRoot":"","sources":["../../src/cli/councilDispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * conversationContext — shared rolling provider history for all dispatch modes
3
+ * (agent / council / zelari).
4
+ *
5
+ * v1.6.0 fixed single-agent context loss with an in-hook historyRef. That left
6
+ * council/zelari stateless across turns, and /clear|/new never reset history —
7
+ * so the model could still "forget" answers or leak prior sessions.
8
+ *
9
+ * This module is the single source of truth for provider-side AgentMessage[]
10
+ * history. Hooks read/write it; slash handlers call clear() on /clear|/new.
11
+ *
12
+ * @since v1.8.0 (PR-A context unification)
13
+ */
14
+ import { compactHistory } from './historyCompaction.js';
15
+ let history = [];
16
+ let lastClarification = null;
17
+ /** Current rolling history (read-only view — callers must not mutate). */
18
+ export function getHistory() {
19
+ return history;
20
+ }
21
+ /** Replace history after compaction / hydrate. */
22
+ export function setHistory(messages) {
23
+ history = [...messages];
24
+ }
25
+ /** Compact in place using the same rules as the agent loop. */
26
+ export function compactInPlace() {
27
+ history = compactHistory(history);
28
+ }
29
+ /** Append messages (e.g. this turn's assistant+tool tail). */
30
+ export function appendMessages(msgs) {
31
+ if (msgs.length === 0)
32
+ return;
33
+ history = history.concat(msgs);
34
+ }
35
+ /** Drop everything ( /clear, /new ). */
36
+ export function clearHistory() {
37
+ history = [];
38
+ lastClarification = null;
39
+ }
40
+ /** Serialize for session sidecar / tests. */
41
+ export function serializeHistory() {
42
+ return [...history];
43
+ }
44
+ /** Hydrate from session restore. */
45
+ export function hydrateHistory(messages) {
46
+ history = [...messages];
47
+ }
48
+ export function getLastClarification() {
49
+ return lastClarification;
50
+ }
51
+ export function setLastClarification(c) {
52
+ lastClarification = c
53
+ ? { question: c.question, choices: c.choices, at: Date.now() }
54
+ : null;
55
+ }
56
+ /**
57
+ * If the user sends a short reply that likely answers the last clarifying
58
+ * question, return a rewritten user message that re-anchors the question so
59
+ * the model cannot treat "full" / "2" / "sì" as a brand-new request.
60
+ *
61
+ * Returns null when no rewrite is needed (long free-form message, no prior
62
+ * question, or history already carries enough context).
63
+ */
64
+ export function maybeAnchorShortAnswer(userText) {
65
+ const clar = lastClarification;
66
+ if (!clar)
67
+ return null;
68
+ const trimmed = userText.trim();
69
+ if (!trimmed)
70
+ return null;
71
+ // Long free-form answers already carry intent — don't wrap.
72
+ if (trimmed.length > 80 || trimmed.includes('\n'))
73
+ return null;
74
+ const lower = trimmed.toLowerCase();
75
+ const choices = clar.choices;
76
+ const matched = choices.find((c) => c.toLowerCase() === lower) ??
77
+ choices.find((c) => c.toLowerCase().startsWith(lower)) ??
78
+ choices.find((c) => lower.startsWith(c.toLowerCase().slice(0, Math.min(4, c.length))));
79
+ // Also treat numeric picks ("1", "2") as choice indices (1-based).
80
+ let choiceLabel = matched ?? null;
81
+ if (!choiceLabel && /^\d{1,2}$/.test(trimmed)) {
82
+ const idx = Number.parseInt(trimmed, 10) - 1;
83
+ if (idx >= 0 && idx < choices.length)
84
+ choiceLabel = choices[idx] ?? null;
85
+ }
86
+ // Very short replies without a choice match still get anchored if ≤ 24 chars
87
+ // (e.g. "sì", "ok", "la seconda") — the model needs the prior question.
88
+ if (!choiceLabel && trimmed.length > 24)
89
+ return null;
90
+ const picked = choiceLabel ?? trimmed;
91
+ return (`The user is answering your previous clarifying question.\n` +
92
+ `Question: ${clar.question}\n` +
93
+ `Choices were: ${choices.join(' | ')}\n` +
94
+ `User's answer: ${picked}\n` +
95
+ `Proceed using this answer; do not re-ask the same question unless the answer is still ambiguous.`);
96
+ }
97
+ /**
98
+ * Build a compact text block of recent conversation for council/zelari paths
99
+ * that do not feed full AgentMessage[] into every member (token control).
100
+ * Includes the last few user/assistant turns only.
101
+ */
102
+ export function formatHistoryForCouncil(maxTurns = 4) {
103
+ if (history.length === 0)
104
+ return '';
105
+ const lines = [];
106
+ // Walk from the end; collect up to maxTurns user+assistant pairs.
107
+ let turns = 0;
108
+ const chunk = [];
109
+ for (let i = history.length - 1; i >= 0 && turns < maxTurns; i--) {
110
+ const m = history[i];
111
+ if (m.role === 'user') {
112
+ chunk.push(`User: ${truncate(m.content, 400)}`);
113
+ turns += 1;
114
+ }
115
+ else if (m.role === 'assistant' && m.content.trim()) {
116
+ chunk.push(`Assistant: ${truncate(m.content, 600)}`);
117
+ }
118
+ }
119
+ if (chunk.length === 0)
120
+ return '';
121
+ lines.push('## Prior conversation (rolling context)');
122
+ lines.push(...chunk.reverse());
123
+ return lines.join('\n');
124
+ }
125
+ function truncate(s, max) {
126
+ const t = s.replace(/\s+/g, ' ').trim();
127
+ if (t.length <= max)
128
+ return t;
129
+ return `${t.slice(0, max - 1)}…`;
130
+ }
131
+ /** Test-only: reset module state. */
132
+ export function _resetConversationContextForTests() {
133
+ history = [];
134
+ lastClarification = null;
135
+ }
136
+ //# sourceMappingURL=conversationContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversationContext.js","sourceRoot":"","sources":["../../../src/cli/hooks/conversationContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAUxD,IAAI,OAAO,GAAmB,EAAE,CAAC;AACjC,IAAI,iBAAiB,GAA6B,IAAI,CAAC;AAEvD,0EAA0E;AAC1E,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,UAAU,CAAC,QAAiC;IAC1D,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,cAAc;IAC5B,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,cAAc,CAAC,IAA6B;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,YAAY;IAC1B,OAAO,GAAG,EAAE,CAAC;IACb,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,cAAc,CAAC,QAAiC;IAC9D,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,CAAiD;IAEjD,iBAAiB,GAAG,CAAC;QACnB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;QAC9D,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,IAAI,GAAG,iBAAiB,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,4DAA4D;IAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/D,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,MAAM,OAAO,GACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzF,mEAAmE;IACnE,IAAI,WAAW,GAAG,OAAO,IAAI,IAAI,CAAC;IAClC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM;YAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAC3E,CAAC;IAED,6EAA6E;IAC7E,wEAAwE;IACxE,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IAErD,MAAM,MAAM,GAAG,WAAW,IAAI,OAAO,CAAC;IACtC,OAAO,CACL,4DAA4D;QAC5D,aAAa,IAAI,CAAC,QAAQ,IAAI;QAC9B,iBAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;QACxC,kBAAkB,MAAM,IAAI;QAC5B,kGAAkG,CACnG,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAQ,GAAG,CAAC;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,kEAAkE;IAClE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACjE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAChD,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,GAAW;IACtC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AACnC,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,iCAAiC;IAC/C,OAAO,GAAG,EAAE,CAAC;IACb,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC"}