@wrongstack/core 0.313.1 → 0.316.2
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/dist/chronicle/index.js +31 -31
- package/dist/chronicle/legacy-journal-import.d.ts +0 -6
- package/dist/chronicle/metrics-ingest.d.ts +14 -0
- package/dist/chronicle/metrics-schema.d.ts +10 -1
- package/dist/chronicle/metrics-store.d.ts +20 -2
- package/dist/chronicle/project-server.js +39 -31
- package/dist/chronicle/sink.d.ts +13 -0
- package/dist/chronicle/sqlite-journal.d.ts +20 -2
- package/dist/{chunk-WOEZV3Q4.js → chunk-25LSLC3G.js} +2 -1
- package/dist/{chunk-AI4LLQ2U.js → chunk-27QIURLN.js} +229 -12
- package/dist/{chunk-I45KAW2N.js → chunk-3AGWVSS7.js} +38 -450
- package/dist/chunk-3BDV7RL3.js +211 -0
- package/dist/{chunk-NFAYHPRH.js → chunk-3ECENVHL.js} +10 -8
- package/dist/{chunk-FW5LDDMJ.js → chunk-45WI72ZB.js} +1576 -1156
- package/dist/{chunk-AT4V4XGI.js → chunk-4BMVPOHO.js} +539 -313
- package/dist/{chunk-YBUJCZ57.js → chunk-4I7HGVVA.js} +17 -5
- package/dist/{chunk-JVGPR3TS.js → chunk-4LCZVJVF.js} +7 -55
- package/dist/{chunk-4ZHTKJHM.js → chunk-4SJNS7OB.js} +36 -2
- package/dist/{chunk-AD7ZFZCS.js → chunk-5BMIE7QG.js} +3 -3
- package/dist/{chunk-IQ35HMQL.js → chunk-5YPSXQXM.js} +71 -24
- package/dist/chunk-6FHWXLPT.js +10 -0
- package/dist/{chunk-FIV4IJL7.js → chunk-6H5GEOET.js} +163 -20
- package/dist/{chunk-VB3H5WWB.js → chunk-6NWEVFEL.js} +2 -2
- package/dist/{chunk-E6I5RXVK.js → chunk-AYW5YINX.js} +2 -2
- package/dist/{chunk-DEIQMBD2.js → chunk-B7F4WVP4.js} +2 -2
- package/dist/{chunk-XQ2XGIBF.js → chunk-BPBKKBUK.js} +6 -7
- package/dist/{chunk-K4YUNKU7.js → chunk-BYD345OX.js} +2 -2
- package/dist/{chunk-LZDDLNCZ.js → chunk-C27KDLOX.js} +4 -4
- package/dist/{chunk-6AKOTGLM.js → chunk-CU546ESW.js} +7 -7
- package/dist/{chunk-ZZ4V3WIZ.js → chunk-DLHHXUAM.js} +10 -1
- package/dist/{chunk-BAKVJLEV.js → chunk-DOTHQSJ2.js} +28 -16
- package/dist/{chunk-KBZGE6LN.js → chunk-DYLPMV4Q.js} +4 -3
- package/dist/{chunk-52RTVH4M.js → chunk-F3JWNST7.js} +2 -2
- package/dist/{chunk-WEBMSQP2.js → chunk-FC2ZGRF3.js} +21 -4
- package/dist/{chunk-FHAMQS7Q.js → chunk-FCBTO76Z.js} +76 -146
- package/dist/{chunk-4LJJYBAU.js → chunk-FHZVFYSL.js} +9 -1
- package/dist/{chunk-W4A6QA3D.js → chunk-FWNLEZYG.js} +4 -3
- package/dist/{chunk-OJZEX73F.js → chunk-GDQ7CZRQ.js} +5 -1
- package/dist/{chunk-QVOVMXJR.js → chunk-GJJGJB2R.js} +32 -9
- package/dist/{chunk-4XV6IR37.js → chunk-HI3JGZR2.js} +7 -6
- package/dist/{chunk-FSWCWSTS.js → chunk-HMLIGAU7.js} +26 -26
- package/dist/{chunk-PFXFQQRT.js → chunk-HXKZ7OBQ.js} +7 -43
- package/dist/{chunk-2FQL4PDC.js → chunk-I7DALG7J.js} +5 -5
- package/dist/{chunk-GM54GJBU.js → chunk-IRUTEHCE.js} +3 -3
- package/dist/{chunk-TYW2GI5I.js → chunk-J2WRWR37.js} +40 -13
- package/dist/{chunk-ZEHUCJHY.js → chunk-JFPJ6LLQ.js} +2 -2
- package/dist/chunk-JMULFFLN.js +9 -0
- package/dist/{chunk-RD6DEE36.js → chunk-JO4MGB6Z.js} +94 -8
- package/dist/{chunk-5DSMEVA4.js → chunk-K6BXGITA.js} +7 -7
- package/dist/{chunk-O74MJHXU.js → chunk-KZMSZV32.js} +2 -2
- package/dist/{chunk-GFJOMSHG.js → chunk-LA7CLDRW.js} +6 -2
- package/dist/{chunk-M2WF6AXG.js → chunk-LSMMOS2Z.js} +7 -3
- package/dist/{chunk-ASX6AW36.js → chunk-LXWCMQNJ.js} +3 -3
- package/dist/{chunk-WZO23AWO.js → chunk-M27LIEKV.js} +72 -22
- package/dist/{chunk-JTHKOYWU.js → chunk-MJPHJRAL.js} +15 -15
- package/dist/{chunk-G5AAKEEZ.js → chunk-MTL4O5YR.js} +5 -5
- package/dist/chunk-NHJ75HXY.js +1 -0
- package/dist/{chunk-ZYU2YOJ6.js → chunk-NIOAGFPB.js} +29 -15
- package/dist/{chunk-Y2GE5TSI.js → chunk-NS52ISWS.js} +2 -2
- package/dist/{chunk-UIWONWVG.js → chunk-NSOFPKGT.js} +541 -148
- package/dist/{chunk-RCQYT2I4.js → chunk-NVIZG63R.js} +2 -2
- package/dist/{chunk-EPC3GZD4.js → chunk-OOYZPOXM.js} +2 -2
- package/dist/{chunk-7ZHZE5EO.js → chunk-OSGLYW5J.js} +2 -2
- package/dist/{chunk-CE4ZOCOI.js → chunk-PFCMSSUF.js} +9 -9
- package/dist/{chunk-GFXZTHNI.js → chunk-PGRVXIMY.js} +5 -5
- package/dist/{chunk-JJPMWPB6.js → chunk-PISBFBJN.js} +6 -6
- package/dist/chunk-POOOIWE5.js +9 -0
- package/dist/{chunk-5RP3QTRL.js → chunk-PQNS3U7Z.js} +20 -3
- package/dist/{chunk-3E244UDA.js → chunk-QSTSJOCK.js} +52 -6
- package/dist/{chunk-YUPMXOGP.js → chunk-RFQMOKWK.js} +3 -3
- package/dist/chunk-RTOTNK3P.js +484 -0
- package/dist/{chunk-SN2DQRL6.js → chunk-RXKSDUAU.js} +7 -7
- package/dist/{chunk-T3KGZBU5.js → chunk-S45JPKQN.js} +189 -43
- package/dist/{chunk-YNCVSFGF.js → chunk-SAFHACFA.js} +4 -1
- package/dist/{chunk-KI4L2DUL.js → chunk-TCCHINEF.js} +114 -19
- package/dist/{chunk-AWNQ6ED6.js → chunk-THEGTRAG.js} +7 -2
- package/dist/{chunk-2KKODIQU.js → chunk-TR4LQE7L.js} +15 -15
- package/dist/{chunk-GPQ3NJPR.js → chunk-TWJMGXCI.js} +3 -3
- package/dist/{chunk-H72H4XDU.js → chunk-U45AXT5D.js} +9 -9
- package/dist/{chunk-62V2AFVG.js → chunk-U4FWBSO3.js} +160 -73
- package/dist/{chunk-A455ATZB.js → chunk-UBGDX6FI.js} +8 -1
- package/dist/chunk-UJILKYES.js +75 -0
- package/dist/{chunk-KSJ5UTP7.js → chunk-ULMAQV3T.js} +84 -4
- package/dist/{chunk-CB2HFKTP.js → chunk-VVBP6KGT.js} +1 -1
- package/dist/{chunk-RPOA7IAE.js → chunk-W5VITDM2.js} +43 -25
- package/dist/{chunk-QRTG4XTI.js → chunk-WAHQVNWT.js} +7 -1
- package/dist/{chunk-SQP64RCS.js → chunk-WGGYRBXH.js} +3019 -2976
- package/dist/{chunk-K3G6JBUC.js → chunk-WLYKU45P.js} +679 -141
- package/dist/chunk-WP7BVANJ.js +53 -0
- package/dist/{chunk-GAZEWQEZ.js → chunk-XF4VUMKW.js} +2 -2
- package/dist/{chunk-PAAWLLZX.js → chunk-Y5YXDM7D.js} +2 -2
- package/dist/{chunk-65RDIOR2.js → chunk-YOPAUVU4.js} +162 -44
- package/dist/{chunk-FFSX2QDQ.js → chunk-YPT4A46F.js} +3 -3
- package/dist/chunk-YWXT3JNM.js +425 -0
- package/dist/{chunk-EFEHDQGY.js → chunk-ZHZ2Y2DH.js} +64 -10
- package/dist/{chunk-CQQL4ZOQ.js → chunk-ZT7JNIGX.js} +4 -3
- package/dist/coordination/agent-monitor.d.ts +9 -1
- package/dist/coordination/agent-subagent-runner.d.ts +1 -1
- package/dist/coordination/agents/agent-prompts.d.ts +8 -0
- package/dist/coordination/agents/index.d.ts +33 -1
- package/dist/coordination/agents/index.js +52 -22
- package/dist/coordination/agents/phase3-wave1-platform.d.ts +1 -3
- package/dist/coordination/agents/phase3-wave2-meta.d.ts +1 -3
- package/dist/coordination/agents/phase8-wave3-products.d.ts +1 -3
- package/dist/coordination/agents/phase9-wave4-platform-meta.d.ts +1 -3
- package/dist/coordination/agents/project-agent-identity.d.ts +11 -11
- package/dist/coordination/agents/types.d.ts +13 -2
- package/dist/coordination/brain-monitor.d.ts +30 -7
- package/dist/coordination/collab-debug.d.ts +1 -1
- package/dist/coordination/collab-pause.d.ts +1 -1
- package/dist/coordination/delegate-tool.d.ts +7 -5
- package/dist/coordination/director-kanban-queue-helpers.d.ts +1 -0
- package/dist/coordination/director-options.d.ts +7 -0
- package/dist/coordination/director-spawn-model.d.ts +17 -0
- package/dist/coordination/director-tools.d.ts +2 -2
- package/dist/coordination/director.d.ts +12 -0
- package/dist/coordination/dispatcher.d.ts +8 -0
- package/dist/coordination/fleet-bus.d.ts +35 -4
- package/dist/coordination/fleet-supervisor.d.ts +10 -2
- package/dist/coordination/fleet.d.ts +16 -7
- package/dist/coordination/index.d.ts +4 -0
- package/dist/coordination/index.js +86 -49
- package/dist/coordination/kanban-dispatch-port.d.ts +2 -2
- package/dist/coordination/mailbox-http-router.d.ts +4 -3
- package/dist/coordination/mailbox-http-validation.d.ts +1 -1
- package/dist/coordination/mailbox-project-server.js +15 -15
- package/dist/coordination/mailbox-types.d.ts +24 -6
- package/dist/coordination/model-tier-leader.d.ts +122 -0
- package/dist/coordination/model-tier.d.ts +122 -0
- package/dist/coordination/multi-agent-coordinator.d.ts +24 -0
- package/dist/coordination/origin-session.d.ts +16 -0
- package/dist/coordination/provider-status-tracker.d.ts +37 -5
- package/dist/coordination/session-note-hub.d.ts +44 -0
- package/dist/coordination/session-note-tool.d.ts +10 -0
- package/dist/core/agent.d.ts +1 -1
- package/dist/core/context.d.ts +22 -3
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +130 -38
- package/dist/core/request-conversation-binding.d.ts +37 -0
- package/dist/core/session-notes.d.ts +25 -0
- package/dist/core/system-prompt-builder.d.ts +11 -2
- package/dist/core/system-prompt-variants.d.ts +78 -0
- package/dist/design/index.js +3 -3
- package/dist/execution/auto-compaction-middleware.d.ts +11 -0
- package/dist/execution/autonomy-brain.d.ts +2 -1
- package/dist/execution/autonomy-prompt-contributor.d.ts +7 -2
- package/dist/execution/compaction-core.d.ts +4 -4
- package/dist/execution/eternal-autonomy.d.ts +1 -1
- package/dist/execution/index.js +138 -129
- package/dist/execution/model-runtime.d.ts +0 -7
- package/dist/execution/parallel-eternal-engine.d.ts +7 -7
- package/dist/extension/index.js +3 -3
- package/dist/goal/index.js +6 -6
- package/dist/hooks/index.js +3 -3
- package/dist/hq/index.js +14 -12
- package/dist/hq/persistence/event-log.d.ts +0 -1
- package/dist/hq/persistence.d.ts +4 -4
- package/dist/hq/publisher.d.ts +2 -0
- package/dist/index.d.ts +14 -11
- package/dist/index.js +728 -635
- package/dist/infrastructure/index.d.ts +4 -4
- package/dist/infrastructure/index.js +281 -260
- package/dist/infrastructure/token-counter.d.ts +9 -0
- package/dist/kernel/events/agent-events.d.ts +77 -3
- package/dist/kernel/events/brain-events.d.ts +12 -0
- package/dist/kernel/events/provider-events.d.ts +7 -1
- package/dist/kernel/events/session-events.d.ts +14 -0
- package/dist/kernel/events/tool-events.d.ts +13 -0
- package/dist/kernel/index.js +4 -4
- package/dist/mailbox-attach.d.ts +1 -1
- package/dist/models/index.js +10 -9
- package/dist/observability/event-bridge.d.ts +25 -5
- package/dist/observability/index.d.ts +9 -8
- package/dist/observability/index.js +459 -351
- package/dist/observability/tool-usage-source.d.ts +65 -0
- package/dist/plugin/index.d.ts +5 -0
- package/dist/plugin/index.js +66 -50
- package/dist/plugins/auto-review-plugin.d.ts +3 -2
- package/dist/plugins/review-finding-commands.d.ts +0 -8
- package/dist/{review-finding-store-DKAV3AS6.js → plugins/review-finding-store.js} +7 -6
- package/dist/plugins/review-finding-types.js +19 -0
- package/dist/plugins/review-report-integration.js +21 -0
- package/dist/{review-report-store-OWY3EC3N.js → plugins/review-report-store.js} +7 -6
- package/dist/plugins/review-report-types.js +13 -0
- package/dist/prompts/index.js +5 -5
- package/dist/registry/index.js +3 -3
- package/dist/registry/tool-registry.d.ts +59 -9
- package/dist/{registry-R23UBE7H.js → registry-7N4O3E7W.js} +5 -5
- package/dist/security/capabilities.d.ts +6 -0
- package/dist/security/file-permissions.d.ts +1 -1
- package/dist/security/index.js +47 -33
- package/dist/security/permission-policy.d.ts +12 -1
- package/dist/security/secret-scrubber.d.ts +15 -0
- package/dist/session-catalog/index.d.ts +1 -0
- package/dist/session-catalog/index.js +19 -14
- package/dist/session-catalog/project-server.js +30 -13
- package/dist/session-catalog/protocol.d.ts +32 -1
- package/dist/session-catalog/registry.d.ts +17 -1
- package/dist/session-catalog/session-agents.d.ts +56 -0
- package/dist/session-catalog/store-rebuild.d.ts +14 -0
- package/dist/session-catalog/store-schema.d.ts +26 -0
- package/dist/session-catalog/store.d.ts +27 -1
- package/dist/session-note-attach.d.ts +9 -0
- package/dist/skills/index.js +5 -5
- package/dist/statusline/index.d.ts +43 -0
- package/dist/statusline/index.js +102 -0
- package/dist/storage/board-store-port.d.ts +2 -2
- package/dist/storage/config-loader/in-project-policy.d.ts +29 -0
- package/dist/storage/config-loader.d.ts +3 -2
- package/dist/storage/file-session-writer.d.ts +4 -2
- package/dist/storage/goal-coordination.d.ts +6 -1
- package/dist/storage/goal-kanban.d.ts +4 -1
- package/dist/storage/index.d.ts +12 -4
- package/dist/storage/index.js +76 -61
- package/dist/storage/input-history-store.d.ts +2 -4
- package/dist/storage/memory-curator.d.ts +133 -0
- package/dist/storage/session-agent-attribution.d.ts +39 -0
- package/dist/storage/session-doctor.d.ts +109 -0
- package/dist/storage/session-event-bridge.d.ts +5 -7
- package/dist/storage/session-outcome.d.ts +42 -0
- package/dist/storage/session-recovery.d.ts +55 -0
- package/dist/storage/session-store/load-session-data.d.ts +11 -0
- package/dist/storage/session-store/prune-helpers.d.ts +1 -1
- package/dist/storage/session-store/resume-session.d.ts +0 -2
- package/dist/storage/session-store/types.d.ts +8 -0
- package/dist/storage/session-store.d.ts +3 -3
- package/dist/storage/session-summary-tracker.d.ts +8 -1
- package/dist/storage/session-write-buffer.d.ts +18 -0
- package/dist/storage/session-writer-truncate.d.ts +2 -0
- package/dist/tasking/index.js +2 -2
- package/dist/tools/fallback-manage-tools.d.ts +6 -4
- package/dist/tools/index.js +21 -21
- package/dist/tools/model-tier-set-tool.d.ts +66 -0
- package/dist/types/agent-bridge.d.ts +2 -1
- package/dist/types/config/mcp-features.d.ts +7 -0
- package/dist/types/config/model-tiers.d.ts +148 -0
- package/dist/types/config/root.d.ts +9 -0
- package/dist/types/config/tools.d.ts +73 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/context.d.ts +2 -0
- package/dist/types/default-config.d.ts +6 -0
- package/dist/types/errors.d.ts +2 -1
- package/dist/types/index.d.ts +11 -9
- package/dist/types/index.js +25 -15
- package/dist/types/multi-agent.d.ts +43 -0
- package/dist/types/plugin.d.ts +1 -1
- package/dist/types/provider.d.ts +15 -0
- package/dist/types/runtime-capability-manifest.d.ts +1 -1
- package/dist/types/secret-scrubber.d.ts +15 -0
- package/dist/types/session-markers.d.ts +37 -10
- package/dist/types/session-markers.js +1 -1
- package/dist/types/session-timeline.d.ts +197 -0
- package/dist/types/session-timeline.js +12 -0
- package/dist/types/session.d.ts +172 -11
- package/dist/types/system-prompt.d.ts +27 -0
- package/dist/utils/config-backup.d.ts +9 -1
- package/dist/utils/heap-watchdog.js +2 -2
- package/dist/utils/index.js +50 -48
- package/dist/utils/message-invariants.d.ts +4 -1
- package/dist/utils/regex-guard.d.ts +1 -1
- package/dist/utils/socket-path.d.ts +1 -1
- package/dist/utils/token-estimate.d.ts +6 -2
- package/dist/utils/wstack-paths.d.ts +2 -0
- package/dist/wiring/proxy-rewrite.d.ts +28 -0
- package/dist/wiring/proxy-rewrite.js +7 -1
- package/dist/worktree/index.js +2 -2
- package/instructions/agents/explore-companion.md +45 -18
- package/instructions/agents/memory-curator.md +34 -22
- package/instructions/coordination/director-preamble.md +12 -7
- package/instructions/coordination/subagent-baseline.md +26 -5
- package/instructions/leader-after-task.md +4 -1
- package/instructions/llm/chimera-review.md +30 -9
- package/instructions/llm/memory-curator.md +31 -0
- package/instructions/sections/tool/delegation-compact.md +2 -0
- package/instructions/sections/tool/delegation-full.md +5 -1
- package/instructions/sections/tool/mailbox-compact.md +5 -1
- package/instructions/sections/tool/mailbox-full.md +3 -0
- package/instructions/sections/tool/session-note-compact.md +3 -0
- package/instructions/sections/tool/session-note-full.md +15 -0
- package/instructions/system-lite.md +9 -4
- package/instructions/system-pro.md +66 -143
- package/instructions/system.md +73 -175
- package/package.json +33 -5
- package/dist/chunk-2BUUIMQB.js +0 -225
- package/dist/chunk-FAYRX2AD.js +0 -13
- package/dist/chunk-H5E77KUJ.js +0 -15
- package/dist/chunk-M7BS2K6U.js +0 -1
- package/dist/coordination/agents.d.ts +0 -8
- package/dist/coordination/transport.d.ts +0 -2
- package/dist/storage/session-writer/session-writer-summary-tracker.d.ts +0 -28
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
import {
|
|
2
|
+
JsonlFindingStore
|
|
3
|
+
} from "./chunk-4LCZVJVF.js";
|
|
4
|
+
import {
|
|
5
|
+
computeFindingFingerprint
|
|
6
|
+
} from "./chunk-UJILKYES.js";
|
|
7
|
+
import {
|
|
8
|
+
JsonlReportStore
|
|
9
|
+
} from "./chunk-HXKZ7OBQ.js";
|
|
10
|
+
|
|
11
|
+
// src/plugins/review-finding-parser.ts
|
|
12
|
+
import { randomUUID } from "node:crypto";
|
|
13
|
+
var SEVERITIES = /* @__PURE__ */ new Set(["critical", "high", "medium", "low"]);
|
|
14
|
+
var CATEGORIES = /* @__PURE__ */ new Set([
|
|
15
|
+
"bug",
|
|
16
|
+
"security",
|
|
17
|
+
"performance",
|
|
18
|
+
"type",
|
|
19
|
+
"contract",
|
|
20
|
+
"test",
|
|
21
|
+
"other"
|
|
22
|
+
]);
|
|
23
|
+
var CONFIDENCES = /* @__PURE__ */ new Set(["high", "medium", "low"]);
|
|
24
|
+
var FENCED_BLOCK = /```json[ \t]*\r?\n([\s\S]*?)\r?\n```/gi;
|
|
25
|
+
function extractStructuredFindingsBlock(reportText) {
|
|
26
|
+
if (!reportText) return null;
|
|
27
|
+
let best = null;
|
|
28
|
+
for (const match of reportText.matchAll(FENCED_BLOCK)) {
|
|
29
|
+
const body = match[1];
|
|
30
|
+
if (!body?.trim()) continue;
|
|
31
|
+
let parsed;
|
|
32
|
+
try {
|
|
33
|
+
parsed = JSON.parse(body);
|
|
34
|
+
} catch {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (typeof parsed !== "object" || parsed === null) continue;
|
|
38
|
+
const findings = parsed.findings;
|
|
39
|
+
if (!Array.isArray(findings)) continue;
|
|
40
|
+
const items = [];
|
|
41
|
+
for (const raw of findings) {
|
|
42
|
+
const item = normalizeStructuredItem(raw);
|
|
43
|
+
if (item) items.push(item);
|
|
44
|
+
}
|
|
45
|
+
if (findings.length > 0 && items.length === 0) continue;
|
|
46
|
+
const durationRaw = parsed.durationSeconds;
|
|
47
|
+
const durationSeconds = typeof durationRaw === "number" && Number.isFinite(durationRaw) && durationRaw > 0 ? Math.floor(durationRaw) : void 0;
|
|
48
|
+
best = { findings: items, ...durationSeconds !== void 0 ? { durationSeconds } : {} };
|
|
49
|
+
}
|
|
50
|
+
return best;
|
|
51
|
+
}
|
|
52
|
+
function normalizeStructuredItem(raw) {
|
|
53
|
+
if (typeof raw !== "object" || raw === null) return null;
|
|
54
|
+
const item = raw;
|
|
55
|
+
const severity = typeof item.severity === "string" ? item.severity.toLowerCase() : "";
|
|
56
|
+
if (!SEVERITIES.has(severity)) return null;
|
|
57
|
+
const title = typeof item.title === "string" ? item.title.trim() : "";
|
|
58
|
+
if (title.length === 0) return null;
|
|
59
|
+
const file = typeof item.file === "string" && item.file.trim().length > 0 ? item.file.trim() : void 0;
|
|
60
|
+
const line = typeof item.line === "number" && Number.isInteger(item.line) && item.line >= 1 ? item.line : void 0;
|
|
61
|
+
const categoryRaw = typeof item.category === "string" ? item.category.toLowerCase() : "";
|
|
62
|
+
const category = CATEGORIES.has(categoryRaw) ? categoryRaw : void 0;
|
|
63
|
+
const confidenceRaw = typeof item.confidence === "string" ? item.confidence.toLowerCase() : "";
|
|
64
|
+
const confidence = CONFIDENCES.has(confidenceRaw) ? confidenceRaw : void 0;
|
|
65
|
+
return {
|
|
66
|
+
severity,
|
|
67
|
+
...file ? { file } : {},
|
|
68
|
+
...line !== void 0 ? { line } : {},
|
|
69
|
+
...category ? { category } : {},
|
|
70
|
+
...confidence ? { confidence } : {},
|
|
71
|
+
title,
|
|
72
|
+
...typeof item.description === "string" && item.description.trim().length > 0 ? { description: item.description.trim() } : {},
|
|
73
|
+
...typeof item.suggestedFix === "string" && item.suggestedFix.trim().length > 0 ? { suggestedFix: item.suggestedFix.trim() } : {}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
var SUGGEST_LINE = /^\s*(?:→|->|=>)\s*(.+)$/;
|
|
77
|
+
var DURATION_LINE = /^Duration:\s*(\d+)s\s*$/im;
|
|
78
|
+
function parseChimeraReviewReport(reportText, context = {}) {
|
|
79
|
+
if (!reportText || reportText.trim().length === 0) {
|
|
80
|
+
return { findings: [], unparseableCount: 0 };
|
|
81
|
+
}
|
|
82
|
+
const structured = extractStructuredFindingsBlock(reportText);
|
|
83
|
+
if (structured) {
|
|
84
|
+
const reportId2 = context.reportId ?? randomUUID();
|
|
85
|
+
const findings2 = structured.findings.map(
|
|
86
|
+
(item) => buildFindingFromStructuredItem(item, { ...context, reportId: reportId2 })
|
|
87
|
+
);
|
|
88
|
+
return {
|
|
89
|
+
findings: findings2,
|
|
90
|
+
unparseableCount: 0,
|
|
91
|
+
...structured.durationSeconds !== void 0 ? { durationSeconds: structured.durationSeconds } : {},
|
|
92
|
+
structured: true
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const findings = [];
|
|
96
|
+
const reportId = context.reportId ?? randomUUID();
|
|
97
|
+
let unparseableCount = 0;
|
|
98
|
+
let durationSeconds;
|
|
99
|
+
let currentSeverity = null;
|
|
100
|
+
let currentLines = [];
|
|
101
|
+
const lines = reportText.split("\n");
|
|
102
|
+
for (let i = 0; i < lines.length; i++) {
|
|
103
|
+
const line = lines[i];
|
|
104
|
+
const headingMatch = line.trim().match(/^###\s+(critical|high|medium|low)\b/i);
|
|
105
|
+
if (headingMatch) {
|
|
106
|
+
flushSection();
|
|
107
|
+
currentSeverity = headingMatch[1].toLowerCase();
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const durMatch = line.match(DURATION_LINE);
|
|
111
|
+
if (durMatch) {
|
|
112
|
+
durationSeconds = Number.parseInt(durMatch[1], 10);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (currentSeverity !== null) {
|
|
116
|
+
currentLines.push(line);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
flushSection();
|
|
120
|
+
return { findings, unparseableCount, durationSeconds };
|
|
121
|
+
function flushSection() {
|
|
122
|
+
if (currentSeverity === null || currentLines.length === 0) {
|
|
123
|
+
currentSeverity = null;
|
|
124
|
+
currentLines = [];
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const combined = currentLines.join("\n");
|
|
128
|
+
const segments = combined.split(/\n\s*(?=\d+\.\s)/).filter((s) => s.trim().length > 0);
|
|
129
|
+
for (const segment of segments) {
|
|
130
|
+
const finding = parseFindingSegment(segment, currentSeverity, { ...context, reportId });
|
|
131
|
+
if (finding) {
|
|
132
|
+
findings.push(finding);
|
|
133
|
+
} else {
|
|
134
|
+
unparseableCount++;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
currentSeverity = null;
|
|
138
|
+
currentLines = [];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function parseFindingSegment(segment, severity, context) {
|
|
142
|
+
const lines = segment.split("\n").map((l) => l.trim()).filter((l) => l.length > 0);
|
|
143
|
+
if (lines.length === 0) return null;
|
|
144
|
+
const first = lines[0];
|
|
145
|
+
const match = first.match(/^\d+\.\s+(.*)$/);
|
|
146
|
+
if (!match) return null;
|
|
147
|
+
const content = match[1].trim();
|
|
148
|
+
let remaining = content;
|
|
149
|
+
const tagMatch = content.match(/^\[(\w+)\]\s*/);
|
|
150
|
+
if (tagMatch) {
|
|
151
|
+
remaining = content.slice(tagMatch[0].length).trim();
|
|
152
|
+
}
|
|
153
|
+
const citationMatch = remaining.match(
|
|
154
|
+
/^(`+)([a-zA-Z_./\\:][^`]*[a-zA-Z0-9_./\\:])\1(?=\s*[—–-]|\s*$)/
|
|
155
|
+
);
|
|
156
|
+
if (citationMatch) {
|
|
157
|
+
const inner = citationMatch[2];
|
|
158
|
+
const afterCitation = remaining.slice(citationMatch[0].length);
|
|
159
|
+
remaining = `${inner}${afterCitation}`;
|
|
160
|
+
}
|
|
161
|
+
let file;
|
|
162
|
+
let line;
|
|
163
|
+
let desc = remaining;
|
|
164
|
+
const refMatch = remaining.match(
|
|
165
|
+
/^([a-zA-Z_./\\][a-zA-Z0-9_./\\-]*\.\w+)(?::(\d+))?\s+(?:[—–]|-)\s+(.+)$/
|
|
166
|
+
);
|
|
167
|
+
if (refMatch) {
|
|
168
|
+
file = refMatch[1].trim();
|
|
169
|
+
if (refMatch[2] !== void 0) {
|
|
170
|
+
line = Number.parseInt(refMatch[2], 10);
|
|
171
|
+
}
|
|
172
|
+
desc = refMatch[3].trim();
|
|
173
|
+
}
|
|
174
|
+
if (!file) {
|
|
175
|
+
const pathMatch = remaining.match(/^([a-zA-Z_./\\][a-zA-Z0-9_./\\-]*\.\w+)(?::(\d+))?/);
|
|
176
|
+
if (pathMatch) {
|
|
177
|
+
file = pathMatch[1].trim();
|
|
178
|
+
if (pathMatch[2] !== void 0) {
|
|
179
|
+
line = Number.parseInt(pathMatch[2], 10);
|
|
180
|
+
}
|
|
181
|
+
const afterFile = remaining.slice(pathMatch[0].length).trim();
|
|
182
|
+
desc = afterFile.replace(/^[—–-]\s*/, "").trim() || desc;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const cleanDesc = desc.replace(/^[—–-]\s*/, "").trim();
|
|
186
|
+
const suggestions = [];
|
|
187
|
+
for (let i = 1; i < lines.length; i++) {
|
|
188
|
+
const suggest = lines[i].match(SUGGEST_LINE);
|
|
189
|
+
if (suggest) {
|
|
190
|
+
suggestions.push(suggest[1].trim());
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const title = cleanDesc.split(/\.\s/)[0].trim() || content;
|
|
194
|
+
const fullDesc = suggestions.length > 0 ? cleanDesc + "\n" + suggestions.map((s) => " \u2192 " + s).join("\n") : cleanDesc;
|
|
195
|
+
const suggestedFix = suggestions.length > 0 ? suggestions.join("\n") : void 0;
|
|
196
|
+
return {
|
|
197
|
+
id: randomUUID(),
|
|
198
|
+
fingerprint: computeFindingFingerprint(file ?? "", line ?? null, title),
|
|
199
|
+
severity,
|
|
200
|
+
source: normalizeFindingSource(context.reviewType),
|
|
201
|
+
...file ? { location: { file, ...line !== void 0 ? { line } : {} } } : {},
|
|
202
|
+
title,
|
|
203
|
+
description: fullDesc,
|
|
204
|
+
...suggestedFix ? { suggestedFix } : {},
|
|
205
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
206
|
+
status: "active",
|
|
207
|
+
originReport: {
|
|
208
|
+
reportId: context.reportId ?? randomUUID(),
|
|
209
|
+
sessionId: context.sessionId ?? "",
|
|
210
|
+
agentId: context.agentId ?? "",
|
|
211
|
+
reviewerModel: context.reviewerModel ?? ""
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function normalizeFindingSource(reviewType) {
|
|
216
|
+
switch (reviewType) {
|
|
217
|
+
case "auto":
|
|
218
|
+
case "chimera":
|
|
219
|
+
case "cascade":
|
|
220
|
+
case "security-scanner":
|
|
221
|
+
return reviewType;
|
|
222
|
+
default:
|
|
223
|
+
return "chimera";
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function buildFindingFromStructuredItem(item, context) {
|
|
227
|
+
const file = item.file;
|
|
228
|
+
const line = item.line;
|
|
229
|
+
const title = item.title;
|
|
230
|
+
const description = item.description ?? title;
|
|
231
|
+
return {
|
|
232
|
+
id: randomUUID(),
|
|
233
|
+
fingerprint: computeFindingFingerprint(file ?? "", line ?? null, title),
|
|
234
|
+
severity: item.severity,
|
|
235
|
+
source: normalizeFindingSource(context.reviewType),
|
|
236
|
+
...file ? { location: { file, ...line !== void 0 ? { line } : {} } } : {},
|
|
237
|
+
...item.category ? { category: item.category } : {},
|
|
238
|
+
...item.confidence ? { confidence: item.confidence } : {},
|
|
239
|
+
title,
|
|
240
|
+
description,
|
|
241
|
+
...item.suggestedFix ? { suggestedFix: item.suggestedFix } : {},
|
|
242
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
243
|
+
status: "active",
|
|
244
|
+
originReport: {
|
|
245
|
+
reportId: context.reportId ?? randomUUID(),
|
|
246
|
+
sessionId: context.sessionId ?? "",
|
|
247
|
+
agentId: context.agentId ?? "",
|
|
248
|
+
reviewerModel: context.reviewerModel ?? ""
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// src/plugins/review-finding-integration.ts
|
|
254
|
+
function classifyChimeraReviewSource(bundle) {
|
|
255
|
+
const cascadeDepth = bundle.cascadeDepth ?? 0;
|
|
256
|
+
if (cascadeDepth > 0) return "cascade";
|
|
257
|
+
const cascadeOn = bundle.cascadeOn;
|
|
258
|
+
if (cascadeOn !== void 0 && cascadeOn !== "off") return "auto";
|
|
259
|
+
return "chimera";
|
|
260
|
+
}
|
|
261
|
+
async function integrateFindings(payload, projectDir, reportId) {
|
|
262
|
+
if ((!payload.reviewText || payload.reviewText.trim().length === 0) && !payload.parsedReport) {
|
|
263
|
+
return { created: 0, relinked: 0, reopened: 0, totalFindings: 0, unparseableCount: 0 };
|
|
264
|
+
}
|
|
265
|
+
const store = new JsonlFindingStore(projectDir);
|
|
266
|
+
const source = classifyChimeraReviewSource(payload.bundle);
|
|
267
|
+
const agentId = payload.bundle.fileProvenance?.find((entry) => entry.agentId)?.agentId ?? "chimera-review";
|
|
268
|
+
const sessionId = payload.sessionId ?? payload.cwd;
|
|
269
|
+
const model = payload.bundle.config.model;
|
|
270
|
+
const parsed = payload.parsedReport ?? parseChimeraReviewReport(payload.reviewText, {
|
|
271
|
+
sessionId,
|
|
272
|
+
agentId,
|
|
273
|
+
reviewerModel: model,
|
|
274
|
+
reviewType: source,
|
|
275
|
+
reportId
|
|
276
|
+
});
|
|
277
|
+
if (parsed.findings.length === 0) {
|
|
278
|
+
return {
|
|
279
|
+
created: 0,
|
|
280
|
+
relinked: 0,
|
|
281
|
+
reopened: 0,
|
|
282
|
+
totalFindings: 0,
|
|
283
|
+
unparseableCount: parsed.unparseableCount
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
const result = await store.upsert(parsed.findings, {
|
|
287
|
+
sessionId,
|
|
288
|
+
reportId,
|
|
289
|
+
agentId,
|
|
290
|
+
model
|
|
291
|
+
});
|
|
292
|
+
return {
|
|
293
|
+
created: result.created,
|
|
294
|
+
relinked: result.relinked,
|
|
295
|
+
reopened: result.reopened,
|
|
296
|
+
reportId,
|
|
297
|
+
totalFindings: parsed.findings.length,
|
|
298
|
+
unparseableCount: parsed.unparseableCount
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// src/plugins/review-report-integration.ts
|
|
303
|
+
async function updateReviewReportEvidence(reportId, projectDir, evidenceStatus, evidenceChecks) {
|
|
304
|
+
await new JsonlReportStore(projectDir).updateEvidence(
|
|
305
|
+
reportId,
|
|
306
|
+
evidenceStatus,
|
|
307
|
+
evidenceChecks
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
async function persistReviewReport(payload, reportId, projectDir) {
|
|
311
|
+
const store = new JsonlReportStore(projectDir);
|
|
312
|
+
const existed = await store.get(reportId);
|
|
313
|
+
const source = classifyChimeraReviewSource(payload.bundle);
|
|
314
|
+
const agentId = payload.bundle.fileProvenance?.find((entry) => entry.agentId)?.agentId ?? "chimera-review";
|
|
315
|
+
const sessionId = payload.sessionId ?? payload.cwd;
|
|
316
|
+
const model = payload.bundle.config.model;
|
|
317
|
+
const cascadeDepth = payload.bundle.cascadeDepth;
|
|
318
|
+
const files = payload.bundle.files.map((f) => ({
|
|
319
|
+
path: f.path,
|
|
320
|
+
status: f.status
|
|
321
|
+
}));
|
|
322
|
+
const reviewStatus = payload.status === "success" ? "success" : "failed";
|
|
323
|
+
const parsed = reviewStatus === "success" ? payload.parsedReport ?? parseChimeraReviewReport(payload.reviewText, {
|
|
324
|
+
sessionId,
|
|
325
|
+
agentId,
|
|
326
|
+
reviewerModel: model,
|
|
327
|
+
reviewType: source,
|
|
328
|
+
reportId
|
|
329
|
+
}) : { findings: [], unparseableCount: 0, durationSeconds: void 0 };
|
|
330
|
+
const counts = { critical: 0, high: 0, medium: 0, low: 0 };
|
|
331
|
+
for (const finding of parsed.findings) {
|
|
332
|
+
counts[finding.severity]++;
|
|
333
|
+
}
|
|
334
|
+
const input = {
|
|
335
|
+
id: reportId,
|
|
336
|
+
sessionId,
|
|
337
|
+
agentId,
|
|
338
|
+
reviewerModel: model,
|
|
339
|
+
source,
|
|
340
|
+
reviewStatus,
|
|
341
|
+
files,
|
|
342
|
+
counts,
|
|
343
|
+
totalFindings: parsed.findings.length,
|
|
344
|
+
unparseableCount: parsed.unparseableCount,
|
|
345
|
+
durationSeconds: parsed.durationSeconds,
|
|
346
|
+
rawText: payload.reviewText,
|
|
347
|
+
...cascadeDepth !== void 0 ? { cascadeDepth } : {},
|
|
348
|
+
// P0-3: carry the cascade evidence verification (status + per-check
|
|
349
|
+
// comparisons) so the persisted report is auditable. Absent on initial
|
|
350
|
+
// reviews — no cascade step produced evidence yet.
|
|
351
|
+
...payload.bundle.evidenceStatus !== void 0 ? { evidenceStatus: payload.bundle.evidenceStatus } : {},
|
|
352
|
+
...payload.bundle.evidenceChecks !== void 0 ? { evidenceChecks: payload.bundle.evidenceChecks } : {}
|
|
353
|
+
};
|
|
354
|
+
await store.persist(input);
|
|
355
|
+
if (reviewStatus === "success" && parsed.findings.length === 0 && parsed.unparseableCount === 0 && isExplicitAllClearReview(payload.reviewText)) {
|
|
356
|
+
await store.transition(
|
|
357
|
+
reportId,
|
|
358
|
+
"completed",
|
|
359
|
+
{ id: "chimera", kind: "system" },
|
|
360
|
+
{
|
|
361
|
+
reason: "Successful Chimera review produced no actionable findings"
|
|
362
|
+
}
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
return {
|
|
366
|
+
reportId,
|
|
367
|
+
created: !existed,
|
|
368
|
+
totalFindings: parsed.findings.length
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
function isExplicitAllClearReview(text) {
|
|
372
|
+
const normalized = text.trim().toLowerCase();
|
|
373
|
+
return normalized.startsWith("## \u{1F982} chimera review \u2014 all clear") || normalized.includes("chimera review: all clear");
|
|
374
|
+
}
|
|
375
|
+
async function syncReportCompletion(reportId, projectDir, actor) {
|
|
376
|
+
const reportStore = new JsonlReportStore(projectDir);
|
|
377
|
+
const findingStore = new JsonlFindingStore(projectDir);
|
|
378
|
+
const report = await reportStore.get(reportId);
|
|
379
|
+
if (!report) {
|
|
380
|
+
return { reportId, completed: false, totalFindings: 0, remaining: 0 };
|
|
381
|
+
}
|
|
382
|
+
if (report.lifecycle === "completed" || report.lifecycle === "skipped") {
|
|
383
|
+
return { reportId, completed: false, totalFindings: 0, remaining: 0 };
|
|
384
|
+
}
|
|
385
|
+
const findings = await findingStore.list({ reportId, limit: 9999 });
|
|
386
|
+
const total = findings.length;
|
|
387
|
+
if (total === 0) {
|
|
388
|
+
return { reportId, completed: false, totalFindings: 0, remaining: 0 };
|
|
389
|
+
}
|
|
390
|
+
const remaining = findings.filter(
|
|
391
|
+
(f) => f.status !== "resolved" && f.status !== "ignored"
|
|
392
|
+
).length;
|
|
393
|
+
if (remaining > 0) {
|
|
394
|
+
return { reportId, completed: false, totalFindings: total, remaining };
|
|
395
|
+
}
|
|
396
|
+
await reportStore.transition(reportId, "completed", actor, {
|
|
397
|
+
reason: `All ${total} finding(s) resolved or ignored`
|
|
398
|
+
});
|
|
399
|
+
return { reportId, completed: true, totalFindings: total, remaining: 0 };
|
|
400
|
+
}
|
|
401
|
+
async function syncReportReopen(reportId, projectDir, actor, reason) {
|
|
402
|
+
const reportStore = new JsonlReportStore(projectDir);
|
|
403
|
+
const report = await reportStore.get(reportId);
|
|
404
|
+
if (!report) {
|
|
405
|
+
return { reportId, reopened: false, previousLifecycle: "not_found" };
|
|
406
|
+
}
|
|
407
|
+
if (report.lifecycle !== "completed" && report.lifecycle !== "skipped") {
|
|
408
|
+
return { reportId, reopened: false, previousLifecycle: report.lifecycle };
|
|
409
|
+
}
|
|
410
|
+
await reportStore.transition(reportId, "open", actor, {
|
|
411
|
+
reason: reason ?? `Finding reopened \u2014 report was ${report.lifecycle}`
|
|
412
|
+
});
|
|
413
|
+
return { reportId, reopened: true, previousLifecycle: report.lifecycle };
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export {
|
|
417
|
+
parseChimeraReviewReport,
|
|
418
|
+
classifyChimeraReviewSource,
|
|
419
|
+
integrateFindings,
|
|
420
|
+
updateReviewReportEvidence,
|
|
421
|
+
persistReviewReport,
|
|
422
|
+
syncReportCompletion,
|
|
423
|
+
syncReportReopen
|
|
424
|
+
};
|
|
425
|
+
//# sourceMappingURL=chunk-YWXT3JNM.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
computeMessageTokens
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import {
|
|
5
|
-
isTextBlock
|
|
6
|
-
} from "./chunk-O37BQ65S.js";
|
|
3
|
+
} from "./chunk-HMLIGAU7.js";
|
|
7
4
|
import {
|
|
8
5
|
expectDefined
|
|
9
6
|
} from "./chunk-PFZO3C6H.js";
|
|
7
|
+
import {
|
|
8
|
+
isTextBlock
|
|
9
|
+
} from "./chunk-O37BQ65S.js";
|
|
10
10
|
|
|
11
11
|
// src/utils/context-evidence.ts
|
|
12
12
|
import * as path from "node:path";
|
|
@@ -695,6 +695,12 @@ function wrapAsState(ctx) {
|
|
|
695
695
|
// src/core/context.ts
|
|
696
696
|
import { realpathSync } from "node:fs";
|
|
697
697
|
import * as path2 from "node:path";
|
|
698
|
+
import { requireSessionId } from "@wrongstack/primitives";
|
|
699
|
+
function isAppendableSessionWriter(writer) {
|
|
700
|
+
return Boolean(
|
|
701
|
+
writer && typeof writer === "object" && typeof writer.append === "function"
|
|
702
|
+
);
|
|
703
|
+
}
|
|
698
704
|
var Context = class _Context {
|
|
699
705
|
messages = [];
|
|
700
706
|
/**
|
|
@@ -979,6 +985,7 @@ var Context = class _Context {
|
|
|
979
985
|
_conversationJournalQueue = [];
|
|
980
986
|
_conversationJournalBytes = 0;
|
|
981
987
|
_conversationJournalDrain = null;
|
|
988
|
+
_conversationJournalLastError = null;
|
|
982
989
|
static CONVERSATION_JOURNAL_MAX_EVENTS = 256;
|
|
983
990
|
static CONVERSATION_JOURNAL_MAX_BYTES = 4 * 1024 * 1024;
|
|
984
991
|
static MAX_FILE_EVENTS = 1e3;
|
|
@@ -990,9 +997,13 @@ var Context = class _Context {
|
|
|
990
997
|
const drain = this._conversationJournalDrain;
|
|
991
998
|
if (!drain) break;
|
|
992
999
|
await drain;
|
|
1000
|
+
if (this._conversationJournalQueue.length > 0 && this._conversationJournalLastError) {
|
|
1001
|
+
throw this._conversationJournalLastError;
|
|
1002
|
+
}
|
|
993
1003
|
}
|
|
994
1004
|
this._conversationJournalQueue.length = 0;
|
|
995
1005
|
this._conversationJournalBytes = 0;
|
|
1006
|
+
this._conversationJournalLastError = null;
|
|
996
1007
|
}
|
|
997
1008
|
conversationJournalBytes(event) {
|
|
998
1009
|
try {
|
|
@@ -1024,6 +1035,11 @@ var Context = class _Context {
|
|
|
1024
1035
|
);
|
|
1025
1036
|
}
|
|
1026
1037
|
enqueueConversationJournal(event, writer) {
|
|
1038
|
+
if (!isAppendableSessionWriter(writer)) {
|
|
1039
|
+
this.warnConversationJournalDrop(event.type);
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
1042
|
+
this._conversationJournalLastError = null;
|
|
1027
1043
|
const bytes = this.conversationJournalBytes(event);
|
|
1028
1044
|
const shouldSnapshot = event.type === "messages_replaced" || this._conversationJournalQueue.length >= _Context.CONVERSATION_JOURNAL_MAX_EVENTS || this._conversationJournalBytes + bytes > _Context.CONVERSATION_JOURNAL_MAX_BYTES;
|
|
1029
1045
|
if (shouldSnapshot) {
|
|
@@ -1065,12 +1081,42 @@ var Context = class _Context {
|
|
|
1065
1081
|
const queued = this._conversationJournalQueue.shift();
|
|
1066
1082
|
if (!queued) continue;
|
|
1067
1083
|
this._conversationJournalBytes = Math.max(0, this._conversationJournalBytes - queued.bytes);
|
|
1068
|
-
|
|
1069
|
-
|
|
1084
|
+
if (!isAppendableSessionWriter(queued.writer)) {
|
|
1085
|
+
this.warnConversationJournalDrop(queued.event.type);
|
|
1086
|
+
continue;
|
|
1087
|
+
}
|
|
1088
|
+
try {
|
|
1089
|
+
await queued.writer.append(queued.event);
|
|
1090
|
+
this._conversationJournalLastError = null;
|
|
1091
|
+
} catch (err) {
|
|
1092
|
+
const attempts = (queued.attempts ?? 0) + 1;
|
|
1093
|
+
this._conversationJournalQueue.unshift({ ...queued, attempts });
|
|
1094
|
+
this._conversationJournalBytes += queued.bytes;
|
|
1095
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1096
|
+
this._conversationJournalLastError = error;
|
|
1097
|
+
if (attempts < 3) {
|
|
1098
|
+
await new Promise((resolve3) => setTimeout(resolve3, attempts * 25));
|
|
1099
|
+
continue;
|
|
1100
|
+
}
|
|
1101
|
+
console.warn(
|
|
1102
|
+
JSON.stringify({
|
|
1103
|
+
level: "error",
|
|
1104
|
+
event: "session.conversation_journal_write_failed",
|
|
1105
|
+
sessionId: this.session?.id,
|
|
1106
|
+
eventType: queued.event.type,
|
|
1107
|
+
attempts,
|
|
1108
|
+
message: error.message,
|
|
1109
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1110
|
+
})
|
|
1111
|
+
);
|
|
1112
|
+
break;
|
|
1113
|
+
}
|
|
1070
1114
|
}
|
|
1071
1115
|
})().finally(() => {
|
|
1072
1116
|
if (this._conversationJournalDrain === drain) this._conversationJournalDrain = null;
|
|
1073
|
-
if (this._conversationJournalQueue.length > 0
|
|
1117
|
+
if (this._conversationJournalQueue.length > 0 && !this._conversationJournalLastError) {
|
|
1118
|
+
this.startConversationJournalDrain();
|
|
1119
|
+
}
|
|
1074
1120
|
});
|
|
1075
1121
|
this._conversationJournalDrain = drain;
|
|
1076
1122
|
}
|
|
@@ -1456,9 +1502,16 @@ var Context = class _Context {
|
|
|
1456
1502
|
}
|
|
1457
1503
|
};
|
|
1458
1504
|
function resolveEventSessionId(ctx) {
|
|
1459
|
-
if (ctx.activeRunSessionId)
|
|
1505
|
+
if (ctx.activeRunSessionId) {
|
|
1506
|
+
return requireSessionId(ctx.activeRunSessionId, "agent event emission");
|
|
1507
|
+
}
|
|
1460
1508
|
const session = ctx.session;
|
|
1461
|
-
return session?.id
|
|
1509
|
+
return requireSessionId(session?.id, "agent event emission");
|
|
1510
|
+
}
|
|
1511
|
+
function resolveOwningSessionId(ctx) {
|
|
1512
|
+
const owning = ctx.meta?.["sessionId"];
|
|
1513
|
+
if (typeof owning === "string" && owning.length > 0) return owning;
|
|
1514
|
+
return resolveEventSessionId(ctx);
|
|
1462
1515
|
}
|
|
1463
1516
|
|
|
1464
1517
|
// src/utils/json-repair.ts
|
|
@@ -1582,8 +1635,9 @@ export {
|
|
|
1582
1635
|
wrapAsState,
|
|
1583
1636
|
Context,
|
|
1584
1637
|
resolveEventSessionId,
|
|
1638
|
+
resolveOwningSessionId,
|
|
1585
1639
|
bindRequestProvider,
|
|
1586
1640
|
providerBoundToRequest,
|
|
1587
1641
|
completePartialObject
|
|
1588
1642
|
};
|
|
1589
|
-
//# sourceMappingURL=chunk-
|
|
1643
|
+
//# sourceMappingURL=chunk-ZHZ2Y2DH.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ensureProjectGitignore
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HI3JGZR2.js";
|
|
4
4
|
|
|
5
5
|
// src/utils/config-backup.ts
|
|
6
6
|
import * as fs from "node:fs/promises";
|
|
@@ -11,7 +11,7 @@ function configHistoryDir(globalRoot) {
|
|
|
11
11
|
function configSlug(absolutePath, globalRoot) {
|
|
12
12
|
const rel = path.relative(globalRoot, absolutePath);
|
|
13
13
|
const normalized = rel.replace(/\\/g, "/").replace(/\.json$/i, "");
|
|
14
|
-
return normalized.replace(
|
|
14
|
+
return normalized.replace(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-+|-+$/g, "") || "config";
|
|
15
15
|
}
|
|
16
16
|
async function backupConfigFile(filePath, paths) {
|
|
17
17
|
let currentContent;
|
|
@@ -144,8 +144,9 @@ async function activateProjectStateGuard(projectRoot, options = {}) {
|
|
|
144
144
|
|
|
145
145
|
export {
|
|
146
146
|
configHistoryDir,
|
|
147
|
+
configSlug,
|
|
147
148
|
backupConfigFile,
|
|
148
149
|
startProjectStateGuard,
|
|
149
150
|
activateProjectStateGuard
|
|
150
151
|
};
|
|
151
|
-
//# sourceMappingURL=chunk-
|
|
152
|
+
//# sourceMappingURL=chunk-ZT7JNIGX.js.map
|
|
@@ -104,8 +104,16 @@ export declare class AgentMonitorService {
|
|
|
104
104
|
*
|
|
105
105
|
* Entries already in the ring win: a live subagent's in-memory segment is
|
|
106
106
|
* newer than its JSONL, which is only written when a segment closes.
|
|
107
|
+
*
|
|
108
|
+
* `only` restricts BOTH the disk scan and the returned set to a known list of
|
|
109
|
+
* subagent ids. This is how a session gets ITS OWN subagents back: the
|
|
110
|
+
* transcripts directory is shared by every session of the project, so the
|
|
111
|
+
* unfiltered form hands each of four open tabs the union of all four tabs'
|
|
112
|
+
* workers. The caller derives the list from the session's own journal
|
|
113
|
+
* (`deriveSessionAgents`), which is the only record that says which agents
|
|
114
|
+
* belong to which session.
|
|
107
115
|
*/
|
|
108
|
-
loadSessionsFromDisk(): Promise<AgentVirtualSession[]>;
|
|
116
|
+
loadSessionsFromDisk(only?: readonly string[]): Promise<AgentVirtualSession[]>;
|
|
109
117
|
private _readTranscriptFile;
|
|
110
118
|
/** Get a specific agent's virtual session, or undefined. */
|
|
111
119
|
getSession(subagentId: string): AgentVirtualSession | undefined;
|
|
@@ -36,7 +36,7 @@ export interface AgentFactoryResult {
|
|
|
36
36
|
* thrown here are swallowed so a flaky cleanup can't mask the task's
|
|
37
37
|
* real result.
|
|
38
38
|
*/
|
|
39
|
-
dispose?: ((
|
|
39
|
+
dispose?: (() => Promise<void> | void) | undefined;
|
|
40
40
|
}
|
|
41
41
|
export interface AgentRunnerOptions {
|
|
42
42
|
factory: AgentFactory;
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Number of live prompt-cache entries.
|
|
3
|
+
*
|
|
4
|
+
* Exposed so the "one entry per role, regardless of how many times the overlay
|
|
5
|
+
* is rewritten" bound above is testable. The old fingerprint-in-key scheme grew
|
|
6
|
+
* this without limit and nothing could observe it.
|
|
7
|
+
*/
|
|
8
|
+
export declare function agentPromptCacheSize(): number;
|
|
1
9
|
export declare function agentPrompt(id: string): string;
|
|
2
10
|
//# sourceMappingURL=agent-prompts.d.ts.map
|
|
@@ -23,13 +23,33 @@ import { WAVE3_AGENTS } from './phase8-wave3-products.js';
|
|
|
23
23
|
import { META_AGENTS } from './phase9-meta.js';
|
|
24
24
|
import { WAVE4_AGENTS } from './phase9-wave4-platform-meta.js';
|
|
25
25
|
import { ROLE_SKILL_SETS, SHADOW_AGENT_SKILLS } from './role-skills.js';
|
|
26
|
-
import type { AgentDefinition } from './types.js';
|
|
26
|
+
import type { AgentCapability, AgentDefinition } from './types.js';
|
|
27
27
|
export * from './capability-manifest.js';
|
|
28
28
|
export * from './phase3-wave1-platform.js';
|
|
29
29
|
export * from './phase3-wave2-meta.js';
|
|
30
30
|
export * from './phase8-wave3-products.js';
|
|
31
31
|
export * from './phase9-wave4-platform-meta.js';
|
|
32
|
+
export * from './project-agent-auto-optimize.js';
|
|
33
|
+
export * from './project-agent-capture-window.js';
|
|
34
|
+
export * from './project-agent-capture.js';
|
|
35
|
+
export * from './project-agent-config-io.js';
|
|
36
|
+
export * from './project-agent-config-validation.js';
|
|
37
|
+
export * from './project-agent-consolidation.js';
|
|
38
|
+
export * from './project-agent-directive-outcome.js';
|
|
39
|
+
export * from './project-agent-files.js';
|
|
40
|
+
export * from './project-agent-identity-types.js';
|
|
32
41
|
export * from './project-agent-identity.js';
|
|
42
|
+
export * from './project-agent-knowledge-manifests.js';
|
|
43
|
+
export * from './project-agent-learning-entries.js';
|
|
44
|
+
export * from './project-agent-learning-normalize.js';
|
|
45
|
+
export * from './project-agent-learning-policy.js';
|
|
46
|
+
export * from './project-agent-learning-structured.js';
|
|
47
|
+
export * from './project-agent-optimizer.js';
|
|
48
|
+
export * from './project-agent-paths.js';
|
|
49
|
+
export * from './project-agent-profile.js';
|
|
50
|
+
export * from './project-agent-quarantine.js';
|
|
51
|
+
export * from './project-agent-roster.js';
|
|
52
|
+
export * from './project-agent-skill-layer.js';
|
|
33
53
|
export * from './role-skills.js';
|
|
34
54
|
export * from './types.js';
|
|
35
55
|
export { BUILD_AGENTS, DELIVERY_AGENTS, DISCOVERY_AGENTS, DOMAIN_AGENTS, KNOWLEDGE_AGENTS, META_AGENTS, PLANNING_AGENTS, REVIEW_AGENTS, VERIFY_AGENTS, WAVE1_AGENTS, WAVE2_AGENTS, WAVE3_AGENTS, WAVE4_AGENTS, };
|
|
@@ -53,5 +73,17 @@ export declare const AGENTS_BY_PHASE: {
|
|
|
53
73
|
export declare const AGENT_CATALOG: Record<string, AgentDefinition>;
|
|
54
74
|
/** Role lookup helper. Returns undefined for unknown roles. */
|
|
55
75
|
export declare function getAgentDefinition(role: string): AgentDefinition | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Role → dispatcher rationale, for every role that declares one.
|
|
78
|
+
*
|
|
79
|
+
* Derived from the catalog rather than hand-listed. There used to be four
|
|
80
|
+
* hand-maintained `WAVE*_ROLE_METAS` maps beside the agent arrays; nothing
|
|
81
|
+
* read them, and `WAVE2_ROLE_METAS` had drifted to carry six roles that live
|
|
82
|
+
* in `WAVE4_AGENTS` — a duplicate set no consumer would ever have noticed
|
|
83
|
+
* because the map itself was dead. Deriving from `AGENT_CATALOG` makes that
|
|
84
|
+
* class of drift impossible: a role is listed here exactly when its own
|
|
85
|
+
* `capability.rationale` is set.
|
|
86
|
+
*/
|
|
87
|
+
export declare const ROLE_DISPATCH_RATIONALE: Record<string, NonNullable<AgentCapability['rationale']>>;
|
|
56
88
|
export { ROLE_SKILL_SETS, SHADOW_AGENT_SKILLS };
|
|
57
89
|
//# sourceMappingURL=index.d.ts.map
|