@trazum/core 1.39.0 → 1.40.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/README.md CHANGED
@@ -119,6 +119,19 @@ silently priced through, and each verdict says whether it fails a gate:
119
119
  `not-arrived` always, `fields-stopped` too — a team must not pass on the
120
120
  strength of its own log's silence — and a vanished workload never.
121
121
 
122
+ ## The long run
123
+
124
+ `buildHistory(reports, plans)` turns stored reports into the series no
125
+ pairwise comparison can see: per-label spend, per-model share and cache
126
+ share per period, with consecutive movement named as runs (`MIN_RUN` rises
127
+ or falls at least — two is a comparison, one is noise) and the same plan
128
+ action appearing in two or more plans reported as a decision nobody is
129
+ executing. `storedReportFrom(name, parsed)` reads one stored `profile`
130
+ document into the slice history needs, returning null for anything else so
131
+ the caller names the file instead of absorbing it. No forecasts anywhere:
132
+ shapes are stated with their first and last values, and where they go next
133
+ is the reader's.
134
+
122
135
  ## Comparing two versions
123
136
 
124
137
  ```ts
@@ -0,0 +1,110 @@
1
+ /**
2
+ * The long run: many reports over many periods, as one series.
3
+ *
4
+ * Every comparison in Trazum is between two logs, and a product's cost
5
+ * problem is rarely visible in two — it is visible in twenty. This module
6
+ * takes *stored reports* (the `--json` documents a team already keeps) and
7
+ * builds the series no pairwise comparison can see: the workload that grew a
8
+ * little every week, the model share that has been climbing since a date,
9
+ * the cache hit rate decaying slowly enough that no single week's report
10
+ * called it a finding.
11
+ *
12
+ * **Still no forecasts.** Twenty points make a trend visible; they do not
13
+ * make next month knowable. The series is stated, the shape is named as
14
+ * consecutive movement — never a line fitted through the points — and where
15
+ * it goes next remains the reader's to judge, the same refusal
16
+ * `modelMixDrift` has carried since 1.27.
17
+ *
18
+ * **Derived from stored reports, not re-parsed logs**, so a year of `--json`
19
+ * output is enough and the raw logs can be thrown away — which is what the
20
+ * privacy story requires anyway. Browser-safe: documents in, series out.
21
+ */
22
+ import type { PlanActionKind, PlanDocument } from './plan.js';
23
+ /** The slice of a stored profile document this module actually reads. */
24
+ export interface StoredReport {
25
+ /** Where it came from — a file name, shown so a finding can be traced. */
26
+ name: string;
27
+ span: {
28
+ fromMs: number;
29
+ toMs: number;
30
+ } | null;
31
+ totalUsd: number;
32
+ calls: number;
33
+ /** Label → dollars this period. */
34
+ byLabel: Map<string, number>;
35
+ /** Model → dollars this period. */
36
+ byModel: Map<string, number>;
37
+ /** Share of input tokens served from cache, or null when unknowable. */
38
+ cacheReadShare: number | null;
39
+ }
40
+ /**
41
+ * A run of consecutive movement, named — never extrapolated.
42
+ *
43
+ * `periods` counts the *rises* (or falls), so a run of 3 spans 4 reports.
44
+ * The floor is 3: two rises is what `--against` already shows, and one is
45
+ * noise wearing a trend's clothes.
46
+ */
47
+ export interface HistoryRun {
48
+ kind: 'label-spend-climbing' | 'model-share-climbing' | 'cache-share-decaying';
49
+ subject: string;
50
+ /** Consecutive rises (falls, for decay). */
51
+ periods: number;
52
+ /** The report the run started in, by name — "climbing since <this one>". */
53
+ sinceName: string;
54
+ /** First and last values of the run, so the reader judges the size. */
55
+ from: number;
56
+ to: number;
57
+ }
58
+ /** The same action planned again and again: a decision nobody is executing. */
59
+ export interface RepeatedPlanAction {
60
+ kind: PlanActionKind;
61
+ label: string;
62
+ model: string;
63
+ appearances: number;
64
+ firstPlanned: string | null;
65
+ lastPlanned: string | null;
66
+ }
67
+ export interface HistoryDocument {
68
+ schemaVersion: 1;
69
+ /** Ordered oldest first by span start. */
70
+ periods: {
71
+ name: string;
72
+ fromMs: number;
73
+ toMs: number;
74
+ totalUsd: number;
75
+ calls: number;
76
+ }[];
77
+ /** Per label, dollars per period — null where the label had no traffic. */
78
+ labelSeries: {
79
+ label: string;
80
+ points: (number | null)[];
81
+ }[];
82
+ /** Per model, share of that period's total — null where absent. */
83
+ modelShareSeries: {
84
+ model: string;
85
+ points: (number | null)[];
86
+ }[];
87
+ /** Cache read share per period, null where unknowable. */
88
+ cacheShareSeries: (number | null)[];
89
+ /** The findings only a series can make. Shapes, never forecasts. */
90
+ runs: HistoryRun[];
91
+ /** Plans in the same directory, held against each other. */
92
+ repeatedPlanActions: RepeatedPlanAction[];
93
+ /**
94
+ * Reports that carry no span cannot be placed on a timeline; they are
95
+ * named here and in no series above, never silently absorbed.
96
+ */
97
+ undatedReports: string[];
98
+ }
99
+ export declare const MIN_RUN = 3;
100
+ export declare function buildHistory(reports: StoredReport[], plans?: (PlanDocument & {
101
+ createdAt?: string;
102
+ name?: string;
103
+ })[]): HistoryDocument;
104
+ /**
105
+ * Reads one stored `profile --json` document into the slice history needs.
106
+ * Returns null when the JSON is not a profile document — the caller names
107
+ * the file rather than absorbing it.
108
+ */
109
+ export declare function storedReportFrom(name: string, parsed: unknown): StoredReport | null;
110
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9D,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mCAAmC;IACnC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,wEAAwE;IACxE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,sBAAsB,GAAG,sBAAsB,GAAG,sBAAsB,CAAC;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,CAAC,CAAC;IACjB,0CAA0C;IAC1C,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3F,2EAA2E;IAC3E,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;KAAE,EAAE,CAAC;IAC5D,mEAAmE;IACnE,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;KAAE,EAAE,CAAC;IACjE,0DAA0D;IAC1D,gBAAgB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACpC,oEAAoE;IACpE,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,4DAA4D;IAC5D,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C;;;OAGG;IACH,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,OAAO,IAAI,CAAC;AAwBzB,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,GAAE,CAAC,YAAY,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAAO,GACnE,eAAe,CAiHjB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CA8CnF"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * The long run: many reports over many periods, as one series.
3
+ *
4
+ * Every comparison in Trazum is between two logs, and a product's cost
5
+ * problem is rarely visible in two — it is visible in twenty. This module
6
+ * takes *stored reports* (the `--json` documents a team already keeps) and
7
+ * builds the series no pairwise comparison can see: the workload that grew a
8
+ * little every week, the model share that has been climbing since a date,
9
+ * the cache hit rate decaying slowly enough that no single week's report
10
+ * called it a finding.
11
+ *
12
+ * **Still no forecasts.** Twenty points make a trend visible; they do not
13
+ * make next month knowable. The series is stated, the shape is named as
14
+ * consecutive movement — never a line fitted through the points — and where
15
+ * it goes next remains the reader's to judge, the same refusal
16
+ * `modelMixDrift` has carried since 1.27.
17
+ *
18
+ * **Derived from stored reports, not re-parsed logs**, so a year of `--json`
19
+ * output is enough and the raw logs can be thrown away — which is what the
20
+ * privacy story requires anyway. Browser-safe: documents in, series out.
21
+ */
22
+ import { UNLABELLED } from './usage.js';
23
+ export const MIN_RUN = 3;
24
+ /** The longest run of strictly consecutive movement ending anywhere in the series. */
25
+ function longestRun(points, direction) {
26
+ let best = null;
27
+ let start = -1;
28
+ let length = 0;
29
+ for (let i = 1; i < points.length; i++) {
30
+ const prev = points[i - 1] ?? null;
31
+ const here = points[i] ?? null;
32
+ if (prev !== null && here !== null && Math.sign(here - prev) === direction && here !== prev) {
33
+ if (length === 0)
34
+ start = i - 1;
35
+ length += 1;
36
+ if (best === null || length > best.length)
37
+ best = { start, length };
38
+ }
39
+ else {
40
+ length = 0;
41
+ }
42
+ }
43
+ return best !== null && best.length >= MIN_RUN ? best : null;
44
+ }
45
+ export function buildHistory(reports, plans = []) {
46
+ const undatedReports = reports.filter((r) => r.span === null).map((r) => r.name);
47
+ const dated = reports
48
+ .filter((r) => r.span !== null)
49
+ .sort((a, b) => a.span.fromMs - b.span.fromMs);
50
+ const periods = dated.map((r) => ({
51
+ name: r.name,
52
+ fromMs: r.span.fromMs,
53
+ toMs: r.span.toMs,
54
+ totalUsd: r.totalUsd,
55
+ calls: r.calls,
56
+ }));
57
+ const labels = [...new Set(dated.flatMap((r) => [...r.byLabel.keys()]))].sort();
58
+ const labelSeries = labels.map((label) => ({
59
+ label,
60
+ points: dated.map((r) => r.byLabel.get(label) ?? null),
61
+ }));
62
+ const models = [...new Set(dated.flatMap((r) => [...r.byModel.keys()]))].sort();
63
+ const modelShareSeries = models.map((model) => ({
64
+ model,
65
+ points: dated.map((r) => {
66
+ const usd = r.byModel.get(model);
67
+ if (usd === undefined || r.totalUsd <= 0)
68
+ return null;
69
+ return usd / r.totalUsd;
70
+ }),
71
+ }));
72
+ const cacheShareSeries = dated.map((r) => r.cacheReadShare);
73
+ const runs = [];
74
+ for (const series of labelSeries) {
75
+ const run = longestRun(series.points, 1);
76
+ if (run === null)
77
+ continue;
78
+ runs.push({
79
+ kind: 'label-spend-climbing',
80
+ subject: series.label,
81
+ periods: run.length,
82
+ sinceName: periods[run.start].name,
83
+ from: series.points[run.start],
84
+ to: series.points[run.start + run.length],
85
+ });
86
+ }
87
+ for (const series of modelShareSeries) {
88
+ const run = longestRun(series.points, 1);
89
+ if (run === null)
90
+ continue;
91
+ runs.push({
92
+ kind: 'model-share-climbing',
93
+ subject: series.model,
94
+ periods: run.length,
95
+ sinceName: periods[run.start].name,
96
+ from: series.points[run.start],
97
+ to: series.points[run.start + run.length],
98
+ });
99
+ }
100
+ {
101
+ const run = longestRun(cacheShareSeries, -1);
102
+ if (run !== null) {
103
+ runs.push({
104
+ kind: 'cache-share-decaying',
105
+ subject: 'cache',
106
+ periods: run.length,
107
+ sinceName: periods[run.start].name,
108
+ from: cacheShareSeries[run.start],
109
+ to: cacheShareSeries[run.start + run.length],
110
+ });
111
+ }
112
+ }
113
+ runs.sort((a, b) => b.periods - a.periods);
114
+ /**
115
+ * Plans held against each other: the same action (kind, label, model) in
116
+ * two or more plans is a decision nobody is executing, and the dates make
117
+ * the sentence sayable — "planned first on <date>, still planned on
118
+ * <date>".
119
+ */
120
+ const seen = new Map();
121
+ const ordered = [...plans].sort((a, b) => (a.createdAt ?? '').localeCompare(b.createdAt ?? ''));
122
+ for (const plan of ordered) {
123
+ for (const action of plan.actions) {
124
+ const key = `${action.kind}\n${action.label}\n${action.model}`;
125
+ const entry = seen.get(key);
126
+ if (entry === undefined) {
127
+ seen.set(key, {
128
+ kind: action.kind,
129
+ label: action.label,
130
+ model: action.model,
131
+ appearances: 1,
132
+ firstPlanned: plan.createdAt ?? null,
133
+ lastPlanned: plan.createdAt ?? null,
134
+ });
135
+ }
136
+ else {
137
+ entry.appearances += 1;
138
+ entry.lastPlanned = plan.createdAt ?? entry.lastPlanned;
139
+ }
140
+ }
141
+ }
142
+ const repeatedPlanActions = [...seen.values()]
143
+ .filter((entry) => entry.appearances >= 2)
144
+ .sort((a, b) => b.appearances - a.appearances);
145
+ return {
146
+ schemaVersion: 1,
147
+ periods,
148
+ labelSeries,
149
+ modelShareSeries,
150
+ cacheShareSeries,
151
+ runs,
152
+ repeatedPlanActions,
153
+ undatedReports,
154
+ };
155
+ }
156
+ /**
157
+ * Reads one stored `profile --json` document into the slice history needs.
158
+ * Returns null when the JSON is not a profile document — the caller names
159
+ * the file rather than absorbing it.
160
+ */
161
+ export function storedReportFrom(name, parsed) {
162
+ const doc = parsed;
163
+ if (doc === null || typeof doc !== 'object')
164
+ return null;
165
+ if (doc.schemaVersion !== 1 || doc.total === undefined || !Array.isArray(doc.byLabelAndModel)) {
166
+ return null;
167
+ }
168
+ const byLabel = new Map();
169
+ const byModel = new Map();
170
+ for (const slice of doc.byLabelAndModel) {
171
+ const usd = slice.breakdown?.totalUsd ?? 0;
172
+ const label = slice.label ?? UNLABELLED;
173
+ const model = slice.model ?? 'unknown';
174
+ byLabel.set(label, (byLabel.get(label) ?? 0) + usd);
175
+ byModel.set(model, (byModel.get(model) ?? 0) + usd);
176
+ }
177
+ const input = doc.total.inputTokens ?? 0;
178
+ const cacheRead = doc.total.cacheReadTokens ?? 0;
179
+ const cacheWrite = doc.total.cacheWriteTokens ?? 0;
180
+ const denominator = input + cacheRead + cacheWrite;
181
+ return {
182
+ name,
183
+ span: doc.span ?? null,
184
+ totalUsd: doc.total.totalUsd ?? 0,
185
+ calls: doc.total.calls ?? 0,
186
+ byLabel,
187
+ byModel,
188
+ cacheReadShare: denominator > 0 ? cacheRead / denominator : null,
189
+ };
190
+ }
191
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -16,6 +16,8 @@ export { assignSources, fleetRollup } from './fleet.js';
16
16
  export { buildPlan, planLabelName } from './plan.js';
17
17
  export type { PlanAction, PlanActionKind, PlanAssumption, PlanDocument } from './plan.js';
18
18
  export { verifyPlan } from './verify.js';
19
+ export { buildHistory, storedReportFrom, MIN_RUN } from './history.js';
20
+ export type { HistoryDocument, HistoryRun, RepeatedPlanAction, StoredReport } from './history.js';
19
21
  export type { CannotTellReason, PlanVerification, VerifiedAction, VerifyOutcome } from './verify.js';
20
22
  export type { FleetSource, FleetRollup } from './fleet.js';
21
23
  export type { MeasuredUsage, LabelCoverage } from './measured-profile.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -20,6 +20,7 @@ export { measuredUsage, labelCoverage, MIN_SCALE_DAYS, SCALE_TO_DAYS } from './m
20
20
  export { assignSources, fleetRollup } from './fleet.js';
21
21
  export { buildPlan, planLabelName } from './plan.js';
22
22
  export { verifyPlan } from './verify.js';
23
+ export { buildHistory, storedReportFrom, MIN_RUN } from './history.js';
23
24
  // The same tokens at another model's rates — arithmetic, not advice, and it
24
25
  // refuses to price a call the target could not have accepted. See reprice.ts.
25
26
  // The shape of a call's input — the half of the bill a total could only name.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trazum/core",
3
- "version": "1.39.0",
3
+ "version": "1.40.0",
4
4
  "description": "Trazum core: priced advisories for LLM prompts (caching, model tier, batching, schemas), plus deterministic trimming, token counting and pricing.",
5
5
  "license": "MIT",
6
6
  "author": "David Mu\u00f1oz Rey",
package/src/history.ts ADDED
@@ -0,0 +1,284 @@
1
+ /**
2
+ * The long run: many reports over many periods, as one series.
3
+ *
4
+ * Every comparison in Trazum is between two logs, and a product's cost
5
+ * problem is rarely visible in two — it is visible in twenty. This module
6
+ * takes *stored reports* (the `--json` documents a team already keeps) and
7
+ * builds the series no pairwise comparison can see: the workload that grew a
8
+ * little every week, the model share that has been climbing since a date,
9
+ * the cache hit rate decaying slowly enough that no single week's report
10
+ * called it a finding.
11
+ *
12
+ * **Still no forecasts.** Twenty points make a trend visible; they do not
13
+ * make next month knowable. The series is stated, the shape is named as
14
+ * consecutive movement — never a line fitted through the points — and where
15
+ * it goes next remains the reader's to judge, the same refusal
16
+ * `modelMixDrift` has carried since 1.27.
17
+ *
18
+ * **Derived from stored reports, not re-parsed logs**, so a year of `--json`
19
+ * output is enough and the raw logs can be thrown away — which is what the
20
+ * privacy story requires anyway. Browser-safe: documents in, series out.
21
+ */
22
+
23
+ import { UNLABELLED } from './usage.js';
24
+ import type { PlanActionKind, PlanDocument } from './plan.js';
25
+
26
+ /** The slice of a stored profile document this module actually reads. */
27
+ export interface StoredReport {
28
+ /** Where it came from — a file name, shown so a finding can be traced. */
29
+ name: string;
30
+ span: { fromMs: number; toMs: number } | null;
31
+ totalUsd: number;
32
+ calls: number;
33
+ /** Label → dollars this period. */
34
+ byLabel: Map<string, number>;
35
+ /** Model → dollars this period. */
36
+ byModel: Map<string, number>;
37
+ /** Share of input tokens served from cache, or null when unknowable. */
38
+ cacheReadShare: number | null;
39
+ }
40
+
41
+ /**
42
+ * A run of consecutive movement, named — never extrapolated.
43
+ *
44
+ * `periods` counts the *rises* (or falls), so a run of 3 spans 4 reports.
45
+ * The floor is 3: two rises is what `--against` already shows, and one is
46
+ * noise wearing a trend's clothes.
47
+ */
48
+ export interface HistoryRun {
49
+ kind: 'label-spend-climbing' | 'model-share-climbing' | 'cache-share-decaying';
50
+ subject: string;
51
+ /** Consecutive rises (falls, for decay). */
52
+ periods: number;
53
+ /** The report the run started in, by name — "climbing since <this one>". */
54
+ sinceName: string;
55
+ /** First and last values of the run, so the reader judges the size. */
56
+ from: number;
57
+ to: number;
58
+ }
59
+
60
+ /** The same action planned again and again: a decision nobody is executing. */
61
+ export interface RepeatedPlanAction {
62
+ kind: PlanActionKind;
63
+ label: string;
64
+ model: string;
65
+ appearances: number;
66
+ firstPlanned: string | null;
67
+ lastPlanned: string | null;
68
+ }
69
+
70
+ export interface HistoryDocument {
71
+ schemaVersion: 1;
72
+ /** Ordered oldest first by span start. */
73
+ periods: { name: string; fromMs: number; toMs: number; totalUsd: number; calls: number }[];
74
+ /** Per label, dollars per period — null where the label had no traffic. */
75
+ labelSeries: { label: string; points: (number | null)[] }[];
76
+ /** Per model, share of that period's total — null where absent. */
77
+ modelShareSeries: { model: string; points: (number | null)[] }[];
78
+ /** Cache read share per period, null where unknowable. */
79
+ cacheShareSeries: (number | null)[];
80
+ /** The findings only a series can make. Shapes, never forecasts. */
81
+ runs: HistoryRun[];
82
+ /** Plans in the same directory, held against each other. */
83
+ repeatedPlanActions: RepeatedPlanAction[];
84
+ /**
85
+ * Reports that carry no span cannot be placed on a timeline; they are
86
+ * named here and in no series above, never silently absorbed.
87
+ */
88
+ undatedReports: string[];
89
+ }
90
+
91
+ export const MIN_RUN = 3;
92
+
93
+ /** The longest run of strictly consecutive movement ending anywhere in the series. */
94
+ function longestRun(
95
+ points: (number | null)[],
96
+ direction: 1 | -1,
97
+ ): { start: number; length: number } | null {
98
+ let best: { start: number; length: number } | null = null;
99
+ let start = -1;
100
+ let length = 0;
101
+ for (let i = 1; i < points.length; i++) {
102
+ const prev = points[i - 1] ?? null;
103
+ const here = points[i] ?? null;
104
+ if (prev !== null && here !== null && Math.sign(here - prev) === direction && here !== prev) {
105
+ if (length === 0) start = i - 1;
106
+ length += 1;
107
+ if (best === null || length > best.length) best = { start, length };
108
+ } else {
109
+ length = 0;
110
+ }
111
+ }
112
+ return best !== null && best.length >= MIN_RUN ? best : null;
113
+ }
114
+
115
+ export function buildHistory(
116
+ reports: StoredReport[],
117
+ plans: (PlanDocument & { createdAt?: string; name?: string })[] = [],
118
+ ): HistoryDocument {
119
+ const undatedReports = reports.filter((r) => r.span === null).map((r) => r.name);
120
+ const dated = reports
121
+ .filter((r) => r.span !== null)
122
+ .sort((a, b) => a.span!.fromMs - b.span!.fromMs);
123
+
124
+ const periods = dated.map((r) => ({
125
+ name: r.name,
126
+ fromMs: r.span!.fromMs,
127
+ toMs: r.span!.toMs,
128
+ totalUsd: r.totalUsd,
129
+ calls: r.calls,
130
+ }));
131
+
132
+ const labels = [...new Set(dated.flatMap((r) => [...r.byLabel.keys()]))].sort();
133
+ const labelSeries = labels.map((label) => ({
134
+ label,
135
+ points: dated.map((r) => r.byLabel.get(label) ?? null),
136
+ }));
137
+
138
+ const models = [...new Set(dated.flatMap((r) => [...r.byModel.keys()]))].sort();
139
+ const modelShareSeries = models.map((model) => ({
140
+ model,
141
+ points: dated.map((r) => {
142
+ const usd = r.byModel.get(model);
143
+ if (usd === undefined || r.totalUsd <= 0) return null;
144
+ return usd / r.totalUsd;
145
+ }),
146
+ }));
147
+
148
+ const cacheShareSeries = dated.map((r) => r.cacheReadShare);
149
+
150
+ const runs: HistoryRun[] = [];
151
+ for (const series of labelSeries) {
152
+ const run = longestRun(series.points, 1);
153
+ if (run === null) continue;
154
+ runs.push({
155
+ kind: 'label-spend-climbing',
156
+ subject: series.label,
157
+ periods: run.length,
158
+ sinceName: periods[run.start]!.name,
159
+ from: series.points[run.start]!,
160
+ to: series.points[run.start + run.length]!,
161
+ });
162
+ }
163
+ for (const series of modelShareSeries) {
164
+ const run = longestRun(series.points, 1);
165
+ if (run === null) continue;
166
+ runs.push({
167
+ kind: 'model-share-climbing',
168
+ subject: series.model,
169
+ periods: run.length,
170
+ sinceName: periods[run.start]!.name,
171
+ from: series.points[run.start]!,
172
+ to: series.points[run.start + run.length]!,
173
+ });
174
+ }
175
+ {
176
+ const run = longestRun(cacheShareSeries, -1);
177
+ if (run !== null) {
178
+ runs.push({
179
+ kind: 'cache-share-decaying',
180
+ subject: 'cache',
181
+ periods: run.length,
182
+ sinceName: periods[run.start]!.name,
183
+ from: cacheShareSeries[run.start]!,
184
+ to: cacheShareSeries[run.start + run.length]!,
185
+ });
186
+ }
187
+ }
188
+ runs.sort((a, b) => b.periods - a.periods);
189
+
190
+ /**
191
+ * Plans held against each other: the same action (kind, label, model) in
192
+ * two or more plans is a decision nobody is executing, and the dates make
193
+ * the sentence sayable — "planned first on <date>, still planned on
194
+ * <date>".
195
+ */
196
+ const seen = new Map<string, RepeatedPlanAction>();
197
+ const ordered = [...plans].sort((a, b) => (a.createdAt ?? '').localeCompare(b.createdAt ?? ''));
198
+ for (const plan of ordered) {
199
+ for (const action of plan.actions) {
200
+ const key = `${action.kind}\n${action.label}\n${action.model}`;
201
+ const entry = seen.get(key);
202
+ if (entry === undefined) {
203
+ seen.set(key, {
204
+ kind: action.kind,
205
+ label: action.label,
206
+ model: action.model,
207
+ appearances: 1,
208
+ firstPlanned: plan.createdAt ?? null,
209
+ lastPlanned: plan.createdAt ?? null,
210
+ });
211
+ } else {
212
+ entry.appearances += 1;
213
+ entry.lastPlanned = plan.createdAt ?? entry.lastPlanned;
214
+ }
215
+ }
216
+ }
217
+ const repeatedPlanActions = [...seen.values()]
218
+ .filter((entry) => entry.appearances >= 2)
219
+ .sort((a, b) => b.appearances - a.appearances);
220
+
221
+ return {
222
+ schemaVersion: 1,
223
+ periods,
224
+ labelSeries,
225
+ modelShareSeries,
226
+ cacheShareSeries,
227
+ runs,
228
+ repeatedPlanActions,
229
+ undatedReports,
230
+ };
231
+ }
232
+
233
+ /**
234
+ * Reads one stored `profile --json` document into the slice history needs.
235
+ * Returns null when the JSON is not a profile document — the caller names
236
+ * the file rather than absorbing it.
237
+ */
238
+ export function storedReportFrom(name: string, parsed: unknown): StoredReport | null {
239
+ const doc = parsed as {
240
+ schemaVersion?: number;
241
+ span?: { fromMs: number; toMs: number } | null;
242
+ total?: {
243
+ totalUsd?: number;
244
+ calls?: number;
245
+ inputTokens?: number;
246
+ cacheReadTokens?: number;
247
+ cacheWriteTokens?: number;
248
+ };
249
+ byLabelAndModel?: {
250
+ label?: string;
251
+ model?: string;
252
+ breakdown?: { totalUsd?: number };
253
+ }[];
254
+ };
255
+ if (doc === null || typeof doc !== 'object') return null;
256
+ if (doc.schemaVersion !== 1 || doc.total === undefined || !Array.isArray(doc.byLabelAndModel)) {
257
+ return null;
258
+ }
259
+
260
+ const byLabel = new Map<string, number>();
261
+ const byModel = new Map<string, number>();
262
+ for (const slice of doc.byLabelAndModel) {
263
+ const usd = slice.breakdown?.totalUsd ?? 0;
264
+ const label = slice.label ?? UNLABELLED;
265
+ const model = slice.model ?? 'unknown';
266
+ byLabel.set(label, (byLabel.get(label) ?? 0) + usd);
267
+ byModel.set(model, (byModel.get(model) ?? 0) + usd);
268
+ }
269
+
270
+ const input = doc.total.inputTokens ?? 0;
271
+ const cacheRead = doc.total.cacheReadTokens ?? 0;
272
+ const cacheWrite = doc.total.cacheWriteTokens ?? 0;
273
+ const denominator = input + cacheRead + cacheWrite;
274
+
275
+ return {
276
+ name,
277
+ span: doc.span ?? null,
278
+ totalUsd: doc.total.totalUsd ?? 0,
279
+ calls: doc.total.calls ?? 0,
280
+ byLabel,
281
+ byModel,
282
+ cacheReadShare: denominator > 0 ? cacheRead / denominator : null,
283
+ };
284
+ }
package/src/index.ts CHANGED
@@ -47,6 +47,8 @@ export { assignSources, fleetRollup } from './fleet.js';
47
47
  export { buildPlan, planLabelName } from './plan.js';
48
48
  export type { PlanAction, PlanActionKind, PlanAssumption, PlanDocument } from './plan.js';
49
49
  export { verifyPlan } from './verify.js';
50
+ export { buildHistory, storedReportFrom, MIN_RUN } from './history.js';
51
+ export type { HistoryDocument, HistoryRun, RepeatedPlanAction, StoredReport } from './history.js';
50
52
  export type { CannotTellReason, PlanVerification, VerifiedAction, VerifyOutcome } from './verify.js';
51
53
  export type { FleetSource, FleetRollup } from './fleet.js';
52
54
  export type { MeasuredUsage, LabelCoverage } from './measured-profile.js';