@zhixuan92/multi-model-agent-core 4.0.2 → 4.0.4
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.
- package/README.md +20 -6
- package/dist/bounded-execution/activity-tracker-types.d.ts +2 -2
- package/dist/bounded-execution/activity-tracker-types.d.ts.map +1 -1
- package/dist/bounded-execution/activity-tracker.d.ts +3 -3
- package/dist/bounded-execution/activity-tracker.d.ts.map +1 -1
- package/dist/bounded-execution/activity-tracker.js +15 -15
- package/dist/bounded-execution/activity-tracker.js.map +1 -1
- package/dist/config/model-profile-registry.d.ts +0 -10
- package/dist/config/model-profile-registry.d.ts.map +1 -1
- package/dist/config/model-profile-registry.js +126 -8
- package/dist/config/model-profile-registry.js.map +1 -1
- package/dist/config/schema.d.ts +0 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +3 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/escalation/delegate-with-escalation.d.ts +24 -0
- package/dist/escalation/delegate-with-escalation.d.ts.map +1 -1
- package/dist/escalation/delegate-with-escalation.js +5 -0
- package/dist/escalation/delegate-with-escalation.js.map +1 -1
- package/dist/escalation/fallback-types.d.ts +1 -1
- package/dist/escalation/fallback-types.d.ts.map +1 -1
- package/dist/escalation/fallback.js +2 -2
- package/dist/escalation/fallback.js.map +1 -1
- package/dist/events/cloud-events.d.ts +3 -4
- package/dist/events/cloud-events.d.ts.map +1 -1
- package/dist/events/cloud-events.js +0 -1
- package/dist/events/cloud-events.js.map +1 -1
- package/dist/events/event-builder.d.ts +4 -2
- package/dist/events/event-builder.d.ts.map +1 -1
- package/dist/events/event-builder.js +47 -45
- package/dist/events/event-builder.js.map +1 -1
- package/dist/events/observability-events.d.ts +7 -8
- package/dist/events/observability-events.d.ts.map +1 -1
- package/dist/events/running-headline-sink.d.ts +26 -0
- package/dist/events/running-headline-sink.d.ts.map +1 -0
- package/dist/events/running-headline-sink.js +116 -0
- package/dist/events/running-headline-sink.js.map +1 -0
- package/dist/events/telemetry-types.d.ts +20 -20
- package/dist/events/telemetry-types.js +8 -8
- package/dist/events/telemetry-types.js.map +1 -1
- package/dist/events/verbose-log-channel.d.ts +22 -2
- package/dist/events/verbose-log-channel.d.ts.map +1 -1
- package/dist/events/verbose-log-channel.js +46 -9
- package/dist/events/verbose-log-channel.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/intake/brief-compiler-slots/delegate.d.ts +1 -0
- package/dist/intake/brief-compiler-slots/delegate.d.ts.map +1 -1
- package/dist/intake/brief-compiler-slots/delegate.js +17 -2
- package/dist/intake/brief-compiler-slots/delegate.js.map +1 -1
- package/dist/lifecycle/diff-tracker.d.ts +72 -0
- package/dist/lifecycle/diff-tracker.d.ts.map +1 -0
- package/dist/lifecycle/diff-tracker.js +316 -0
- package/dist/lifecycle/diff-tracker.js.map +1 -0
- package/dist/lifecycle/executor-output-types.d.ts +2 -2
- package/dist/lifecycle/executor-output-types.d.ts.map +1 -1
- package/dist/lifecycle/handlers/baseline-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/baseline-handlers.js +48 -1
- package/dist/lifecycle/handlers/baseline-handlers.js.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js +23 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js.map +1 -1
- package/dist/lifecycle/handlers/quality-chain-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/quality-chain-handlers.js +177 -6
- package/dist/lifecycle/handlers/quality-chain-handlers.js.map +1 -1
- package/dist/lifecycle/handlers/review-diff-handler.d.ts.map +1 -1
- package/dist/lifecycle/handlers/review-diff-handler.js +74 -13
- package/dist/lifecycle/handlers/review-diff-handler.js.map +1 -1
- package/dist/lifecycle/handlers/run-verify-command-handler.js +11 -2
- package/dist/lifecycle/handlers/run-verify-command-handler.js.map +1 -1
- package/dist/lifecycle/handlers/spec-chain-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/spec-chain-handlers.js +135 -6
- package/dist/lifecycle/handlers/spec-chain-handlers.js.map +1 -1
- package/dist/lifecycle/handlers/terminal-handlers.d.ts +8 -0
- package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/terminal-handlers.js +168 -11
- package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
- package/dist/lifecycle/lifecycle-context.d.ts +0 -2
- package/dist/lifecycle/lifecycle-context.d.ts.map +1 -1
- package/dist/lifecycle/merge-stage-stats.d.ts +58 -0
- package/dist/lifecycle/merge-stage-stats.d.ts.map +1 -0
- package/dist/lifecycle/merge-stage-stats.js +120 -0
- package/dist/lifecycle/merge-stage-stats.js.map +1 -0
- package/dist/lifecycle/shared-compute.js +4 -4
- package/dist/lifecycle/shared-compute.js.map +1 -1
- package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
- package/dist/lifecycle/stage-plan-builder.js +6 -0
- package/dist/lifecycle/stage-plan-builder.js.map +1 -1
- package/dist/lifecycle/stage-plan-types.d.ts +18 -0
- package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
- package/dist/lifecycle/stage-progression.d.ts +20 -0
- package/dist/lifecycle/stage-progression.d.ts.map +1 -0
- package/dist/lifecycle/stage-progression.js +165 -0
- package/dist/lifecycle/stage-progression.js.map +1 -0
- package/dist/lifecycle/task-executor.d.ts.map +1 -1
- package/dist/lifecycle/task-executor.js +55 -10
- package/dist/lifecycle/task-executor.js.map +1 -1
- package/dist/lifecycle/task-runner.d.ts +7 -3
- package/dist/lifecycle/task-runner.d.ts.map +1 -1
- package/dist/lifecycle/task-runner.js +43 -7
- package/dist/lifecycle/task-runner.js.map +1 -1
- package/dist/providers/anthropic-messages-adapter.d.ts.map +1 -1
- package/dist/providers/anthropic-messages-adapter.js +25 -1
- package/dist/providers/anthropic-messages-adapter.js.map +1 -1
- package/dist/providers/base/result-builders.d.ts +1 -1
- package/dist/providers/base/result-builders.d.ts.map +1 -1
- package/dist/providers/base/result-builders.js +4 -4
- package/dist/providers/base/result-builders.js.map +1 -1
- package/dist/providers/make-runner-shell.d.ts.map +1 -1
- package/dist/providers/make-runner-shell.js +6 -5
- package/dist/providers/make-runner-shell.js.map +1 -1
- package/dist/providers/openai-chat-adapter.d.ts +0 -2
- package/dist/providers/openai-chat-adapter.d.ts.map +1 -1
- package/dist/providers/openai-chat-adapter.js +2 -3
- package/dist/providers/openai-chat-adapter.js.map +1 -1
- package/dist/providers/openai-responses-adapter.d.ts +1 -2
- package/dist/providers/openai-responses-adapter.d.ts.map +1 -1
- package/dist/providers/openai-responses-adapter.js +67 -39
- package/dist/providers/openai-responses-adapter.js.map +1 -1
- package/dist/providers/provider-factory.d.ts.map +1 -1
- package/dist/providers/provider-factory.js +51 -9
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/providers/runner-adapter.d.ts +10 -0
- package/dist/providers/runner-adapter.d.ts.map +1 -1
- package/dist/providers/runner-shell-types.d.ts +33 -0
- package/dist/providers/runner-shell-types.d.ts.map +1 -1
- package/dist/providers/runner-shell.d.ts +10 -1
- package/dist/providers/runner-shell.d.ts.map +1 -1
- package/dist/providers/runner-shell.js +251 -18
- package/dist/providers/runner-shell.js.map +1 -1
- package/dist/providers/runner-types.d.ts +21 -2
- package/dist/providers/runner-types.d.ts.map +1 -1
- package/dist/providers/tool-name-sets.d.ts +29 -0
- package/dist/providers/tool-name-sets.d.ts.map +1 -0
- package/dist/providers/tool-name-sets.js +41 -0
- package/dist/providers/tool-name-sets.js.map +1 -0
- package/dist/reporting/headline-composer.d.ts +12 -0
- package/dist/reporting/headline-composer.d.ts.map +1 -1
- package/dist/reporting/headline-composer.js.map +1 -1
- package/dist/reporting/headline-templates/audit.d.ts.map +1 -1
- package/dist/reporting/headline-templates/audit.js +35 -6
- package/dist/reporting/headline-templates/audit.js.map +1 -1
- package/dist/reporting/headline-templates/debug.d.ts +22 -3
- package/dist/reporting/headline-templates/debug.d.ts.map +1 -1
- package/dist/reporting/headline-templates/debug.js +38 -8
- package/dist/reporting/headline-templates/debug.js.map +1 -1
- package/dist/reporting/headline-templates/delegate.d.ts.map +1 -1
- package/dist/reporting/headline-templates/delegate.js +36 -6
- package/dist/reporting/headline-templates/delegate.js.map +1 -1
- package/dist/reporting/headline-templates/execute-plan.d.ts.map +1 -1
- package/dist/reporting/headline-templates/execute-plan.js +18 -6
- package/dist/reporting/headline-templates/execute-plan.js.map +1 -1
- package/dist/reporting/headline-templates/review.d.ts.map +1 -1
- package/dist/reporting/headline-templates/review.js +32 -8
- package/dist/reporting/headline-templates/review.js.map +1 -1
- package/dist/reporting/headline-templates/verify.d.ts.map +1 -1
- package/dist/reporting/headline-templates/verify.js +23 -6
- package/dist/reporting/headline-templates/verify.js.map +1 -1
- package/dist/reporting/headline-text.d.ts +36 -0
- package/dist/reporting/headline-text.d.ts.map +1 -0
- package/dist/reporting/headline-text.js +73 -0
- package/dist/reporting/headline-text.js.map +1 -0
- package/dist/reporting/report-parser-slots/verify-report.d.ts +17 -0
- package/dist/reporting/report-parser-slots/verify-report.d.ts.map +1 -1
- package/dist/reporting/report-parser-slots/verify-report.js +45 -3
- package/dist/reporting/report-parser-slots/verify-report.js.map +1 -1
- package/dist/reporting/severity.d.ts +62 -0
- package/dist/reporting/severity.d.ts.map +1 -0
- package/dist/reporting/severity.js +93 -0
- package/dist/reporting/severity.js.map +1 -0
- package/dist/reporting/structured-report.d.ts +3 -3
- package/dist/research/explore-orchestrator.d.ts.map +1 -1
- package/dist/research/explore-orchestrator.js +4 -5
- package/dist/research/explore-orchestrator.js.map +1 -1
- package/dist/review/annotator-engine.d.ts +8 -0
- package/dist/review/annotator-engine.d.ts.map +1 -1
- package/dist/review/annotator-engine.js +7 -1
- package/dist/review/annotator-engine.js.map +1 -1
- package/dist/review/annotator-output-parser.d.ts.map +1 -1
- package/dist/review/annotator-output-parser.js +94 -14
- package/dist/review/annotator-output-parser.js.map +1 -1
- package/dist/review/annotator-prompt-builder.d.ts +20 -0
- package/dist/review/annotator-prompt-builder.d.ts.map +1 -1
- package/dist/review/annotator-prompt-builder.js +52 -1
- package/dist/review/annotator-prompt-builder.js.map +1 -1
- package/dist/review/review-types.d.ts +6 -2
- package/dist/review/review-types.d.ts.map +1 -1
- package/dist/review/reviewer-engine.d.ts +25 -0
- package/dist/review/reviewer-engine.d.ts.map +1 -1
- package/dist/review/reviewer-engine.js +18 -1
- package/dist/review/reviewer-engine.js.map +1 -1
- package/dist/review/reviewer-output-parser.d.ts.map +1 -1
- package/dist/review/reviewer-output-parser.js +190 -13
- package/dist/review/reviewer-output-parser.js.map +1 -1
- package/dist/review/reviewer-prompt-builder.d.ts +4 -12
- package/dist/review/reviewer-prompt-builder.d.ts.map +1 -1
- package/dist/review/reviewer-prompt-builder.js.map +1 -1
- package/dist/review/templates/diff-review.d.ts +8 -0
- package/dist/review/templates/diff-review.d.ts.map +1 -1
- package/dist/review/templates/diff-review.js +34 -2
- package/dist/review/templates/diff-review.js.map +1 -1
- package/dist/review/templates/finding-criteria.d.ts +39 -0
- package/dist/review/templates/finding-criteria.d.ts.map +1 -0
- package/dist/review/templates/finding-criteria.js +80 -0
- package/dist/review/templates/finding-criteria.js.map +1 -0
- package/dist/review/templates/quality-review-artifact.d.ts +13 -0
- package/dist/review/templates/quality-review-artifact.d.ts.map +1 -1
- package/dist/review/templates/quality-review-artifact.js +41 -3
- package/dist/review/templates/quality-review-artifact.js.map +1 -1
- package/dist/review/templates/shared.d.ts +22 -5
- package/dist/review/templates/shared.d.ts.map +1 -1
- package/dist/review/templates/spec-review.d.ts +15 -0
- package/dist/review/templates/spec-review.d.ts.map +1 -1
- package/dist/review/templates/spec-review.js +43 -3
- package/dist/review/templates/spec-review.js.map +1 -1
- package/dist/stores/batch-registry.d.ts +18 -0
- package/dist/stores/batch-registry.d.ts.map +1 -1
- package/dist/stores/batch-registry.js +10 -0
- package/dist/stores/batch-registry.js.map +1 -1
- package/dist/stores/context-block-tool.d.ts +14 -0
- package/dist/stores/context-block-tool.d.ts.map +1 -1
- package/dist/stores/context-block-tool.js.map +1 -1
- package/dist/stores/file-backed-context-block-store.d.ts +63 -0
- package/dist/stores/file-backed-context-block-store.d.ts.map +1 -0
- package/dist/stores/file-backed-context-block-store.js +293 -0
- package/dist/stores/file-backed-context-block-store.js.map +1 -0
- package/dist/stores/project-context-registry.d.ts +16 -3
- package/dist/stores/project-context-registry.d.ts.map +1 -1
- package/dist/stores/project-context-registry.js +9 -2
- package/dist/stores/project-context-registry.js.map +1 -1
- package/dist/tools/audit/schema.d.ts +2 -2
- package/dist/tools/audit/tool-config.d.ts.map +1 -1
- package/dist/tools/audit/tool-config.js +23 -6
- package/dist/tools/audit/tool-config.js.map +1 -1
- package/dist/tools/debug/tool-config.d.ts.map +1 -1
- package/dist/tools/debug/tool-config.js +17 -4
- package/dist/tools/debug/tool-config.js.map +1 -1
- package/dist/tools/execute-plan/tool-config.d.ts.map +1 -1
- package/dist/tools/execute-plan/tool-config.js +5 -1
- package/dist/tools/execute-plan/tool-config.js.map +1 -1
- package/dist/tools/investigate/tool-config.d.ts +13 -1
- package/dist/tools/investigate/tool-config.d.ts.map +1 -1
- package/dist/tools/investigate/tool-config.js +34 -4
- package/dist/tools/investigate/tool-config.js.map +1 -1
- package/dist/tools/retry/tool-config.d.ts.map +1 -1
- package/dist/tools/retry/tool-config.js +28 -5
- package/dist/tools/retry/tool-config.js.map +1 -1
- package/dist/tools/review/schema.d.ts +1 -1
- package/dist/tools/review/tool-config.d.ts.map +1 -1
- package/dist/tools/review/tool-config.js +19 -4
- package/dist/tools/review/tool-config.js.map +1 -1
- package/dist/tools/verify/tool-config.d.ts.map +1 -1
- package/dist/tools/verify/tool-config.js +17 -4
- package/dist/tools/verify/tool-config.js.map +1 -1
- package/dist/types/enums.d.ts +10 -10
- package/package.json +5 -1
- package/dist/intake/brief-compiler-slots/investigate.d.ts +0 -26
- package/dist/intake/brief-compiler-slots/investigate.d.ts.map +0 -1
- package/dist/intake/brief-compiler-slots/investigate.js +0 -42
- package/dist/intake/brief-compiler-slots/investigate.js.map +0 -1
|
@@ -1,18 +1,123 @@
|
|
|
1
|
+
import { resolveRateCard, priceTokens } from '../bounded-execution/cost-compute.js';
|
|
1
2
|
const DEFAULT_CAPABILITIES = {
|
|
2
3
|
cache_control: false, thinking: false, vision: false, tool_use: true, streaming: false, other: [],
|
|
3
4
|
};
|
|
5
|
+
// Tool-name sets are centralized in `tool-name-sets.ts` so the
|
|
6
|
+
// runner-shell + running-headline-sink can't drift. Note: this
|
|
7
|
+
// runner's READ list is intentionally narrower than the central
|
|
8
|
+
// READ_TOOL_NAMES — runner-shell tracks filesRead by extractable
|
|
9
|
+
// path, and grep/glob/listFiles don't have a single "file" arg. The
|
|
10
|
+
// central set is for the polling headline's read activity counter,
|
|
11
|
+
// which counts every read-class tool call regardless of args.
|
|
12
|
+
import { WRITE_TOOL_NAMES, SHELL_TOOL_NAMES } from './tool-name-sets.js';
|
|
13
|
+
const READ_TOOL_NAMES = new Set(['readFile', 'read_file']);
|
|
14
|
+
function extractPathFromToolInput(input) {
|
|
15
|
+
if (typeof input !== 'object' || input === null)
|
|
16
|
+
return undefined;
|
|
17
|
+
const obj = input;
|
|
18
|
+
for (const key of ['path', 'file_path', 'filePath']) {
|
|
19
|
+
const v = obj[key];
|
|
20
|
+
if (typeof v === 'string')
|
|
21
|
+
return v;
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Heuristic: does the given shell command write to the filesystem?
|
|
27
|
+
*
|
|
28
|
+
* Gap 11 fix (4.0.3+): the polling headline tracks file writes by tool
|
|
29
|
+
* name (writeFile/write_file/edit_file). Workers that bypass these and
|
|
30
|
+
* write via run_shell (cat >, sed -i, tee, etc.) used to show "0 write"
|
|
31
|
+
* for the entire run despite actively producing artifacts. This
|
|
32
|
+
* heuristic looks for common write patterns in the command string;
|
|
33
|
+
* false positives are acceptable (operator gets a slightly noisy count)
|
|
34
|
+
* but false negatives are not (the headline lies about progress).
|
|
35
|
+
*
|
|
36
|
+
* Patterns detected:
|
|
37
|
+
* - Output redirects: `> file`, `>> file`, `&> file`, `>| file`
|
|
38
|
+
* - Heredoc to file: `<<EOF > file`, `cat <<...> file`
|
|
39
|
+
* - `sed -i` / `sed -i ''` (in-place edit)
|
|
40
|
+
* - `awk -i inplace` / `gawk -i inplace`
|
|
41
|
+
* - `tee file`, `tee -a file`
|
|
42
|
+
* - `cp/mv/touch/install` (file creation/moves)
|
|
43
|
+
* - `mkdir`, `rm`, `chmod`, `chown` (filesystem mutation)
|
|
44
|
+
* - `git checkout/reset/restore/pull/merge` (modifies files)
|
|
45
|
+
* - `python/node -c '... open(... "w") ...'` is NOT detected — too
|
|
46
|
+
* ambiguous; keeps false-positive rate low.
|
|
47
|
+
*/
|
|
48
|
+
const SHELL_WRITE_PATTERNS = [
|
|
49
|
+
/[^&|>]>>?\s*[^&|>\s]/, // > file or >> file (excluding 2>&1, &> handled below)
|
|
50
|
+
/&>\s*[^&|>\s]/, // &> file
|
|
51
|
+
/>\|\s*[^&|>\s]/, // >| file
|
|
52
|
+
/\bsed\s+(?:-[a-z]*i[a-z]*\b|--in-place\b)/i, // sed -i / sed --in-place
|
|
53
|
+
/\b(?:awk|gawk|nawk)\s+-i\s+inplace\b/i,
|
|
54
|
+
/\btee\b/,
|
|
55
|
+
/\b(?:cp|mv|touch|install|ln)\s+/,
|
|
56
|
+
/\bmkdir\s+/,
|
|
57
|
+
/\brm\s+/,
|
|
58
|
+
/\bchmod\s+/,
|
|
59
|
+
/\bchown\s+/,
|
|
60
|
+
/\bgit\s+(?:checkout|reset|restore|pull|merge|clean|stash|cherry-pick|rebase|apply)\b/,
|
|
61
|
+
/\bnpm\s+(?:install|i|ci|uninstall|update|run\s+build|run\s+test)\b/,
|
|
62
|
+
/\bpnpm\s+(?:install|add|remove|update|run)\b/,
|
|
63
|
+
/\byarn\s+(?:install|add|remove|upgrade)\b/,
|
|
64
|
+
];
|
|
65
|
+
export function shellCommandWritesFs(command) {
|
|
66
|
+
if (!command || command.length === 0)
|
|
67
|
+
return false;
|
|
68
|
+
for (const pattern of SHELL_WRITE_PATTERNS) {
|
|
69
|
+
if (pattern.test(command))
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
function extractShellCommand(input) {
|
|
75
|
+
if (typeof input !== 'object' || input === null)
|
|
76
|
+
return undefined;
|
|
77
|
+
const obj = input;
|
|
78
|
+
for (const key of ['command', 'cmd', 'shell']) {
|
|
79
|
+
const v = obj[key];
|
|
80
|
+
if (typeof v === 'string')
|
|
81
|
+
return v;
|
|
82
|
+
if (Array.isArray(v))
|
|
83
|
+
return v.join(' ');
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
4
87
|
export class RunnerShell {
|
|
5
88
|
adapter;
|
|
6
|
-
|
|
89
|
+
defaultModel;
|
|
90
|
+
constructor(adapter,
|
|
91
|
+
/** Default model id used for cost computation when input.model is absent.
|
|
92
|
+
* Reviewer/annotator engines call shell.run() without setting input.model,
|
|
93
|
+
* so without this default every reviewer-side stage would record costUSD=null. */
|
|
94
|
+
defaultModel) {
|
|
7
95
|
this.adapter = adapter;
|
|
96
|
+
this.defaultModel = defaultModel;
|
|
8
97
|
}
|
|
9
98
|
async run(input) {
|
|
99
|
+
const startMs = Date.now();
|
|
100
|
+
const modelForCost = input.model ?? this.defaultModel;
|
|
10
101
|
const ctx = { cwd: input.cwd, callCache: new Map() };
|
|
11
102
|
const usage = { inputTokens: 0, outputTokens: 0, cachedReadTokens: 0, cachedNonReadTokens: 0 };
|
|
12
103
|
const allToolCalls = [];
|
|
104
|
+
const filesRead = [];
|
|
105
|
+
const filesWritten = [];
|
|
106
|
+
let turns = 0;
|
|
13
107
|
const history = [];
|
|
14
108
|
let finalText = '';
|
|
15
109
|
let stoppedByAdapter = false;
|
|
110
|
+
// Common fields stamped on every emitted bus event so VerboseLogChannel
|
|
111
|
+
// surfaces enough context for an operator to see which run a line belongs
|
|
112
|
+
// to without grepping back to the originating request.
|
|
113
|
+
const baseEventFields = {
|
|
114
|
+
...(input.batchId !== undefined && { batchId: input.batchId }),
|
|
115
|
+
...(input.taskIndex !== undefined && { taskIndex: input.taskIndex }),
|
|
116
|
+
...(input.tier !== undefined && { tier: input.tier }),
|
|
117
|
+
...(input.model !== undefined && { model: input.model }),
|
|
118
|
+
...(input.stageLabel !== undefined && { stageLabel: input.stageLabel }),
|
|
119
|
+
providerType: this.adapter.providerType,
|
|
120
|
+
};
|
|
16
121
|
for (let turn = 0; turn < input.maxTurns; turn++) {
|
|
17
122
|
if (input.abortSignal?.aborted) {
|
|
18
123
|
return {
|
|
@@ -21,8 +126,28 @@ export class RunnerShell {
|
|
|
21
126
|
toolCalls: allToolCalls,
|
|
22
127
|
usage,
|
|
23
128
|
errorCode: 'aborted',
|
|
129
|
+
turns,
|
|
130
|
+
durationMs: Date.now() - startMs,
|
|
131
|
+
filesRead,
|
|
132
|
+
filesWritten,
|
|
133
|
+
costUSD: computeCost(modelForCost, usage),
|
|
24
134
|
};
|
|
25
135
|
}
|
|
136
|
+
// Three-event-per-turn lifecycle so verbose stderr surfaces every
|
|
137
|
+
// state change. `runner_turn_started` fires before the LLM call so
|
|
138
|
+
// operators see "now waiting on the model" in real time. After the
|
|
139
|
+
// adapter returns, `runner_response_received` carries the raw
|
|
140
|
+
// provider response shape (stop_reason + content-block tally). After
|
|
141
|
+
// local tool execution, `runner_turn_completed` carries per-tool
|
|
142
|
+
// counts (read vs write etc.) so operators can see what work the
|
|
143
|
+
// model is doing without grepping the JSONL log.
|
|
144
|
+
input.bus?.emit({
|
|
145
|
+
event: 'runner_turn_started',
|
|
146
|
+
ts: new Date().toISOString(),
|
|
147
|
+
...baseEventFields,
|
|
148
|
+
turnIndex: turn,
|
|
149
|
+
});
|
|
150
|
+
turns++;
|
|
26
151
|
const turnResult = await this.adapter.turn({
|
|
27
152
|
systemPrompt: input.systemPrompt,
|
|
28
153
|
userMessage: input.userMessage,
|
|
@@ -37,34 +162,131 @@ export class RunnerShell {
|
|
|
37
162
|
usage.cachedReadTokens += turnResult.usage.cachedReadTokens;
|
|
38
163
|
usage.cachedNonReadTokens += turnResult.usage.cachedNonReadTokens;
|
|
39
164
|
finalText = turnResult.assistantText;
|
|
165
|
+
input.bus?.emit({
|
|
166
|
+
event: 'runner_response_received',
|
|
167
|
+
ts: new Date().toISOString(),
|
|
168
|
+
...baseEventFields,
|
|
169
|
+
turnIndex: turn,
|
|
170
|
+
finishReason: turnResult.finishReason,
|
|
171
|
+
assistantTextLen: turnResult.assistantText.length,
|
|
172
|
+
toolCallCount: turnResult.toolCalls.length,
|
|
173
|
+
...(turnResult.responseShape?.stopReason !== undefined && { stopReason: turnResult.responseShape.stopReason }),
|
|
174
|
+
...(turnResult.responseShape?.contentBlocks !== undefined && { contentBlocks: turnResult.responseShape.contentBlocks }),
|
|
175
|
+
usage: turnResult.usage,
|
|
176
|
+
});
|
|
40
177
|
const turnRecord = {
|
|
41
178
|
assistantText: turnResult.assistantText,
|
|
42
179
|
toolCalls: [],
|
|
43
180
|
};
|
|
44
|
-
|
|
181
|
+
const willTerminate = turnResult.toolCalls.length === 0;
|
|
182
|
+
if (willTerminate) {
|
|
45
183
|
history.push(turnRecord);
|
|
46
184
|
stoppedByAdapter = true;
|
|
47
|
-
break;
|
|
48
185
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
186
|
+
else {
|
|
187
|
+
for (const call of turnResult.toolCalls) {
|
|
188
|
+
const def = input.toolDefinitions.find(d => d.name === call.name);
|
|
189
|
+
let result;
|
|
190
|
+
if (!def) {
|
|
191
|
+
result = { error: `unknown tool: ${call.name}` };
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
try {
|
|
195
|
+
result = await def.execute(call.input, ctx);
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
result = { error: `tool execution failed: ${err instanceof Error ? err.message : String(err)}` };
|
|
199
|
+
}
|
|
58
200
|
}
|
|
59
|
-
|
|
60
|
-
|
|
201
|
+
const enriched = { name: call.name, input: call.input, result };
|
|
202
|
+
allToolCalls.push(enriched);
|
|
203
|
+
turnRecord.toolCalls.push(enriched);
|
|
204
|
+
// Track file ops so the wire telemetry's filesReadCount /
|
|
205
|
+
// filesWrittenCount aren't perpetually 0. Only count successful
|
|
206
|
+
// calls (a tool that threw produced { error: ... } as result).
|
|
207
|
+
const succeeded = !(typeof result === 'object' && result !== null && 'error' in result);
|
|
208
|
+
if (succeeded) {
|
|
209
|
+
const path = extractPathFromToolInput(call.input);
|
|
210
|
+
if (READ_TOOL_NAMES.has(call.name) && path)
|
|
211
|
+
filesRead.push(path);
|
|
212
|
+
else if (WRITE_TOOL_NAMES.has(call.name) && path)
|
|
213
|
+
filesWritten.push(path);
|
|
214
|
+
else if (SHELL_TOOL_NAMES.has(call.name)) {
|
|
215
|
+
// Gap 11 fix (4.0.3+): workers writing via run_shell
|
|
216
|
+
// (cat >, sed -i, tee, etc.) used to show "0 write" in
|
|
217
|
+
// polling for the entire run despite actively producing
|
|
218
|
+
// artifacts. Detect common write patterns in the command
|
|
219
|
+
// arg and attribute as a synthetic write entry tagged
|
|
220
|
+
// `shell:` so callers can distinguish it from explicit
|
|
221
|
+
// write_file calls. False positives acceptable; false
|
|
222
|
+
// negatives are not — the headline must reflect reality.
|
|
223
|
+
const command = extractShellCommand(call.input);
|
|
224
|
+
if (command && shellCommandWritesFs(command)) {
|
|
225
|
+
filesWritten.push(`shell:${command.slice(0, 80)}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
61
228
|
}
|
|
62
229
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
230
|
+
history.push(turnRecord);
|
|
231
|
+
}
|
|
232
|
+
// Per-tool counts for THIS turn so operators see "5 readFile, 1 grep"
|
|
233
|
+
// instead of the bare "tool_call_count=6". The user can immediately
|
|
234
|
+
// tell read vs write activity without inspecting the JSONL log.
|
|
235
|
+
const toolCallsByName = {};
|
|
236
|
+
// Gap 11 (4.0.3+): also count shell calls that wrote to the
|
|
237
|
+
// filesystem so the headline reflects worker-produced artifacts
|
|
238
|
+
// even when the worker bypassed write_file/edit_file.
|
|
239
|
+
let shellWritesThisTurn = 0;
|
|
240
|
+
for (const tc of turnResult.toolCalls) {
|
|
241
|
+
toolCallsByName[tc.name] = (toolCallsByName[tc.name] ?? 0) + 1;
|
|
242
|
+
if (SHELL_TOOL_NAMES.has(tc.name)) {
|
|
243
|
+
const cmd = extractShellCommand(tc.input);
|
|
244
|
+
if (cmd && shellCommandWritesFs(cmd))
|
|
245
|
+
shellWritesThisTurn += 1;
|
|
246
|
+
}
|
|
66
247
|
}
|
|
67
|
-
|
|
248
|
+
input.bus?.emit({
|
|
249
|
+
event: 'runner_turn_completed',
|
|
250
|
+
ts: new Date().toISOString(),
|
|
251
|
+
...baseEventFields,
|
|
252
|
+
turnIndex: turn,
|
|
253
|
+
terminated: willTerminate,
|
|
254
|
+
toolCallCount: turnResult.toolCalls.length,
|
|
255
|
+
...(turnResult.toolCalls.length > 0 && { toolCalls: toolCallsByName }),
|
|
256
|
+
...(shellWritesThisTurn > 0 && { shellWrites: shellWritesThisTurn }),
|
|
257
|
+
});
|
|
258
|
+
if (willTerminate)
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
// Empty-output regression guard (4.0.3). The 4.0.x runner-shell
|
|
262
|
+
// unconditionally reported `workerStatus: 'done'` whenever the adapter
|
|
263
|
+
// returned no tool calls — even when assistantText was empty. Combined
|
|
264
|
+
// with the anthropic-messages adapter's text-only extraction, a
|
|
265
|
+
// reasoning model that emitted thinking blocks with no text block (or
|
|
266
|
+
// any provider that returned end_turn with empty content) silently
|
|
267
|
+
// produced an "ok" RunResult carrying `output: ''`. The reviewer
|
|
268
|
+
// engine then approved that empty output and the audit/delegate
|
|
269
|
+
// looked successful while emitting nothing useful.
|
|
270
|
+
//
|
|
271
|
+
// 3.12.7's claude-agent-sdk owned the agent loop and didn't have this
|
|
272
|
+
// failure mode. This branch restores the missing check: stopping with
|
|
273
|
+
// empty narrative AND no tool calls is `incomplete`, surfaced as a
|
|
274
|
+
// structured error with errorCode `empty_output` so callers can tell
|
|
275
|
+
// the difference between "model finished cleanly" and "model returned
|
|
276
|
+
// nothing usable".
|
|
277
|
+
if (stoppedByAdapter && finalText.trim() === '' && allToolCalls.length === 0) {
|
|
278
|
+
return {
|
|
279
|
+
workerStatus: 'failed',
|
|
280
|
+
finalAssistantText: '',
|
|
281
|
+
toolCalls: allToolCalls,
|
|
282
|
+
usage,
|
|
283
|
+
errorCode: 'empty_output',
|
|
284
|
+
turns,
|
|
285
|
+
durationMs: Date.now() - startMs,
|
|
286
|
+
filesRead,
|
|
287
|
+
filesWritten,
|
|
288
|
+
costUSD: computeCost(modelForCost, usage),
|
|
289
|
+
};
|
|
68
290
|
}
|
|
69
291
|
return {
|
|
70
292
|
workerStatus: stoppedByAdapter ? 'done' : 'blocked',
|
|
@@ -72,7 +294,18 @@ export class RunnerShell {
|
|
|
72
294
|
toolCalls: allToolCalls,
|
|
73
295
|
usage,
|
|
74
296
|
...(stoppedByAdapter ? {} : { errorCode: 'max_turns_exhausted' }),
|
|
297
|
+
turns,
|
|
298
|
+
durationMs: Date.now() - startMs,
|
|
299
|
+
filesRead,
|
|
300
|
+
filesWritten,
|
|
301
|
+
costUSD: computeCost(modelForCost, usage),
|
|
75
302
|
};
|
|
76
303
|
}
|
|
77
304
|
}
|
|
305
|
+
function computeCost(model, usage) {
|
|
306
|
+
const card = resolveRateCard(model ?? null);
|
|
307
|
+
if (!card)
|
|
308
|
+
return null;
|
|
309
|
+
return priceTokens(usage, card);
|
|
310
|
+
}
|
|
78
311
|
//# sourceMappingURL=runner-shell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-shell.js","sourceRoot":"","sources":["../../src/providers/runner-shell.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner-shell.js","sourceRoot":"","sources":["../../src/providers/runner-shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ContextBlockStore } from '../stores/context-block-tool.js';
|
|
2
2
|
import type { AgentType, Effort, FormatConstraints, SandboxPolicy, TaskSpec, ToolMode } from '../types.js';
|
|
3
3
|
import type { ResearchToolDefinition } from '../research/types.js';
|
|
4
|
+
import type { EventEmitter } from '../events/event-emitter.js';
|
|
4
5
|
export type RunStatus = 'ok' | 'incomplete' | 'timeout' | 'api_aborted' | 'api_error' | 'provider_transport_failure' | 'error' | 'brief_too_vague' | 'cost_exceeded' | 'unavailable';
|
|
5
6
|
/** Canonical 4-field token-count shape. reasoningTokens are summed into
|
|
6
7
|
* outputTokens by each runner before emitting. totalTokens, cachedTokens,
|
|
@@ -16,7 +17,7 @@ export interface TokenUsage {
|
|
|
16
17
|
export interface CostBreakdown {
|
|
17
18
|
costUSD: number | null;
|
|
18
19
|
/** Actual cost minus estimated parent cost. Negative = worker cheaper (savings). */
|
|
19
|
-
|
|
20
|
+
costDeltaVsMainUSD: number | null;
|
|
20
21
|
}
|
|
21
22
|
export interface TerminationReason {
|
|
22
23
|
/** Why the task stopped. 'finished' means the worker returned normally — check
|
|
@@ -92,6 +93,24 @@ export interface RunOptions {
|
|
|
92
93
|
cacheHints?: {
|
|
93
94
|
cacheableSystemPrompt?: boolean;
|
|
94
95
|
};
|
|
96
|
+
/** Bus for emitting per-turn / per-runner-call observability events. When
|
|
97
|
+
* present, the runner-shell + adapter emit `runner_turn_started`,
|
|
98
|
+
* `runner_turn_completed`, and `runner_response_received` events that the
|
|
99
|
+
* server's VerboseLogChannel + LocalLogSink + TelemetrySink consume. */
|
|
100
|
+
bus?: EventEmitter;
|
|
101
|
+
/** Identifies the in-flight batch in emitted runner events. Plumbed
|
|
102
|
+
* through delegateWithEscalation so consumers can correlate runner-shell
|
|
103
|
+
* output back to the originating /audit, /delegate, etc. request. */
|
|
104
|
+
batchId?: string;
|
|
105
|
+
/** Identifies which task within a batch is running. Threaded through every
|
|
106
|
+
* emitted event so per-task running-headline progress can be tracked when
|
|
107
|
+
* a batch has multiple parallel tasks. */
|
|
108
|
+
taskIndex?: number;
|
|
109
|
+
/** Tier label (`'standard'` | `'complex'`) included in emitted events. */
|
|
110
|
+
tier?: string;
|
|
111
|
+
/** Lifecycle stage label (e.g. `'Implementing'`, `'Spec review'`). Forwarded
|
|
112
|
+
* to the runner-shell so its emitted events carry the current stage. */
|
|
113
|
+
stageLabel?: string;
|
|
95
114
|
}
|
|
96
115
|
/** Runtime dependencies for `runTasks`. */
|
|
97
116
|
export interface RunTasksRuntime {
|
|
@@ -163,7 +182,7 @@ export type ProgressEvent = {
|
|
|
163
182
|
toolCalls: number;
|
|
164
183
|
};
|
|
165
184
|
costUSD: number | null;
|
|
166
|
-
|
|
185
|
+
costDeltaVsMainUSD: number | null;
|
|
167
186
|
final: boolean;
|
|
168
187
|
headline: string;
|
|
169
188
|
/** Per-stage idle time (ms since last LLM/tool/text event in the current stage). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-types.d.ts","sourceRoot":"","sources":["../../src/providers/runner-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,QAAQ,EACR,QAAQ,EACT,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner-types.d.ts","sourceRoot":"","sources":["../../src/providers/runner-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for tool-name → category sets.
|
|
3
|
+
*
|
|
4
|
+
* Two consumers historically maintained their own copies and drifted:
|
|
5
|
+
* - `runner-shell.ts` tracks `filesRead` / `filesWritten` arrays based
|
|
6
|
+
* on tool name → these flow into wire telemetry's
|
|
7
|
+
* `filesReadCount` / `filesWrittenCount`.
|
|
8
|
+
* - `running-headline-sink.ts` increments the polling headline's
|
|
9
|
+
* `read` / `write` counts from per-turn `toolCalls` records.
|
|
10
|
+
*
|
|
11
|
+
* Pre-4.0.3 the sink had `WRITE_TOOLS = {writeFile, write_file}` while
|
|
12
|
+
* the runner had `WRITE_TOOL_NAMES = {writeFile, write_file, editFile,
|
|
13
|
+
* edit_file}`. A worker calling `edit_file` correctly bumped the
|
|
14
|
+
* runner's counter (so `filesWrittenCount` was right on the wire) but
|
|
15
|
+
* the polling headline reported "0 write" — drift. This module
|
|
16
|
+
* eliminates that risk: both consumers import from here.
|
|
17
|
+
*/
|
|
18
|
+
/** File-reading tools. Includes search/grep tools because they READ
|
|
19
|
+
* file content even though they don't return whole files — the wire
|
|
20
|
+
* attribution treats them uniformly as "read activity". */
|
|
21
|
+
export declare const READ_TOOL_NAMES: ReadonlySet<string>;
|
|
22
|
+
/** File-writing tools. Both `writeFile` (full overwrite) and
|
|
23
|
+
* `editFile` (patch) modify the filesystem and count as writes. */
|
|
24
|
+
export declare const WRITE_TOOL_NAMES: ReadonlySet<string>;
|
|
25
|
+
/** Shell tools. Uncategorized for read/write attribution by name —
|
|
26
|
+
* the runner-shell inspects the command argument via
|
|
27
|
+
* `shellCommandWritesFs` (Gap 11) to attribute writes heuristically. */
|
|
28
|
+
export declare const SHELL_TOOL_NAMES: ReadonlySet<string>;
|
|
29
|
+
//# sourceMappingURL=tool-name-sets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-name-sets.d.ts","sourceRoot":"","sources":["../../src/providers/tool-name-sets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;4DAE4D;AAC5D,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAK9C,CAAC;AAEH;oEACoE;AACpE,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAG/C,CAAC;AAEH;;yEAEyE;AACzE,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAI/C,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for tool-name → category sets.
|
|
3
|
+
*
|
|
4
|
+
* Two consumers historically maintained their own copies and drifted:
|
|
5
|
+
* - `runner-shell.ts` tracks `filesRead` / `filesWritten` arrays based
|
|
6
|
+
* on tool name → these flow into wire telemetry's
|
|
7
|
+
* `filesReadCount` / `filesWrittenCount`.
|
|
8
|
+
* - `running-headline-sink.ts` increments the polling headline's
|
|
9
|
+
* `read` / `write` counts from per-turn `toolCalls` records.
|
|
10
|
+
*
|
|
11
|
+
* Pre-4.0.3 the sink had `WRITE_TOOLS = {writeFile, write_file}` while
|
|
12
|
+
* the runner had `WRITE_TOOL_NAMES = {writeFile, write_file, editFile,
|
|
13
|
+
* edit_file}`. A worker calling `edit_file` correctly bumped the
|
|
14
|
+
* runner's counter (so `filesWrittenCount` was right on the wire) but
|
|
15
|
+
* the polling headline reported "0 write" — drift. This module
|
|
16
|
+
* eliminates that risk: both consumers import from here.
|
|
17
|
+
*/
|
|
18
|
+
/** File-reading tools. Includes search/grep tools because they READ
|
|
19
|
+
* file content even though they don't return whole files — the wire
|
|
20
|
+
* attribution treats them uniformly as "read activity". */
|
|
21
|
+
export const READ_TOOL_NAMES = new Set([
|
|
22
|
+
'readFile', 'read_file',
|
|
23
|
+
'grep',
|
|
24
|
+
'glob',
|
|
25
|
+
'listFiles', 'list_files',
|
|
26
|
+
]);
|
|
27
|
+
/** File-writing tools. Both `writeFile` (full overwrite) and
|
|
28
|
+
* `editFile` (patch) modify the filesystem and count as writes. */
|
|
29
|
+
export const WRITE_TOOL_NAMES = new Set([
|
|
30
|
+
'writeFile', 'write_file',
|
|
31
|
+
'editFile', 'edit_file',
|
|
32
|
+
]);
|
|
33
|
+
/** Shell tools. Uncategorized for read/write attribution by name —
|
|
34
|
+
* the runner-shell inspects the command argument via
|
|
35
|
+
* `shellCommandWritesFs` (Gap 11) to attribute writes heuristically. */
|
|
36
|
+
export const SHELL_TOOL_NAMES = new Set([
|
|
37
|
+
'runShell', 'run_shell',
|
|
38
|
+
'shell',
|
|
39
|
+
'bash',
|
|
40
|
+
]);
|
|
41
|
+
//# sourceMappingURL=tool-name-sets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-name-sets.js","sourceRoot":"","sources":["../../src/providers/tool-name-sets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;4DAE4D;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC;IAC1D,UAAU,EAAE,WAAW;IACvB,MAAM;IACN,MAAM;IACN,WAAW,EAAE,YAAY;CAC1B,CAAC,CAAC;AAEH;oEACoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IAC3D,WAAW,EAAE,YAAY;IACzB,UAAU,EAAE,WAAW;CACxB,CAAC,CAAC;AAEH;;yEAEyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IAC3D,UAAU,EAAE,WAAW;IACvB,OAAO;IACP,MAAM;CACP,CAAC,CAAC"}
|
|
@@ -1,8 +1,18 @@
|
|
|
1
|
+
import type { RunResult, TaskSpec } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 4.0.3+: signature accepts optional `runResult` and `task` so composers
|
|
4
|
+
* can read fields the structured `report` doesn't carry (e.g.,
|
|
5
|
+
* `annotatedFindings` from runResult, `filePaths` from task).
|
|
6
|
+
* Backwards-compatible at runtime — composers that ignore both keep
|
|
7
|
+
* working.
|
|
8
|
+
*/
|
|
1
9
|
export interface HeadlineTemplate {
|
|
2
10
|
compose(input: {
|
|
3
11
|
taskBrief: string;
|
|
4
12
|
report: unknown;
|
|
5
13
|
status: string;
|
|
14
|
+
runResult?: RunResult;
|
|
15
|
+
task?: TaskSpec;
|
|
6
16
|
}): string;
|
|
7
17
|
}
|
|
8
18
|
export declare class HeadlineComposer {
|
|
@@ -12,6 +22,8 @@ export declare class HeadlineComposer {
|
|
|
12
22
|
taskBrief: string;
|
|
13
23
|
report: unknown;
|
|
14
24
|
status: string;
|
|
25
|
+
runResult?: RunResult;
|
|
26
|
+
task?: TaskSpec;
|
|
15
27
|
}): string;
|
|
16
28
|
}
|
|
17
29
|
//# sourceMappingURL=headline-composer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headline-composer.d.ts","sourceRoot":"","sources":["../../src/reporting/headline-composer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"headline-composer.d.ts","sourceRoot":"","sources":["../../src/reporting/headline-composer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,KAAK,EAAE;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;KACjB,GAAG,MAAM,CAAC;CACZ;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAE9C,OAAO,CAAC,KAAK,EAAE;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;KACjB,GAAG,MAAM;CAGX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headline-composer.js","sourceRoot":"","sources":["../../src/reporting/headline-composer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"headline-composer.js","sourceRoot":"","sources":["../../src/reporting/headline-composer.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAO,gBAAgB;IACP;IAApB,YAAoB,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAElD,OAAO,CAAC,KAMP;QACC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/reporting/headline-templates/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/reporting/headline-templates/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,eAAO,MAAM,qBAAqB,EAAE,gBA2CnC,CAAC"}
|
|
@@ -1,12 +1,41 @@
|
|
|
1
1
|
import { isNotApplicable } from '../not-applicable.js';
|
|
2
|
+
import { countHighOrCritical, parseNarrativeFindings } from '../severity.js';
|
|
2
3
|
export const auditHeadlineTemplate = {
|
|
3
|
-
compose({ report, status }) {
|
|
4
|
-
if (!report || isNotApplicable(report))
|
|
5
|
-
return `[${status}] audit completed`;
|
|
4
|
+
compose({ report, status, runResult, task }) {
|
|
6
5
|
const r = report;
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const reportInapplicable = !r || isNotApplicable(r);
|
|
7
|
+
// Source priority for findings (4.0.3+):
|
|
8
|
+
// 1. Structured report's `findings` (rare — only when the worker
|
|
9
|
+
// emitted proper JSON matching the audit reportSchema).
|
|
10
|
+
// 2. runResult.annotatedFindings (canonical narrative-path source
|
|
11
|
+
// populated by the quality-chain handler when verdict='annotated').
|
|
12
|
+
// 3. NEW: parseNarrativeFindings(runResult.output) — recovers
|
|
13
|
+
// findings directly from the implementer's `## Finding N:`
|
|
14
|
+
// output when the annotator errored (parse failure, exhaustion).
|
|
15
|
+
// Without this third fallback, audits where the annotator
|
|
16
|
+
// failed report `0 findings (0 high)` even though the
|
|
17
|
+
// implementer's narrative carried valid findings.
|
|
18
|
+
const reportFindings = !reportInapplicable && Array.isArray(r?.findings) ? r.findings : [];
|
|
19
|
+
const annotated = runResult?.annotatedFindings ?? [];
|
|
20
|
+
let findings = reportFindings.length > 0
|
|
21
|
+
? reportFindings
|
|
22
|
+
: annotated;
|
|
23
|
+
if (findings.length === 0 && typeof runResult?.output === 'string') {
|
|
24
|
+
const narrative = parseNarrativeFindings(runResult.output);
|
|
25
|
+
if (narrative.length > 0)
|
|
26
|
+
findings = narrative;
|
|
27
|
+
}
|
|
28
|
+
if (findings.length === 0 && reportInapplicable) {
|
|
29
|
+
return `[${status}] audit completed`;
|
|
30
|
+
}
|
|
31
|
+
const high = countHighOrCritical(findings);
|
|
32
|
+
// Document path fallback (per round-2 audit F3): when we fall back
|
|
33
|
+
// to annotatedFindings, the structured report's documentPath is
|
|
34
|
+
// absent. Pull from the task's filePaths instead.
|
|
35
|
+
const path = (!reportInapplicable && typeof r?.documentPath === 'string' ? r.documentPath : '')
|
|
36
|
+
|| task?.filePaths?.[0]
|
|
37
|
+
|| '';
|
|
38
|
+
return `[${status}] audit ${path}: ${findings.length} findings (${high} high)`;
|
|
10
39
|
},
|
|
11
40
|
};
|
|
12
41
|
//# sourceMappingURL=audit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/reporting/headline-templates/audit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/reporting/headline-templates/audit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;QACzC,MAAM,CAAC,GAAG,MAAiD,CAAC;QAC5D,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;QAEpD,yCAAyC;QACzC,mEAAmE;QACnE,6DAA6D;QAC7D,oEAAoE;QACpE,yEAAyE;QACzE,gEAAgE;QAChE,gEAAgE;QAChE,sEAAsE;QACtE,+DAA+D;QAC/D,2DAA2D;QAC3D,uDAAuD;QACvD,MAAM,cAAc,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,SAAS,GAAG,SAAS,EAAE,iBAAiB,IAAI,EAAE,CAAC;QACrD,IAAI,QAAQ,GACV,cAAc,CAAC,MAAM,GAAG,CAAC;YACvB,CAAC,CAAE,cAAgD;YACnD,CAAC,CAAE,SAA2C,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,SAAS,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;YACnE,MAAM,SAAS,GAAG,sBAAsB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,QAAQ,GAAG,SAAS,CAAC;QACjD,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC;YAChD,OAAO,IAAI,MAAM,mBAAmB,CAAC;QACvC,CAAC;QAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAE3C,mEAAmE;QACnE,gEAAgE;QAChE,kDAAkD;QAClD,MAAM,IAAI,GACR,CAAC,CAAC,kBAAkB,IAAI,OAAO,CAAC,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;eAC/E,IAA6C,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;eAC9D,EAAE,CAAC;QAER,OAAO,IAAI,MAAM,WAAW,IAAI,KAAK,QAAQ,CAAC,MAAM,cAAc,IAAI,QAAQ,CAAC;IACjF,CAAC;CACF,CAAC"}
|
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
import type { HeadlineTemplate } from '../headline-composer.js';
|
|
2
2
|
/**
|
|
3
|
-
* Compose a terminal headline for debug.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Compose a terminal headline for debug.
|
|
4
|
+
*
|
|
5
|
+
* Tool sweep #4 rewrite: bring debug into the same shape as audit and
|
|
6
|
+
* review/verify so operator-facing logs stay consistent across tools:
|
|
7
|
+
*
|
|
8
|
+
* [ok] debug <path>: 3 findings (0 high)
|
|
9
|
+
* [error] debug: 1 findings (1 high)
|
|
10
|
+
* [ok] debug completed
|
|
11
|
+
*
|
|
12
|
+
* Previously emitted "debug: 1/1 tasks complete" with no status prefix
|
|
13
|
+
* and no findings count — operator could not tell ok from error and
|
|
14
|
+
* had no signal about how many real findings landed.
|
|
15
|
+
*
|
|
16
|
+
* Source priority for findings (parallel to audit):
|
|
17
|
+
* 1. runResult.annotatedFindings (canonical — annotator's structured
|
|
18
|
+
* output when verdict='annotated').
|
|
19
|
+
* 2. parseNarrativeFindings(runResult.output) — recovers `## Finding N:`
|
|
20
|
+
* blocks from the implementer's narrative when the annotator errored.
|
|
21
|
+
*
|
|
22
|
+
* Note: debug's reportSchema.parse is intentionally a thrower (the tool
|
|
23
|
+
* doesn't emit a structured report), so `report` is always notApplicable
|
|
24
|
+
* here — there's no `report.findings` source to read.
|
|
6
25
|
*/
|
|
7
26
|
export declare const debugHeadlineTemplate: HeadlineTemplate;
|
|
8
27
|
//# sourceMappingURL=debug.d.ts.map
|