@towles/tool 0.0.120 → 0.0.122

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 (64) hide show
  1. package/node_modules/@towles/shared/package.json +15 -0
  2. package/node_modules/@towles/shared/src/date-utils.test.ts +97 -0
  3. package/node_modules/@towles/shared/src/date-utils.ts +54 -0
  4. package/node_modules/@towles/shared/src/fs.ts +19 -0
  5. package/node_modules/@towles/shared/src/git/branch-name.test.ts +83 -0
  6. package/node_modules/@towles/shared/src/git/branch-name.ts +10 -0
  7. package/node_modules/@towles/shared/src/git/exec.ts +41 -0
  8. package/node_modules/@towles/shared/src/git/gh-cli-wrapper.test.ts +55 -0
  9. package/node_modules/@towles/shared/src/git/gh-cli-wrapper.ts +74 -0
  10. package/node_modules/@towles/shared/src/index.ts +8 -0
  11. package/node_modules/@towles/shared/src/render.test.ts +71 -0
  12. package/node_modules/@towles/shared/src/render.ts +36 -0
  13. package/package.json +4 -1
  14. package/packages/agentboard/apps/tui/src/components/DetailPanel.tsx +62 -1
  15. package/packages/agentboard/packages/runtime/package.json +1 -0
  16. package/packages/agentboard/packages/runtime/src/agents/watchers/claude-code.test.ts +38 -1
  17. package/packages/agentboard/packages/runtime/src/agents/watchers/claude-code.ts +106 -31
  18. package/packages/agentboard/packages/runtime/src/agents/watchers/claude-pid.test.ts +74 -0
  19. package/packages/agentboard/packages/runtime/src/agents/watchers/claude-pid.ts +57 -0
  20. package/packages/agentboard/packages/runtime/src/agents/watchers/claude-usage.test.ts +148 -0
  21. package/packages/agentboard/packages/runtime/src/agents/watchers/claude-usage.ts +78 -0
  22. package/packages/agentboard/packages/runtime/src/contracts/agent.ts +17 -0
  23. package/packages/agentboard/packages/runtime/src/server/pane-scanner.ts +10 -4
  24. package/packages/core/skills/towles-tool/SKILL.md +1 -0
  25. package/packages/shared/node_modules/consola/LICENSE +47 -0
  26. package/packages/shared/node_modules/consola/README.md +352 -0
  27. package/packages/shared/node_modules/consola/basic.d.ts +1 -0
  28. package/packages/shared/node_modules/consola/browser.d.ts +1 -0
  29. package/packages/shared/node_modules/consola/core.d.ts +1 -0
  30. package/packages/shared/node_modules/consola/dist/basic.cjs +32 -0
  31. package/packages/shared/node_modules/consola/dist/basic.d.cts +23 -0
  32. package/packages/shared/node_modules/consola/dist/basic.d.mts +21 -0
  33. package/packages/shared/node_modules/consola/dist/basic.d.ts +23 -0
  34. package/packages/shared/node_modules/consola/dist/basic.mjs +24 -0
  35. package/packages/shared/node_modules/consola/dist/browser.cjs +84 -0
  36. package/packages/shared/node_modules/consola/dist/browser.d.cts +23 -0
  37. package/packages/shared/node_modules/consola/dist/browser.d.mts +21 -0
  38. package/packages/shared/node_modules/consola/dist/browser.d.ts +23 -0
  39. package/packages/shared/node_modules/consola/dist/browser.mjs +76 -0
  40. package/packages/shared/node_modules/consola/dist/chunks/prompt.cjs +288 -0
  41. package/packages/shared/node_modules/consola/dist/chunks/prompt.mjs +280 -0
  42. package/packages/shared/node_modules/consola/dist/core.cjs +517 -0
  43. package/packages/shared/node_modules/consola/dist/core.d.cts +459 -0
  44. package/packages/shared/node_modules/consola/dist/core.d.mts +459 -0
  45. package/packages/shared/node_modules/consola/dist/core.d.ts +459 -0
  46. package/packages/shared/node_modules/consola/dist/core.mjs +512 -0
  47. package/packages/shared/node_modules/consola/dist/index.cjs +663 -0
  48. package/packages/shared/node_modules/consola/dist/index.d.cts +24 -0
  49. package/packages/shared/node_modules/consola/dist/index.d.mts +22 -0
  50. package/packages/shared/node_modules/consola/dist/index.d.ts +24 -0
  51. package/packages/shared/node_modules/consola/dist/index.mjs +651 -0
  52. package/packages/shared/node_modules/consola/dist/shared/consola.DCGIlDNP.cjs +75 -0
  53. package/packages/shared/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs +72 -0
  54. package/packages/shared/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs +288 -0
  55. package/packages/shared/node_modules/consola/dist/shared/consola.DwRq1yyg.cjs +312 -0
  56. package/packages/shared/node_modules/consola/dist/utils.cjs +64 -0
  57. package/packages/shared/node_modules/consola/dist/utils.d.cts +286 -0
  58. package/packages/shared/node_modules/consola/dist/utils.d.mts +286 -0
  59. package/packages/shared/node_modules/consola/dist/utils.d.ts +286 -0
  60. package/packages/shared/node_modules/consola/dist/utils.mjs +54 -0
  61. package/packages/shared/node_modules/consola/lib/index.cjs +10 -0
  62. package/packages/shared/node_modules/consola/package.json +136 -0
  63. package/packages/shared/node_modules/consola/utils.d.ts +1 -0
  64. package/packages/shared/tsconfig.json +0 -16
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ const node_util = require('node:util');
4
+ const node_path = require('node:path');
5
+
6
+ function parseStack(stack, message) {
7
+ const cwd = process.cwd() + node_path.sep;
8
+ const lines = stack.split("\n").splice(message.split("\n").length).map((l) => l.trim().replace("file://", "").replace(cwd, ""));
9
+ return lines;
10
+ }
11
+
12
+ function writeStream(data, stream) {
13
+ const write = stream.__write || stream.write;
14
+ return write.call(stream, data);
15
+ }
16
+
17
+ const bracket = (x) => x ? `[${x}]` : "";
18
+ class BasicReporter {
19
+ formatStack(stack, message, opts) {
20
+ const indent = " ".repeat((opts?.errorLevel || 0) + 1);
21
+ return indent + parseStack(stack, message).join(`
22
+ ${indent}`);
23
+ }
24
+ formatError(err, opts) {
25
+ const message = err.message ?? node_util.formatWithOptions(opts, err);
26
+ const stack = err.stack ? this.formatStack(err.stack, message, opts) : "";
27
+ const level = opts?.errorLevel || 0;
28
+ const causedPrefix = level > 0 ? `${" ".repeat(level)}[cause]: ` : "";
29
+ const causedError = err.cause ? "\n\n" + this.formatError(err.cause, { ...opts, errorLevel: level + 1 }) : "";
30
+ return causedPrefix + message + "\n" + stack + causedError;
31
+ }
32
+ formatArgs(args, opts) {
33
+ const _args = args.map((arg) => {
34
+ if (arg && typeof arg.stack === "string") {
35
+ return this.formatError(arg, opts);
36
+ }
37
+ return arg;
38
+ });
39
+ return node_util.formatWithOptions(opts, ..._args);
40
+ }
41
+ formatDate(date, opts) {
42
+ return opts.date ? date.toLocaleTimeString() : "";
43
+ }
44
+ filterAndJoin(arr) {
45
+ return arr.filter(Boolean).join(" ");
46
+ }
47
+ formatLogObj(logObj, opts) {
48
+ const message = this.formatArgs(logObj.args, opts);
49
+ if (logObj.type === "box") {
50
+ return "\n" + [
51
+ bracket(logObj.tag),
52
+ logObj.title && logObj.title,
53
+ ...message.split("\n")
54
+ ].filter(Boolean).map((l) => " > " + l).join("\n") + "\n";
55
+ }
56
+ return this.filterAndJoin([
57
+ bracket(logObj.type),
58
+ bracket(logObj.tag),
59
+ message
60
+ ]);
61
+ }
62
+ log(logObj, ctx) {
63
+ const line = this.formatLogObj(logObj, {
64
+ columns: ctx.options.stdout.columns || 0,
65
+ ...ctx.options.formatOptions
66
+ });
67
+ return writeStream(
68
+ line + "\n",
69
+ logObj.level < 2 ? ctx.options.stderr || process.stderr : ctx.options.stdout || process.stdout
70
+ );
71
+ }
72
+ }
73
+
74
+ exports.BasicReporter = BasicReporter;
75
+ exports.parseStack = parseStack;
@@ -0,0 +1,72 @@
1
+ import { formatWithOptions } from 'node:util';
2
+ import { sep } from 'node:path';
3
+
4
+ function parseStack(stack, message) {
5
+ const cwd = process.cwd() + sep;
6
+ const lines = stack.split("\n").splice(message.split("\n").length).map((l) => l.trim().replace("file://", "").replace(cwd, ""));
7
+ return lines;
8
+ }
9
+
10
+ function writeStream(data, stream) {
11
+ const write = stream.__write || stream.write;
12
+ return write.call(stream, data);
13
+ }
14
+
15
+ const bracket = (x) => x ? `[${x}]` : "";
16
+ class BasicReporter {
17
+ formatStack(stack, message, opts) {
18
+ const indent = " ".repeat((opts?.errorLevel || 0) + 1);
19
+ return indent + parseStack(stack, message).join(`
20
+ ${indent}`);
21
+ }
22
+ formatError(err, opts) {
23
+ const message = err.message ?? formatWithOptions(opts, err);
24
+ const stack = err.stack ? this.formatStack(err.stack, message, opts) : "";
25
+ const level = opts?.errorLevel || 0;
26
+ const causedPrefix = level > 0 ? `${" ".repeat(level)}[cause]: ` : "";
27
+ const causedError = err.cause ? "\n\n" + this.formatError(err.cause, { ...opts, errorLevel: level + 1 }) : "";
28
+ return causedPrefix + message + "\n" + stack + causedError;
29
+ }
30
+ formatArgs(args, opts) {
31
+ const _args = args.map((arg) => {
32
+ if (arg && typeof arg.stack === "string") {
33
+ return this.formatError(arg, opts);
34
+ }
35
+ return arg;
36
+ });
37
+ return formatWithOptions(opts, ..._args);
38
+ }
39
+ formatDate(date, opts) {
40
+ return opts.date ? date.toLocaleTimeString() : "";
41
+ }
42
+ filterAndJoin(arr) {
43
+ return arr.filter(Boolean).join(" ");
44
+ }
45
+ formatLogObj(logObj, opts) {
46
+ const message = this.formatArgs(logObj.args, opts);
47
+ if (logObj.type === "box") {
48
+ return "\n" + [
49
+ bracket(logObj.tag),
50
+ logObj.title && logObj.title,
51
+ ...message.split("\n")
52
+ ].filter(Boolean).map((l) => " > " + l).join("\n") + "\n";
53
+ }
54
+ return this.filterAndJoin([
55
+ bracket(logObj.type),
56
+ bracket(logObj.tag),
57
+ message
58
+ ]);
59
+ }
60
+ log(logObj, ctx) {
61
+ const line = this.formatLogObj(logObj, {
62
+ columns: ctx.options.stdout.columns || 0,
63
+ ...ctx.options.formatOptions
64
+ });
65
+ return writeStream(
66
+ line + "\n",
67
+ logObj.level < 2 ? ctx.options.stderr || process.stderr : ctx.options.stdout || process.stdout
68
+ );
69
+ }
70
+ }
71
+
72
+ export { BasicReporter as B, parseStack as p };
@@ -0,0 +1,288 @@
1
+ import * as tty from 'node:tty';
2
+
3
+ const {
4
+ env = {},
5
+ argv = [],
6
+ platform = ""
7
+ } = typeof process === "undefined" ? {} : process;
8
+ const isDisabled = "NO_COLOR" in env || argv.includes("--no-color");
9
+ const isForced = "FORCE_COLOR" in env || argv.includes("--color");
10
+ const isWindows = platform === "win32";
11
+ const isDumbTerminal = env.TERM === "dumb";
12
+ const isCompatibleTerminal = tty && tty.isatty && tty.isatty(1) && env.TERM && !isDumbTerminal;
13
+ const isCI = "CI" in env && ("GITHUB_ACTIONS" in env || "GITLAB_CI" in env || "CIRCLECI" in env);
14
+ const isColorSupported = !isDisabled && (isForced || isWindows && !isDumbTerminal || isCompatibleTerminal || isCI);
15
+ function replaceClose(index, string, close, replace, head = string.slice(0, Math.max(0, index)) + replace, tail = string.slice(Math.max(0, index + close.length)), next = tail.indexOf(close)) {
16
+ return head + (next < 0 ? tail : replaceClose(next, tail, close, replace));
17
+ }
18
+ function clearBleed(index, string, open, close, replace) {
19
+ return index < 0 ? open + string + close : open + replaceClose(index, string, close, replace) + close;
20
+ }
21
+ function filterEmpty(open, close, replace = open, at = open.length + 1) {
22
+ return (string) => string || !(string === "" || string === void 0) ? clearBleed(
23
+ ("" + string).indexOf(close, at),
24
+ string,
25
+ open,
26
+ close,
27
+ replace
28
+ ) : "";
29
+ }
30
+ function init(open, close, replace) {
31
+ return filterEmpty(`\x1B[${open}m`, `\x1B[${close}m`, replace);
32
+ }
33
+ const colorDefs = {
34
+ reset: init(0, 0),
35
+ bold: init(1, 22, "\x1B[22m\x1B[1m"),
36
+ dim: init(2, 22, "\x1B[22m\x1B[2m"),
37
+ italic: init(3, 23),
38
+ underline: init(4, 24),
39
+ inverse: init(7, 27),
40
+ hidden: init(8, 28),
41
+ strikethrough: init(9, 29),
42
+ black: init(30, 39),
43
+ red: init(31, 39),
44
+ green: init(32, 39),
45
+ yellow: init(33, 39),
46
+ blue: init(34, 39),
47
+ magenta: init(35, 39),
48
+ cyan: init(36, 39),
49
+ white: init(37, 39),
50
+ gray: init(90, 39),
51
+ bgBlack: init(40, 49),
52
+ bgRed: init(41, 49),
53
+ bgGreen: init(42, 49),
54
+ bgYellow: init(43, 49),
55
+ bgBlue: init(44, 49),
56
+ bgMagenta: init(45, 49),
57
+ bgCyan: init(46, 49),
58
+ bgWhite: init(47, 49),
59
+ blackBright: init(90, 39),
60
+ redBright: init(91, 39),
61
+ greenBright: init(92, 39),
62
+ yellowBright: init(93, 39),
63
+ blueBright: init(94, 39),
64
+ magentaBright: init(95, 39),
65
+ cyanBright: init(96, 39),
66
+ whiteBright: init(97, 39),
67
+ bgBlackBright: init(100, 49),
68
+ bgRedBright: init(101, 49),
69
+ bgGreenBright: init(102, 49),
70
+ bgYellowBright: init(103, 49),
71
+ bgBlueBright: init(104, 49),
72
+ bgMagentaBright: init(105, 49),
73
+ bgCyanBright: init(106, 49),
74
+ bgWhiteBright: init(107, 49)
75
+ };
76
+ function createColors(useColor = isColorSupported) {
77
+ return useColor ? colorDefs : Object.fromEntries(Object.keys(colorDefs).map((key) => [key, String]));
78
+ }
79
+ const colors = createColors();
80
+ function getColor(color, fallback = "reset") {
81
+ return colors[color] || colors[fallback];
82
+ }
83
+ function colorize(color, text) {
84
+ return getColor(color)(text);
85
+ }
86
+
87
+ const ansiRegex = [
88
+ String.raw`[\u001B\u009B][[\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\d\/#&.:=?%@~_]+)*|[a-zA-Z\d]+(?:;[-a-zA-Z\d\/#&.:=?%@~_]*)*)?\u0007)`,
89
+ String.raw`(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]))`
90
+ ].join("|");
91
+ function stripAnsi(text) {
92
+ return text.replace(new RegExp(ansiRegex, "g"), "");
93
+ }
94
+ function centerAlign(str, len, space = " ") {
95
+ const free = len - str.length;
96
+ if (free <= 0) {
97
+ return str;
98
+ }
99
+ const freeLeft = Math.floor(free / 2);
100
+ let _str = "";
101
+ for (let i = 0; i < len; i++) {
102
+ _str += i < freeLeft || i >= freeLeft + str.length ? space : str[i - freeLeft];
103
+ }
104
+ return _str;
105
+ }
106
+ function rightAlign(str, len, space = " ") {
107
+ const free = len - str.length;
108
+ if (free <= 0) {
109
+ return str;
110
+ }
111
+ let _str = "";
112
+ for (let i = 0; i < len; i++) {
113
+ _str += i < free ? space : str[i - free];
114
+ }
115
+ return _str;
116
+ }
117
+ function leftAlign(str, len, space = " ") {
118
+ let _str = "";
119
+ for (let i = 0; i < len; i++) {
120
+ _str += i < str.length ? str[i] : space;
121
+ }
122
+ return _str;
123
+ }
124
+ function align(alignment, str, len, space = " ") {
125
+ switch (alignment) {
126
+ case "left": {
127
+ return leftAlign(str, len, space);
128
+ }
129
+ case "right": {
130
+ return rightAlign(str, len, space);
131
+ }
132
+ case "center": {
133
+ return centerAlign(str, len, space);
134
+ }
135
+ default: {
136
+ return str;
137
+ }
138
+ }
139
+ }
140
+
141
+ const boxStylePresets = {
142
+ solid: {
143
+ tl: "\u250C",
144
+ tr: "\u2510",
145
+ bl: "\u2514",
146
+ br: "\u2518",
147
+ h: "\u2500",
148
+ v: "\u2502"
149
+ },
150
+ double: {
151
+ tl: "\u2554",
152
+ tr: "\u2557",
153
+ bl: "\u255A",
154
+ br: "\u255D",
155
+ h: "\u2550",
156
+ v: "\u2551"
157
+ },
158
+ doubleSingle: {
159
+ tl: "\u2553",
160
+ tr: "\u2556",
161
+ bl: "\u2559",
162
+ br: "\u255C",
163
+ h: "\u2500",
164
+ v: "\u2551"
165
+ },
166
+ doubleSingleRounded: {
167
+ tl: "\u256D",
168
+ tr: "\u256E",
169
+ bl: "\u2570",
170
+ br: "\u256F",
171
+ h: "\u2500",
172
+ v: "\u2551"
173
+ },
174
+ singleThick: {
175
+ tl: "\u250F",
176
+ tr: "\u2513",
177
+ bl: "\u2517",
178
+ br: "\u251B",
179
+ h: "\u2501",
180
+ v: "\u2503"
181
+ },
182
+ singleDouble: {
183
+ tl: "\u2552",
184
+ tr: "\u2555",
185
+ bl: "\u2558",
186
+ br: "\u255B",
187
+ h: "\u2550",
188
+ v: "\u2502"
189
+ },
190
+ singleDoubleRounded: {
191
+ tl: "\u256D",
192
+ tr: "\u256E",
193
+ bl: "\u2570",
194
+ br: "\u256F",
195
+ h: "\u2550",
196
+ v: "\u2502"
197
+ },
198
+ rounded: {
199
+ tl: "\u256D",
200
+ tr: "\u256E",
201
+ bl: "\u2570",
202
+ br: "\u256F",
203
+ h: "\u2500",
204
+ v: "\u2502"
205
+ }
206
+ };
207
+ const defaultStyle = {
208
+ borderColor: "white",
209
+ borderStyle: "rounded",
210
+ valign: "center",
211
+ padding: 2,
212
+ marginLeft: 1,
213
+ marginTop: 1,
214
+ marginBottom: 1
215
+ };
216
+ function box(text, _opts = {}) {
217
+ const opts = {
218
+ ..._opts,
219
+ style: {
220
+ ...defaultStyle,
221
+ ..._opts.style
222
+ }
223
+ };
224
+ const textLines = text.split("\n");
225
+ const boxLines = [];
226
+ const _color = getColor(opts.style.borderColor);
227
+ const borderStyle = {
228
+ ...typeof opts.style.borderStyle === "string" ? boxStylePresets[opts.style.borderStyle] || boxStylePresets.solid : opts.style.borderStyle
229
+ };
230
+ if (_color) {
231
+ for (const key in borderStyle) {
232
+ borderStyle[key] = _color(
233
+ borderStyle[key]
234
+ );
235
+ }
236
+ }
237
+ const paddingOffset = opts.style.padding % 2 === 0 ? opts.style.padding : opts.style.padding + 1;
238
+ const height = textLines.length + paddingOffset;
239
+ const width = Math.max(
240
+ ...textLines.map((line) => stripAnsi(line).length),
241
+ opts.title ? stripAnsi(opts.title).length : 0
242
+ ) + paddingOffset;
243
+ const widthOffset = width + paddingOffset;
244
+ const leftSpace = opts.style.marginLeft > 0 ? " ".repeat(opts.style.marginLeft) : "";
245
+ if (opts.style.marginTop > 0) {
246
+ boxLines.push("".repeat(opts.style.marginTop));
247
+ }
248
+ if (opts.title) {
249
+ const title = _color ? _color(opts.title) : opts.title;
250
+ const left = borderStyle.h.repeat(
251
+ Math.floor((width - stripAnsi(opts.title).length) / 2)
252
+ );
253
+ const right = borderStyle.h.repeat(
254
+ width - stripAnsi(opts.title).length - stripAnsi(left).length + paddingOffset
255
+ );
256
+ boxLines.push(
257
+ `${leftSpace}${borderStyle.tl}${left}${title}${right}${borderStyle.tr}`
258
+ );
259
+ } else {
260
+ boxLines.push(
261
+ `${leftSpace}${borderStyle.tl}${borderStyle.h.repeat(widthOffset)}${borderStyle.tr}`
262
+ );
263
+ }
264
+ const valignOffset = opts.style.valign === "center" ? Math.floor((height - textLines.length) / 2) : opts.style.valign === "top" ? height - textLines.length - paddingOffset : height - textLines.length;
265
+ for (let i = 0; i < height; i++) {
266
+ if (i < valignOffset || i >= valignOffset + textLines.length) {
267
+ boxLines.push(
268
+ `${leftSpace}${borderStyle.v}${" ".repeat(widthOffset)}${borderStyle.v}`
269
+ );
270
+ } else {
271
+ const line = textLines[i - valignOffset];
272
+ const left = " ".repeat(paddingOffset);
273
+ const right = " ".repeat(width - stripAnsi(line).length);
274
+ boxLines.push(
275
+ `${leftSpace}${borderStyle.v}${left}${line}${right}${borderStyle.v}`
276
+ );
277
+ }
278
+ }
279
+ boxLines.push(
280
+ `${leftSpace}${borderStyle.bl}${borderStyle.h.repeat(widthOffset)}${borderStyle.br}`
281
+ );
282
+ if (opts.style.marginBottom > 0) {
283
+ boxLines.push("".repeat(opts.style.marginBottom));
284
+ }
285
+ return boxLines.join("\n");
286
+ }
287
+
288
+ export { centerAlign as a, align as b, colorize as c, box as d, colors as e, getColor as g, leftAlign as l, rightAlign as r, stripAnsi as s };