@agents-ensemble/core 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acp/testing/fake-acp-server.d.ts +2 -0
- package/dist/acp/testing/fake-acp-server.d.ts.map +1 -1
- package/dist/acp/testing/fake-acp-server.js +3 -0
- package/dist/acp/testing/fake-acp-server.js.map +1 -1
- package/dist/conductor/conductor-agent-factory.d.ts +5 -0
- package/dist/conductor/conductor-agent-factory.d.ts.map +1 -0
- package/dist/conductor/conductor-agent-factory.js +10 -0
- package/dist/conductor/conductor-agent-factory.js.map +1 -0
- package/dist/conductor/conductor-agent.d.ts +7 -0
- package/dist/conductor/conductor-agent.d.ts.map +1 -1
- package/dist/conductor/conductor-session-driver.d.ts.map +1 -1
- package/dist/conductor/conductor-session-driver.js +2 -1
- package/dist/conductor/conductor-session-driver.js.map +1 -1
- package/dist/conductor/conductor-session.d.ts +1 -2
- package/dist/conductor/conductor-session.d.ts.map +1 -1
- package/dist/conductor/conductor-session.js +216 -31
- package/dist/conductor/conductor-session.js.map +1 -1
- package/dist/conductor/index.d.ts +3 -2
- package/dist/conductor/index.d.ts.map +1 -1
- package/dist/conductor/index.js +2 -1
- package/dist/conductor/index.js.map +1 -1
- package/dist/conductor/operator-command.d.ts +5 -0
- package/dist/conductor/operator-command.d.ts.map +1 -1
- package/dist/conductor/operator-command.js +6 -0
- package/dist/conductor/operator-command.js.map +1 -1
- package/dist/conductor/pi-conductor-agent.d.ts +2 -5
- package/dist/conductor/pi-conductor-agent.d.ts.map +1 -1
- package/dist/conductor/pi-conductor-agent.js +16 -19
- package/dist/conductor/pi-conductor-agent.js.map +1 -1
- package/dist/conductor/pi-resource-loader.d.ts +2 -0
- package/dist/conductor/pi-resource-loader.d.ts.map +1 -1
- package/dist/conductor/pi-resource-loader.js +16 -8
- package/dist/conductor/pi-resource-loader.js.map +1 -1
- package/dist/conductor/session/dispatch-hold.d.ts +1 -1
- package/dist/conductor/session/dispatch-hold.d.ts.map +1 -1
- package/dist/conductor/session/dispatch-hold.js +4 -3
- package/dist/conductor/session/dispatch-hold.js.map +1 -1
- package/dist/conductor/session/dispatch-mode.d.ts +1 -1
- package/dist/conductor/session/events/index.d.ts +2 -1
- package/dist/conductor/session/events/index.d.ts.map +1 -1
- package/dist/conductor/session/events/index.js.map +1 -1
- package/dist/conductor/session/events/session-event.d.ts +7 -1
- package/dist/conductor/session/events/session-event.d.ts.map +1 -1
- package/dist/conductor/session/events/session-log-event-groups.d.ts +1 -1
- package/dist/conductor/session/events/session-log-event-groups.d.ts.map +1 -1
- package/dist/conductor/session/events/session-log-event-groups.js +1 -0
- package/dist/conductor/session/events/session-log-event-groups.js.map +1 -1
- package/dist/conductor/session/events/shared/permission-pending.d.ts +5 -0
- package/dist/conductor/session/events/shared/permission-pending.d.ts.map +1 -1
- package/dist/conductor/session/format-session-event.d.ts.map +1 -1
- package/dist/conductor/session/format-session-event.js +32 -2
- package/dist/conductor/session/format-session-event.js.map +1 -1
- package/dist/conductor/session/select-dispatch-batch.d.ts.map +1 -1
- package/dist/conductor/session/select-dispatch-batch.js +21 -4
- package/dist/conductor/session/select-dispatch-batch.js.map +1 -1
- package/dist/conductor/session/session-event.d.ts +1 -1
- package/dist/conductor/session/session-event.d.ts.map +1 -1
- package/dist/dispatch/get-tool-call-tool.d.ts +8 -0
- package/dist/dispatch/get-tool-call-tool.d.ts.map +1 -0
- package/dist/dispatch/get-tool-call-tool.js +46 -0
- package/dist/dispatch/get-tool-call-tool.js.map +1 -0
- package/dist/dispatch/index.d.ts +3 -0
- package/dist/dispatch/index.d.ts.map +1 -1
- package/dist/dispatch/index.js +2 -0
- package/dist/dispatch/index.js.map +1 -1
- package/dist/dispatch/report-session-state-tool.d.ts +4 -0
- package/dist/dispatch/report-session-state-tool.d.ts.map +1 -0
- package/dist/dispatch/report-session-state-tool.js +38 -0
- package/dist/dispatch/report-session-state-tool.js.map +1 -0
- package/dist/dispatch/session-usage-tool.js +1 -1
- package/dist/dispatch/session-usage-tool.js.map +1 -1
- package/dist/escalation/ask-human-tool.d.ts +0 -2
- package/dist/escalation/ask-human-tool.d.ts.map +1 -1
- package/dist/escalation/ask-human-tool.js +1 -7
- package/dist/escalation/ask-human-tool.js.map +1 -1
- package/dist/github/github-monitor.d.ts +1 -1
- package/dist/github/github-monitor.d.ts.map +1 -1
- package/dist/github/github-monitor.js +1 -1
- package/dist/github/github-monitor.js.map +1 -1
- package/dist/operator-runtime.d.ts +20 -0
- package/dist/operator-runtime.d.ts.map +1 -0
- package/dist/operator-runtime.js +14 -0
- package/dist/operator-runtime.js.map +1 -0
- package/dist/permission/index.d.ts +2 -0
- package/dist/permission/index.d.ts.map +1 -1
- package/dist/permission/index.js +1 -0
- package/dist/permission/index.js.map +1 -1
- package/dist/permission/permission-brief.d.ts +22 -0
- package/dist/permission/permission-brief.d.ts.map +1 -0
- package/dist/permission/permission-brief.js +245 -0
- package/dist/permission/permission-brief.js.map +1 -0
- package/dist/prompt/index.d.ts +1 -0
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +1 -0
- package/dist/prompt/index.js.map +1 -1
- package/dist/prompt/modules/ensemble/conductor-base-module.d.ts.map +1 -1
- package/dist/prompt/modules/ensemble/conductor-base-module.js +11 -1
- package/dist/prompt/modules/ensemble/conductor-base-module.js.map +1 -1
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/tool-call-snapshot-registry.d.ts +69 -0
- package/dist/runtime/tool-call-snapshot-registry.d.ts.map +1 -0
- package/dist/runtime/tool-call-snapshot-registry.js +275 -0
- package/dist/runtime/tool-call-snapshot-registry.js.map +1 -0
- package/dist/runtime/types.d.ts +2 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/worker-runtime.d.ts.map +1 -1
- package/dist/runtime/worker-runtime.js +6 -2
- package/dist/runtime/worker-runtime.js.map +1 -1
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +1 -0
- package/dist/session/index.js.map +1 -1
- package/dist/session/open-questions-store.d.ts +12 -0
- package/dist/session/open-questions-store.d.ts.map +1 -0
- package/dist/session/open-questions-store.js +161 -0
- package/dist/session/open-questions-store.js.map +1 -0
- package/dist/session/tool-call-snapshot-history.d.ts +32 -0
- package/dist/session/tool-call-snapshot-history.d.ts.map +1 -0
- package/dist/session/tool-call-snapshot-history.js +203 -0
- package/dist/session/tool-call-snapshot-history.js.map +1 -0
- package/dist/usage/enrich-session-usage-cost.d.ts +4 -1
- package/dist/usage/enrich-session-usage-cost.d.ts.map +1 -1
- package/dist/usage/enrich-session-usage-cost.js +8 -2
- package/dist/usage/enrich-session-usage-cost.js.map +1 -1
- package/dist/usage/index.d.ts +1 -1
- package/dist/usage/index.d.ts.map +1 -1
- package/dist/usage/session-usage-tracker.d.ts +7 -1
- package/dist/usage/session-usage-tracker.d.ts.map +1 -1
- package/dist/usage/session-usage-tracker.js +51 -0
- package/dist/usage/session-usage-tracker.js.map +1 -1
- package/dist/usage/types.d.ts +30 -2
- package/dist/usage/types.d.ts.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
export const OPEN_QUESTIONS_STORE_VERSION = 1;
|
|
5
|
+
export function openQuestionsStorePath(input) {
|
|
6
|
+
return join(input.repoRoot, '.ensemble', 'sessions', input.conductorAgentId, 'open-questions.yaml');
|
|
7
|
+
}
|
|
8
|
+
export async function loadOpenQuestionsStore(path) {
|
|
9
|
+
let raw;
|
|
10
|
+
try {
|
|
11
|
+
raw = await readFile(path, 'utf8');
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (isEnoent(error))
|
|
15
|
+
return undefined;
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
return parseOpenQuestionsStore(yaml.load(raw));
|
|
19
|
+
}
|
|
20
|
+
export async function saveOpenQuestionsStore(path, snapshot) {
|
|
21
|
+
const document = parseOpenQuestionsStore({
|
|
22
|
+
version: OPEN_QUESTIONS_STORE_VERSION,
|
|
23
|
+
...snapshot,
|
|
24
|
+
});
|
|
25
|
+
await mkdir(dirname(path), { recursive: true });
|
|
26
|
+
const tempPath = `${path}.tmp`;
|
|
27
|
+
await writeFile(tempPath, `${yaml.dump({
|
|
28
|
+
version: OPEN_QUESTIONS_STORE_VERSION,
|
|
29
|
+
...document,
|
|
30
|
+
}, { lineWidth: 120 })}\n`, 'utf8');
|
|
31
|
+
await rename(tempPath, path);
|
|
32
|
+
}
|
|
33
|
+
function parseOpenQuestionsStore(value) {
|
|
34
|
+
const record = asRecord(value, 'document');
|
|
35
|
+
if (record.version !== OPEN_QUESTIONS_STORE_VERSION) {
|
|
36
|
+
throw new Error(`Unsupported open questions YAML version: ${String(record.version)}`);
|
|
37
|
+
}
|
|
38
|
+
if (!Number.isSafeInteger(record.sequence) ||
|
|
39
|
+
record.sequence < 0) {
|
|
40
|
+
throw new Error('Invalid open questions YAML: sequence');
|
|
41
|
+
}
|
|
42
|
+
if (!Array.isArray(record.openQuestions)) {
|
|
43
|
+
throw new Error('Invalid open questions YAML: openQuestions');
|
|
44
|
+
}
|
|
45
|
+
const questionIds = new Set();
|
|
46
|
+
let highestQuestionSequence = 0;
|
|
47
|
+
for (const [index, question] of record.openQuestions.entries()) {
|
|
48
|
+
const { id, sequence: idSequence } = validateOpenQuestion(question, index);
|
|
49
|
+
if (questionIds.has(id)) {
|
|
50
|
+
throw new Error(`Invalid open questions YAML: duplicate id ${id}`);
|
|
51
|
+
}
|
|
52
|
+
questionIds.add(id);
|
|
53
|
+
if (idSequence !== undefined &&
|
|
54
|
+
idSequence > highestQuestionSequence) {
|
|
55
|
+
highestQuestionSequence = idSequence;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (highestQuestionSequence > record.sequence) {
|
|
59
|
+
throw new Error(`Invalid open questions YAML: sequence is behind question id inq-${highestQuestionSequence}`);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
sequence: record.sequence,
|
|
63
|
+
openQuestions: record.openQuestions,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function validateOpenQuestion(value, index) {
|
|
67
|
+
const field = `openQuestions[${index}]`;
|
|
68
|
+
const question = asRecord(value, field);
|
|
69
|
+
requireString(question.id, `${field}.id`);
|
|
70
|
+
const id = question.id;
|
|
71
|
+
const idMatch = /^inq-([1-9]\d*)$/.exec(id);
|
|
72
|
+
const idSequence = idMatch ? Number(idMatch[1]) : undefined;
|
|
73
|
+
if (idSequence !== undefined && !Number.isSafeInteger(idSequence)) {
|
|
74
|
+
throw new Error(`Invalid open questions YAML: ${field}.id`);
|
|
75
|
+
}
|
|
76
|
+
requireString(question.question, `${field}.question`);
|
|
77
|
+
requireString(question.responseType, `${field}.responseType`);
|
|
78
|
+
if (question.responseType !== 'yes_no' &&
|
|
79
|
+
question.responseType !== 'text' &&
|
|
80
|
+
question.responseType !== 'choice') {
|
|
81
|
+
throw new Error(`Invalid open questions YAML: ${field}.responseType`);
|
|
82
|
+
}
|
|
83
|
+
if (question.status !== 'open' && question.status !== 'answered') {
|
|
84
|
+
throw new Error(`Invalid open questions YAML: ${field}.status`);
|
|
85
|
+
}
|
|
86
|
+
if (question.source !== 'conductor' &&
|
|
87
|
+
question.source !== 'max_turns') {
|
|
88
|
+
throw new Error(`Invalid open questions YAML: ${field}.source`);
|
|
89
|
+
}
|
|
90
|
+
if (typeof question.askedAt !== 'number' ||
|
|
91
|
+
!Number.isFinite(question.askedAt)) {
|
|
92
|
+
throw new Error(`Invalid open questions YAML: ${field}.askedAt`);
|
|
93
|
+
}
|
|
94
|
+
for (const key of [
|
|
95
|
+
'context',
|
|
96
|
+
'answer',
|
|
97
|
+
'selectedChoice',
|
|
98
|
+
'sourceMessage',
|
|
99
|
+
'rationale',
|
|
100
|
+
'relatedPermissionId',
|
|
101
|
+
]) {
|
|
102
|
+
requireOptionalString(question[key], `${field}.${key}`);
|
|
103
|
+
}
|
|
104
|
+
if (question.assent !== undefined &&
|
|
105
|
+
question.assent !== 'yes' &&
|
|
106
|
+
question.assent !== 'no' &&
|
|
107
|
+
question.assent !== 'unclear') {
|
|
108
|
+
throw new Error(`Invalid open questions YAML: ${field}.assent`);
|
|
109
|
+
}
|
|
110
|
+
if (question.approved !== undefined &&
|
|
111
|
+
typeof question.approved !== 'boolean') {
|
|
112
|
+
throw new Error(`Invalid open questions YAML: ${field}.approved`);
|
|
113
|
+
}
|
|
114
|
+
if (question.answeredAt !== undefined &&
|
|
115
|
+
(typeof question.answeredAt !== 'number' ||
|
|
116
|
+
!Number.isFinite(question.answeredAt))) {
|
|
117
|
+
throw new Error(`Invalid open questions YAML: ${field}.answeredAt`);
|
|
118
|
+
}
|
|
119
|
+
if (question.answeredBy !== undefined &&
|
|
120
|
+
question.answeredBy !== 'operator' &&
|
|
121
|
+
question.answeredBy !== 'conductor') {
|
|
122
|
+
throw new Error(`Invalid open questions YAML: ${field}.answeredBy`);
|
|
123
|
+
}
|
|
124
|
+
if (question.choices !== undefined) {
|
|
125
|
+
if (!Array.isArray(question.choices)) {
|
|
126
|
+
throw new Error(`Invalid open questions YAML: ${field}.choices`);
|
|
127
|
+
}
|
|
128
|
+
for (const [choiceIndex, choice] of question.choices.entries()) {
|
|
129
|
+
const choiceRecord = asRecord(choice, `${field}.choices[${choiceIndex}]`);
|
|
130
|
+
requireString(choiceRecord.id, `${field}.choices[${choiceIndex}].id`);
|
|
131
|
+
requireString(choiceRecord.label, `${field}.choices[${choiceIndex}].label`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
id,
|
|
136
|
+
...(idSequence !== undefined ? { sequence: idSequence } : {}),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function asRecord(value, field) {
|
|
140
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
141
|
+
throw new Error(`Invalid open questions YAML: ${field}`);
|
|
142
|
+
}
|
|
143
|
+
return value;
|
|
144
|
+
}
|
|
145
|
+
function requireString(value, field) {
|
|
146
|
+
if (typeof value !== 'string') {
|
|
147
|
+
throw new Error(`Invalid open questions YAML: ${field}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function requireOptionalString(value, field) {
|
|
151
|
+
if (value !== undefined && typeof value !== 'string') {
|
|
152
|
+
throw new Error(`Invalid open questions YAML: ${field}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function isEnoent(error) {
|
|
156
|
+
return (typeof error === 'object' &&
|
|
157
|
+
error !== null &&
|
|
158
|
+
'code' in error &&
|
|
159
|
+
error.code === 'ENOENT');
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=open-questions-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-questions-store.js","sourceRoot":"","sources":["../../src/session/open-questions-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type StoredToolCallSnapshot } from '../runtime/tool-call-snapshot-registry.js';
|
|
2
|
+
export interface LoadToolCallSnapshotHistoryResult {
|
|
3
|
+
entries: StoredToolCallSnapshot[];
|
|
4
|
+
/** The loaded data was partially invalid or pruned and should be rewritten. */
|
|
5
|
+
needsRewrite: boolean;
|
|
6
|
+
warning?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PruneToolCallSnapshotHistoryResult {
|
|
9
|
+
removedCount: number;
|
|
10
|
+
failedCount: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function toolCallSnapshotHistoryPath(input: {
|
|
13
|
+
repoRoot: string;
|
|
14
|
+
conductorAgentId: string;
|
|
15
|
+
}): string;
|
|
16
|
+
/**
|
|
17
|
+
* Read the optional history independently from the required resume sidecar.
|
|
18
|
+
* Invalid history is discarded locally so it cannot prevent session resume.
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadToolCallSnapshotHistory(input: {
|
|
21
|
+
repoRoot: string;
|
|
22
|
+
conductorAgentId: string;
|
|
23
|
+
now?: number;
|
|
24
|
+
}): Promise<LoadToolCallSnapshotHistoryResult>;
|
|
25
|
+
/** Save atomically; an empty history removes the optional file. */
|
|
26
|
+
export declare function saveToolCallSnapshotHistory(path: string, snapshots: readonly StoredToolCallSnapshot[]): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Remove inactive history files after their retention window. Active files
|
|
29
|
+
* prune individual expired snapshots in the registry as new updates arrive.
|
|
30
|
+
*/
|
|
31
|
+
export declare function pruneExpiredToolCallSnapshotHistoryFiles(repoRoot: string, now?: number): Promise<PruneToolCallSnapshotHistoryResult>;
|
|
32
|
+
//# sourceMappingURL=tool-call-snapshot-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-snapshot-history.d.ts","sourceRoot":"","sources":["../../src/session/tool-call-snapshot-history.ts"],"names":[],"mappings":"AAUA,OAAO,EAKL,KAAK,sBAAsB,EAC5B,MAAM,2CAA2C,CAAC;AAMnD,MAAM,WAAW,iCAAiC;IAChD,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,+EAA+E;IAC/E,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kCAAkC;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,GAAG,MAAM,CAKT;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAoG7C;AAED,mEAAmE;AACnE,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,sBAAsB,EAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;;GAGG;AACH,wBAAsB,wCAAwC,CAC5D,QAAQ,EAAE,MAAM,EAChB,GAAG,SAAa,GACf,OAAO,CAAC,kCAAkC,CAAC,CA+B7C"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { mkdir, readdir, readFile, rename, rm, stat, writeFile, } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { encodedHistorySize, TOOL_CALL_SNAPSHOT_HISTORY_MAX_BYTES, TOOL_CALL_SNAPSHOT_HISTORY_MAX_ENTRIES, TOOL_CALL_SNAPSHOT_HISTORY_TTL_MS, } from '../runtime/tool-call-snapshot-registry.js';
|
|
4
|
+
import { sessionSidecarDir } from './session-sidecar.js';
|
|
5
|
+
const TOOL_CALL_SNAPSHOT_HISTORY_VERSION = 1;
|
|
6
|
+
const TOOL_CALL_SNAPSHOT_HISTORY_SUFFIX = '.tool-calls';
|
|
7
|
+
export function toolCallSnapshotHistoryPath(input) {
|
|
8
|
+
return join(sessionSidecarDir(input.repoRoot), `${input.conductorAgentId}${TOOL_CALL_SNAPSHOT_HISTORY_SUFFIX}`);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Read the optional history independently from the required resume sidecar.
|
|
12
|
+
* Invalid history is discarded locally so it cannot prevent session resume.
|
|
13
|
+
*/
|
|
14
|
+
export async function loadToolCallSnapshotHistory(input) {
|
|
15
|
+
const path = toolCallSnapshotHistoryPath(input);
|
|
16
|
+
let raw;
|
|
17
|
+
try {
|
|
18
|
+
const fileInfo = await stat(path);
|
|
19
|
+
if (fileInfo.size > TOOL_CALL_SNAPSHOT_HISTORY_MAX_BYTES) {
|
|
20
|
+
await removeHistoryFile(path);
|
|
21
|
+
return {
|
|
22
|
+
entries: [],
|
|
23
|
+
needsRewrite: false,
|
|
24
|
+
warning: 'tool-call snapshot history exceeds the size limit and was discarded',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
raw = await readFile(path, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (isEnoent(error)) {
|
|
31
|
+
return { entries: [], needsRewrite: false };
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
entries: [],
|
|
35
|
+
needsRewrite: false,
|
|
36
|
+
warning: 'tool-call snapshot history could not be read and was ignored',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (Buffer.byteLength(raw, 'utf8') > TOOL_CALL_SNAPSHOT_HISTORY_MAX_BYTES) {
|
|
40
|
+
await removeHistoryFile(path);
|
|
41
|
+
return {
|
|
42
|
+
entries: [],
|
|
43
|
+
needsRewrite: false,
|
|
44
|
+
warning: 'tool-call snapshot history exceeds the size limit and was discarded',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
let value;
|
|
48
|
+
try {
|
|
49
|
+
value = JSON.parse(raw);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
await removeHistoryFile(path);
|
|
53
|
+
return {
|
|
54
|
+
entries: [],
|
|
55
|
+
needsRewrite: false,
|
|
56
|
+
warning: 'tool-call snapshot history is invalid and was discarded',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (!isRecord(value) ||
|
|
60
|
+
value.version !== TOOL_CALL_SNAPSHOT_HISTORY_VERSION ||
|
|
61
|
+
!Array.isArray(value.snapshots)) {
|
|
62
|
+
await removeHistoryFile(path);
|
|
63
|
+
return {
|
|
64
|
+
entries: [],
|
|
65
|
+
needsRewrite: false,
|
|
66
|
+
warning: 'tool-call snapshot history has an unsupported format and was discarded',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const now = input.now ?? Date.now();
|
|
70
|
+
const entries = [];
|
|
71
|
+
let invalidCount = 0;
|
|
72
|
+
for (const candidate of value.snapshots) {
|
|
73
|
+
const entry = parseHistoryEntry(candidate, now);
|
|
74
|
+
if (!entry) {
|
|
75
|
+
invalidCount += 1;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
entries.push(entry);
|
|
79
|
+
}
|
|
80
|
+
entries.sort((left, right) => left.updatedAt - right.updatedAt);
|
|
81
|
+
let needsRewrite = invalidCount > 0;
|
|
82
|
+
while (entries.length > TOOL_CALL_SNAPSHOT_HISTORY_MAX_ENTRIES ||
|
|
83
|
+
encodedHistorySize(entries) > TOOL_CALL_SNAPSHOT_HISTORY_MAX_BYTES) {
|
|
84
|
+
entries.shift();
|
|
85
|
+
needsRewrite = true;
|
|
86
|
+
}
|
|
87
|
+
const retained = entries.filter((entry) => entry.updatedAt >
|
|
88
|
+
now - TOOL_CALL_SNAPSHOT_HISTORY_TTL_MS);
|
|
89
|
+
if (retained.length !== entries.length)
|
|
90
|
+
needsRewrite = true;
|
|
91
|
+
return {
|
|
92
|
+
entries: retained,
|
|
93
|
+
needsRewrite,
|
|
94
|
+
...(invalidCount > 0
|
|
95
|
+
? {
|
|
96
|
+
warning: `tool-call snapshot history contained ${invalidCount} invalid entr${invalidCount === 1 ? 'y' : 'ies'}; invalid entries were skipped`,
|
|
97
|
+
}
|
|
98
|
+
: {}),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** Save atomically; an empty history removes the optional file. */
|
|
102
|
+
export async function saveToolCallSnapshotHistory(path, snapshots) {
|
|
103
|
+
if (snapshots.length === 0) {
|
|
104
|
+
await removeHistoryFile(path);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (snapshots.length > TOOL_CALL_SNAPSHOT_HISTORY_MAX_ENTRIES ||
|
|
108
|
+
encodedHistorySize(snapshots) > TOOL_CALL_SNAPSHOT_HISTORY_MAX_BYTES) {
|
|
109
|
+
throw new Error('tool-call snapshot history exceeds its configured limit');
|
|
110
|
+
}
|
|
111
|
+
const serialized = JSON.stringify({
|
|
112
|
+
version: TOOL_CALL_SNAPSHOT_HISTORY_VERSION,
|
|
113
|
+
snapshots,
|
|
114
|
+
});
|
|
115
|
+
await mkdir(dirname(path), { recursive: true });
|
|
116
|
+
const tempPath = `${path}.tmp`;
|
|
117
|
+
try {
|
|
118
|
+
await writeFile(tempPath, serialized, 'utf8');
|
|
119
|
+
await rename(tempPath, path);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
await removeHistoryFile(tempPath);
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Remove inactive history files after their retention window. Active files
|
|
128
|
+
* prune individual expired snapshots in the registry as new updates arrive.
|
|
129
|
+
*/
|
|
130
|
+
export async function pruneExpiredToolCallSnapshotHistoryFiles(repoRoot, now = Date.now()) {
|
|
131
|
+
const dir = sessionSidecarDir(repoRoot);
|
|
132
|
+
let entries;
|
|
133
|
+
try {
|
|
134
|
+
entries = await readdir(dir);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (isEnoent(error))
|
|
138
|
+
return { removedCount: 0, failedCount: 0 };
|
|
139
|
+
return { removedCount: 0, failedCount: 1 };
|
|
140
|
+
}
|
|
141
|
+
let removedCount = 0;
|
|
142
|
+
let failedCount = 0;
|
|
143
|
+
const cutoff = now - TOOL_CALL_SNAPSHOT_HISTORY_TTL_MS;
|
|
144
|
+
for (const entry of entries) {
|
|
145
|
+
if (!entry.endsWith(TOOL_CALL_SNAPSHOT_HISTORY_SUFFIX) &&
|
|
146
|
+
!entry.endsWith(`${TOOL_CALL_SNAPSHOT_HISTORY_SUFFIX}.tmp`)) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const path = join(dir, entry);
|
|
150
|
+
try {
|
|
151
|
+
const fileInfo = await stat(path);
|
|
152
|
+
if (!fileInfo.isFile() || fileInfo.mtimeMs > cutoff)
|
|
153
|
+
continue;
|
|
154
|
+
await rm(path, { force: true });
|
|
155
|
+
removedCount += 1;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (!isEnoent(error))
|
|
159
|
+
failedCount += 1;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return { removedCount, failedCount };
|
|
163
|
+
}
|
|
164
|
+
function parseHistoryEntry(value, now) {
|
|
165
|
+
if (!isRecord(value))
|
|
166
|
+
return undefined;
|
|
167
|
+
const snapshot = value.snapshot;
|
|
168
|
+
if (typeof value.workerId !== 'string' ||
|
|
169
|
+
value.workerId.trim() === '' ||
|
|
170
|
+
typeof value.workerName !== 'string' ||
|
|
171
|
+
value.workerName.trim() === '' ||
|
|
172
|
+
typeof value.sessionId !== 'string' ||
|
|
173
|
+
value.sessionId.trim() === '' ||
|
|
174
|
+
typeof value.updatedAt !== 'number' ||
|
|
175
|
+
!Number.isFinite(value.updatedAt) ||
|
|
176
|
+
value.updatedAt <= 0 ||
|
|
177
|
+
value.updatedAt > now ||
|
|
178
|
+
!isRecord(snapshot) ||
|
|
179
|
+
typeof snapshot.toolCallId !== 'string' ||
|
|
180
|
+
snapshot.toolCallId.trim() === '') {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
workerId: value.workerId,
|
|
185
|
+
workerName: value.workerName,
|
|
186
|
+
sessionId: value.sessionId,
|
|
187
|
+
updatedAt: value.updatedAt,
|
|
188
|
+
snapshot: snapshot,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
async function removeHistoryFile(path) {
|
|
192
|
+
await rm(path, { force: true }).catch(() => { });
|
|
193
|
+
}
|
|
194
|
+
function isRecord(value) {
|
|
195
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
196
|
+
}
|
|
197
|
+
function isEnoent(error) {
|
|
198
|
+
return (typeof error === 'object' &&
|
|
199
|
+
error !== null &&
|
|
200
|
+
'code' in error &&
|
|
201
|
+
error.code === 'ENOENT');
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=tool-call-snapshot-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-snapshot-history.js","sourceRoot":"","sources":["../../src/session/tool-call-snapshot-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { ConductorUsageCost } from '../conductor/conductor-agent.js';
|
|
2
2
|
import type { SessionUsageSummary } from './types.js';
|
|
3
3
|
export type GetConductorUsageCost = () => Promise<ConductorUsageCost | undefined>;
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Conductor が報告した請求記録を session usage にマージする。
|
|
6
|
+
* 推定値は渡さず、未取得・失敗時は元の summary を返す。
|
|
7
|
+
*/
|
|
5
8
|
export declare function enrichSessionUsageWithCost(summary: SessionUsageSummary, getCost?: GetConductorUsageCost): Promise<SessionUsageSummary>;
|
|
6
9
|
//# sourceMappingURL=enrich-session-usage-cost.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enrich-session-usage-cost.d.ts","sourceRoot":"","sources":["../../src/usage/enrich-session-usage-cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;AAElF
|
|
1
|
+
{"version":3,"file":"enrich-session-usage-cost.d.ts","sourceRoot":"","sources":["../../src/usage/enrich-session-usage-cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;AAElF;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAiB9B"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Conductor が報告した請求記録を session usage にマージする。
|
|
3
|
+
* 推定値は渡さず、未取得・失敗時は元の summary を返す。
|
|
4
|
+
*/
|
|
2
5
|
export async function enrichSessionUsageWithCost(summary, getCost) {
|
|
3
6
|
if (!getCost) {
|
|
4
7
|
return summary;
|
|
@@ -8,7 +11,10 @@ export async function enrichSessionUsageWithCost(summary, getCost) {
|
|
|
8
11
|
if (cost == null) {
|
|
9
12
|
return summary;
|
|
10
13
|
}
|
|
11
|
-
return {
|
|
14
|
+
return {
|
|
15
|
+
...summary,
|
|
16
|
+
cost: { ...cost, scope: 'conductor-only' },
|
|
17
|
+
};
|
|
12
18
|
}
|
|
13
19
|
catch {
|
|
14
20
|
return summary;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enrich-session-usage-cost.js","sourceRoot":"","sources":["../../src/usage/enrich-session-usage-cost.ts"],"names":[],"mappings":"AAKA
|
|
1
|
+
{"version":3,"file":"enrich-session-usage-cost.js","sourceRoot":"","sources":["../../src/usage/enrich-session-usage-cost.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAA4B,EAC5B,OAA+B;IAE/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO;YACL,GAAG,OAAO;YACV,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE;SAC3C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|
package/dist/usage/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { SessionUsageTracker, resetSessionUsageRoundCounter, } from './session-usage-tracker.js';
|
|
2
2
|
export type { SessionUsageTrackerOptions } from './session-usage-tracker.js';
|
|
3
3
|
export { estimateTokenUsageFromText } from './estimate-token-usage.js';
|
|
4
|
-
export type { LlmTokenCounts, LlmUsageRecord, LlmUsageSource, SessionContextUtilization, SessionUsageAgentKind, SessionUsageAgentTotals, SessionUsageRound, SessionUsageSummary, } from './types.js';
|
|
4
|
+
export type { LlmTokenCounts, LlmUsageRecord, LlmUsageSource, SessionContextUtilization, SessionUsageAgentKind, SessionUsageAgentTotals, SessionUsageCacheStats, SessionUsageCacheSummary, SessionUsageCost, SessionUsageRound, SessionUsageTokenScope, SessionUsageSummary, } from './types.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,YAAY,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/usage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,YAAY,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
|
@@ -2,13 +2,18 @@ import type { PromptResult } from '../acp/types.js';
|
|
|
2
2
|
import type { ConductorTokenUsage } from '../conductor/conductor-agent.js';
|
|
3
3
|
import type { SessionUsageRound, SessionUsageSummary } from './types.js';
|
|
4
4
|
export interface SessionUsageTrackerOptions {
|
|
5
|
-
/**
|
|
5
|
+
/** SDK が limit を返さないため、指定時のみ利用率を算出する。 */
|
|
6
6
|
contextLimitTokens?: number;
|
|
7
|
+
/** Enable only when the selected backend exposes a reliable compaction counter. */
|
|
8
|
+
trackCompactions?: boolean;
|
|
7
9
|
}
|
|
8
10
|
export declare class SessionUsageTracker {
|
|
9
11
|
private readonly rounds;
|
|
10
12
|
private readonly contextLimitTokens?;
|
|
13
|
+
private readonly trackCompactions;
|
|
14
|
+
private compactionCount;
|
|
11
15
|
constructor(options?: SessionUsageTrackerOptions);
|
|
16
|
+
recordContextCompaction(): void;
|
|
12
17
|
recordConductorRound(input: {
|
|
13
18
|
runId: string;
|
|
14
19
|
status: string;
|
|
@@ -26,6 +31,7 @@ export declare class SessionUsageTracker {
|
|
|
26
31
|
agent?: 'conductor' | string;
|
|
27
32
|
}): SessionUsageRound | null;
|
|
28
33
|
getSessionSummary(): SessionUsageSummary;
|
|
34
|
+
private buildCacheSummary;
|
|
29
35
|
private buildContextUtilization;
|
|
30
36
|
}
|
|
31
37
|
/** テスト用。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-usage-tracker.d.ts","sourceRoot":"","sources":["../../src/usage/session-usage-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"session-usage-tracker.d.ts","sourceRoot":"","sources":["../../src/usage/session-usage-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,OAAO,KAAK,EAOV,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,yCAAyC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAID,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,eAAe,CAAK;gBAEhB,OAAO,GAAE,0BAA+B;IAKpD,uBAAuB,IAAI,IAAI;IAM/B,oBAAoB,CAAC,KAAK,EAAE;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,mBAAmB,CAAC;QAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,iBAAiB;IAerB,iBAAiB,CAAC,KAAK,EAAE;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,YAAY,CAAC;KAC5B,GAAG,iBAAiB;IAuBrB,cAAc,CAAC,MAAM,CAAC,EAAE;QACtB,KAAK,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;KAC9B,GAAG,iBAAiB,GAAG,IAAI;IAa5B,iBAAiB,IAAI,mBAAmB;IAwCxC,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,uBAAuB;CAsBhC;AAyID,YAAY;AACZ,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
|
|
@@ -3,8 +3,16 @@ let roundCounter = 0;
|
|
|
3
3
|
export class SessionUsageTracker {
|
|
4
4
|
rounds = [];
|
|
5
5
|
contextLimitTokens;
|
|
6
|
+
trackCompactions;
|
|
7
|
+
compactionCount = 0;
|
|
6
8
|
constructor(options = {}) {
|
|
7
9
|
this.contextLimitTokens = options.contextLimitTokens;
|
|
10
|
+
this.trackCompactions = options.trackCompactions ?? false;
|
|
11
|
+
}
|
|
12
|
+
recordContextCompaction() {
|
|
13
|
+
if (this.trackCompactions) {
|
|
14
|
+
this.compactionCount += 1;
|
|
15
|
+
}
|
|
8
16
|
}
|
|
9
17
|
recordConductorRound(input) {
|
|
10
18
|
const usage = input.usage ? fromConductorTokenUsage(input.usage) : null;
|
|
@@ -61,7 +69,9 @@ export class SessionUsageTracker {
|
|
|
61
69
|
workers[name] = summarizeAgent(this.rounds.filter((round) => round.agentKind === 'worker' && round.agentName === name));
|
|
62
70
|
}
|
|
63
71
|
const allWithUsage = this.rounds.filter((round) => round.usage != null);
|
|
72
|
+
const cacheStats = this.buildCacheSummary(workerNames);
|
|
64
73
|
return {
|
|
74
|
+
tokenScope: 'recorded-usage-only',
|
|
65
75
|
totals: {
|
|
66
76
|
rounds: this.rounds.length,
|
|
67
77
|
roundsWithUsage: allWithUsage.length,
|
|
@@ -73,6 +83,24 @@ export class SessionUsageTracker {
|
|
|
73
83
|
},
|
|
74
84
|
context: this.buildContextUtilization(),
|
|
75
85
|
latestRound: this.getLatestRound(),
|
|
86
|
+
...(cacheStats ? { cacheStats } : {}),
|
|
87
|
+
...(this.trackCompactions ? { compactionCount: this.compactionCount } : {}),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
buildCacheSummary(workerNames) {
|
|
91
|
+
const totals = summarizeCacheStats(this.rounds);
|
|
92
|
+
if (!totals) {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
totals,
|
|
97
|
+
byAgent: {
|
|
98
|
+
conductor: summarizeCacheStats(this.rounds.filter((round) => round.agentKind === 'conductor')),
|
|
99
|
+
workers: Object.fromEntries(workerNames.map((name) => [
|
|
100
|
+
name,
|
|
101
|
+
summarizeCacheStats(this.rounds.filter((round) => round.agentKind === 'worker' && round.agentName === name)),
|
|
102
|
+
])),
|
|
103
|
+
},
|
|
76
104
|
};
|
|
77
105
|
}
|
|
78
106
|
buildContextUtilization() {
|
|
@@ -93,6 +121,29 @@ export class SessionUsageTracker {
|
|
|
93
121
|
};
|
|
94
122
|
}
|
|
95
123
|
}
|
|
124
|
+
function summarizeCacheStats(rounds) {
|
|
125
|
+
const withUsage = rounds.flatMap((round) => round.usage ? [round.usage] : []);
|
|
126
|
+
const withCacheRead = withUsage.filter((usage) => usage.cacheReadTokens != null);
|
|
127
|
+
const withCacheWrite = withUsage.filter((usage) => usage.cacheWriteTokens != null);
|
|
128
|
+
if (withCacheRead.length === 0 && withCacheWrite.length === 0) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const cacheReadTokens = withCacheRead.length > 0
|
|
132
|
+
? withCacheRead.reduce((sum, usage) => sum + usage.cacheReadTokens, 0)
|
|
133
|
+
: undefined;
|
|
134
|
+
const cacheWriteTokens = withCacheWrite.length > 0
|
|
135
|
+
? withCacheWrite.reduce((sum, usage) => sum + usage.cacheWriteTokens, 0)
|
|
136
|
+
: undefined;
|
|
137
|
+
const cacheReadInputTokens = withCacheRead.reduce((sum, usage) => sum + usage.inputTokens, 0);
|
|
138
|
+
const cacheHitDenominator = cacheReadInputTokens + (cacheReadTokens ?? 0);
|
|
139
|
+
return {
|
|
140
|
+
...(cacheReadTokens !== undefined ? { cacheReadTokens } : {}),
|
|
141
|
+
...(cacheWriteTokens !== undefined ? { cacheWriteTokens } : {}),
|
|
142
|
+
...(cacheReadTokens !== undefined && cacheHitDenominator > 0
|
|
143
|
+
? { cacheHitRate: cacheReadTokens / cacheHitDenominator }
|
|
144
|
+
: {}),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
96
147
|
function nextRoundId() {
|
|
97
148
|
roundCounter += 1;
|
|
98
149
|
return `usage-round-${roundCounter}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-usage-tracker.js","sourceRoot":"","sources":["../../src/usage/session-usage-tracker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"session-usage-tracker.js","sourceRoot":"","sources":["../../src/usage/session-usage-tracker.ts"],"names":[],"mappings":"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"}
|