@wrongstack/core 0.313.1 → 0.316.1
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 +32 -4
- 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
|
@@ -1,23 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
shouldSkipSessionDirectoryEntry
|
|
3
|
+
} from "./chunk-JMULFFLN.js";
|
|
1
4
|
import {
|
|
2
5
|
SESSION_CATALOG_DEFAULT_LEASE_MS,
|
|
3
6
|
SESSION_CATALOG_DEFAULT_RESERVATION_MS,
|
|
4
7
|
SESSION_CATALOG_MAX_AGENTS
|
|
5
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-AYW5YINX.js";
|
|
9
|
+
import {
|
|
10
|
+
isSessionTranscriptFileName
|
|
11
|
+
} from "./chunk-5BMIE7QG.js";
|
|
6
12
|
import {
|
|
7
13
|
loadDatabaseSync
|
|
8
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-IRUTEHCE.js";
|
|
9
15
|
import {
|
|
10
16
|
DefaultSecretScrubber
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import {
|
|
13
|
-
isSessionTranscriptFileName
|
|
14
|
-
} from "./chunk-AD7ZFZCS.js";
|
|
17
|
+
} from "./chunk-QSTSJOCK.js";
|
|
15
18
|
import {
|
|
16
19
|
isPidAlive
|
|
17
20
|
} from "./chunk-TRT2HRWZ.js";
|
|
18
21
|
import {
|
|
19
22
|
atomicWrite
|
|
20
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-OSGLYW5J.js";
|
|
24
|
+
import {
|
|
25
|
+
totalUsageTokens
|
|
26
|
+
} from "./chunk-3ECENVHL.js";
|
|
27
|
+
|
|
28
|
+
// src/session-catalog/session-agents.ts
|
|
29
|
+
function deriveSessionAgents(events) {
|
|
30
|
+
const rows = /* @__PURE__ */ new Map();
|
|
31
|
+
const upsert = (agentId) => {
|
|
32
|
+
let row = rows.get(agentId);
|
|
33
|
+
if (!row) {
|
|
34
|
+
row = { agentId, status: "running", interleavedEventCount: 0 };
|
|
35
|
+
rows.set(agentId, row);
|
|
36
|
+
}
|
|
37
|
+
return row;
|
|
38
|
+
};
|
|
39
|
+
for (const event of events) {
|
|
40
|
+
if (event.agentId !== void 0 && event.agentId !== "") {
|
|
41
|
+
const isLifecycle = event.type === "agent_spawned" || event.type === "agent_session_linked" || event.type === "agent_stopped" || event.type === "agent_error";
|
|
42
|
+
const row = upsert(event.agentId);
|
|
43
|
+
if (!isLifecycle) row.interleavedEventCount += 1;
|
|
44
|
+
}
|
|
45
|
+
switch (event.type) {
|
|
46
|
+
case "agent_spawned": {
|
|
47
|
+
const row = upsert(event.agentId);
|
|
48
|
+
row.role = event.role;
|
|
49
|
+
row.spawnedAt ??= event.ts;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case "agent_session_linked": {
|
|
53
|
+
const row = upsert(event.agentId);
|
|
54
|
+
row.agentSessionId = event.agentSessionId;
|
|
55
|
+
if (event.transcriptPath !== void 0) row.transcriptPath = event.transcriptPath;
|
|
56
|
+
if (event.provider !== void 0) row.provider = event.provider;
|
|
57
|
+
if (event.model !== void 0) row.model = event.model;
|
|
58
|
+
if (event.parentAgentId !== void 0) row.parentAgentId = event.parentAgentId;
|
|
59
|
+
row.spawnedAt ??= event.ts;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case "agent_stopped": {
|
|
63
|
+
const row = upsert(event.agentId);
|
|
64
|
+
row.endedAt = event.ts;
|
|
65
|
+
if (row.status !== "failed") {
|
|
66
|
+
row.status = event.reason === "failed" || event.reason === "aborted" ? "failed" : "completed";
|
|
67
|
+
}
|
|
68
|
+
if (event.usage !== void 0) row.usage = event.usage;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case "agent_error": {
|
|
72
|
+
const row = upsert(event.agentId);
|
|
73
|
+
row.status = "failed";
|
|
74
|
+
row.error = event.error;
|
|
75
|
+
row.endedAt ??= event.ts;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
default:
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return [...rows.values()];
|
|
83
|
+
}
|
|
21
84
|
|
|
22
85
|
// src/session-catalog/store.ts
|
|
23
86
|
import { randomBytes, randomUUID } from "node:crypto";
|
|
@@ -122,6 +185,30 @@ function initializeCatalogSchema(db) {
|
|
|
122
185
|
acquired_at INTEGER NOT NULL,
|
|
123
186
|
expires_at INTEGER NOT NULL
|
|
124
187
|
);
|
|
188
|
+
CREATE TABLE IF NOT EXISTS session_agents (
|
|
189
|
+
session_id TEXT NOT NULL,
|
|
190
|
+
agent_id TEXT NOT NULL,
|
|
191
|
+
role TEXT,
|
|
192
|
+
provider TEXT,
|
|
193
|
+
model TEXT,
|
|
194
|
+
agent_session_id TEXT,
|
|
195
|
+
transcript_path TEXT,
|
|
196
|
+
parent_agent_id TEXT,
|
|
197
|
+
spawned_at TEXT,
|
|
198
|
+
ended_at TEXT,
|
|
199
|
+
status TEXT NOT NULL,
|
|
200
|
+
error TEXT,
|
|
201
|
+
interleaved_event_count INTEGER NOT NULL DEFAULT 0,
|
|
202
|
+
usage_json TEXT,
|
|
203
|
+
ordinal INTEGER NOT NULL DEFAULT 0,
|
|
204
|
+
PRIMARY KEY (session_id, agent_id)
|
|
205
|
+
);
|
|
206
|
+
CREATE TABLE IF NOT EXISTS session_agent_index (
|
|
207
|
+
session_id TEXT PRIMARY KEY,
|
|
208
|
+
transcript_size INTEGER NOT NULL,
|
|
209
|
+
transcript_mtime_ms REAL NOT NULL,
|
|
210
|
+
derived_at TEXT NOT NULL
|
|
211
|
+
);
|
|
125
212
|
CREATE INDEX IF NOT EXISTS idx_sessions_activity ON sessions(indexed_at DESC);
|
|
126
213
|
CREATE INDEX IF NOT EXISTS idx_leases_expiry ON session_leases(lease_expires_at);
|
|
127
214
|
CREATE INDEX IF NOT EXISTS idx_reservations_expiry ON resume_reservations(expires_at);
|
|
@@ -140,7 +227,9 @@ function walkSessionFiles(root, suffix) {
|
|
|
140
227
|
const visit = (dir) => {
|
|
141
228
|
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
142
229
|
if (entry.isDirectory()) {
|
|
143
|
-
if (entry.name
|
|
230
|
+
if (entry.name === "_cas" || entry.name === "_trash") continue;
|
|
231
|
+
if (shouldSkipSessionDirectoryEntry(entry.name)) continue;
|
|
232
|
+
visit(path.join(dir, entry.name));
|
|
144
233
|
} else if (entry.isFile() && entry.name.endsWith(suffix))
|
|
145
234
|
result.push(path.join(dir, entry.name));
|
|
146
235
|
}
|
|
@@ -158,6 +247,8 @@ function summarizeTranscriptFile(transcriptFilePath, id) {
|
|
|
158
247
|
let toolCallCount = 0;
|
|
159
248
|
let compactionCount = 0;
|
|
160
249
|
let tokenTotal = 0;
|
|
250
|
+
let routedModel;
|
|
251
|
+
let routedProvider;
|
|
161
252
|
for (const line of lines) {
|
|
162
253
|
if (!line) continue;
|
|
163
254
|
let event;
|
|
@@ -173,7 +264,9 @@ function summarizeTranscriptFile(transcriptFilePath, id) {
|
|
|
173
264
|
messageCount++;
|
|
174
265
|
if (event.type === "llm_response") {
|
|
175
266
|
iterationCount++;
|
|
176
|
-
tokenTotal +=
|
|
267
|
+
tokenTotal += totalUsageTokens(event.usage);
|
|
268
|
+
if (event.model) routedModel = event.model;
|
|
269
|
+
if (event.provider) routedProvider = event.provider;
|
|
177
270
|
}
|
|
178
271
|
if (event.type === "tool_call_end") toolCallCount++;
|
|
179
272
|
if (event.type === "compaction") compactionCount++;
|
|
@@ -184,8 +277,8 @@ function summarizeTranscriptFile(transcriptFilePath, id) {
|
|
|
184
277
|
title: id,
|
|
185
278
|
startedAt: start.ts,
|
|
186
279
|
...endedAt ? { endedAt } : {},
|
|
187
|
-
model: start.model,
|
|
188
|
-
provider: start.provider,
|
|
280
|
+
model: routedModel ?? start.model,
|
|
281
|
+
provider: routedProvider ?? start.provider,
|
|
189
282
|
tokenTotal,
|
|
190
283
|
...lastActivityAt ? { lastActivityAt } : {},
|
|
191
284
|
messageCount,
|
|
@@ -478,6 +571,30 @@ var SessionCatalogStore = class {
|
|
|
478
571
|
return credential;
|
|
479
572
|
});
|
|
480
573
|
}
|
|
574
|
+
/**
|
|
575
|
+
* Extend a live reservation the requester still owns.
|
|
576
|
+
*
|
|
577
|
+
* Deliberately does NOT call `reapExpired()` first: reaping would delete an
|
|
578
|
+
* already-expired row and turn the accurate "expired" answer into the
|
|
579
|
+
* indistinguishable "not owned by this requester". The caller needs to know
|
|
580
|
+
* which of the two happened.
|
|
581
|
+
*/
|
|
582
|
+
renewReservation(reservationId, requesterInstanceId, reservationMs) {
|
|
583
|
+
return this.transaction(() => {
|
|
584
|
+
const row = this.db.prepare("SELECT * FROM resume_reservations WHERE reservation_id=?").get(reservationId);
|
|
585
|
+
if (!row || row.requester_instance_id !== requesterInstanceId)
|
|
586
|
+
throw conflict("Resume reservation is not owned by this requester");
|
|
587
|
+
if (row.expires_at <= Date.now()) throw conflict("Resume reservation expired");
|
|
588
|
+
const expiresAt = Date.now() + boundedMs(reservationMs, SESSION_CATALOG_DEFAULT_RESERVATION_MS, MAX_RESERVATION_MS);
|
|
589
|
+
this.db.prepare("UPDATE resume_reservations SET expires_at=? WHERE reservation_id=?").run(expiresAt, reservationId);
|
|
590
|
+
return {
|
|
591
|
+
reservationId,
|
|
592
|
+
targetSessionId: row.target_session_id,
|
|
593
|
+
requesterInstanceId,
|
|
594
|
+
expiresAt
|
|
595
|
+
};
|
|
596
|
+
});
|
|
597
|
+
}
|
|
481
598
|
cancelReservation(reservationId, requesterInstanceId) {
|
|
482
599
|
this.db.prepare("DELETE FROM resume_reservations WHERE reservation_id=? AND requester_instance_id=?").run(reservationId, requesterInstanceId);
|
|
483
600
|
}
|
|
@@ -677,6 +794,105 @@ var SessionCatalogStore = class {
|
|
|
677
794
|
const row = this.db.prepare("SELECT * FROM sessions WHERE session_id=?").get(sessionId);
|
|
678
795
|
return row ? this.catalogRecord(row) : null;
|
|
679
796
|
}
|
|
797
|
+
/**
|
|
798
|
+
* The agent roster of one session, derived from its journal.
|
|
799
|
+
*
|
|
800
|
+
* Cached in `session_agents`, keyed to the transcript's size and mtime: the
|
|
801
|
+
* journal is the authority, so the cache is a memo of a pure function over
|
|
802
|
+
* it rather than a second place agents get recorded. When the file has grown
|
|
803
|
+
* (the usual case — a live session) the rows are re-derived from scratch, so
|
|
804
|
+
* a partial read can never leave a half-updated roster behind.
|
|
805
|
+
*
|
|
806
|
+
* Returns `[]` for a session with no transcript on disk. A caller cannot
|
|
807
|
+
* distinguish that from "a real session that spawned nothing", and should
|
|
808
|
+
* not need to: both mean there is no agent to show.
|
|
809
|
+
*/
|
|
810
|
+
listSessionAgents(sessionId) {
|
|
811
|
+
assertId(sessionId);
|
|
812
|
+
const summary = this.getSummary(sessionId);
|
|
813
|
+
if (!summary) return [];
|
|
814
|
+
const file = path2.join(this.sessionsDir, summary.transcriptRelativePath);
|
|
815
|
+
let stat;
|
|
816
|
+
try {
|
|
817
|
+
stat = fs2.statSync(file);
|
|
818
|
+
} catch {
|
|
819
|
+
return [];
|
|
820
|
+
}
|
|
821
|
+
const cached = this.db.prepare(
|
|
822
|
+
"SELECT transcript_size, transcript_mtime_ms FROM session_agent_index WHERE session_id=?"
|
|
823
|
+
).get(sessionId);
|
|
824
|
+
if (cached && Number(cached.transcript_size) === stat.size && Number(cached.transcript_mtime_ms) === stat.mtimeMs) {
|
|
825
|
+
return this.readSessionAgentRows(sessionId);
|
|
826
|
+
}
|
|
827
|
+
let raw;
|
|
828
|
+
try {
|
|
829
|
+
raw = fs2.readFileSync(file, "utf8");
|
|
830
|
+
} catch {
|
|
831
|
+
return [];
|
|
832
|
+
}
|
|
833
|
+
const events = [];
|
|
834
|
+
for (const line of raw.split("\n")) {
|
|
835
|
+
const trimmed = line.trim();
|
|
836
|
+
if (!trimmed) continue;
|
|
837
|
+
try {
|
|
838
|
+
events.push(JSON.parse(trimmed));
|
|
839
|
+
} catch {
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
const derived = deriveSessionAgents(events);
|
|
843
|
+
this.writeSessionAgentRows(sessionId, derived, stat.size, stat.mtimeMs);
|
|
844
|
+
return derived;
|
|
845
|
+
}
|
|
846
|
+
readSessionAgentRows(sessionId) {
|
|
847
|
+
const rows = this.db.prepare("SELECT * FROM session_agents WHERE session_id=? ORDER BY ordinal ASC").all(sessionId);
|
|
848
|
+
return rows.map((row) => ({
|
|
849
|
+
agentId: row.agent_id,
|
|
850
|
+
...row.role !== null ? { role: row.role } : {},
|
|
851
|
+
...row.provider !== null ? { provider: row.provider } : {},
|
|
852
|
+
...row.model !== null ? { model: row.model } : {},
|
|
853
|
+
...row.agent_session_id !== null ? { agentSessionId: row.agent_session_id } : {},
|
|
854
|
+
...row.transcript_path !== null ? { transcriptPath: row.transcript_path } : {},
|
|
855
|
+
...row.parent_agent_id !== null ? { parentAgentId: row.parent_agent_id } : {},
|
|
856
|
+
...row.spawned_at !== null ? { spawnedAt: row.spawned_at } : {},
|
|
857
|
+
...row.ended_at !== null ? { endedAt: row.ended_at } : {},
|
|
858
|
+
status: row.status,
|
|
859
|
+
...row.error !== null ? { error: row.error } : {},
|
|
860
|
+
interleavedEventCount: Number(row.interleaved_event_count),
|
|
861
|
+
...row.usage_json !== null ? { usage: parseJson(row.usage_json) } : {}
|
|
862
|
+
}));
|
|
863
|
+
}
|
|
864
|
+
writeSessionAgentRows(sessionId, records, size, mtimeMs) {
|
|
865
|
+
this.transaction(() => {
|
|
866
|
+
this.db.prepare("DELETE FROM session_agents WHERE session_id=?").run(sessionId);
|
|
867
|
+
const insert = this.db.prepare(
|
|
868
|
+
`INSERT INTO session_agents(session_id,agent_id,role,provider,model,agent_session_id,transcript_path,parent_agent_id,spawned_at,ended_at,status,error,interleaved_event_count,usage_json,ordinal)
|
|
869
|
+
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
|
|
870
|
+
);
|
|
871
|
+
records.forEach((record, ordinal) => {
|
|
872
|
+
insert.run(
|
|
873
|
+
sessionId,
|
|
874
|
+
record.agentId,
|
|
875
|
+
record.role ?? null,
|
|
876
|
+
record.provider ?? null,
|
|
877
|
+
record.model ?? null,
|
|
878
|
+
record.agentSessionId ?? null,
|
|
879
|
+
record.transcriptPath ?? null,
|
|
880
|
+
record.parentAgentId ?? null,
|
|
881
|
+
record.spawnedAt ?? null,
|
|
882
|
+
record.endedAt ?? null,
|
|
883
|
+
record.status,
|
|
884
|
+
record.error ?? null,
|
|
885
|
+
record.interleavedEventCount,
|
|
886
|
+
record.usage ? JSON.stringify(record.usage) : null,
|
|
887
|
+
ordinal
|
|
888
|
+
);
|
|
889
|
+
});
|
|
890
|
+
this.db.prepare(
|
|
891
|
+
`INSERT INTO session_agent_index(session_id,transcript_size,transcript_mtime_ms,derived_at)
|
|
892
|
+
VALUES (?,?,?,?) ON CONFLICT(session_id) DO UPDATE SET transcript_size=excluded.transcript_size,transcript_mtime_ms=excluded.transcript_mtime_ms,derived_at=excluded.derived_at`
|
|
893
|
+
).run(sessionId, size, mtimeMs, (/* @__PURE__ */ new Date()).toISOString());
|
|
894
|
+
});
|
|
895
|
+
}
|
|
680
896
|
resolveId(query) {
|
|
681
897
|
const normalized = query.trim();
|
|
682
898
|
if (!normalized) throw new Error("Session not found: (empty query)");
|
|
@@ -851,6 +1067,7 @@ var SessionCatalogStore = class {
|
|
|
851
1067
|
};
|
|
852
1068
|
|
|
853
1069
|
export {
|
|
1070
|
+
deriveSessionAgents,
|
|
854
1071
|
SessionCatalogStore
|
|
855
1072
|
};
|
|
856
|
-
//# sourceMappingURL=chunk-
|
|
1073
|
+
//# sourceMappingURL=chunk-27QIURLN.js.map
|