@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.
Files changed (136) hide show
  1. package/dist/acp/testing/fake-acp-server.d.ts +2 -0
  2. package/dist/acp/testing/fake-acp-server.d.ts.map +1 -1
  3. package/dist/acp/testing/fake-acp-server.js +3 -0
  4. package/dist/acp/testing/fake-acp-server.js.map +1 -1
  5. package/dist/conductor/conductor-agent-factory.d.ts +5 -0
  6. package/dist/conductor/conductor-agent-factory.d.ts.map +1 -0
  7. package/dist/conductor/conductor-agent-factory.js +10 -0
  8. package/dist/conductor/conductor-agent-factory.js.map +1 -0
  9. package/dist/conductor/conductor-agent.d.ts +7 -0
  10. package/dist/conductor/conductor-agent.d.ts.map +1 -1
  11. package/dist/conductor/conductor-session-driver.d.ts.map +1 -1
  12. package/dist/conductor/conductor-session-driver.js +2 -1
  13. package/dist/conductor/conductor-session-driver.js.map +1 -1
  14. package/dist/conductor/conductor-session.d.ts +1 -2
  15. package/dist/conductor/conductor-session.d.ts.map +1 -1
  16. package/dist/conductor/conductor-session.js +216 -31
  17. package/dist/conductor/conductor-session.js.map +1 -1
  18. package/dist/conductor/index.d.ts +3 -2
  19. package/dist/conductor/index.d.ts.map +1 -1
  20. package/dist/conductor/index.js +2 -1
  21. package/dist/conductor/index.js.map +1 -1
  22. package/dist/conductor/operator-command.d.ts +5 -0
  23. package/dist/conductor/operator-command.d.ts.map +1 -1
  24. package/dist/conductor/operator-command.js +6 -0
  25. package/dist/conductor/operator-command.js.map +1 -1
  26. package/dist/conductor/pi-conductor-agent.d.ts +2 -5
  27. package/dist/conductor/pi-conductor-agent.d.ts.map +1 -1
  28. package/dist/conductor/pi-conductor-agent.js +16 -19
  29. package/dist/conductor/pi-conductor-agent.js.map +1 -1
  30. package/dist/conductor/pi-resource-loader.d.ts +2 -0
  31. package/dist/conductor/pi-resource-loader.d.ts.map +1 -1
  32. package/dist/conductor/pi-resource-loader.js +16 -8
  33. package/dist/conductor/pi-resource-loader.js.map +1 -1
  34. package/dist/conductor/session/dispatch-hold.d.ts +1 -1
  35. package/dist/conductor/session/dispatch-hold.d.ts.map +1 -1
  36. package/dist/conductor/session/dispatch-hold.js +4 -3
  37. package/dist/conductor/session/dispatch-hold.js.map +1 -1
  38. package/dist/conductor/session/dispatch-mode.d.ts +1 -1
  39. package/dist/conductor/session/events/index.d.ts +2 -1
  40. package/dist/conductor/session/events/index.d.ts.map +1 -1
  41. package/dist/conductor/session/events/index.js.map +1 -1
  42. package/dist/conductor/session/events/session-event.d.ts +7 -1
  43. package/dist/conductor/session/events/session-event.d.ts.map +1 -1
  44. package/dist/conductor/session/events/session-log-event-groups.d.ts +1 -1
  45. package/dist/conductor/session/events/session-log-event-groups.d.ts.map +1 -1
  46. package/dist/conductor/session/events/session-log-event-groups.js +1 -0
  47. package/dist/conductor/session/events/session-log-event-groups.js.map +1 -1
  48. package/dist/conductor/session/events/shared/permission-pending.d.ts +5 -0
  49. package/dist/conductor/session/events/shared/permission-pending.d.ts.map +1 -1
  50. package/dist/conductor/session/format-session-event.d.ts.map +1 -1
  51. package/dist/conductor/session/format-session-event.js +32 -2
  52. package/dist/conductor/session/format-session-event.js.map +1 -1
  53. package/dist/conductor/session/select-dispatch-batch.d.ts.map +1 -1
  54. package/dist/conductor/session/select-dispatch-batch.js +21 -4
  55. package/dist/conductor/session/select-dispatch-batch.js.map +1 -1
  56. package/dist/conductor/session/session-event.d.ts +1 -1
  57. package/dist/conductor/session/session-event.d.ts.map +1 -1
  58. package/dist/dispatch/get-tool-call-tool.d.ts +8 -0
  59. package/dist/dispatch/get-tool-call-tool.d.ts.map +1 -0
  60. package/dist/dispatch/get-tool-call-tool.js +46 -0
  61. package/dist/dispatch/get-tool-call-tool.js.map +1 -0
  62. package/dist/dispatch/index.d.ts +3 -0
  63. package/dist/dispatch/index.d.ts.map +1 -1
  64. package/dist/dispatch/index.js +2 -0
  65. package/dist/dispatch/index.js.map +1 -1
  66. package/dist/dispatch/report-session-state-tool.d.ts +4 -0
  67. package/dist/dispatch/report-session-state-tool.d.ts.map +1 -0
  68. package/dist/dispatch/report-session-state-tool.js +38 -0
  69. package/dist/dispatch/report-session-state-tool.js.map +1 -0
  70. package/dist/dispatch/session-usage-tool.js +1 -1
  71. package/dist/dispatch/session-usage-tool.js.map +1 -1
  72. package/dist/escalation/ask-human-tool.d.ts +0 -2
  73. package/dist/escalation/ask-human-tool.d.ts.map +1 -1
  74. package/dist/escalation/ask-human-tool.js +1 -7
  75. package/dist/escalation/ask-human-tool.js.map +1 -1
  76. package/dist/github/github-monitor.d.ts +1 -1
  77. package/dist/github/github-monitor.d.ts.map +1 -1
  78. package/dist/github/github-monitor.js +1 -1
  79. package/dist/github/github-monitor.js.map +1 -1
  80. package/dist/operator-runtime.d.ts +20 -0
  81. package/dist/operator-runtime.d.ts.map +1 -0
  82. package/dist/operator-runtime.js +14 -0
  83. package/dist/operator-runtime.js.map +1 -0
  84. package/dist/permission/index.d.ts +2 -0
  85. package/dist/permission/index.d.ts.map +1 -1
  86. package/dist/permission/index.js +1 -0
  87. package/dist/permission/index.js.map +1 -1
  88. package/dist/permission/permission-brief.d.ts +22 -0
  89. package/dist/permission/permission-brief.d.ts.map +1 -0
  90. package/dist/permission/permission-brief.js +245 -0
  91. package/dist/permission/permission-brief.js.map +1 -0
  92. package/dist/prompt/index.d.ts +1 -0
  93. package/dist/prompt/index.d.ts.map +1 -1
  94. package/dist/prompt/index.js +1 -0
  95. package/dist/prompt/index.js.map +1 -1
  96. package/dist/prompt/modules/ensemble/conductor-base-module.d.ts.map +1 -1
  97. package/dist/prompt/modules/ensemble/conductor-base-module.js +11 -1
  98. package/dist/prompt/modules/ensemble/conductor-base-module.js.map +1 -1
  99. package/dist/runtime/index.d.ts +3 -0
  100. package/dist/runtime/index.d.ts.map +1 -1
  101. package/dist/runtime/index.js +2 -0
  102. package/dist/runtime/index.js.map +1 -1
  103. package/dist/runtime/tool-call-snapshot-registry.d.ts +69 -0
  104. package/dist/runtime/tool-call-snapshot-registry.d.ts.map +1 -0
  105. package/dist/runtime/tool-call-snapshot-registry.js +275 -0
  106. package/dist/runtime/tool-call-snapshot-registry.js.map +1 -0
  107. package/dist/runtime/types.d.ts +2 -0
  108. package/dist/runtime/types.d.ts.map +1 -1
  109. package/dist/runtime/worker-runtime.d.ts.map +1 -1
  110. package/dist/runtime/worker-runtime.js +6 -2
  111. package/dist/runtime/worker-runtime.js.map +1 -1
  112. package/dist/session/index.d.ts +2 -0
  113. package/dist/session/index.d.ts.map +1 -1
  114. package/dist/session/index.js +1 -0
  115. package/dist/session/index.js.map +1 -1
  116. package/dist/session/open-questions-store.d.ts +12 -0
  117. package/dist/session/open-questions-store.d.ts.map +1 -0
  118. package/dist/session/open-questions-store.js +161 -0
  119. package/dist/session/open-questions-store.js.map +1 -0
  120. package/dist/session/tool-call-snapshot-history.d.ts +32 -0
  121. package/dist/session/tool-call-snapshot-history.d.ts.map +1 -0
  122. package/dist/session/tool-call-snapshot-history.js +203 -0
  123. package/dist/session/tool-call-snapshot-history.js.map +1 -0
  124. package/dist/usage/enrich-session-usage-cost.d.ts +4 -1
  125. package/dist/usage/enrich-session-usage-cost.d.ts.map +1 -1
  126. package/dist/usage/enrich-session-usage-cost.js +8 -2
  127. package/dist/usage/enrich-session-usage-cost.js.map +1 -1
  128. package/dist/usage/index.d.ts +1 -1
  129. package/dist/usage/index.d.ts.map +1 -1
  130. package/dist/usage/session-usage-tracker.d.ts +7 -1
  131. package/dist/usage/session-usage-tracker.d.ts.map +1 -1
  132. package/dist/usage/session-usage-tracker.js +51 -0
  133. package/dist/usage/session-usage-tracker.js.map +1 -1
  134. package/dist/usage/types.d.ts +30 -2
  135. package/dist/usage/types.d.ts.map +1 -1
  136. 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
- /** SDK `getUsage().cost` を session usage にマージする。未取得・失敗時は元の summary を返す。 */
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,2EAA2E;AAC3E,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAc9B"}
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
- /** SDK `getUsage().cost` を session usage にマージする。未取得・失敗時は元の summary を返す。 */
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 { ...summary, cost };
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,2EAA2E;AAC3E,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,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
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"}
@@ -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
- /** テスト用。SDK が limit を返さないため、指定時のみ利用率を算出する。 */
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,EAKV,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAS;gBAEjC,OAAO,GAAE,0BAA+B;IAIpD,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;IAoCxC,OAAO,CAAC,uBAAuB;CAsBhC;AAiGD,YAAY;AACZ,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
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":"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"}
1
+ {"version":3,"file":"session-usage-tracker.js","sourceRoot":"","sources":["../../src/usage/session-usage-tracker.ts"],"names":[],"mappings":"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"}