@rcrsr/claude-code-runner 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +103 -30
  2. package/dist/cli/args.d.ts +0 -3
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +51 -20
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/runner.d.ts +5 -2
  7. package/dist/core/runner.d.ts.map +1 -1
  8. package/dist/core/runner.js +27 -24
  9. package/dist/core/runner.js.map +1 -1
  10. package/dist/index.js +83 -41
  11. package/dist/index.js.map +1 -1
  12. package/dist/output/colors.d.ts +5 -11
  13. package/dist/output/colors.d.ts.map +1 -1
  14. package/dist/output/colors.js +7 -59
  15. package/dist/output/colors.js.map +1 -1
  16. package/dist/output/deaddrop-queue.d.ts +45 -0
  17. package/dist/output/deaddrop-queue.d.ts.map +1 -0
  18. package/dist/output/deaddrop-queue.js +82 -0
  19. package/dist/output/deaddrop-queue.js.map +1 -0
  20. package/dist/output/formatter.d.ts +4 -0
  21. package/dist/output/formatter.d.ts.map +1 -1
  22. package/dist/output/formatter.js +20 -17
  23. package/dist/output/formatter.js.map +1 -1
  24. package/dist/process/pty.d.ts.map +1 -1
  25. package/dist/process/pty.js +3 -2
  26. package/dist/process/pty.js.map +1 -1
  27. package/dist/script/index.d.ts +8 -0
  28. package/dist/script/index.d.ts.map +1 -0
  29. package/dist/script/index.js +10 -0
  30. package/dist/script/index.js.map +1 -0
  31. package/dist/script/loader.d.ts +13 -0
  32. package/dist/script/loader.d.ts.map +1 -0
  33. package/dist/script/loader.js +66 -0
  34. package/dist/script/loader.js.map +1 -0
  35. package/dist/script/parser.d.ts +63 -0
  36. package/dist/script/parser.d.ts.map +1 -0
  37. package/dist/script/parser.js +349 -0
  38. package/dist/script/parser.js.map +1 -0
  39. package/dist/script/types.d.ts +49 -0
  40. package/dist/script/types.d.ts.map +1 -0
  41. package/dist/script/types.js +5 -0
  42. package/dist/script/types.js.map +1 -0
  43. package/dist/script/variables.d.ts +27 -0
  44. package/dist/script/variables.d.ts.map +1 -0
  45. package/dist/script/variables.js +74 -0
  46. package/dist/script/variables.js.map +1 -0
  47. package/dist/templates/command.d.ts +18 -20
  48. package/dist/templates/command.d.ts.map +1 -1
  49. package/dist/templates/command.js +40 -61
  50. package/dist/templates/command.js.map +1 -1
  51. package/dist/types/index.d.ts +1 -0
  52. package/dist/types/index.d.ts.map +1 -1
  53. package/dist/types/index.js +1 -0
  54. package/dist/types/index.js.map +1 -1
  55. package/dist/types/runner.d.ts +12 -0
  56. package/dist/types/runner.d.ts.map +1 -1
  57. package/dist/types/runner.js +4 -3
  58. package/dist/types/runner.js.map +1 -1
  59. package/dist/types/tools.d.ts +64 -0
  60. package/dist/types/tools.d.ts.map +1 -0
  61. package/dist/types/tools.js +12 -0
  62. package/dist/types/tools.js.map +1 -0
  63. package/dist/utils/arguments.d.ts +19 -0
  64. package/dist/utils/arguments.d.ts.map +1 -0
  65. package/dist/utils/arguments.js +31 -0
  66. package/dist/utils/arguments.js.map +1 -0
  67. package/dist/utils/constants.d.ts +49 -0
  68. package/dist/utils/constants.d.ts.map +1 -0
  69. package/dist/utils/constants.js +54 -0
  70. package/dist/utils/constants.js.map +1 -0
  71. package/dist/utils/formatting.d.ts +10 -0
  72. package/dist/utils/formatting.d.ts.map +1 -0
  73. package/dist/utils/formatting.js +19 -0
  74. package/dist/utils/formatting.js.map +1 -0
  75. package/dist/utils/index.d.ts +7 -0
  76. package/dist/utils/index.d.ts.map +1 -0
  77. package/dist/utils/index.js +7 -0
  78. package/dist/utils/index.js.map +1 -0
  79. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -4,19 +4,32 @@
4
4
  * Shows intermediate tool calls and responses in real-time
5
5
  */
6
6
  import { randomBytes } from 'crypto';
7
- import { parseArgs, parseCommandLine } from './cli/args.js';
8
- import { runWithSignals } from './core/runner.js';
7
+ import { parseArgs } from './cli/args.js';
8
+ import { runWithSignals, } from './core/runner.js';
9
9
  import { createDeadDropClientFromEnv } from './deaddrop/index.js';
10
- import { colors, configureDeadDrop, flushDeadDrop, formatDuration, printRunner, printRunnerInfo, } from './output/colors.js';
10
+ import { configureDeadDrop, flushDeadDrop, printRunner, printRunnerInfo, } from './output/colors.js';
11
11
  import { createFormatterState } from './output/formatter.js';
12
12
  import { createLogger } from './output/logger.js';
13
+ import { captureOutput, createVariableStore, getSubstitutionList, loadScript, substituteVariables, } from './script/index.js';
14
+ import { loadCommandTemplate } from './templates/command.js';
13
15
  import { DEFAULT_CONFIG } from './types/runner.js';
16
+ import { formatSize } from './utils/formatting.js';
14
17
  /**
15
18
  * Generate a short unique run ID (8 chars, uppercase)
16
19
  */
17
20
  function generateRunId() {
18
21
  return randomBytes(4).toString('hex').toUpperCase();
19
22
  }
23
+ /**
24
+ * Format variables used for "with X" clause
25
+ */
26
+ function formatVarsUsed(vars) {
27
+ if (vars.length === 0)
28
+ return '';
29
+ // Convert $_ to "last result", keep others as-is
30
+ const labels = vars.map((v) => (v === '$_' ? 'last result' : v));
31
+ return `with ${labels.join(', ')}: `;
32
+ }
20
33
  async function main() {
21
34
  const totalStart = Date.now();
22
35
  const args = process.argv.slice(2);
@@ -68,58 +81,87 @@ async function main() {
68
81
  printRunnerInfo(`Log: ${logger.filePath}`);
69
82
  }
70
83
  logger.log(`Started: ${new Date().toISOString()}`);
71
- if (parsed.scriptMode) {
72
- // Script mode: run each line
73
- await runScriptMode(parsed.scriptLines, context, totalStart);
84
+ // Build script lines - single prompt/command becomes a 1-step script
85
+ let lines;
86
+ let scriptArgs = [];
87
+ if (parsed.scriptMode && parsed.scriptFile) {
88
+ const script = loadScript(parsed.scriptFile, parsed.scriptArgs);
89
+ lines = script.lines;
90
+ scriptArgs = parsed.scriptArgs;
74
91
  }
75
92
  else {
76
- // Single command mode
77
- await runSingleMode(parsed.prompt, parsed.subcommand, parsed.displayCommand, context, totalStart);
93
+ // Single prompt or command becomes a 1-step script
94
+ lines = [{ type: 'prompt', text: parsed.prompt }];
78
95
  }
96
+ // Run the script
97
+ const success = await runScript(lines, scriptArgs, context, totalStart);
98
+ context.logger.close();
99
+ await flushDeadDrop();
100
+ process.exit(success ? 0 : 1);
79
101
  }
80
102
  /**
81
- * Run in single command mode (prompt or command)
103
+ * Build display string for a script line
82
104
  */
83
- async function runSingleMode(prompt, subcommand, displayCommand, context, startTime) {
84
- context.logger.log(`${subcommand}: ${displayCommand}\n`);
85
- const result = await runWithSignals(prompt, displayCommand, startTime, context);
86
- context.logger.close();
87
- await flushDeadDrop();
88
- process.exit(result === 'ok' ? 0 : 1);
105
+ function getDisplayLine(line) {
106
+ if (line.type === 'prompt') {
107
+ const preview = line.text.length > 50 ? line.text.slice(0, 50) + '...' : line.text;
108
+ return `"${preview}"`;
109
+ }
110
+ return `command("${line.name}")`;
89
111
  }
90
112
  /**
91
- * Run in script mode
113
+ * Run a script (unified execution for single prompts and multi-step scripts)
92
114
  */
93
- async function runScriptMode(scriptLines, context, startTime) {
94
- printRunner(`Running script: ${scriptLines.length} commands`);
95
- context.logger.log(`Script: ${scriptLines.length} commands\n`);
96
- for (const [i, line] of scriptLines.entries()) {
97
- context.logger.log(`\n=== [${i + 1}/${scriptLines.length}] ${line} ===\n`);
98
- let result;
99
- try {
100
- const parsed = parseCommandLine(line);
101
- result = await runWithSignals(parsed.prompt, line, startTime, context);
115
+ async function runScript(lines, scriptArgs, context, startTime) {
116
+ const store = createVariableStore();
117
+ let completedSteps = 0;
118
+ for (const [i, line] of lines.entries()) {
119
+ const stepNum = i + 1;
120
+ const displayLine = getDisplayLine(line);
121
+ context.logger.log(`\n=== Step ${stepNum}: ${displayLine} ===\n`);
122
+ // Get the prompt text
123
+ let promptText;
124
+ if (line.type === 'prompt') {
125
+ promptText = line.text;
102
126
  }
103
- catch (err) {
104
- printRunner(`${colors.red}Parse error:${colors.reset} ${err.message}`);
105
- result = 'error';
127
+ else {
128
+ const template = loadCommandTemplate(line.name, line.args);
129
+ promptText = template.prompt;
106
130
  }
107
- if (result === 'blocked' || result === 'error') {
108
- const totalDuration = Date.now() - startTime;
109
- printRunner(`${colors.red}Script stopped${colors.reset} [${i + 1}/${scriptLines.length}] steps in ${formatDuration(totalDuration)}`);
110
- context.logger.log(`\nSCRIPT STOPPED at step ${i + 1}, ${Math.round(totalDuration / 1000)}s total`);
111
- context.logger.close();
112
- await flushDeadDrop();
113
- process.exit(1);
131
+ // Substitute variables
132
+ const varsUsed = getSubstitutionList(promptText, store);
133
+ const finalPrompt = substituteVariables(promptText, store, scriptArgs);
134
+ // Build display: show substituted prompt and what variables were used
135
+ const substitutedDisplay = getDisplayLine({
136
+ type: 'prompt',
137
+ text: finalPrompt,
138
+ });
139
+ const withClause = formatVarsUsed(varsUsed);
140
+ // Set step number for formatter output
141
+ context.formatterState.currentStep = stepNum;
142
+ // Run via runWithSignals (handles iterations, signals, output)
143
+ const stepContext = { stepNum };
144
+ const result = await runWithSignals(finalPrompt, `${withClause}${substitutedDisplay}`, startTime, context, stepContext);
145
+ // Capture output for variable store
146
+ captureOutput(store, result.claudeText, line.capture);
147
+ // Print step completion with result size
148
+ const durationMs = context.formatterState.lastStepDurationMs;
149
+ const duration = durationMs ? `${(durationMs / 1000).toFixed(1)}s` : '?';
150
+ const size = formatSize(result.claudeText.length);
151
+ const captureLabel = line.capture ? `$${line.capture}` : 'result';
152
+ printRunner(`Completed step ${stepNum} in ${duration}, ${captureLabel} = ${size}`);
153
+ // Handle failure (runWithSignals already printed the error)
154
+ if (result.status !== 'ok') {
155
+ return false;
114
156
  }
157
+ completedSteps++;
115
158
  }
116
- // All commands completed
159
+ // Print completion with run ID, step count, and duration
117
160
  const totalDuration = Date.now() - startTime;
118
- printRunner(`${colors.green}Script completed${colors.reset} [${scriptLines.length}] steps in ${formatDuration(totalDuration)}`);
119
- context.logger.log(`\nSCRIPT COMPLETE, ${scriptLines.length} commands, ${Math.round(totalDuration / 1000)}s total`);
120
- context.logger.close();
121
- await flushDeadDrop();
122
- process.exit(0);
161
+ const stepWord = completedSteps === 1 ? 'step' : 'steps';
162
+ const durationSec = (totalDuration / 1000).toFixed(1);
163
+ printRunner(`Completed run ${context.runId} (${completedSteps} ${stepWord}) in ${durationSec}s`);
164
+ return true;
123
165
  }
124
166
  // Run main
125
167
  main().catch((err) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * ANSI color codes for terminal output
3
3
  */
4
+ import { configureDeadDrop, flushDeadDrop } from './deaddrop-queue.js';
5
+ export { configureDeadDrop, flushDeadDrop };
4
6
  export declare const colors: {
5
7
  readonly reset: "\u001B[0m";
6
8
  readonly dim: "\u001B[2m";
@@ -47,16 +49,6 @@ export type DeadDropUser = 'Runner' | 'Claude Code';
47
49
  * Deaddrop send function type (to avoid circular imports)
48
50
  */
49
51
  export type DeadDropSender = (content: string, user: DeadDropUser) => Promise<void>;
50
- /**
51
- * Configure the deaddrop sender for all output functions
52
- * Call once at startup when --deaddrop is enabled
53
- */
54
- export declare function configureDeadDrop(sender: DeadDropSender | null): void;
55
- /**
56
- * Flush all pending deaddrop sends
57
- * Call before process.exit to ensure all messages are sent
58
- */
59
- export declare function flushDeadDrop(): Promise<void>;
60
52
  /**
61
53
  * Print a [RUNNER] operational message with timestamp
62
54
  * Automatically sends to Deaddrop if configured (without prefix)
@@ -70,6 +62,8 @@ export declare function printRunnerInfo(message: string): void;
70
62
  /**
71
63
  * Print a [CLAUDE] message with timestamp
72
64
  * Automatically sends to Deaddrop if configured (without prefix)
65
+ * @param message - Display message (may be truncated/formatted for console)
66
+ * @param rawForDeaddrop - Original unmodified text to send to deaddrop (preserves newlines)
73
67
  */
74
- export declare function printClaude(message: string): void;
68
+ export declare function printClaude(message: string, rawForDeaddrop?: string): void;
75
69
  //# sourceMappingURL=colors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/output/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;CAUT,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAC;AAQ5C,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAejD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAM/D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,YAAY,KACf,OAAO,CAAC,IAAI,CAAC,CAAC;AAkBnB;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAErE;AAwBD;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD;AAYD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKjD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKjD"}
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/output/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,aAAa,EAEd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC;AAE5C,eAAO,MAAM,MAAM;;;;;;;;;;CAUT,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAC;AAQ5C,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAejD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAM/D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,YAAY,KACf,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKjD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAK1E"}
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * ANSI color codes for terminal output
3
3
  */
4
+ import { configureDeadDrop, flushDeadDrop, sendToDeadDrop, } from './deaddrop-queue.js';
5
+ // Re-export deaddrop functions for backward compatibility
6
+ export { configureDeadDrop, flushDeadDrop };
4
7
  export const colors = {
5
8
  reset: '\x1b[0m',
6
9
  dim: '\x1b[2m',
@@ -82,63 +85,6 @@ export function formatTimestamp(date = new Date()) {
82
85
  export function timestampPrefix() {
83
86
  return `${colors.dim}${formatTimestamp()}${colors.reset} `;
84
87
  }
85
- /**
86
- * Module-level deaddrop sender, configured once at startup
87
- */
88
- let deadDropSender = null;
89
- const messageQueue = [];
90
- let isProcessing = false;
91
- let flushResolve = null;
92
- /**
93
- * Configure the deaddrop sender for all output functions
94
- * Call once at startup when --deaddrop is enabled
95
- */
96
- export function configureDeadDrop(sender) {
97
- deadDropSender = sender;
98
- }
99
- /**
100
- * Process queued messages one at a time
101
- */
102
- async function processQueue() {
103
- if (isProcessing || !deadDropSender)
104
- return;
105
- isProcessing = true;
106
- let msg = messageQueue.shift();
107
- while (msg) {
108
- await deadDropSender(msg.content, msg.user);
109
- msg = messageQueue.shift();
110
- }
111
- isProcessing = false;
112
- // Resolve flush promise if waiting
113
- if (flushResolve && messageQueue.length === 0) {
114
- flushResolve();
115
- flushResolve = null;
116
- }
117
- }
118
- /**
119
- * Flush all pending deaddrop sends
120
- * Call before process.exit to ensure all messages are sent
121
- */
122
- export async function flushDeadDrop() {
123
- if (messageQueue.length === 0 && !isProcessing)
124
- return;
125
- return new Promise((resolve) => {
126
- flushResolve = resolve;
127
- // If not already processing, start
128
- if (!isProcessing) {
129
- void processQueue();
130
- }
131
- });
132
- }
133
- /**
134
- * Send a message to deaddrop if configured
135
- */
136
- function sendToDeadDrop(message, user) {
137
- if (deadDropSender) {
138
- messageQueue.push({ content: message, user });
139
- void processQueue();
140
- }
141
- }
142
88
  /**
143
89
  * Print a [RUNNER] operational message with timestamp
144
90
  * Automatically sends to Deaddrop if configured (without prefix)
@@ -157,9 +103,11 @@ export function printRunnerInfo(message) {
157
103
  /**
158
104
  * Print a [CLAUDE] message with timestamp
159
105
  * Automatically sends to Deaddrop if configured (without prefix)
106
+ * @param message - Display message (may be truncated/formatted for console)
107
+ * @param rawForDeaddrop - Original unmodified text to send to deaddrop (preserves newlines)
160
108
  */
161
- export function printClaude(message) {
109
+ export function printClaude(message, rawForDeaddrop) {
162
110
  console.log(`${timestampPrefix()}${colors.green}[CLAUDE]${colors.reset} ${message}`);
163
- sendToDeadDrop(stripAnsi(message), 'Claude Code');
111
+ sendToDeadDrop(stripAnsi(rawForDeaddrop ?? message), 'Claude Code');
164
112
  }
165
113
  //# sourceMappingURL=colors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/output/colors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/output/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Serial message queue for deaddrop communication
3
+ * Encapsulates module-level state into a testable class
4
+ */
5
+ import type { DeadDropSender, DeadDropUser } from './colors.js';
6
+ /**
7
+ * Serial message queue for deaddrop communication
8
+ * Ensures messages are sent one at a time in order
9
+ */
10
+ export declare class DeadDropQueue {
11
+ private sender;
12
+ private messageQueue;
13
+ private isProcessing;
14
+ private flushResolve;
15
+ /**
16
+ * Configure the sender function
17
+ * Call once at startup when --deaddrop is enabled
18
+ */
19
+ configure(sender: DeadDropSender | null): void;
20
+ /**
21
+ * Enqueue a message for sending
22
+ */
23
+ send(message: string, user: DeadDropUser): void;
24
+ /**
25
+ * Wait for all pending messages to be sent
26
+ * Call before process.exit to ensure delivery
27
+ */
28
+ flush(): Promise<void>;
29
+ private processQueue;
30
+ }
31
+ /**
32
+ * Configure the deaddrop sender for all output functions
33
+ * Call once at startup when --deaddrop is enabled
34
+ */
35
+ export declare function configureDeadDrop(sender: DeadDropSender | null): void;
36
+ /**
37
+ * Send a message to deaddrop if configured
38
+ */
39
+ export declare function sendToDeadDrop(message: string, user: DeadDropUser): void;
40
+ /**
41
+ * Flush all pending deaddrop sends
42
+ * Call before process.exit to ensure all messages are sent
43
+ */
44
+ export declare function flushDeadDrop(): Promise<void>;
45
+ //# sourceMappingURL=deaddrop-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deaddrop-queue.d.ts","sourceRoot":"","sources":["../../src/output/deaddrop-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhE;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAA6B;IAEjD;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI;IAI9C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAO/C;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAWd,YAAY;CAiB3B;AAKD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAErE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAExE;AAED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Serial message queue for deaddrop communication
3
+ * Encapsulates module-level state into a testable class
4
+ */
5
+ /**
6
+ * Serial message queue for deaddrop communication
7
+ * Ensures messages are sent one at a time in order
8
+ */
9
+ export class DeadDropQueue {
10
+ sender = null;
11
+ messageQueue = [];
12
+ isProcessing = false;
13
+ flushResolve = null;
14
+ /**
15
+ * Configure the sender function
16
+ * Call once at startup when --deaddrop is enabled
17
+ */
18
+ configure(sender) {
19
+ this.sender = sender;
20
+ }
21
+ /**
22
+ * Enqueue a message for sending
23
+ */
24
+ send(message, user) {
25
+ if (this.sender) {
26
+ this.messageQueue.push({ content: message, user });
27
+ void this.processQueue();
28
+ }
29
+ }
30
+ /**
31
+ * Wait for all pending messages to be sent
32
+ * Call before process.exit to ensure delivery
33
+ */
34
+ async flush() {
35
+ if (this.messageQueue.length === 0 && !this.isProcessing)
36
+ return;
37
+ return new Promise((resolve) => {
38
+ this.flushResolve = resolve;
39
+ if (!this.isProcessing) {
40
+ void this.processQueue();
41
+ }
42
+ });
43
+ }
44
+ async processQueue() {
45
+ if (this.isProcessing || !this.sender)
46
+ return;
47
+ this.isProcessing = true;
48
+ let msg = this.messageQueue.shift();
49
+ while (msg) {
50
+ await this.sender(msg.content, msg.user);
51
+ msg = this.messageQueue.shift();
52
+ }
53
+ this.isProcessing = false;
54
+ if (this.flushResolve && this.messageQueue.length === 0) {
55
+ this.flushResolve();
56
+ this.flushResolve = null;
57
+ }
58
+ }
59
+ }
60
+ // Singleton instance (maintains backward compatibility)
61
+ const defaultQueue = new DeadDropQueue();
62
+ /**
63
+ * Configure the deaddrop sender for all output functions
64
+ * Call once at startup when --deaddrop is enabled
65
+ */
66
+ export function configureDeadDrop(sender) {
67
+ defaultQueue.configure(sender);
68
+ }
69
+ /**
70
+ * Send a message to deaddrop if configured
71
+ */
72
+ export function sendToDeadDrop(message, user) {
73
+ defaultQueue.send(message, user);
74
+ }
75
+ /**
76
+ * Flush all pending deaddrop sends
77
+ * Call before process.exit to ensure all messages are sent
78
+ */
79
+ export async function flushDeadDrop() {
80
+ return defaultQueue.flush();
81
+ }
82
+ //# sourceMappingURL=deaddrop-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deaddrop-queue.js","sourceRoot":"","sources":["../../src/output/deaddrop-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,GAA0B,IAAI,CAAC;IACrC,YAAY,GAAoB,EAAE,CAAC;IACnC,YAAY,GAAG,KAAK,CAAC;IACrB,YAAY,GAAwB,IAAI,CAAC;IAEjD;;;OAGG;IACH,SAAS,CAAC,MAA6B;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,IAAkB;QACtC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAEjE,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAC9C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACpC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACzC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AAED,wDAAwD;AACxD,MAAM,YAAY,GAAG,IAAI,aAAa,EAAE,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA6B;IAC7D,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,IAAkB;IAChE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC;AAC9B,CAAC"}
@@ -13,6 +13,10 @@ export interface FormatterState {
13
13
  activeTask: ActiveTask | null;
14
14
  toolStartTimes: Map<string, number>;
15
15
  currentStep: number;
16
+ /** When true, step completion is not printed (caller handles it) */
17
+ suppressStepCompletion: boolean;
18
+ /** Duration from last result message (for caller to use) */
19
+ lastStepDurationMs: number | null;
16
20
  }
17
21
  export declare function createFormatterState(): FormatterState;
18
22
  export declare function resetFormatterState(state: FormatterState): void;
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,aAAa,EASnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,WAAW,EAChB,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAU5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAQrD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAK/D;AAwED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,SAAS,GACnB,IAAI,CAuBN;AAoFD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EAAE,sCAAsC;AACvD,mBAAmB,EAAE,MAAM,GAC1B,MAAM,CA2GR"}
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,aAAa,EASnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,WAAW,EAChB,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAuB5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,sBAAsB,EAAE,OAAO,CAAC;IAChC,4DAA4D;IAC5D,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAUrD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAK/D;AA2ED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,SAAS,GACnB,IAAI,CAuBN;AAoFD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EAAE,sCAAsC;AACvD,mBAAmB,EAAE,MAAM,GAC1B,MAAM,CA4GR"}
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { isAssistantMessage, isResultMessage, isSystemInitMessage, isTextBlock, isToolResultBlock, isToolUseBlock, isUserMessage, } from '../types/claude.js';
5
5
  import { NOISE_PATTERNS, } from '../types/runner.js';
6
+ import { MAX_RESULT_LINES, TRUNCATE_ANSWER, TRUNCATE_BASH_CMD, TRUNCATE_ERROR, TRUNCATE_GREP_PATTERN, TRUNCATE_MESSAGE, TRUNCATE_TASK_DESC, TRUNCATE_TASK_SUMMARY, TRUNCATE_TASK_VERBOSE, TRUNCATE_TOOL_JSON, TRUNCATE_VERBOSE_LINE, } from '../utils/constants.js';
6
7
  import { colors, formatDuration, printClaude, printRunner, shortenPath, timestampPrefix, truncate, } from './colors.js';
7
8
  export function createFormatterState() {
8
9
  return {
@@ -11,6 +12,8 @@ export function createFormatterState() {
11
12
  activeTask: null,
12
13
  toolStartTimes: new Map(),
13
14
  currentStep: 1,
15
+ suppressStepCompletion: true,
16
+ lastStepDurationMs: null,
14
17
  };
15
18
  }
16
19
  export function resetFormatterState(state) {
@@ -53,16 +56,16 @@ function formatToolUse(tool, indented, state) {
53
56
  summary = input['pattern'] ?? '';
54
57
  }
55
58
  else if (name === 'Grep') {
56
- summary = `"${truncate(input['pattern'] ?? '', 30)}"`;
59
+ summary = `"${truncate(input['pattern'] ?? '', TRUNCATE_GREP_PATTERN)}"`;
57
60
  }
58
61
  else if (name === 'Bash') {
59
- summary = truncate(input['command'] ?? '', 50);
62
+ summary = truncate(input['command'] ?? '', TRUNCATE_BASH_CMD);
60
63
  }
61
64
  else if (name === 'Task') {
62
65
  const taskType = input['subagent_type'] ?? 'agent';
63
66
  const taskDesc = truncate(input['description'] ??
64
67
  input['prompt'] ??
65
- '', 40);
68
+ '', TRUNCATE_TASK_DESC);
66
69
  summary = `${colors.magenta}${taskType}${colors.reset}: ${taskDesc}`;
67
70
  // Mark task as active and print task header
68
71
  state.activeTask = { name: taskType, description: taskDesc, id: tool.id };
@@ -74,7 +77,7 @@ function formatToolUse(tool, indented, state) {
74
77
  summary = shortenPath(input['file_path'] ?? '');
75
78
  }
76
79
  else {
77
- summary = truncate(JSON.stringify(input), 60);
80
+ summary = truncate(JSON.stringify(input), TRUNCATE_TOOL_JSON);
78
81
  }
79
82
  console.log(`${prefix}${colors.cyan}${name}${colors.reset} ${summary}`);
80
83
  }
@@ -121,13 +124,12 @@ function printToolResult(result, durationStr, verbosity, state) {
121
124
  : JSON.stringify(result.content);
122
125
  const filtered = filterNoiseLines(content);
123
126
  const lines = filtered.split('\n').filter((l) => l.trim());
124
- const maxLines = 10;
125
- const showLines = lines.slice(0, maxLines);
127
+ const showLines = lines.slice(0, MAX_RESULT_LINES);
126
128
  for (const line of showLines) {
127
- console.log(`${timestampPrefix()}${indent} ${colors.dim}${truncate(line, 150)}${colors.reset}`);
129
+ console.log(`${timestampPrefix()}${indent} ${colors.dim}${truncate(line, TRUNCATE_VERBOSE_LINE)}${colors.reset}`);
128
130
  }
129
- if (lines.length > maxLines) {
130
- console.log(`${timestampPrefix()}${indent} ${colors.dim}... (${lines.length - maxLines} more lines)${colors.reset}${durationStr}`);
131
+ if (lines.length > MAX_RESULT_LINES) {
132
+ console.log(`${timestampPrefix()}${indent} ${colors.dim}... (${lines.length - MAX_RESULT_LINES} more lines)${colors.reset}${durationStr}`);
131
133
  }
132
134
  else if (durationStr) {
133
135
  console.log(`${timestampPrefix()}${indent} ${durationStr}`);
@@ -148,7 +150,7 @@ function printTaskResult(result, durationStr, verbosity, state) {
148
150
  .filter((l) => l.trim() && !l.includes('agentId:'));
149
151
  // Show task result summary
150
152
  if (lines.length > 0) {
151
- const maxLen = verbosity === 'verbose' ? 500 : 200;
153
+ const maxLen = verbosity === 'verbose' ? TRUNCATE_TASK_VERBOSE : TRUNCATE_TASK_SUMMARY;
152
154
  const summary = lines.join(' ').replace(/\s+/g, ' ');
153
155
  console.log(`${timestampPrefix()} ${colors.green}→ ${truncate(summary, maxLen)}${colors.reset}`);
154
156
  }
@@ -174,13 +176,13 @@ parallelThresholdMs) {
174
176
  // Show answers but not thinking/status updates
175
177
  if (!block.text.startsWith("I'll ") &&
176
178
  !block.text.startsWith('Let me ')) {
177
- const text = block.text.replace(/[\r\n]+/g, ' ').trim();
178
- console.log(`${timestampPrefix()}${colors.green}[ANSWER]${colors.reset} ${truncate(text, 500)}`);
179
+ const displayText = block.text.replace(/[\r\n]+/g, ' ').trim();
180
+ console.log(`${timestampPrefix()}${colors.green}[ANSWER]${colors.reset} ${truncate(displayText, TRUNCATE_ANSWER)}`);
179
181
  }
180
182
  }
181
183
  else {
182
- const text = block.text.replace(/[\r\n]+/g, ' ').trim();
183
- printClaude(text);
184
+ const displayText = block.text.replace(/[\r\n]+/g, ' ').trim();
185
+ printClaude(displayText, block.text);
184
186
  }
185
187
  }
186
188
  else if (isToolUseBlock(block)) {
@@ -230,7 +232,7 @@ parallelThresholdMs) {
230
232
  content.startsWith('Error:') ||
231
233
  content.startsWith('error:');
232
234
  if (isError) {
233
- console.log(`${timestampPrefix()} ${colors.red}ERROR: ${truncate(content, 100)}${colors.reset}${durationStr}`);
235
+ console.log(`${timestampPrefix()} ${colors.red}ERROR: ${truncate(content, TRUNCATE_ERROR)}${colors.reset}${durationStr}`);
234
236
  }
235
237
  else if (state.activeTask?.id === toolUseId) {
236
238
  // Task completing
@@ -244,14 +246,15 @@ parallelThresholdMs) {
244
246
  }
245
247
  else if (isResultMessage(msg)) {
246
248
  flushPendingTools(state, verbosity);
247
- if (verbosity !== 'quiet') {
249
+ state.lastStepDurationMs = msg.duration_ms ?? null;
250
+ if (!state.suppressStepCompletion && verbosity !== 'quiet') {
248
251
  const duration = msg.duration_ms ? formatDuration(msg.duration_ms) : '?';
249
252
  printRunner(`Completed step ${state.currentStep} in ${duration}`);
250
253
  }
251
254
  }
252
255
  else {
253
256
  if (verbosity === 'verbose') {
254
- console.log(`${timestampPrefix()}${colors.dim}[${msg.type.toUpperCase()}] ${truncate(JSON.stringify(msg), 100)}${colors.reset}`);
257
+ console.log(`${timestampPrefix()}${colors.dim}[${msg.type.toUpperCase()}] ${truncate(JSON.stringify(msg), TRUNCATE_MESSAGE)}${colors.reset}`);
255
258
  }
256
259
  }
257
260
  return claudeText;