zelari-code 0.7.8 → 0.7.9

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 (78) hide show
  1. package/README.md +27 -1
  2. package/bin/zelari-code.js +1 -1
  3. package/dist/agents/councilApi.js +7 -7
  4. package/dist/agents/councilApi.js.map +1 -1
  5. package/dist/agents/councilDirectives.js +3 -3
  6. package/dist/agents/promoteMember.js +2 -2
  7. package/dist/agents/roles.js +50 -32
  8. package/dist/agents/roles.js.map +1 -1
  9. package/dist/agents/skills/builtin/debugging.js +4 -4
  10. package/dist/agents/skills/builtin/debugging.js.map +1 -1
  11. package/dist/agents/skills/builtin/docs.js +23 -13
  12. package/dist/agents/skills/builtin/docs.js.map +1 -1
  13. package/dist/agents/skills/builtin/git-ops.js +3 -3
  14. package/dist/agents/skills/builtin/git-ops.js.map +1 -1
  15. package/dist/agents/skills/builtin/planning.js +4 -4
  16. package/dist/agents/skills/builtin/planning.js.map +1 -1
  17. package/dist/agents/skills/builtin/refactoring.js +3 -3
  18. package/dist/agents/skills/builtin/refactoring.js.map +1 -1
  19. package/dist/agents/skills/builtin/review.js +9 -9
  20. package/dist/agents/skills/builtin/review.js.map +1 -1
  21. package/dist/agents/skills/builtin/testing.js +3 -3
  22. package/dist/agents/skills/builtin/testing.js.map +1 -1
  23. package/dist/agents/tools.js +2 -9
  24. package/dist/agents/tools.js.map +1 -1
  25. package/dist/cli/app.js +48 -17
  26. package/dist/cli/app.js.map +1 -1
  27. package/dist/cli/components/CollapsibleToolOutput.js +8 -26
  28. package/dist/cli/components/CollapsibleToolOutput.js.map +1 -1
  29. package/dist/cli/components/Header.js +6 -18
  30. package/dist/cli/components/Header.js.map +1 -1
  31. package/dist/cli/components/Sidebar.js +86 -37
  32. package/dist/cli/components/Sidebar.js.map +1 -1
  33. package/dist/cli/components/SplashScreen.js +117 -71
  34. package/dist/cli/components/SplashScreen.js.map +1 -1
  35. package/dist/cli/components/StatusBar.js +22 -18
  36. package/dist/cli/components/StatusBar.js.map +1 -1
  37. package/dist/cli/councilConfig.js +38 -0
  38. package/dist/cli/councilConfig.js.map +1 -0
  39. package/dist/cli/councilDispatcher.js +35 -49
  40. package/dist/cli/councilDispatcher.js.map +1 -1
  41. package/dist/cli/hooks/useChatTurn.js +80 -61
  42. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  43. package/dist/cli/hooks/useExecutionTimer.js +25 -0
  44. package/dist/cli/hooks/useExecutionTimer.js.map +1 -0
  45. package/dist/cli/hooks/useGitChanges.js +142 -0
  46. package/dist/cli/hooks/useGitChanges.js.map +1 -0
  47. package/dist/cli/hooks/useSlashDispatch.js +9 -2
  48. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  49. package/dist/cli/main.bundled.js +1668 -1151
  50. package/dist/cli/main.bundled.js.map +4 -4
  51. package/dist/cli/main.js +1 -1
  52. package/dist/cli/mcp/mcpClient.js +14 -6
  53. package/dist/cli/mcp/mcpClient.js.map +1 -1
  54. package/dist/cli/updater.js +8 -5
  55. package/dist/cli/updater.js.map +1 -1
  56. package/dist/cli/utils/cmdline.js +26 -0
  57. package/dist/cli/utils/cmdline.js.map +1 -0
  58. package/dist/cli/utils/paths.js +20 -0
  59. package/dist/cli/utils/paths.js.map +1 -0
  60. package/dist/cli/workspace/planDetect.js +17 -0
  61. package/dist/cli/workspace/planDetect.js.map +1 -0
  62. package/dist/cli/workspace/postCouncilHook.js +39 -28
  63. package/dist/cli/workspace/postCouncilHook.js.map +1 -1
  64. package/dist/cli/workspace/stubs.js +241 -196
  65. package/dist/cli/workspace/stubs.js.map +1 -1
  66. package/dist/main/core/AgentHarness.js +36 -7
  67. package/dist/main/core/AgentHarness.js.map +1 -1
  68. package/dist/main/core/tools/builtin/listFiles.js +43 -5
  69. package/dist/main/core/tools/builtin/listFiles.js.map +1 -1
  70. package/dist/main/core/tools/builtin/search.js +28 -120
  71. package/dist/main/core/tools/builtin/search.js.map +1 -1
  72. package/package.json +71 -71
  73. package/dist/cli/oauthCallbackServer.js +0 -207
  74. package/dist/cli/oauthCallbackServer.js.map +0 -1
  75. package/dist/main/core/tools/builtin/_walk.js +0 -129
  76. package/dist/main/core/tools/builtin/_walk.js.map +0 -1
  77. package/dist/main/core/tools/builtin/diff.js +0 -477
  78. package/dist/main/core/tools/builtin/diff.js.map +0 -1
@@ -1,44 +1,93 @@
1
1
  import React from 'react';
2
2
  import { Box, Text } from 'ink';
3
3
  /**
4
- * Sidebar showing: formatted skill list (from formatSkillList), session count,
5
- * and an indicator when the user is typing a slash command.
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
+ /** Column width of the sidebar (border + padding included). */
19
+ export const SIDEBAR_WIDTH = 28;
20
+ /** Sidebar only renders on terminals at least this wide. */
21
+ 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;
24
+ /** Max file rows before collapsing to "+N more". */
25
+ const MAX_FILES_SHORT = 6;
26
+ const MAX_FILES_TALL = 10;
27
+ /**
28
+ * Pure helper: should the sidebar render at all? It lives in the dynamic
29
+ * region (Ink repaints it), so it must never make that region taller than
30
+ * the terminal — narrow or tiny panes skip it entirely.
31
+ */
32
+ export function shouldShowSidebar(columns, rows) {
33
+ return columns >= SIDEBAR_MIN_COLUMNS && rows >= 16;
34
+ }
35
+ /** Truncate a repo-relative path to `max` chars keeping the tail (filename). */
36
+ export function truncatePath(p, max) {
37
+ if (p.length <= max)
38
+ return p;
39
+ return `…${p.slice(-(max - 1))}`;
40
+ }
41
+ /**
42
+ * Sidebar — right-hand column of the dynamic region (v0.7.9).
6
43
  *
7
- * Performance: React.memo with custom comparator. sessionCount changes only on
8
- * message append, not on every streaming delta but React.memo's default
9
- * shallow equal still triggers re-render because the parent passes a fresh
10
- * primitive int each render. The custom comparator avoids that. Sidebar also
11
- * rebuilds its visibleSkills slice via useMemo to avoid re-splitting on every
12
- * parent render.
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.
13
49
  */
14
- function SidebarImpl({ skillList, sessionCount, isSlashMode, height }) {
15
- // Truncate visible skills list to fit the available height. useMemo so we
16
- // don't re-split on every render (e.g. during streaming token deltas).
17
- const { visibleLines, truncated } = React.useMemo(() => {
18
- const lines = skillList.split('\n');
19
- const headerLines = 3 + (isSlashMode ? 1 : 0);
20
- const maxSkillLines = Math.max(2, height - headerLines - 3); // 3 for border + padding
21
- return {
22
- visibleLines: lines.slice(0, maxSkillLines),
23
- truncated: lines.length > maxSkillLines,
24
- };
25
- }, [skillList, isSlashMode, height]);
26
- return (React.createElement(Box, { flexDirection: "column", width: 40, height: height, borderStyle: "single", borderColor: "gray", paddingX: 1 },
27
- React.createElement(Text, { bold: true, color: "cyan" }, "Skills & sessions"),
28
- React.createElement(Text, { dimColor: true },
29
- "Sessions: ",
30
- sessionCount),
31
- isSlashMode && React.createElement(Text, { color: "yellow" }, "\u2328 slash command mode"),
32
- React.createElement(Box, { marginTop: 1, flexDirection: "column" },
33
- visibleLines.map((line, idx) => (
34
- // key={idx} is OK here: order is stable, content is what changes.
35
- React.createElement(Text, { key: idx }, line))),
36
- truncated && React.createElement(Text, { dimColor: true }, " ... (more in /skills)"))));
50
+ 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;
53
+ const visible = changes.files.slice(0, maxFiles);
54
+ const hidden = changes.files.length - visible.length;
55
+ // Width available for the path inside the box: total − border(2) − padding(2)
56
+ // the " +NNN -NNN" tail (~11 chars).
57
+ 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))),
61
+ 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)}` : '')),
68
+ React.createElement(Text, { dimColor: true }, '─'.repeat(innerWidth)),
69
+ !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
+ React.createElement(Text, { dimColor: true },
71
+ "changes (",
72
+ changes.files.length,
73
+ ")"),
74
+ visible.map((f) => (React.createElement(FileRow, { key: f.path, file: f, pathWidth: innerWidth - 10 }))),
75
+ hidden > 0 && React.createElement(Text, { dimColor: true },
76
+ " +",
77
+ hidden,
78
+ " more\u2026")))));
79
+ }
80
+ function FileRow({ file, pathWidth }) {
81
+ const name = truncatePath(file.path, Math.max(6, pathWidth));
82
+ return (React.createElement(Box, null,
83
+ React.createElement(Text, { wrap: "truncate" },
84
+ React.createElement(Text, { color: file.untracked ? 'yellow' : 'white' }, name),
85
+ file.untracked ? (React.createElement(Text, { color: "yellow" }, " new")) : (React.createElement(React.Fragment, null,
86
+ React.createElement(Text, { color: "green" },
87
+ " +",
88
+ file.added ?? '·'),
89
+ React.createElement(Text, { color: "red" },
90
+ " -",
91
+ file.removed ?? '·'))))));
37
92
  }
38
- export const Sidebar = React.memo(SidebarImpl, (prev, next) => {
39
- return (prev.skillList === next.skillList &&
40
- prev.sessionCount === next.sessionCount &&
41
- prev.isSlashMode === next.isSlashMode &&
42
- prev.height === next.height);
43
- });
44
93
  //# sourceMappingURL=Sidebar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/cli/components/Sidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAgB;IACjF,0EAA0E;IAC1E,uEAAuE;IACvE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACrD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB;QACtF,OAAO;YACL,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC;YAC3C,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,aAAa;SACxC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAErC,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC;QACxG,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,wBAA6B;QACpD,oBAAC,IAAI,IAAC,QAAQ;;YAAY,YAAY,CAAQ;QAC7C,WAAW,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,gCAA4B;QAChE,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;YACtC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YAC/B,kEAAkE;YAClE,oBAAC,IAAI,IAAC,GAAG,EAAE,GAAG,IAAG,IAAI,CAAQ,CAC9B,CAAC;YACD,SAAS,IAAI,oBAAC,IAAI,IAAC,QAAQ,oCAA+B,CACvD,CACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC5D,OAAO,CACL,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;QACjC,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY;QACvC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW;QACrC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAC5B,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/cli/components/Sidebar.tsx"],"names":[],"mappings":"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"}
@@ -5,10 +5,11 @@
5
5
  * ASCII art) centered in the terminal for ~2 seconds — or until any key is
6
6
  * pressed — then unmounts and gives way to the normal App.
7
7
  *
8
- * Sizing: two pre-rendered variants (64 and 44 columns wide) are embedded
9
- * as constants; `pickSplashArt` chooses the largest one that fits the
10
- * current terminal, or returns null when even the small one doesn't fit
11
- * (the splash is then skipped entirely).
8
+ * Sizing: four pre-rendered variants (64/44/30/22 columns wide) are
9
+ * embedded as constants; `pickSplashArt` chooses the largest one that fits
10
+ * the current terminal (dropping the version/hint footer on short panes),
11
+ * or returns null when even the micro one doesn't fit (the splash is then
12
+ * skipped entirely).
12
13
  *
13
14
  * Skipped when stdout is not a TTY (pipes, CI) or `ZELARI_NO_SPLASH=1`.
14
15
  */
@@ -22,68 +23,99 @@ import { Box, Text, useInput, useStdin } from 'ink';
22
23
  export const SPLASH_DURATION_MS = 2000;
23
24
  // Downscaled from the source emblem (142×79) by block-averaging glyph
24
25
  // density — see docs/plans/2026-07-03-cli-splash-screen.md.
25
- const EMBLEM_LARGE = ` =%@*-
26
- =%@@@@@#:
27
- *%%%%%%@@%-
28
- :#%%%%%%%%%@@*
29
- :*%%%%%%%%%%%%%@%*.
30
- =%%%%%%%%%%%%%%%%@@%.
31
- =%%%%%%%%%%%%%%%%%%%@%-
32
- *%%%%%%%%%%%%%%%%%%%%%@@=
33
- .#%%%%%%%%@@@@@@@@%%%%%%@@@+
34
- :#%%%%%%@@@@@@@@@@@@@@@%%%%@@+
35
- -%%%%%@@@@@@@@@@@@@@@@@@@@@%%@@#.
36
- -%%%%%@@@@@@@@@@@@@@@@@@@@@@@%%@@%:
37
- =%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%.
38
- +%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%:
39
- =%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-
40
- -%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%:
41
- :%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%
42
- #%%%%%@@@@@@@@@@@@@@@%--#%@@@@@@@@@@@@@%%@@@=
43
- #@@%%%%@@@@@@@@@@@@@@%: -*@@@@@@@@@@@%%@@@@=
44
- #@@%%%%@@@@@@@@@@@@@%: .. -#@@@@@@@%%%%@@@=
45
- +@@@%%%@@@@@@@@@@@@%: :#= =%@@@@%%%@@@%-
46
- =@@@@%%%@@@@@@@@@@%: -%%*: +%@@%%@@@#
47
- +%@@@@%%@@@@@@@@@%: -%@@%*=.:+#@@@@#:
48
- .+*@@@@@@@@@%%%@@@@@@%: -%@@@@@#- +@@@@@@*=
49
- =*%%%%@@@@@@@@@@@%%@@@@%: -#@@@@@@@*: :*@@@@@@%+=
50
- -*%%%%%%%%%%@@@@@@@@@@@@@@@: -%@@@@@@@@#- -#@@@@@@@@*
51
- #%%%%%%%%%%%%%@@@@@@@@@@@@@: -#@@@@@%+-::. *@@@@@@@@=
52
- =%%%%%%%%%%%%%%%@@@@@@@@@@@@: :*+--=%#. :+++++*@@@@@@@@%
53
- #@%%%%%%%%%%%%%@@@@@@@@@@@@%: .. - -## *@@@@@@@@@@@@@@=
54
- :@@%%%%%%%%%%%%@@@@@@@@@@@@@%: .**= *%= :%@@@@@@@@@@@@@%
55
- #@@@%%%%%%%%%%%@@@@@@@@@@@@@@- =#@@%- :**: =%@@@@@@@@@@@@@+
56
- =@@@@@%%%@@%%%%@@@@@@@@@@@@@@@@@@@@@@%- :: .-#@@@@@@@@@@@@@%.
57
- :@@@@@@%%@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@%==*%%@@@@@@@@@@@@@@@@#
58
- *@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:
59
- :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+
26
+ const EMBLEM_LARGE = ` =%@*-
27
+ =%@@@@@#:
28
+ *%%%%%%@@%-
29
+ :#%%%%%%%%%@@*
30
+ :*%%%%%%%%%%%%%@%*.
31
+ =%%%%%%%%%%%%%%%%@@%.
32
+ =%%%%%%%%%%%%%%%%%%%@%-
33
+ *%%%%%%%%%%%%%%%%%%%%%@@=
34
+ .#%%%%%%%%@@@@@@@@%%%%%%@@@+
35
+ :#%%%%%%@@@@@@@@@@@@@@@%%%%@@+
36
+ -%%%%%@@@@@@@@@@@@@@@@@@@@@%%@@#.
37
+ -%%%%%@@@@@@@@@@@@@@@@@@@@@@@%%@@%:
38
+ =%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%.
39
+ +%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%:
40
+ =%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-
41
+ -%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%:
42
+ :%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%
43
+ #%%%%%@@@@@@@@@@@@@@@%--#%@@@@@@@@@@@@@%%@@@=
44
+ #@@%%%%@@@@@@@@@@@@@@%: -*@@@@@@@@@@@%%@@@@=
45
+ #@@%%%%@@@@@@@@@@@@@%: .. -#@@@@@@@%%%%@@@=
46
+ +@@@%%%@@@@@@@@@@@@%: :#= =%@@@@%%%@@@%-
47
+ =@@@@%%%@@@@@@@@@@%: -%%*: +%@@%%@@@#
48
+ +%@@@@%%@@@@@@@@@%: -%@@%*=.:+#@@@@#:
49
+ .+*@@@@@@@@@%%%@@@@@@%: -%@@@@@#- +@@@@@@*=
50
+ =*%%%%@@@@@@@@@@@%%@@@@%: -#@@@@@@@*: :*@@@@@@%+=
51
+ -*%%%%%%%%%%@@@@@@@@@@@@@@@: -%@@@@@@@@#- -#@@@@@@@@*
52
+ #%%%%%%%%%%%%%@@@@@@@@@@@@@: -#@@@@@%+-::. *@@@@@@@@=
53
+ =%%%%%%%%%%%%%%%@@@@@@@@@@@@: :*+--=%#. :+++++*@@@@@@@@%
54
+ #@%%%%%%%%%%%%%@@@@@@@@@@@@%: .. - -## *@@@@@@@@@@@@@@=
55
+ :@@%%%%%%%%%%%%@@@@@@@@@@@@@%: .**= *%= :%@@@@@@@@@@@@@%
56
+ #@@@%%%%%%%%%%%@@@@@@@@@@@@@@- =#@@%- :**: =%@@@@@@@@@@@@@+
57
+ =@@@@@%%%@@%%%%@@@@@@@@@@@@@@@@@@@@@@%- :: .-#@@@@@@@@@@@@@%.
58
+ :@@@@@@%%@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@%==*%%@@@@@@@@@@@@@@@@#
59
+ *@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:
60
+ :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+
60
61
  =##########*######**##**#*********##**#*#######################*`;
61
- const EMBLEM_SMALL = ` =%%*:
62
- :#%%@@@+
63
- =%%%%%%%@#.
64
- .*%%%%%%%%%@%-
65
- =%%%%%%%%%%%%%@*.
66
- +%%%%%%@@@@@%%%%@%:
67
- *%%%%@@@@@@@@@@@%%@%:
68
- *%%%@@@@@@@@@@@@@@@%@%-
69
- :#%%@@@@@@@@@@@@@@@@@@@@@+
70
- :%%%@@@@@@@@@@@@@@@@@@@@@@@+
71
- #%%@@@@@@@@@@@@@@@@@@@@@@@@@-
72
- +%%@@@@@@@@@@@@#@@@@@@@@@@@@@%:
73
- %%%%@@@@@@@@@@%::*@@@@@@@@@%@@=
74
- -%@%%@@@@@@@@@%:.::*@@@@@%%@@*.
75
- :%@@%%@@@@@@@%.:%#::*@@%@@@-
76
- :#@@@%@@@@@@%.:%@%+.-#@@@=
77
- :+#@@@@@@@%@@@@%.:%@@@%=.+@@@%*-
78
- .*#%%%%%%@@@@@@@@@@.:%@@@@@*:.+%@@@@#-
79
- +%%%%%%%%%%@@@@@@@@::##*%* :----%@@@@%.
80
- .@%%%%%%%%%@@@@@@@@@:.-..-#=:%@@@@@@@@@+
81
- *@@%%%%%%%%@@@@@@@@@: =#+ +#.-@@@@@@@@@@.
82
- -@@@%%%%%%%@@@@@@@@@@#%@@@- -.:*@@@@@@@@@*
83
- %@@@@%@@%@@@@@@@@@@@@@@@@@%**%@@@@@@@@@@@@:
62
+ const EMBLEM_SMALL = ` =%%*:
63
+ :#%%@@@+
64
+ =%%%%%%%@#.
65
+ .*%%%%%%%%%@%-
66
+ =%%%%%%%%%%%%%@*.
67
+ +%%%%%%@@@@@%%%%@%:
68
+ *%%%%@@@@@@@@@@@%%@%:
69
+ *%%%@@@@@@@@@@@@@@@%@%-
70
+ :#%%@@@@@@@@@@@@@@@@@@@@@+
71
+ :%%%@@@@@@@@@@@@@@@@@@@@@@@+
72
+ #%%@@@@@@@@@@@@@@@@@@@@@@@@@-
73
+ +%%@@@@@@@@@@@@#@@@@@@@@@@@@@%:
74
+ %%%%@@@@@@@@@@%::*@@@@@@@@@%@@=
75
+ -%@%%@@@@@@@@@%:.::*@@@@@%%@@*.
76
+ :%@@%%@@@@@@@%.:%#::*@@%@@@-
77
+ :#@@@%@@@@@@%.:%@%+.-#@@@=
78
+ :+#@@@@@@@%@@@@%.:%@@@%=.+@@@%*-
79
+ .*#%%%%%%@@@@@@@@@@.:%@@@@@*:.+%@@@@#-
80
+ +%%%%%%%%%%@@@@@@@@::##*%* :----%@@@@%.
81
+ .@%%%%%%%%%@@@@@@@@@:.-..-#=:%@@@@@@@@@+
82
+ *@@%%%%%%%%@@@@@@@@@: =#+ +#.-@@@@@@@@@@.
83
+ -@@@%%%%%%%@@@@@@@@@@#%@@@- -.:*@@@@@@@@@*
84
+ %@@@@%@@%@@@@@@@@@@@@@@@@@%**%@@@@@@@@@@@@:
84
85
  =@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*`;
85
- /** Rows the footer (wordmark + version + hint + margins) needs below the art. */
86
- const FOOTER_ROWS = 5;
86
+ const EMBLEM_TINY = ` -%%+
87
+ .*%%%@#:
88
+ =%%%%%%%@*
89
+ +%%%%%%%%%%#.
90
+ +%%%@@@@@@@%@#.
91
+ .*%@@@@@@@@@@@@@%-
92
+ .#%@@@@@@@@@@@@@@@@-
93
+ *%@@@@@@@@@@@@@@@@@%.
94
+ :@%%@@@@@@%:+%@@@@@%@=
95
+ =@%%@@@@@%.=-+%@%%@*
96
+ .=@@%@@@@%.*@*-+@@*.
97
+ -*%@@@@@@@@%.*@@@+:#@@#=.
98
+ *%%%%%%@@@@@@.*#%#=-:+@@@%
99
+ :@%%%%%%@@@@@@.:=.*:*@@@@@@=
100
+ *@%%@%%@@@@@@@*%@*:-:%@@@@@%.
101
+ :@@@%@@@@@@@@@@@@@@#%@@@@@@@@=
102
+ *%%%%%%%%%%%%%%%%%%%%%%%%%%%%#`;
103
+ const EMBLEM_MICRO = ` -#%=
104
+ +%%%%#.
105
+ :#%%%%%%%-
106
+ :%%@@@@@@@@=
107
+ -%@@@@@@@@@@@+
108
+ :%@@@@@@%@@@@@@=
109
+ -%%@@@@@.+%@@%@+
110
+ -@@@@@@:%++%@=
111
+ =*%@@@@@@:@@%=*@#+.
112
+ =%%%%%@@@@:+++-*%@@*
113
+ .%%%%%@@@@@+%+=:%@@@@:
114
+ *@@@@@@@@@@@@@%@@@@@@*`;
115
+ /** Rows the FULL footer (margin + wordmark + version + hint) needs below the art. */
116
+ const FOOTER_ROWS_FULL = 5;
117
+ /** Rows the COMPACT footer (margin + wordmark only) needs — used on short terminals. */
118
+ const FOOTER_ROWS_COMPACT = 2;
87
119
  function measure(art) {
88
120
  const lines = art.split('\n');
89
121
  return {
@@ -92,15 +124,29 @@ function measure(art) {
92
124
  height: lines.length,
93
125
  };
94
126
  }
95
- const VARIANTS = [measure(EMBLEM_LARGE), measure(EMBLEM_SMALL)];
127
+ const VARIANTS = [
128
+ measure(EMBLEM_LARGE),
129
+ measure(EMBLEM_SMALL),
130
+ measure(EMBLEM_TINY),
131
+ measure(EMBLEM_MICRO),
132
+ ];
96
133
  /**
97
- * Pure helper: pick the largest emblem variant that fits `columns`×`rows`
98
- * (leaving room for the wordmark footer), or null when none fits.
134
+ * Pure helper: pick the largest emblem variant that fits `columns`×`rows`.
135
+ * Tries the full footer first (wordmark + version + hint); on short
136
+ * terminals falls back to the compact footer (wordmark only) so the
137
+ * splash still shows in low panes like VS Code's integrated terminal.
138
+ * Returns null only when even the micro variant doesn't fit.
99
139
  */
100
140
  export function pickSplashArt(columns, rows) {
141
+ // Largest art wins: a bigger emblem with the compact footer beats a
142
+ // smaller emblem with the full footer.
101
143
  for (const v of VARIANTS) {
102
- if (v.width <= columns - 2 && v.height + FOOTER_ROWS <= rows)
103
- return v;
144
+ if (v.width > columns - 2)
145
+ continue;
146
+ if (v.height + FOOTER_ROWS_FULL <= rows)
147
+ return { ...v, compact: false };
148
+ if (v.height + FOOTER_ROWS_COMPACT <= rows)
149
+ return { ...v, compact: true };
104
150
  }
105
151
  return null;
106
152
  }
@@ -135,8 +181,8 @@ function Splash({ onDone, version }) {
135
181
  React.createElement(Text, { color: "cyan" }, picked.art),
136
182
  React.createElement(Box, { marginTop: 1 },
137
183
  React.createElement(Text, { bold: true, color: "white" }, 'Z E L A R I C O D E')),
138
- React.createElement(Text, { dimColor: true }, `${version ? `v${version} — ` : ''}N-THEM Studio`),
139
- React.createElement(Text, { dimColor: true, italic: true }, "press any key to skip")));
184
+ !picked.compact && (React.createElement(Text, { dimColor: true }, `${version ? `v${version} — ` : ''}N-THEM Studio`)),
185
+ !picked.compact && (React.createElement(Text, { dimColor: true, italic: true }, "press any key to skip"))));
140
186
  }
141
187
  /**
142
188
  * SplashGate — renders the splash first, then swaps in `children` (the
@@ -1 +1 @@
1
- {"version":3,"file":"SplashScreen.js","sourceRoot":"","sources":["../../../src/cli/components/SplashScreen.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SplashScreen.js","sourceRoot":"","sources":["../../../src/cli/components/SplashScreen.tsx"],"names":[],"mappings":"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"}
@@ -1,22 +1,23 @@
1
1
  import React from 'react';
2
2
  import { Box, Text } from 'ink';
3
- import { formatCost, formatTokens } from '../modelPricing.js';
3
+ import { formatDuration } from '../utils/duration.js';
4
4
  /**
5
- * StatusBar — single one-line status bar replacing the persistent v0.6
6
- * `Header`. It lives in the dynamic region (repainted by Ink) and condenses:
7
- * provider · model · session · tokens · cost · queue · busy.
5
+ * StatusBar — single one-line status bar. v0.7.9: rendered BELOW the input
6
+ * box (the "top bar" position above it is gone), and the token/cost fields
7
+ * are replaced by an execution timer: `⏱ 12s` while a run is in flight,
8
+ * `last 34s` after it completes.
8
9
  *
9
10
  * Why one line: the static-scrollback model (v0.7.0) needs the dynamic
10
11
  * region as short as possible. A single status line + the input bar + the
11
12
  * streaming tail is always well under a screen, so no full repaint.
12
13
  */
13
- export function StatusBar({ model, provider, sessionId, sessionActive, totalTokens, totalCostUsd, queueCount = 0, busy = false, }) {
14
- const hasCost = typeof totalCostUsd === 'number' && totalCostUsd > 0;
15
- const costStr = hasCost ? formatCost(totalCostUsd) : '$0.0000';
16
- const tokStr = formatTokens(totalTokens ?? 0);
14
+ export function StatusBar({ model, provider, sessionId, sessionActive, queueCount = 0, busy = false, mode = 'agent', cwd, elapsedMs = null, lastMs = null, }) {
17
15
  return (React.createElement(Box, { paddingX: 1 },
18
16
  React.createElement(Text, { color: sessionActive ? 'green' : 'gray' }, sessionActive ? '●' : '○'),
19
17
  React.createElement(Text, { dimColor: true }, " "),
18
+ React.createElement(Text, { bold: true, color: mode === 'council' ? 'magenta' : 'cyan' }, mode === 'council' ? '⛬ council' : '⏵ agent'),
19
+ React.createElement(Text, { dimColor: true }, " (shift+tab)"),
20
+ React.createElement(Text, { dimColor: true }, " \u00B7 "),
20
21
  React.createElement(Text, { bold: true, color: "cyan" }, provider),
21
22
  React.createElement(Text, { dimColor: true }, " \u00B7 "),
22
23
  React.createElement(Text, null, model),
@@ -24,19 +25,22 @@ export function StatusBar({ model, provider, sessionId, sessionActive, totalToke
24
25
  React.createElement(Text, { dimColor: true },
25
26
  "session ",
26
27
  sessionId),
27
- React.createElement(Text, { dimColor: true }, " \u00B7 "),
28
- React.createElement(Text, { color: "gray" },
29
- tokStr,
30
- " tok"),
31
- React.createElement(Text, { dimColor: true }, " \u00B7 "),
32
- React.createElement(Text, { color: hasCost ? 'yellow' : 'gray' }, costStr),
28
+ cwd ? (React.createElement(React.Fragment, null,
29
+ React.createElement(Text, { dimColor: true }, " \u00B7 "),
30
+ React.createElement(Text, { color: "blue" }, cwd))) : null,
31
+ busy && elapsedMs !== null ? (React.createElement(React.Fragment, null,
32
+ React.createElement(Text, { dimColor: true }, " \u00B7 "),
33
+ React.createElement(Text, { color: "yellow" },
34
+ "\u23F1 ",
35
+ formatDuration(elapsedMs)))) : lastMs !== null ? (React.createElement(React.Fragment, null,
36
+ React.createElement(Text, { dimColor: true }, " \u00B7 "),
37
+ React.createElement(Text, { dimColor: true },
38
+ "last ",
39
+ formatDuration(lastMs)))) : null,
33
40
  queueCount > 0 ? (React.createElement(React.Fragment, null,
34
41
  React.createElement(Text, { dimColor: true }, " \u00B7 "),
35
42
  React.createElement(Text, { color: "magenta" },
36
43
  "queue ",
37
- queueCount))) : null,
38
- busy ? (React.createElement(React.Fragment, null,
39
- React.createElement(Text, { dimColor: true }, " \u00B7 "),
40
- React.createElement(Text, { color: "yellow" }, "working"))) : null));
44
+ queueCount))) : null));
41
45
  }
42
46
  //# sourceMappingURL=StatusBar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/cli/components/StatusBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAa9D;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,GAAG,CAAC,EACd,IAAI,GAAG,KAAK,GACG;IACf,MAAM,OAAO,GAAG,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,GAAG,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IAC9C,OAAO,CACL,oBAAC,GAAG,IAAC,QAAQ,EAAE,CAAC;QACd,oBAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAC1C,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CACrB;QACP,oBAAC,IAAI,IAAC,QAAQ,cAAS;QACvB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,IAAE,QAAQ,CAAQ;QACzC,oBAAC,IAAI,IAAC,QAAQ,qBAAW;QACzB,oBAAC,IAAI,QAAE,KAAK,CAAQ;QACpB,oBAAC,IAAI,IAAC,QAAQ,qBAAW;QACzB,oBAAC,IAAI,IAAC,QAAQ;;YAAU,SAAS,CAAQ;QACzC,oBAAC,IAAI,IAAC,QAAQ,qBAAW;QACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;YAAE,MAAM;mBAAY;QACtC,oBAAC,IAAI,IAAC,QAAQ,qBAAW;QACzB,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAG,OAAO,CAAQ;QACzD,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAChB;YACE,oBAAC,IAAI,IAAC,QAAQ,qBAAW;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS;;gBAAQ,UAAU,CAAQ,CAC9C,CACJ,CAAC,CAAC,CAAC,IAAI;QACP,IAAI,CAAC,CAAC,CAAC,CACN;YACE,oBAAC,IAAI,IAAC,QAAQ,qBAAW;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,cAAe,CAClC,CACJ,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/cli/components/StatusBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAqBtD;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,aAAa,EACb,UAAU,GAAG,CAAC,EACd,IAAI,GAAG,KAAK,EACZ,IAAI,GAAG,OAAO,EACd,GAAG,EACH,SAAS,GAAG,IAAI,EAChB,MAAM,GAAG,IAAI,GACE;IACf,OAAO,CACL,oBAAC,GAAG,IAAC,QAAQ,EAAE,CAAC;QACd,oBAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAC1C,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CACrB;QACP,oBAAC,IAAI,IAAC,QAAQ,cAAS;QACvB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IACtD,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CACxC;QACP,oBAAC,IAAI,IAAC,QAAQ,yBAAoB;QAClC,oBAAC,IAAI,IAAC,QAAQ,qBAAW;QACzB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,IAAE,QAAQ,CAAQ;QACzC,oBAAC,IAAI,IAAC,QAAQ,qBAAW;QACzB,oBAAC,IAAI,QAAE,KAAK,CAAQ;QACpB,oBAAC,IAAI,IAAC,QAAQ,qBAAW;QACzB,oBAAC,IAAI,IAAC,QAAQ;;YAAU,SAAS,CAAQ;QACxC,GAAG,CAAC,CAAC,CAAC,CACL;YACE,oBAAC,IAAI,IAAC,QAAQ,qBAAW;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,IAAE,GAAG,CAAQ,CAC9B,CACJ,CAAC,CAAC,CAAC,IAAI;QACP,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAC5B;YACE,oBAAC,IAAI,IAAC,QAAQ,qBAAW;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ;;gBAAI,cAAc,CAAC,SAAS,CAAC,CAAQ,CACxD,CACJ,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CACpB;YACE,oBAAC,IAAI,IAAC,QAAQ,qBAAW;YACzB,oBAAC,IAAI,IAAC,QAAQ;;gBAAO,cAAc,CAAC,MAAM,CAAC,CAAQ,CAClD,CACJ,CAAC,CAAC,CAAC,IAAI;QACP,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAChB;YACE,oBAAC,IAAI,IAAC,QAAQ,qBAAW;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS;;gBAAQ,UAAU,CAAQ,CAC9C,CACJ,CAAC,CAAC,CAAC,IAAI,CACJ,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Council tier resolution — explicit lite (3) vs full (6) roster sizes.
3
+ *
4
+ * Default for interactive `/council` is **full** (6 members) so Minosse and
5
+ * Lucifero always run. Opt into the lighter tier via `ZELARI_COUNCIL_TIER=lite`
6
+ * or an explicit `councilSize` below 6.
7
+ */
8
+ export const COUNCIL_TIER_SIZES = {
9
+ lite: 3,
10
+ full: 6,
11
+ };
12
+ export function resolveCouncilTier(opts) {
13
+ const env = opts?.env ?? process.env;
14
+ if (opts?.explicitSize !== undefined) {
15
+ const size = clampCouncilSize(opts.explicitSize);
16
+ return { tier: size >= COUNCIL_TIER_SIZES.full ? 'full' : 'lite', councilSize: size };
17
+ }
18
+ const envSize = env['ZELARI_COUNCIL_SIZE'];
19
+ if (envSize) {
20
+ const parsed = Number.parseInt(envSize, 10);
21
+ if (Number.isFinite(parsed) && parsed > 0) {
22
+ const size = clampCouncilSize(parsed);
23
+ return { tier: size >= COUNCIL_TIER_SIZES.full ? 'full' : 'lite', councilSize: size };
24
+ }
25
+ }
26
+ const tierEnv = env['ZELARI_COUNCIL_TIER']?.toLowerCase();
27
+ if (tierEnv === 'lite') {
28
+ return { tier: 'lite', councilSize: COUNCIL_TIER_SIZES.lite };
29
+ }
30
+ if (tierEnv === 'full') {
31
+ return { tier: 'full', councilSize: COUNCIL_TIER_SIZES.full };
32
+ }
33
+ return { tier: 'full', councilSize: COUNCIL_TIER_SIZES.full };
34
+ }
35
+ function clampCouncilSize(n) {
36
+ return Math.min(COUNCIL_TIER_SIZES.full, Math.max(1, Math.floor(n)));
37
+ }
38
+ //# sourceMappingURL=councilConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"councilConfig.js","sourceRoot":"","sources":["../../src/cli/councilConfig.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;CACC,CAAC;AAOX,MAAM,UAAU,kBAAkB,CAAC,IAGlC;IACC,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAErC,IAAI,IAAI,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACxF,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC3C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACxF,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1D,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAS;IACjC,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC"}