bernard-agent 0.8.1 → 0.9.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 (174) hide show
  1. package/README.md +80 -44
  2. package/dist/agent.d.ts +14 -3
  3. package/dist/agent.js +228 -38
  4. package/dist/agent.js.map +1 -1
  5. package/dist/builtin-specialists/correction-agent.json +32 -0
  6. package/dist/builtin-specialists/file-wrapper.json +43 -0
  7. package/dist/builtin-specialists/shell-wrapper.json +50 -0
  8. package/dist/builtin-specialists/specialist-creator.json +32 -0
  9. package/dist/builtin-specialists/web-wrapper.json +38 -0
  10. package/dist/candidate-bootstrap.d.ts +18 -0
  11. package/dist/candidate-bootstrap.js +61 -0
  12. package/dist/candidate-bootstrap.js.map +1 -0
  13. package/dist/config.d.ts +126 -10
  14. package/dist/config.js +222 -45
  15. package/dist/config.js.map +1 -1
  16. package/dist/context.js +23 -6
  17. package/dist/context.js.map +1 -1
  18. package/dist/correction-candidates.d.ts +54 -0
  19. package/dist/correction-candidates.js +138 -0
  20. package/dist/correction-candidates.js.map +1 -0
  21. package/dist/correction.d.ts +67 -0
  22. package/dist/correction.js +138 -0
  23. package/dist/correction.js.map +1 -0
  24. package/dist/critic.js +2 -1
  25. package/dist/critic.js.map +1 -1
  26. package/dist/cron/notes-store.d.ts +41 -0
  27. package/dist/cron/notes-store.js +134 -0
  28. package/dist/cron/notes-store.js.map +1 -0
  29. package/dist/cron/runner.js +25 -3
  30. package/dist/cron/runner.js.map +1 -1
  31. package/dist/cron/scoped-notes-tools.d.ts +24 -0
  32. package/dist/cron/scoped-notes-tools.js +50 -0
  33. package/dist/cron/scoped-notes-tools.js.map +1 -0
  34. package/dist/custom-providers.d.ts +80 -0
  35. package/dist/custom-providers.js +238 -0
  36. package/dist/custom-providers.js.map +1 -0
  37. package/dist/fs-utils.d.ts +2 -0
  38. package/dist/fs-utils.js +44 -0
  39. package/dist/fs-utils.js.map +1 -0
  40. package/dist/history.js +3 -1
  41. package/dist/history.js.map +1 -1
  42. package/dist/image.d.ts +59 -0
  43. package/dist/image.js +228 -0
  44. package/dist/image.js.map +1 -0
  45. package/dist/index.js +72 -4
  46. package/dist/index.js.map +1 -1
  47. package/dist/mcp.js +1 -1
  48. package/dist/mcp.js.map +1 -1
  49. package/dist/memory.d.ts +13 -0
  50. package/dist/memory.js +45 -4
  51. package/dist/memory.js.map +1 -1
  52. package/dist/menu.d.ts +97 -0
  53. package/dist/menu.js +338 -0
  54. package/dist/menu.js.map +1 -0
  55. package/dist/os-info.d.ts +22 -0
  56. package/dist/os-info.js +111 -0
  57. package/dist/os-info.js.map +1 -0
  58. package/dist/output.d.ts +35 -1
  59. package/dist/output.js +256 -45
  60. package/dist/output.js.map +1 -1
  61. package/dist/pac.d.ts +14 -2
  62. package/dist/pac.js +5 -5
  63. package/dist/pac.js.map +1 -1
  64. package/dist/paths.d.ts +5 -0
  65. package/dist/paths.js +6 -1
  66. package/dist/paths.js.map +1 -1
  67. package/dist/plan-store.d.ts +47 -0
  68. package/dist/plan-store.js +94 -0
  69. package/dist/plan-store.js.map +1 -0
  70. package/dist/prompt-rewriter.d.ts +29 -0
  71. package/dist/prompt-rewriter.js +155 -0
  72. package/dist/prompt-rewriter.js.map +1 -0
  73. package/dist/providers/index.d.ts +56 -4
  74. package/dist/providers/index.js +86 -5
  75. package/dist/providers/index.js.map +1 -1
  76. package/dist/providers/profiles.d.ts +37 -0
  77. package/dist/providers/profiles.js +110 -0
  78. package/dist/providers/profiles.js.map +1 -0
  79. package/dist/providers/types.d.ts +11 -2
  80. package/dist/providers/types.js +3 -0
  81. package/dist/providers/types.js.map +1 -1
  82. package/dist/rag-query.js +15 -1
  83. package/dist/rag-query.js.map +1 -1
  84. package/dist/react.d.ts +38 -0
  85. package/dist/react.js +116 -0
  86. package/dist/react.js.map +1 -0
  87. package/dist/reasoning-log.d.ts +30 -0
  88. package/dist/reasoning-log.js +102 -0
  89. package/dist/reasoning-log.js.map +1 -0
  90. package/dist/reference-resolver.d.ts +47 -0
  91. package/dist/reference-resolver.js +316 -0
  92. package/dist/reference-resolver.js.map +1 -0
  93. package/dist/reference-tool-lookup.d.ts +37 -0
  94. package/dist/reference-tool-lookup.js +318 -0
  95. package/dist/reference-tool-lookup.js.map +1 -0
  96. package/dist/repl.js +1038 -371
  97. package/dist/repl.js.map +1 -1
  98. package/dist/setup.js +2 -1
  99. package/dist/setup.js.map +1 -1
  100. package/dist/specialist-detector.js +2 -1
  101. package/dist/specialist-detector.js.map +1 -1
  102. package/dist/specialists.d.ts +74 -3
  103. package/dist/specialists.js +152 -20
  104. package/dist/specialists.js.map +1 -1
  105. package/dist/structured-output.d.ts +58 -0
  106. package/dist/structured-output.js +138 -0
  107. package/dist/structured-output.js.map +1 -0
  108. package/dist/theme.d.ts +2 -0
  109. package/dist/theme.js +18 -12
  110. package/dist/theme.js.map +1 -1
  111. package/dist/tool-call-repair.d.ts +29 -0
  112. package/dist/tool-call-repair.js +99 -0
  113. package/dist/tool-call-repair.js.map +1 -0
  114. package/dist/tool-profiles.d.ts +70 -0
  115. package/dist/tool-profiles.js +385 -0
  116. package/dist/tool-profiles.js.map +1 -0
  117. package/dist/tools/activity-summary.d.ts +15 -0
  118. package/dist/tools/activity-summary.js +44 -0
  119. package/dist/tools/activity-summary.js.map +1 -0
  120. package/dist/tools/ask-user.d.ts +49 -0
  121. package/dist/tools/ask-user.js +52 -0
  122. package/dist/tools/ask-user.js.map +1 -0
  123. package/dist/tools/augment.d.ts +17 -0
  124. package/dist/tools/augment.js +102 -0
  125. package/dist/tools/augment.js.map +1 -0
  126. package/dist/tools/cron-logs.js +7 -0
  127. package/dist/tools/cron-logs.js.map +1 -1
  128. package/dist/tools/cron-notes.d.ts +52 -0
  129. package/dist/tools/cron-notes.js +105 -0
  130. package/dist/tools/cron-notes.js.map +1 -0
  131. package/dist/tools/datetime.d.ts +7 -0
  132. package/dist/tools/datetime.js +29 -3
  133. package/dist/tools/datetime.js.map +1 -1
  134. package/dist/tools/evaluate.d.ts +20 -0
  135. package/dist/tools/evaluate.js +29 -0
  136. package/dist/tools/evaluate.js.map +1 -0
  137. package/dist/tools/index.js +4 -0
  138. package/dist/tools/index.js.map +1 -1
  139. package/dist/tools/mcp.d.ts +3 -3
  140. package/dist/tools/plan.d.ts +81 -0
  141. package/dist/tools/plan.js +108 -0
  142. package/dist/tools/plan.js.map +1 -0
  143. package/dist/tools/result-cap.d.ts +24 -0
  144. package/dist/tools/result-cap.js +44 -0
  145. package/dist/tools/result-cap.js.map +1 -0
  146. package/dist/tools/routine.d.ts +3 -3
  147. package/dist/tools/shell.d.ts +14 -1
  148. package/dist/tools/shell.js +86 -4
  149. package/dist/tools/shell.js.map +1 -1
  150. package/dist/tools/specialist-run.d.ts +5 -3
  151. package/dist/tools/specialist-run.js +115 -24
  152. package/dist/tools/specialist-run.js.map +1 -1
  153. package/dist/tools/specialist.d.ts +83 -3
  154. package/dist/tools/specialist.js +83 -3
  155. package/dist/tools/specialist.js.map +1 -1
  156. package/dist/tools/subagent.js +32 -14
  157. package/dist/tools/subagent.js.map +1 -1
  158. package/dist/tools/task.d.ts +5 -5
  159. package/dist/tools/task.js +9 -42
  160. package/dist/tools/task.js.map +1 -1
  161. package/dist/tools/think.d.ts +18 -0
  162. package/dist/tools/think.js +25 -0
  163. package/dist/tools/think.js.map +1 -0
  164. package/dist/tools/tool-wrapper-run.d.ts +121 -0
  165. package/dist/tools/tool-wrapper-run.js +382 -0
  166. package/dist/tools/tool-wrapper-run.js.map +1 -0
  167. package/dist/tools/types.d.ts +28 -2
  168. package/dist/tools/web-search.d.ts +31 -0
  169. package/dist/tools/web-search.js +172 -0
  170. package/dist/tools/web-search.js.map +1 -0
  171. package/dist/tools/wrap-with-specialist.d.ts +55 -0
  172. package/dist/tools/wrap-with-specialist.js +137 -0
  173. package/dist/tools/wrap-with-specialist.js.map +1 -0
  174. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
package/dist/menu.d.ts ADDED
@@ -0,0 +1,97 @@
1
+ import * as readline from 'node:readline';
2
+ /** Pinned-region id used by the interactive menu. Exported for tests. */
3
+ export declare const MENU_REGION_ID = "menu";
4
+ /** A single selectable item in a menu. */
5
+ export interface MenuItem {
6
+ /** Text shown next to the number. */
7
+ label: string;
8
+ /** If true, appends " (active)" marker. */
9
+ active?: boolean;
10
+ /** Optional annotation shown after the label (e.g. "= 4096 (default)"). */
11
+ annotation?: string;
12
+ /** Optional second line shown below the item, indented further. */
13
+ description?: string;
14
+ /** Opaque payload returned to the caller on selection. */
15
+ value?: unknown;
16
+ }
17
+ /** A section divider inserted between items in the numbered list. */
18
+ export interface MenuSection {
19
+ type: 'section';
20
+ /** Header text printed before the next batch of items. */
21
+ title: string;
22
+ }
23
+ /** Union of what can appear in the entries array. */
24
+ export type MenuEntry = MenuItem | MenuSection;
25
+ /** Options for selectFromMenu(). */
26
+ export interface MenuOptions {
27
+ /** Prompt string override, e.g. "Select option". Default: "Select". */
28
+ promptLabel?: string;
29
+ /** Optional heading rendered inside the ephemeral menu block. */
30
+ title?: string;
31
+ /**
32
+ * Optional header lines pinned above the title. Rendered inside the menu's
33
+ * own pinned region so they update atomically with the menu, never leaking
34
+ * into scrollback as the menu repaints.
35
+ */
36
+ headerLines?: string[];
37
+ }
38
+ /** Options for promptValue(). */
39
+ export interface ValuePromptOptions {
40
+ /** Prompt label, e.g. "New value for max-tokens". */
41
+ label: string;
42
+ /**
43
+ * Optional header lines printed above the prompt. Use to provide context
44
+ * (e.g. an ask_user progress strip).
45
+ */
46
+ headerLines?: string[];
47
+ }
48
+ /** Result from selectFromMenu(). */
49
+ export type SelectResult = {
50
+ cancelled: true;
51
+ } | {
52
+ cancelled: false;
53
+ index: number;
54
+ item: MenuItem;
55
+ };
56
+ /** Result from promptValue(). */
57
+ export type ValueResult = {
58
+ cancelled: true;
59
+ } | {
60
+ cancelled: false;
61
+ raw: string;
62
+ };
63
+ /** Count the selectable (non-section) items in an entries array. */
64
+ export declare function countMenuItems(entries: MenuEntry[]): number;
65
+ /** Get the Nth (0-based) selectable item, skipping sections. */
66
+ export declare function getMenuItem(entries: MenuEntry[], index: number): MenuItem | undefined;
67
+ /**
68
+ * A single line of the fallback numbered-list rendering, tagged with whether
69
+ * it should be emitted via `printDim` (description rows) or `printInfo`.
70
+ */
71
+ export interface LegacyLine {
72
+ text: string;
73
+ dim?: boolean;
74
+ }
75
+ export declare function buildLegacyLines(entries: MenuEntry[]): LegacyLine[];
76
+ /**
77
+ * Build the lines array for the ephemeral menu block.
78
+ * The highlighted item gets a `>` cursor and accent styling; its description
79
+ * (if present) is shown below it. Other items show a plain numbered label.
80
+ *
81
+ * Exported for direct testing; production callers go through selectFromMenu.
82
+ */
83
+ export declare function renderMenuLines(entries: MenuEntry[], highlightItemIndex: number, options: MenuOptions | undefined): string[];
84
+ /**
85
+ * Prompt the user to select from a menu.
86
+ *
87
+ * In a TTY without `BERNARD_PLAIN_MENU=1`, renders as an ephemeral arrow-key
88
+ * menu above the prompt. Otherwise falls back to a numbered list + rl.question.
89
+ * Returns cancelled on Esc/Ctrl-C/q, on external signal abort, or on empty /
90
+ * out-of-range input in fallback mode.
91
+ */
92
+ export declare function selectFromMenu(rl: readline.Interface, entries: MenuEntry[], options?: MenuOptions, signal?: AbortSignal): Promise<SelectResult>;
93
+ /**
94
+ * Prompt the user to enter a free-form string value.
95
+ * Returns cancelled if input is empty or signal aborted.
96
+ */
97
+ export declare function promptValue(rl: readline.Interface, options: ValuePromptOptions, signal?: AbortSignal): Promise<ValueResult>;
package/dist/menu.js ADDED
@@ -0,0 +1,338 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MENU_REGION_ID = void 0;
37
+ exports.countMenuItems = countMenuItems;
38
+ exports.getMenuItem = getMenuItem;
39
+ exports.buildLegacyLines = buildLegacyLines;
40
+ exports.renderMenuLines = renderMenuLines;
41
+ exports.selectFromMenu = selectFromMenu;
42
+ exports.promptValue = promptValue;
43
+ const readline = __importStar(require("node:readline"));
44
+ const output_js_1 = require("./output.js");
45
+ const theme_js_1 = require("./theme.js");
46
+ /** Pinned-region id used by the interactive menu. Exported for tests. */
47
+ exports.MENU_REGION_ID = 'menu';
48
+ /** Pinned-region id used by promptValue() to display optional header lines. */
49
+ const PROMPT_HEADER_REGION_ID = 'prompt-header';
50
+ const DIGIT_KEY_RE = /^[1-9]$/;
51
+ /** Type guard for MenuSection entries. */
52
+ function isSection(entry) {
53
+ return 'type' in entry && entry.type === 'section';
54
+ }
55
+ /** Count the selectable (non-section) items in an entries array. */
56
+ function countMenuItems(entries) {
57
+ let count = 0;
58
+ for (const e of entries) {
59
+ if (!isSection(e))
60
+ count++;
61
+ }
62
+ return count;
63
+ }
64
+ /** Get the Nth (0-based) selectable item, skipping sections. */
65
+ function getMenuItem(entries, index) {
66
+ let n = 0;
67
+ for (const e of entries) {
68
+ if (!isSection(e)) {
69
+ if (n === index)
70
+ return e;
71
+ n++;
72
+ }
73
+ }
74
+ return undefined;
75
+ }
76
+ /** True when we should skip the interactive renderer and use the legacy numbered-list path. */
77
+ function useFallback() {
78
+ const flag = process.env.BERNARD_PLAIN_MENU;
79
+ const forcePlain = flag === 'true' || flag === '1';
80
+ // setRawMode throws on non-TTY stdin, so both streams must be TTY.
81
+ return !process.stdout.isTTY || !process.stdin.isTTY || forcePlain;
82
+ }
83
+ function buildLegacyLines(entries) {
84
+ const out = [];
85
+ let n = 1;
86
+ for (const entry of entries) {
87
+ if (isSection(entry)) {
88
+ out.push({ text: `\n ${entry.title}` });
89
+ }
90
+ else {
91
+ const activeMarker = entry.active ? ' (active)' : '';
92
+ const annotation = entry.annotation ? ` ${entry.annotation}` : '';
93
+ out.push({ text: ` ${n}. ${entry.label}${activeMarker}${annotation}` });
94
+ if (entry.description) {
95
+ out.push({ text: ` ${entry.description}`, dim: true });
96
+ }
97
+ n++;
98
+ }
99
+ }
100
+ return out;
101
+ }
102
+ /**
103
+ * Wrap rl.question in a Promise with optional AbortSignal support.
104
+ * Returns null on abort or if the signal was already aborted.
105
+ */
106
+ function questionWithSignal(rl, prompt, signal) {
107
+ return new Promise((resolve) => {
108
+ if (signal?.aborted) {
109
+ resolve(null);
110
+ return;
111
+ }
112
+ let settled = false;
113
+ const settle = (val) => {
114
+ if (settled)
115
+ return;
116
+ settled = true;
117
+ resolve(val);
118
+ };
119
+ const onAbort = () => settle(null);
120
+ signal?.addEventListener('abort', onAbort, { once: true });
121
+ if (signal) {
122
+ rl.question(prompt, { signal }, (answer) => {
123
+ signal.removeEventListener('abort', onAbort);
124
+ settle(answer);
125
+ });
126
+ }
127
+ else {
128
+ rl.question(prompt, (answer) => settle(answer));
129
+ }
130
+ });
131
+ }
132
+ /** Legacy numbered-list + rl.question selection flow. */
133
+ async function legacySelect(rl, entries, options, signal) {
134
+ if (options?.headerLines && options.headerLines.length > 0) {
135
+ for (const headerLine of options.headerLines)
136
+ (0, output_js_1.printInfo)(headerLine);
137
+ (0, output_js_1.printInfo)('');
138
+ }
139
+ if (options?.title) {
140
+ (0, output_js_1.printInfo)(`\n ${options.title}\n`);
141
+ }
142
+ for (const line of buildLegacyLines(entries)) {
143
+ if (line.dim)
144
+ (0, output_js_1.printDim)(line.text);
145
+ else
146
+ (0, output_js_1.printInfo)(line.text);
147
+ }
148
+ (0, output_js_1.printInfo)('');
149
+ const items = entries.filter((e) => !isSection(e));
150
+ const label = options?.promptLabel ?? 'Select';
151
+ const { ansi } = (0, theme_js_1.getTheme)();
152
+ const promptStr = ` ${ansi.prompt}${label} [1-${items.length}]${ansi.reset} (Enter or Esc to cancel): `;
153
+ const answer = await questionWithSignal(rl, promptStr, signal);
154
+ if (answer === null || answer.trim() === '') {
155
+ (0, output_js_1.printInfo)(' Cancelled.');
156
+ return { cancelled: true };
157
+ }
158
+ const num = parseInt(answer.trim(), 10);
159
+ if (num >= 1 && num <= items.length) {
160
+ return { cancelled: false, index: num - 1, item: items[num - 1] };
161
+ }
162
+ (0, output_js_1.printInfo)(' Cancelled.');
163
+ return { cancelled: true };
164
+ }
165
+ /**
166
+ * Build the lines array for the ephemeral menu block.
167
+ * The highlighted item gets a `>` cursor and accent styling; its description
168
+ * (if present) is shown below it. Other items show a plain numbered label.
169
+ *
170
+ * Exported for direct testing; production callers go through selectFromMenu.
171
+ */
172
+ function renderMenuLines(entries, highlightItemIndex, options) {
173
+ const { accent, accentBold, dim, muted } = (0, theme_js_1.getTheme)();
174
+ const lines = [];
175
+ if (options?.headerLines && options.headerLines.length > 0) {
176
+ for (const headerLine of options.headerLines)
177
+ lines.push(headerLine);
178
+ lines.push('');
179
+ }
180
+ if (options?.title) {
181
+ lines.push(` ${accentBold(options.title)}`);
182
+ lines.push('');
183
+ }
184
+ let itemIndex = 0;
185
+ for (const entry of entries) {
186
+ if (isSection(entry)) {
187
+ lines.push(` ${muted(entry.title)}`);
188
+ continue;
189
+ }
190
+ const n = itemIndex + 1;
191
+ const activeMarker = entry.active ? ' (active)' : '';
192
+ const annotation = entry.annotation ? ` ${entry.annotation}` : '';
193
+ const labelText = `${n}. ${entry.label}${activeMarker}${annotation}`;
194
+ const isHighlighted = itemIndex === highlightItemIndex;
195
+ if (isHighlighted) {
196
+ lines.push(` ${accent('>')} ${accentBold(labelText)}`);
197
+ if (entry.description) {
198
+ lines.push(` ${dim(entry.description)}`);
199
+ }
200
+ }
201
+ else {
202
+ lines.push(` ${labelText}`);
203
+ }
204
+ itemIndex++;
205
+ }
206
+ lines.push('');
207
+ lines.push(` ${dim('\u2191/\u2193 move \u00B7 Enter select \u00B7 Esc cancel')}`);
208
+ return lines;
209
+ }
210
+ /** Interactive arrow-key menu rendered via the pinned region. */
211
+ async function interactiveSelect(rl, entries, options, signal) {
212
+ if (signal?.aborted) {
213
+ return { cancelled: true };
214
+ }
215
+ const itemCount = countMenuItems(entries);
216
+ if (itemCount === 0) {
217
+ return { cancelled: true };
218
+ }
219
+ readline.emitKeypressEvents(process.stdin);
220
+ const wasRaw = process.stdin.isRaw ?? false;
221
+ process.stdin.setRawMode(true);
222
+ rl.pause();
223
+ // rl.pause() pauses the underlying stdin; resume so 'keypress' events fire.
224
+ process.stdin.resume();
225
+ let highlight = 0;
226
+ const repaint = () => {
227
+ (0, output_js_1.setPinnedRegion)(exports.MENU_REGION_ID, renderMenuLines(entries, highlight, options));
228
+ };
229
+ return new Promise((resolve) => {
230
+ let settled = false;
231
+ const finish = (result) => {
232
+ if (settled)
233
+ return;
234
+ settled = true;
235
+ process.stdin.removeListener('keypress', onKeypress);
236
+ signal?.removeEventListener('abort', onAbort);
237
+ try {
238
+ process.stdin.setRawMode(wasRaw);
239
+ }
240
+ catch {
241
+ // stdin may have been detached; ignore.
242
+ }
243
+ (0, output_js_1.clearPinnedRegion)(exports.MENU_REGION_ID);
244
+ rl.resume();
245
+ if (!result.cancelled) {
246
+ (0, output_js_1.printInfo)(` Selected: ${result.item.label}`);
247
+ }
248
+ resolve(result);
249
+ };
250
+ const commit = (idx) => {
251
+ const item = getMenuItem(entries, idx);
252
+ if (!item) {
253
+ finish({ cancelled: true });
254
+ return;
255
+ }
256
+ finish({ cancelled: false, index: idx, item });
257
+ };
258
+ const onKeypress = (_str, key) => {
259
+ if (!key)
260
+ return;
261
+ if (key.ctrl && key.name === 'c') {
262
+ finish({ cancelled: true });
263
+ return;
264
+ }
265
+ if (key.name === 'escape' || key.name === 'q') {
266
+ finish({ cancelled: true });
267
+ return;
268
+ }
269
+ if (key.name === 'return' || key.name === 'enter') {
270
+ commit(highlight);
271
+ return;
272
+ }
273
+ if (key.name === 'up') {
274
+ if (highlight > 0) {
275
+ highlight--;
276
+ repaint();
277
+ }
278
+ return;
279
+ }
280
+ if (key.name === 'down') {
281
+ if (highlight < itemCount - 1) {
282
+ highlight++;
283
+ repaint();
284
+ }
285
+ return;
286
+ }
287
+ if (key.name && DIGIT_KEY_RE.test(key.name)) {
288
+ const n = parseInt(key.name, 10) - 1;
289
+ if (n < itemCount) {
290
+ commit(n);
291
+ }
292
+ }
293
+ };
294
+ const onAbort = () => finish({ cancelled: true });
295
+ signal?.addEventListener('abort', onAbort, { once: true });
296
+ process.stdin.on('keypress', onKeypress);
297
+ repaint();
298
+ });
299
+ }
300
+ /**
301
+ * Prompt the user to select from a menu.
302
+ *
303
+ * In a TTY without `BERNARD_PLAIN_MENU=1`, renders as an ephemeral arrow-key
304
+ * menu above the prompt. Otherwise falls back to a numbered list + rl.question.
305
+ * Returns cancelled on Esc/Ctrl-C/q, on external signal abort, or on empty /
306
+ * out-of-range input in fallback mode.
307
+ */
308
+ async function selectFromMenu(rl, entries, options, signal) {
309
+ if (useFallback()) {
310
+ return legacySelect(rl, entries, options, signal);
311
+ }
312
+ return interactiveSelect(rl, entries, options, signal);
313
+ }
314
+ /**
315
+ * Prompt the user to enter a free-form string value.
316
+ * Returns cancelled if input is empty or signal aborted.
317
+ */
318
+ async function promptValue(rl, options, signal) {
319
+ const { ansi } = (0, theme_js_1.getTheme)();
320
+ const promptStr = ` ${ansi.prompt}${options.label}${ansi.reset} (Enter or Esc to cancel): `;
321
+ const hasHeader = options.headerLines && options.headerLines.length > 0;
322
+ if (hasHeader) {
323
+ (0, output_js_1.setPinnedRegion)(PROMPT_HEADER_REGION_ID, [...options.headerLines, '']);
324
+ }
325
+ try {
326
+ const answer = await questionWithSignal(rl, promptStr, signal);
327
+ if (answer === null || answer.trim() === '') {
328
+ (0, output_js_1.printInfo)(' Cancelled.');
329
+ return { cancelled: true };
330
+ }
331
+ return { cancelled: false, raw: answer.trim() };
332
+ }
333
+ finally {
334
+ if (hasHeader)
335
+ (0, output_js_1.clearPinnedRegion)(PROMPT_HEADER_REGION_ID);
336
+ }
337
+ }
338
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** Minimal OS fingerprint used to tailor tool-wrapper prompts and examples. */
2
+ export interface OsInfo {
3
+ /** Node's `process.platform` — 'darwin' | 'linux' | 'win32' | ... */
4
+ platform: NodeJS.Platform;
5
+ /** 'x64', 'arm64', etc. */
6
+ arch: string;
7
+ /** Default shell path, best-effort from $SHELL or a platform fallback. */
8
+ shell: string;
9
+ /** Human-readable OS label (e.g. "macOS 14.3", "Ubuntu 22.04", "Windows 10"). */
10
+ osRelease?: string;
11
+ }
12
+ /** Returns a cached OS fingerprint for the current process. */
13
+ export declare function getOsInfo(): OsInfo;
14
+ /** Clears the cached value. Used by tests. */
15
+ export declare function _resetOsInfoCache(): void;
16
+ /**
17
+ * Returns a short markdown block describing the host OS, suitable for injecting
18
+ * into a tool-wrapper specialist's system prompt. The block is a few lines so
19
+ * specialists can tailor commands (brew vs apt, gfind vs find, etc.) without
20
+ * re-detecting.
21
+ */
22
+ export declare function osPromptBlock(): string;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getOsInfo = getOsInfo;
37
+ exports._resetOsInfoCache = _resetOsInfoCache;
38
+ exports.osPromptBlock = osPromptBlock;
39
+ const os = __importStar(require("node:os"));
40
+ const fs = __importStar(require("node:fs"));
41
+ const node_child_process_1 = require("node:child_process");
42
+ let cached;
43
+ function detectOsRelease(platform) {
44
+ try {
45
+ if (platform === 'linux' && fs.existsSync('/etc/os-release')) {
46
+ const contents = fs.readFileSync('/etc/os-release', 'utf-8');
47
+ const pretty = /^PRETTY_NAME="?([^"\n]+)"?/m.exec(contents);
48
+ if (pretty)
49
+ return pretty[1];
50
+ const name = /^NAME="?([^"\n]+)"?/m.exec(contents);
51
+ if (name)
52
+ return name[1];
53
+ }
54
+ if (platform === 'darwin') {
55
+ const raw = (0, node_child_process_1.execSync)('sw_vers', { encoding: 'utf-8', timeout: 1000 });
56
+ const product = /ProductName:\s*(.+)/i.exec(raw)?.[1]?.trim() ?? 'macOS';
57
+ const version = /ProductVersion:\s*(.+)/i.exec(raw)?.[1]?.trim() ?? '';
58
+ return `${product} ${version}`.trim();
59
+ }
60
+ }
61
+ catch {
62
+ /* best-effort — fall through */
63
+ }
64
+ return `${os.type()} ${os.release()}`;
65
+ }
66
+ function detectShell(platform) {
67
+ const envShell = process.env.SHELL;
68
+ if (envShell)
69
+ return envShell;
70
+ if (platform === 'win32')
71
+ return process.env.ComSpec ?? 'cmd.exe';
72
+ return '/bin/sh';
73
+ }
74
+ /** Returns a cached OS fingerprint for the current process. */
75
+ function getOsInfo() {
76
+ if (cached)
77
+ return cached;
78
+ const platform = os.platform();
79
+ const info = {
80
+ platform,
81
+ arch: os.arch(),
82
+ shell: detectShell(platform),
83
+ osRelease: detectOsRelease(platform),
84
+ };
85
+ cached = info;
86
+ return info;
87
+ }
88
+ /** Clears the cached value. Used by tests. */
89
+ function _resetOsInfoCache() {
90
+ cached = undefined;
91
+ }
92
+ /**
93
+ * Returns a short markdown block describing the host OS, suitable for injecting
94
+ * into a tool-wrapper specialist's system prompt. The block is a few lines so
95
+ * specialists can tailor commands (brew vs apt, gfind vs find, etc.) without
96
+ * re-detecting.
97
+ */
98
+ function osPromptBlock() {
99
+ const info = getOsInfo();
100
+ const lines = [
101
+ '## Host OS',
102
+ `- Platform: ${info.platform}`,
103
+ `- Architecture: ${info.arch}`,
104
+ `- Shell: ${info.shell}`,
105
+ ];
106
+ if (info.osRelease)
107
+ lines.push(`- Release: ${info.osRelease}`);
108
+ lines.push('', 'Tailor commands to this platform. On macOS, BSD userland (e.g. `find` without `-printf`) applies unless GNU tools are installed as `g*` prefixes. On Linux, assume GNU userland. On Windows, prefer PowerShell-compatible syntax.');
109
+ return lines.join('\n');
110
+ }
111
+ //# sourceMappingURL=os-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os-info.js","sourceRoot":"","sources":["../src/os-info.ts"],"names":[],"mappings":"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"}
package/dist/output.d.ts CHANGED
@@ -1,4 +1,24 @@
1
1
  import type { CoreMessage } from 'ai';
2
+ import type { Step } from './plan-store.js';
3
+ /**
4
+ * Enables or disables printing of tool-call arguments and tool result bodies.
5
+ * Tool names and call lines (▶ toolName) are always shown regardless.
6
+ */
7
+ export declare function setToolDetailsVisible(enabled: boolean): void;
8
+ /**
9
+ * Number of visual terminal rows a single logical line will occupy, given
10
+ * the current column width. Strips ANSI CSI escapes so zero-width control
11
+ * codes don't inflate the count. Exported for direct testing.
12
+ */
13
+ export declare function visualRowCount(line: string, columns: number): number;
14
+ /**
15
+ * Pins or updates a named region of lines above the prompt.
16
+ * Passing an empty array removes the region. No-op when the new content
17
+ * matches what is already pinned under that id.
18
+ */
19
+ export declare function setPinnedRegion(id: string, lines: string[]): void;
20
+ /** Removes a named pinned region. */
21
+ export declare function clearPinnedRegion(id: string): void;
2
22
  /** Cumulative token-usage statistics displayed alongside the thinking spinner. */
3
23
  export interface SpinnerStats {
4
24
  /** Epoch timestamp (ms) when the current agent step began. */
@@ -37,7 +57,7 @@ export declare function startSpinner(message?: string | (() => string)): void;
37
57
  /** Stops the spinner, clears its line, and restores the cursor. */
38
58
  export declare function stopSpinner(): void;
39
59
  /** Prints the branded welcome banner with provider, model, and optional version info. */
40
- export declare function printWelcome(provider: string, model: string, version?: string): void;
60
+ export declare function printWelcome(provider: string, model: string, version?: string, baseURL?: string): void;
41
61
  /** Prints an assistant response, stopping any active spinner first. */
42
62
  export declare function printAssistantText(text: string, prefix?: string): void;
43
63
  /**
@@ -57,6 +77,8 @@ export declare function printToolResult(toolName: string, result: unknown, prefi
57
77
  export declare function printError(message: string): void;
58
78
  /** Prints an informational message in the theme's muted color. */
59
79
  export declare function printInfo(message: string): void;
80
+ /** Prints a dimmed, de-emphasized line — used for secondary text like menu descriptions. */
81
+ export declare function printDim(message: string): void;
60
82
  /** Prints a warning message in the theme's warning color. */
61
83
  export declare function printWarning(message: string): void;
62
84
  /**
@@ -66,6 +88,18 @@ export declare function printWarning(message: string): void;
66
88
  * Tool-role messages are skipped.
67
89
  */
68
90
  export declare function printConversationReplay(messages: CoreMessage[]): void;
91
+ /**
92
+ * Pins the current plan as a bulleted, status-decorated list above the prompt.
93
+ *
94
+ * Uses the generic pinned-region mechanism keyed by `'plan'`, so the block
95
+ * stays anchored while other chat-flow output scrolls above it.
96
+ * Passing no steps removes the pinned plan.
97
+ */
98
+ export declare function printPlan(steps: Step[], prefix?: string): void;
99
+ /** Prints a visible thought block, styled as secondary (dim italic) so it reads below the main response. */
100
+ export declare function printThought(thought: string, prefix?: string): void;
101
+ /** Prints a visible post-action self-evaluation, styled to mirror printThought. */
102
+ export declare function printEvaluation(evaluation: string, prefix?: string): void;
69
103
  /** Prints a colored top-border line when a sub-agent begins executing a task. */
70
104
  export declare function printSubAgentStart(id: number, task: string): void;
71
105
  /** Prints a colored bottom-border line when a sub-agent finishes. */