@zhixuan92/multi-model-agent-core 4.0.1 → 4.0.3

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 (192) hide show
  1. package/README.md +18 -6
  2. package/dist/bounded-execution/activity-tracker-types.d.ts +2 -2
  3. package/dist/bounded-execution/activity-tracker-types.d.ts.map +1 -1
  4. package/dist/bounded-execution/activity-tracker.d.ts +3 -3
  5. package/dist/bounded-execution/activity-tracker.d.ts.map +1 -1
  6. package/dist/bounded-execution/activity-tracker.js +15 -15
  7. package/dist/bounded-execution/activity-tracker.js.map +1 -1
  8. package/dist/config/model-profile-registry.d.ts +0 -10
  9. package/dist/config/model-profile-registry.d.ts.map +1 -1
  10. package/dist/config/model-profile-registry.js +126 -8
  11. package/dist/config/model-profile-registry.js.map +1 -1
  12. package/dist/config/schema.d.ts +0 -1
  13. package/dist/config/schema.d.ts.map +1 -1
  14. package/dist/config/schema.js +3 -1
  15. package/dist/config/schema.js.map +1 -1
  16. package/dist/escalation/delegate-with-escalation.d.ts +24 -0
  17. package/dist/escalation/delegate-with-escalation.d.ts.map +1 -1
  18. package/dist/escalation/delegate-with-escalation.js +5 -0
  19. package/dist/escalation/delegate-with-escalation.js.map +1 -1
  20. package/dist/escalation/fallback-types.d.ts +1 -1
  21. package/dist/escalation/fallback-types.d.ts.map +1 -1
  22. package/dist/escalation/fallback.js +2 -2
  23. package/dist/escalation/fallback.js.map +1 -1
  24. package/dist/events/cloud-events.d.ts +3 -4
  25. package/dist/events/cloud-events.d.ts.map +1 -1
  26. package/dist/events/cloud-events.js +0 -1
  27. package/dist/events/cloud-events.js.map +1 -1
  28. package/dist/events/event-builder.d.ts +4 -2
  29. package/dist/events/event-builder.d.ts.map +1 -1
  30. package/dist/events/event-builder.js +47 -45
  31. package/dist/events/event-builder.js.map +1 -1
  32. package/dist/events/observability-events.d.ts +7 -8
  33. package/dist/events/observability-events.d.ts.map +1 -1
  34. package/dist/events/running-headline-sink.d.ts +26 -0
  35. package/dist/events/running-headline-sink.d.ts.map +1 -0
  36. package/dist/events/running-headline-sink.js +116 -0
  37. package/dist/events/running-headline-sink.js.map +1 -0
  38. package/dist/events/telemetry-types.d.ts +20 -20
  39. package/dist/events/telemetry-types.js +8 -8
  40. package/dist/events/telemetry-types.js.map +1 -1
  41. package/dist/events/verbose-log-channel.d.ts +22 -2
  42. package/dist/events/verbose-log-channel.d.ts.map +1 -1
  43. package/dist/events/verbose-log-channel.js +46 -9
  44. package/dist/events/verbose-log-channel.js.map +1 -1
  45. package/dist/index.d.ts +4 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +4 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/intake/brief-compiler-slots/delegate.d.ts +1 -0
  50. package/dist/intake/brief-compiler-slots/delegate.d.ts.map +1 -1
  51. package/dist/intake/brief-compiler-slots/delegate.js +10 -2
  52. package/dist/intake/brief-compiler-slots/delegate.js.map +1 -1
  53. package/dist/lifecycle/executor-output-types.d.ts +2 -2
  54. package/dist/lifecycle/executor-output-types.d.ts.map +1 -1
  55. package/dist/lifecycle/handlers/baseline-handlers.d.ts.map +1 -1
  56. package/dist/lifecycle/handlers/baseline-handlers.js +48 -1
  57. package/dist/lifecycle/handlers/baseline-handlers.js.map +1 -1
  58. package/dist/lifecycle/handlers/quality-chain-handlers.d.ts.map +1 -1
  59. package/dist/lifecycle/handlers/quality-chain-handlers.js +126 -6
  60. package/dist/lifecycle/handlers/quality-chain-handlers.js.map +1 -1
  61. package/dist/lifecycle/handlers/review-diff-handler.d.ts.map +1 -1
  62. package/dist/lifecycle/handlers/review-diff-handler.js +36 -1
  63. package/dist/lifecycle/handlers/review-diff-handler.js.map +1 -1
  64. package/dist/lifecycle/handlers/run-verify-command-handler.js +11 -2
  65. package/dist/lifecycle/handlers/run-verify-command-handler.js.map +1 -1
  66. package/dist/lifecycle/handlers/spec-chain-handlers.d.ts.map +1 -1
  67. package/dist/lifecycle/handlers/spec-chain-handlers.js +107 -6
  68. package/dist/lifecycle/handlers/spec-chain-handlers.js.map +1 -1
  69. package/dist/lifecycle/handlers/terminal-handlers.d.ts +8 -0
  70. package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
  71. package/dist/lifecycle/handlers/terminal-handlers.js +168 -11
  72. package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
  73. package/dist/lifecycle/lifecycle-context.d.ts +0 -2
  74. package/dist/lifecycle/lifecycle-context.d.ts.map +1 -1
  75. package/dist/lifecycle/merge-stage-stats.d.ts +31 -0
  76. package/dist/lifecycle/merge-stage-stats.d.ts.map +1 -0
  77. package/dist/lifecycle/merge-stage-stats.js +64 -0
  78. package/dist/lifecycle/merge-stage-stats.js.map +1 -0
  79. package/dist/lifecycle/shared-compute.js +4 -4
  80. package/dist/lifecycle/shared-compute.js.map +1 -1
  81. package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
  82. package/dist/lifecycle/stage-plan-builder.js +6 -0
  83. package/dist/lifecycle/stage-plan-builder.js.map +1 -1
  84. package/dist/lifecycle/stage-plan-types.d.ts +3 -0
  85. package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
  86. package/dist/lifecycle/stage-progression.d.ts +20 -0
  87. package/dist/lifecycle/stage-progression.d.ts.map +1 -0
  88. package/dist/lifecycle/stage-progression.js +165 -0
  89. package/dist/lifecycle/stage-progression.js.map +1 -0
  90. package/dist/lifecycle/task-executor.d.ts.map +1 -1
  91. package/dist/lifecycle/task-executor.js +55 -10
  92. package/dist/lifecycle/task-executor.js.map +1 -1
  93. package/dist/lifecycle/task-runner.d.ts +7 -3
  94. package/dist/lifecycle/task-runner.d.ts.map +1 -1
  95. package/dist/lifecycle/task-runner.js +43 -7
  96. package/dist/lifecycle/task-runner.js.map +1 -1
  97. package/dist/providers/anthropic-messages-adapter.d.ts.map +1 -1
  98. package/dist/providers/anthropic-messages-adapter.js +25 -1
  99. package/dist/providers/anthropic-messages-adapter.js.map +1 -1
  100. package/dist/providers/base/result-builders.d.ts +1 -1
  101. package/dist/providers/base/result-builders.d.ts.map +1 -1
  102. package/dist/providers/base/result-builders.js +4 -4
  103. package/dist/providers/base/result-builders.js.map +1 -1
  104. package/dist/providers/make-runner-shell.d.ts.map +1 -1
  105. package/dist/providers/make-runner-shell.js +6 -5
  106. package/dist/providers/make-runner-shell.js.map +1 -1
  107. package/dist/providers/openai-chat-adapter.d.ts +0 -2
  108. package/dist/providers/openai-chat-adapter.d.ts.map +1 -1
  109. package/dist/providers/openai-chat-adapter.js +2 -3
  110. package/dist/providers/openai-chat-adapter.js.map +1 -1
  111. package/dist/providers/openai-responses-adapter.d.ts +1 -2
  112. package/dist/providers/openai-responses-adapter.d.ts.map +1 -1
  113. package/dist/providers/openai-responses-adapter.js +67 -39
  114. package/dist/providers/openai-responses-adapter.js.map +1 -1
  115. package/dist/providers/provider-factory.d.ts.map +1 -1
  116. package/dist/providers/provider-factory.js +45 -9
  117. package/dist/providers/provider-factory.js.map +1 -1
  118. package/dist/providers/runner-adapter.d.ts +10 -0
  119. package/dist/providers/runner-adapter.d.ts.map +1 -1
  120. package/dist/providers/runner-shell-types.d.ts +33 -0
  121. package/dist/providers/runner-shell-types.d.ts.map +1 -1
  122. package/dist/providers/runner-shell.d.ts +10 -1
  123. package/dist/providers/runner-shell.d.ts.map +1 -1
  124. package/dist/providers/runner-shell.js +251 -18
  125. package/dist/providers/runner-shell.js.map +1 -1
  126. package/dist/providers/runner-types.d.ts +21 -2
  127. package/dist/providers/runner-types.d.ts.map +1 -1
  128. package/dist/providers/tool-name-sets.d.ts +29 -0
  129. package/dist/providers/tool-name-sets.d.ts.map +1 -0
  130. package/dist/providers/tool-name-sets.js +41 -0
  131. package/dist/providers/tool-name-sets.js.map +1 -0
  132. package/dist/reporting/headline-composer.d.ts +12 -0
  133. package/dist/reporting/headline-composer.d.ts.map +1 -1
  134. package/dist/reporting/headline-composer.js.map +1 -1
  135. package/dist/reporting/headline-templates/audit.d.ts.map +1 -1
  136. package/dist/reporting/headline-templates/audit.js +26 -6
  137. package/dist/reporting/headline-templates/audit.js.map +1 -1
  138. package/dist/reporting/headline-templates/delegate.d.ts.map +1 -1
  139. package/dist/reporting/headline-templates/delegate.js +25 -6
  140. package/dist/reporting/headline-templates/delegate.js.map +1 -1
  141. package/dist/reporting/headline-templates/execute-plan.d.ts.map +1 -1
  142. package/dist/reporting/headline-templates/execute-plan.js +4 -1
  143. package/dist/reporting/headline-templates/execute-plan.js.map +1 -1
  144. package/dist/reporting/headline-templates/review.d.ts.map +1 -1
  145. package/dist/reporting/headline-templates/review.js +14 -7
  146. package/dist/reporting/headline-templates/review.js.map +1 -1
  147. package/dist/reporting/headline-text.d.ts +31 -0
  148. package/dist/reporting/headline-text.d.ts.map +1 -0
  149. package/dist/reporting/headline-text.js +42 -0
  150. package/dist/reporting/headline-text.js.map +1 -0
  151. package/dist/reporting/severity.d.ts +40 -0
  152. package/dist/reporting/severity.d.ts.map +1 -0
  153. package/dist/reporting/severity.js +57 -0
  154. package/dist/reporting/severity.js.map +1 -0
  155. package/dist/reporting/structured-report.d.ts +3 -3
  156. package/dist/research/explore-orchestrator.d.ts.map +1 -1
  157. package/dist/research/explore-orchestrator.js +4 -5
  158. package/dist/research/explore-orchestrator.js.map +1 -1
  159. package/dist/review/annotator-engine.d.ts +8 -0
  160. package/dist/review/annotator-engine.d.ts.map +1 -1
  161. package/dist/review/annotator-engine.js +7 -1
  162. package/dist/review/annotator-engine.js.map +1 -1
  163. package/dist/review/review-types.d.ts +6 -2
  164. package/dist/review/review-types.d.ts.map +1 -1
  165. package/dist/review/reviewer-engine.d.ts +11 -0
  166. package/dist/review/reviewer-engine.d.ts.map +1 -1
  167. package/dist/review/reviewer-engine.js +18 -1
  168. package/dist/review/reviewer-engine.js.map +1 -1
  169. package/dist/review/reviewer-output-parser.d.ts.map +1 -1
  170. package/dist/review/reviewer-output-parser.js +27 -5
  171. package/dist/review/reviewer-output-parser.js.map +1 -1
  172. package/dist/stores/batch-registry.d.ts +18 -0
  173. package/dist/stores/batch-registry.d.ts.map +1 -1
  174. package/dist/stores/batch-registry.js +10 -0
  175. package/dist/stores/batch-registry.js.map +1 -1
  176. package/dist/stores/context-block-tool.d.ts +14 -0
  177. package/dist/stores/context-block-tool.d.ts.map +1 -1
  178. package/dist/stores/context-block-tool.js.map +1 -1
  179. package/dist/stores/file-backed-context-block-store.d.ts +63 -0
  180. package/dist/stores/file-backed-context-block-store.d.ts.map +1 -0
  181. package/dist/stores/file-backed-context-block-store.js +293 -0
  182. package/dist/stores/file-backed-context-block-store.js.map +1 -0
  183. package/dist/stores/project-context-registry.d.ts +16 -3
  184. package/dist/stores/project-context-registry.d.ts.map +1 -1
  185. package/dist/stores/project-context-registry.js +9 -2
  186. package/dist/stores/project-context-registry.js.map +1 -1
  187. package/dist/tools/audit/schema.d.ts +2 -2
  188. package/dist/tools/retry/tool-config.js +1 -1
  189. package/dist/tools/retry/tool-config.js.map +1 -1
  190. package/dist/tools/review/schema.d.ts +1 -1
  191. package/dist/types/enums.d.ts +10 -10
  192. package/package.json +5 -1
@@ -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
- costDeltaVsParentUSD: number | null;
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
- costDeltaVsParentUSD: number | null;
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":"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"}
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;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;CAChF;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAE9C,OAAO,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;CAG/E"}
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":"AAIA,MAAM,OAAO,gBAAgB;IACP;IAApB,YAAoB,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAElD,OAAO,CAAC,KAA6D;QACnE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;CACF"}
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;AAIhE,eAAO,MAAM,qBAAqB,EAAE,gBAQnC,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,gBAkCnC,CAAC"}
@@ -1,12 +1,32 @@
1
1
  import { isNotApplicable } from '../not-applicable.js';
2
+ import { countHighOrCritical } 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 findings = Array.isArray(r.findings) ? r.findings : [];
8
- const high = findings.filter(f => f?.severity === 'high').length;
9
- return `[${status}] audit ${r.documentPath ?? ''}: ${findings.length} findings (${high} high)`;
6
+ const reportInapplicable = !r || isNotApplicable(r);
7
+ // Source priority for findings (4.0.3+ Gap 2 fix):
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
+ // Pre-fix the composer only read (1) — when the worker emitted
13
+ // narrative `## Finding N:` blocks, the structuredReport fallback
14
+ // had no `findings` field, so the headline reported "0 findings"
15
+ // even when the annotator returned dozens.
16
+ const reportFindings = !reportInapplicable && Array.isArray(r?.findings) ? r.findings : [];
17
+ const annotated = runResult?.annotatedFindings ?? [];
18
+ const findings = reportFindings.length > 0 ? reportFindings : annotated;
19
+ if (findings.length === 0 && reportInapplicable) {
20
+ return `[${status}] audit completed`;
21
+ }
22
+ const high = countHighOrCritical(findings);
23
+ // Document path fallback (per round-2 audit F3): when we fall back
24
+ // to annotatedFindings, the structured report's documentPath is
25
+ // absent. Pull from the task's filePaths instead.
26
+ const path = (!reportInapplicable && typeof r?.documentPath === 'string' ? r.documentPath : '')
27
+ || task?.filePaths?.[0]
28
+ || '';
29
+ return `[${status}] audit ${path}: ${findings.length} findings (${high} high)`;
10
30
  },
11
31
  };
12
32
  //# 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;AAEvD,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;QACxB,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,MAAM,mBAAmB,CAAC;QAC7E,MAAM,CAAC,GAAG,MAAqB,CAAC;QAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACjE,OAAO,IAAI,MAAM,WAAW,CAAC,CAAC,YAAY,IAAI,EAAE,KAAK,QAAQ,CAAC,MAAM,cAAc,IAAI,QAAQ,CAAC;IACjG,CAAC;CACF,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,MAAM,gBAAgB,CAAC;AAErD,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,mDAAmD;QACnD,mEAAmE;QACnE,6DAA6D;QAC7D,qEAAqE;QACrE,yEAAyE;QACzE,+DAA+D;QAC/D,kEAAkE;QAClE,iEAAiE;QACjE,2CAA2C;QAC3C,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,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAExE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC;YAChD,OAAO,IAAI,MAAM,mBAAmB,CAAC;QACvC,CAAC;QAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAyC,CAAC,CAAC;QAE5E,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 +1 @@
1
- {"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../../src/reporting/headline-templates/delegate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,eAAO,MAAM,wBAAwB,EAAE,gBAQtC,CAAC"}
1
+ {"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../../src/reporting/headline-templates/delegate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,eAAO,MAAM,wBAAwB,EAAE,gBA+BtC,CAAC"}
@@ -1,12 +1,31 @@
1
1
  import { isNotApplicable } from '../not-applicable.js';
2
+ import { firstSentenceOrTruncate } from '../headline-text.js';
2
3
  export const delegateHeadlineTemplate = {
3
- compose({ report, status }) {
4
- if (!report || isNotApplicable(report))
5
- return `[${status}] no structured report available`;
4
+ compose({ report, status, runResult }) {
6
5
  const r = report;
7
- const files = Array.isArray(r.filesChanged) ? r.filesChanged : [];
8
- const summary = typeof r.summary === 'string' ? r.summary : '';
9
- return `[${status}] ${summary} (${files.length} file${files.length === 1 ? '' : 's'})`;
6
+ const reportInapplicable = !r || isNotApplicable(r);
7
+ // Gap 13 fix (4.0.3+): file count source priority is
8
+ // `report.filesChanged` (rare only when the worker emits proper
9
+ // structured output) → `runResult.filesWritten` (canonical
10
+ // runner-shell signal that always reflects reality, including
11
+ // synthetic `shell:<cmd>` entries from Gap 11). Pre-fix, the
12
+ // composer only read report.filesChanged and reported "(0 files)"
13
+ // even when the worker had successfully edited files via
14
+ // edit_file or run_shell.
15
+ const reportFiles = !reportInapplicable && Array.isArray(r?.filesChanged) ? r.filesChanged : [];
16
+ const runFiles = Array.isArray(runResult?.filesWritten) ? runResult.filesWritten : [];
17
+ const fileCount = reportFiles.length > 0 ? reportFiles.length : runFiles.length;
18
+ if (reportInapplicable && fileCount === 0) {
19
+ return `[${status}] no structured report available`;
20
+ }
21
+ // Gap 12 fix (4.0.3+): trim worker's narrative `summary` to first
22
+ // sentence (or 80-char truncate). Pre-fix, the entire summary —
23
+ // sometimes multi-sentence prose ending mid-thought — was inlined
24
+ // into the headline.
25
+ const rawSummary = !reportInapplicable && typeof r?.summary === 'string' ? r.summary : '';
26
+ const summary = firstSentenceOrTruncate(rawSummary);
27
+ const summaryClause = summary.length > 0 ? ` ${summary}` : '';
28
+ return `[${status}]${summaryClause} (${fileCount} file${fileCount === 1 ? '' : 's'})`;
10
29
  },
11
30
  };
12
31
  //# sourceMappingURL=delegate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"delegate.js","sourceRoot":"","sources":["../../../src/reporting/headline-templates/delegate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,MAAM,wBAAwB,GAAqB;IACxD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;QACxB,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,MAAM,kCAAkC,CAAC;QAC5F,MAAM,CAAC,GAAG,MAAkC,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACzF,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"delegate.js","sourceRoot":"","sources":["../../../src/reporting/headline-templates/delegate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,CAAC,MAAM,wBAAwB,GAAqB;IACxD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;QACnC,MAAM,CAAC,GAAG,MAA8D,CAAC;QACzE,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;QAEpD,qDAAqD;QACrD,kEAAkE;QAClE,2DAA2D;QAC3D,8DAA8D;QAC9D,6DAA6D;QAC7D,kEAAkE;QAClE,yDAAyD;QACzD,0BAA0B;QAC1B,MAAM,WAAW,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACjG,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,SAAU,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAEhF,IAAI,kBAAkB,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,MAAM,kCAAkC,CAAC;QACtD,CAAC;QAED,kEAAkE;QAClE,gEAAgE;QAChE,kEAAkE;QAClE,qBAAqB;QACrB,MAAM,UAAU,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,MAAM,IAAI,aAAa,KAAK,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACxF,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"execute-plan.d.ts","sourceRoot":"","sources":["../../../src/reporting/headline-templates/execute-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAYhE,eAAO,MAAM,2BAA2B,EAAE,gBAczC,CAAC"}
1
+ {"version":3,"file":"execute-plan.d.ts","sourceRoot":"","sources":["../../../src/reporting/headline-templates/execute-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAahE,eAAO,MAAM,2BAA2B,EAAE,gBAgBzC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { firstSentenceOrTruncate } from '../headline-text.js';
1
2
  export const executePlanHeadlineTemplate = {
2
3
  compose({ report, status }) {
3
4
  const r = report;
@@ -6,7 +7,9 @@ export const executePlanHeadlineTemplate = {
6
7
  return `execute_plan: ${completed}/${r.taskOutcomes.length} tasks complete`;
7
8
  }
8
9
  if (r?.summary && typeof r.summary === 'string') {
9
- return `[${status}] execute_plan: ${r.summary}`;
10
+ // Gap 12 fix (4.0.3+): trim worker's narrative summary so the
11
+ // headline doesn't dump multi-sentence prose ending mid-thought.
12
+ return `[${status}] execute_plan: ${firstSentenceOrTruncate(r.summary)}`;
10
13
  }
11
14
  return `[${status}] execute_plan`;
12
15
  },
@@ -1 +1 @@
1
- {"version":3,"file":"execute-plan.js","sourceRoot":"","sources":["../../../src/reporting/headline-templates/execute-plan.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,2BAA2B,GAAqB;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;QACxB,MAAM,CAAC,GAAG,MAA2C,CAAC;QACtD,IAAI,CAAC,EAAE,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClF,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CACrC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CACvE,CAAC,MAAM,CAAC;YACT,OAAO,iBAAiB,SAAS,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,iBAAiB,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,IAAI,MAAM,mBAAmB,CAAC,CAAC,OAAO,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,MAAM,gBAAgB,CAAC;IACpC,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"execute-plan.js","sourceRoot":"","sources":["../../../src/reporting/headline-templates/execute-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAY9D,MAAM,CAAC,MAAM,2BAA2B,GAAqB;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;QACxB,MAAM,CAAC,GAAG,MAA2C,CAAC;QACtD,IAAI,CAAC,EAAE,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClF,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CACrC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CACvE,CAAC,MAAM,CAAC;YACT,OAAO,iBAAiB,SAAS,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,iBAAiB,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChD,8DAA8D;YAC9D,iEAAiE;YACjE,OAAO,IAAI,MAAM,mBAAmB,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3E,CAAC;QACD,OAAO,IAAI,MAAM,gBAAgB,CAAC;IACpC,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/reporting/headline-templates/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,eAAO,MAAM,sBAAsB,EAAE,gBAYpC,CAAC"}
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/reporting/headline-templates/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,eAAO,MAAM,sBAAsB,EAAE,gBAuBpC,CAAC"}
@@ -1,15 +1,22 @@
1
1
  import { isNotApplicable } from '../not-applicable.js';
2
+ import { countHighOrCritical } from '../severity.js';
2
3
  export const reviewHeadlineTemplate = {
3
- compose({ report, status, taskBrief }) {
4
- if (isNotApplicable(report)) {
5
- return `[${status}] review: ${taskBrief}`;
6
- }
4
+ compose({ report, status, taskBrief, runResult, task }) {
7
5
  const r = report;
8
- if (!r?.findings) {
6
+ const reportInapplicable = !r || isNotApplicable(r);
7
+ // 4.0.3+ Gap 2 fix: prefer report.findings (structured), fall back
8
+ // to runResult.annotatedFindings (narrative-path canonical source).
9
+ const reportFindings = !reportInapplicable && Array.isArray(r?.findings) ? r.findings : [];
10
+ const annotated = runResult?.annotatedFindings ?? [];
11
+ const findings = reportFindings.length > 0 ? reportFindings : annotated;
12
+ if (findings.length === 0) {
9
13
  return `[${status}] review: ${taskBrief}`;
10
14
  }
11
- const blocking = r.findings.filter(f => f.severity === 'high').length;
12
- return `[${status}] review ${r.filePath}: ${r.findings.length} findings (${blocking} blocking)`;
15
+ const blocking = countHighOrCritical(findings);
16
+ const path = (!reportInapplicable && typeof r?.filePath === 'string' ? r.filePath : '')
17
+ || task?.filePaths?.[0]
18
+ || '';
19
+ return `[${status}] review ${path}: ${findings.length} findings (${blocking} blocking)`;
13
20
  },
14
21
  };
15
22
  //# sourceMappingURL=review.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/reporting/headline-templates/review.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,MAAM,sBAAsB,GAAqB;IACtD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;QACnC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,MAAM,aAAa,SAAS,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC,GAAG,MAAsB,CAAC;QACjC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;YACjB,OAAO,IAAI,MAAM,aAAa,SAAS,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACtE,OAAO,IAAI,MAAM,YAAY,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,cAAc,QAAQ,YAAY,CAAC;IAClG,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/reporting/headline-templates/review.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,CAAC,MAAM,sBAAsB,GAAqB;IACtD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;QACpD,MAAM,CAAC,GAAG,MAAkD,CAAC;QAC7D,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;QAEpD,mEAAmE;QACnE,oEAAoE;QACpE,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,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAExE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,MAAM,aAAa,SAAS,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAyC,CAAC,CAAC;QAChF,MAAM,IAAI,GACR,CAAC,CAAC,kBAAkB,IAAI,OAAO,CAAC,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;eACvE,IAA6C,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;eAC9D,EAAE,CAAC;QAER,OAAO,IAAI,MAAM,YAAY,IAAI,KAAK,QAAQ,CAAC,MAAM,cAAc,QAAQ,YAAY,CAAC;IAC1F,CAAC;CACF,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Helpers for headline text shaping.
3
+ *
4
+ * Headlines are operator-facing single-line strings that appear in
5
+ * polling output and the terminal envelope. They MUST stay short and
6
+ * structured — workers' free-form `summary` fields can be paragraphs
7
+ * long and end mid-sentence (the v4.0.3 Gap 12 case: "...now ends
8
+ * with:" cut off because the worker meant to put a code excerpt
9
+ * after the colon).
10
+ *
11
+ * `firstSentenceOrTruncate` is the single helper composers use to
12
+ * sanitize narrative text for headline display.
13
+ */
14
+ /**
15
+ * Return the first sentence of `s`, or a hard-truncated form with
16
+ * trailing ellipsis when no sentence boundary exists in the first
17
+ * `max` characters.
18
+ *
19
+ * Why first-sentence? Worker summaries follow a "headline sentence,
20
+ * then details" pattern; the first sentence carries the operator-
21
+ * relevant signal. Truncating mid-sentence (the prior bug) loses
22
+ * that signal AND looks broken.
23
+ *
24
+ * @param s raw text (may be empty / whitespace-only)
25
+ * @param max hard truncation cap when no sentence break is found.
26
+ * 80 keeps headlines well under the typical 120-char
27
+ * terminal-line target after the bracket prefix +
28
+ * file-count suffix are added.
29
+ */
30
+ export declare function firstSentenceOrTruncate(s: string, max?: number): string;
31
+ //# sourceMappingURL=headline-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headline-text.d.ts","sourceRoot":"","sources":["../../src/reporting/headline-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,CAOnE"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Helpers for headline text shaping.
3
+ *
4
+ * Headlines are operator-facing single-line strings that appear in
5
+ * polling output and the terminal envelope. They MUST stay short and
6
+ * structured — workers' free-form `summary` fields can be paragraphs
7
+ * long and end mid-sentence (the v4.0.3 Gap 12 case: "...now ends
8
+ * with:" cut off because the worker meant to put a code excerpt
9
+ * after the colon).
10
+ *
11
+ * `firstSentenceOrTruncate` is the single helper composers use to
12
+ * sanitize narrative text for headline display.
13
+ */
14
+ const SENTENCE_END = /^([^.!?\n]{1,80}[.!?])(\s|$)/;
15
+ /**
16
+ * Return the first sentence of `s`, or a hard-truncated form with
17
+ * trailing ellipsis when no sentence boundary exists in the first
18
+ * `max` characters.
19
+ *
20
+ * Why first-sentence? Worker summaries follow a "headline sentence,
21
+ * then details" pattern; the first sentence carries the operator-
22
+ * relevant signal. Truncating mid-sentence (the prior bug) loses
23
+ * that signal AND looks broken.
24
+ *
25
+ * @param s raw text (may be empty / whitespace-only)
26
+ * @param max hard truncation cap when no sentence break is found.
27
+ * 80 keeps headlines well under the typical 120-char
28
+ * terminal-line target after the bracket prefix +
29
+ * file-count suffix are added.
30
+ */
31
+ export function firstSentenceOrTruncate(s, max = 80) {
32
+ if (!s || typeof s !== 'string')
33
+ return '';
34
+ const trimmed = s.trim();
35
+ if (trimmed.length === 0)
36
+ return '';
37
+ const m = trimmed.match(SENTENCE_END);
38
+ if (m)
39
+ return m[1];
40
+ return trimmed.length > max ? trimmed.slice(0, max - 1) + '…' : trimmed;
41
+ }
42
+ //# sourceMappingURL=headline-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headline-text.js","sourceRoot":"","sources":["../../src/reporting/headline-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,YAAY,GAAG,8BAA8B,CAAC;AAEpD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB,CAAC,CAAS,EAAE,GAAG,GAAG,EAAE;IACzD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,OAAO,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Severity helpers shared across headline composers and telemetry
3
+ * event-builder. Per the wire-telemetry-gaps plan (Gap 2 + round-2 F1):
4
+ * THREE distinct helpers, NOT one — conflating headline counting with
5
+ * telemetry bucketing would corrupt the wire's findings_critical /
6
+ * findings_high columns.
7
+ */
8
+ export type FindingSeverity = 'critical' | 'high' | 'medium' | 'low';
9
+ /**
10
+ * Normalize a raw severity string to the canonical lowercase enum.
11
+ * Returns null for unknown / unparseable values.
12
+ *
13
+ * Used by both headline counting and telemetry bucketing — single
14
+ * source of truth for "what's the severity of this finding".
15
+ */
16
+ export declare function normalizeSeverity(raw: unknown): FindingSeverity | null;
17
+ /**
18
+ * Headline-only helper. Counts findings whose normalized severity is
19
+ * 'high' OR 'critical'. Used by audit + review headline composers to
20
+ * surface the "(N high)" annotation.
21
+ *
22
+ * MUST NOT be used for telemetry bucketing — see
23
+ * `bucketFindingsBySeverity` for that.
24
+ */
25
+ export declare function countHighOrCritical(findings: ReadonlyArray<{
26
+ severity?: unknown;
27
+ }>): number;
28
+ /**
29
+ * Telemetry-only helper. Returns separate per-severity buckets:
30
+ * `{ critical, high, medium, low }`. Used by event-builder so the
31
+ * wire's findings_critical / findings_high / findings_medium /
32
+ * findings_low DB columns each carry exact counts.
33
+ *
34
+ * MUST NOT be replaced by countHighOrCritical — that conflates
35
+ * critical and high into one count.
36
+ */
37
+ export declare function bucketFindingsBySeverity(findings: ReadonlyArray<{
38
+ severity?: unknown;
39
+ }>): Record<FindingSeverity, number>;
40
+ //# sourceMappingURL=severity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../../src/reporting/severity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAIrE;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAItE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,MAAM,CAO3F;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAC9C,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAOjC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Severity helpers shared across headline composers and telemetry
3
+ * event-builder. Per the wire-telemetry-gaps plan (Gap 2 + round-2 F1):
4
+ * THREE distinct helpers, NOT one — conflating headline counting with
5
+ * telemetry bucketing would corrupt the wire's findings_critical /
6
+ * findings_high columns.
7
+ */
8
+ const VALID = new Set(['critical', 'high', 'medium', 'low']);
9
+ /**
10
+ * Normalize a raw severity string to the canonical lowercase enum.
11
+ * Returns null for unknown / unparseable values.
12
+ *
13
+ * Used by both headline counting and telemetry bucketing — single
14
+ * source of truth for "what's the severity of this finding".
15
+ */
16
+ export function normalizeSeverity(raw) {
17
+ if (typeof raw !== 'string')
18
+ return null;
19
+ const lc = raw.trim().toLowerCase();
20
+ return VALID.has(lc) ? lc : null;
21
+ }
22
+ /**
23
+ * Headline-only helper. Counts findings whose normalized severity is
24
+ * 'high' OR 'critical'. Used by audit + review headline composers to
25
+ * surface the "(N high)" annotation.
26
+ *
27
+ * MUST NOT be used for telemetry bucketing — see
28
+ * `bucketFindingsBySeverity` for that.
29
+ */
30
+ export function countHighOrCritical(findings) {
31
+ let n = 0;
32
+ for (const f of findings) {
33
+ const s = normalizeSeverity(f.severity);
34
+ if (s === 'high' || s === 'critical')
35
+ n += 1;
36
+ }
37
+ return n;
38
+ }
39
+ /**
40
+ * Telemetry-only helper. Returns separate per-severity buckets:
41
+ * `{ critical, high, medium, low }`. Used by event-builder so the
42
+ * wire's findings_critical / findings_high / findings_medium /
43
+ * findings_low DB columns each carry exact counts.
44
+ *
45
+ * MUST NOT be replaced by countHighOrCritical — that conflates
46
+ * critical and high into one count.
47
+ */
48
+ export function bucketFindingsBySeverity(findings) {
49
+ const buckets = { critical: 0, high: 0, medium: 0, low: 0 };
50
+ for (const f of findings) {
51
+ const s = normalizeSeverity(f.severity);
52
+ if (s)
53
+ buckets[s] += 1;
54
+ }
55
+ return buckets;
56
+ }
57
+ //# sourceMappingURL=severity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity.js","sourceRoot":"","sources":["../../src/reporting/severity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAqB,CAAC;IACvD,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAA+C;IACjF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU;YAAE,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAA+C;IAE/C,MAAM,OAAO,GAAoC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC7F,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -2,13 +2,13 @@ import { z } from 'zod';
2
2
  export declare const structuredReportSuffix: string;
3
3
  export declare const commitSchema: z.ZodObject<{
4
4
  type: z.ZodEnum<{
5
- feat: "feat";
6
5
  fix: "fix";
7
- refactor: "refactor";
6
+ style: "style";
8
7
  test: "test";
8
+ feat: "feat";
9
+ refactor: "refactor";
9
10
  docs: "docs";
10
11
  chore: "chore";
11
- style: "style";
12
12
  }>;
13
13
  scope: z.ZodOptional<z.ZodString>;
14
14
  subject: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"explore-orchestrator.d.ts","sourceRoot":"","sources":["../../src/research/explore-orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAOzD,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,2CAA2C,CAAC;AASnD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,KAAK,CAAC;IACb,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAC9C,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,sBAAsB,EAAE,CAAC;CAC1C;AAmFD,wBAAsB,cAAc,CAClC,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA6UzB"}
1
+ {"version":3,"file":"explore-orchestrator.d.ts","sourceRoot":"","sources":["../../src/research/explore-orchestrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAOzD,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,2CAA2C,CAAC;AASnD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,KAAK,CAAC;IACb,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAC9C,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,sBAAsB,EAAE,CAAC;CAC1C;AAkFD,wBAAsB,cAAc,CAClC,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA6UzB"}