crewly 1.20.302 → 1.20.303
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/config/roles/developer/prompt.md +7 -0
- package/config/roles/fullstack-dev/prompt.md +7 -0
- package/config/roles/product-manager/prompt.md +7 -0
- package/config/skills/orchestrator/usage-categories/SKILL.md +59 -0
- package/config/skills/orchestrator/usage-categories/execute.sh +81 -0
- package/config/skills/orchestrator/usage-categories/execute.test.sh +45 -0
- package/config/skills/orchestrator/usage-report/SKILL.md +71 -0
- package/config/skills/orchestrator/usage-report/execute.sh +84 -0
- package/config/skills/orchestrator/usage-report/execute.test.sh +39 -0
- package/config/skills/team-leader/usage-report/SKILL.md +71 -0
- package/config/skills/team-leader/usage-report/execute.sh +84 -0
- package/config/skills/team-leader/usage-report/execute.test.sh +39 -0
- package/dist/backend/backend/src/constants.d.ts +11 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +11 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts +36 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js +158 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts +15 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js +26 -0
- package/dist/backend/backend/src/controllers/usage-ledger/usage-ledger.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +10 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +75 -17
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +3 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts +32 -0
- package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js +42 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +26 -6
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.js +59 -5
- package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +101 -0
- package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts +58 -0
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.d.ts.map +1 -0
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js +100 -0
- package/dist/backend/backend/src/services/monitoring/background-work-watchdog.js.map +1 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +3 -0
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +7 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +15 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
- package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +42 -2
- package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-context.service.js +66 -5
- package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/trace-recorder.js +11 -0
- package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -1
- package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts +28 -0
- package/dist/backend/backend/src/services/usage-ledger/categories-param.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/categories-param.js +67 -0
- package/dist/backend/backend/src/services/usage-ledger/categories-param.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts +37 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.js +49 -0
- package/dist/backend/backend/src/services/usage-ledger/excerpt.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/index.d.ts +14 -0
- package/dist/backend/backend/src/services/usage-ledger/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/index.js +14 -0
- package/dist/backend/backend/src/services/usage-ledger/index.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts +100 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js +189 -0
- package/dist/backend/backend/src/services/usage-ledger/ledger-rollup.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts +41 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.js +71 -0
- package/dist/backend/backend/src/services/usage-ledger/owner-spans.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts +47 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.js +106 -0
- package/dist/backend/backend/src/services/usage-ledger/team-directory.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts +101 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js +263 -0
- package/dist/backend/backend/src/services/usage-ledger/unit-classifier.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts +96 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js +166 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-categories.store.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts +90 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js +294 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.backfill.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts +102 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js +314 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.recorder.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts +62 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js +106 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.runtime.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts +52 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js +95 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.store.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts +127 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js +19 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-ledger.types.js.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts +124 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js +372 -0
- package/dist/backend/backend/src/services/usage-ledger/usage-report.service.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +11 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +11 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +26 -6
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.js +59 -5
- package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +35 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +101 -0
- package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js +3 -0
- package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +24 -0
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +63 -1
- package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +42 -2
- package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-context.service.js +66 -5
- package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/trace-recorder.js +11 -0
- package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -1
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts +44 -0
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.d.ts.map +1 -0
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js +52 -0
- package/dist/cli/backend/src/services/usage-ledger/ledger-hooks.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Append-only storage of ledger facts: one JSON object per line, one file per
|
|
3
|
+
* UTC month (`2026-10.jsonl`), plus `backfill.jsonl` for facts rebuilt from
|
|
4
|
+
* history. There is no update and no delete: a fact is written once.
|
|
5
|
+
*
|
|
6
|
+
* @module services/usage-ledger/usage-ledger.store
|
|
7
|
+
*/
|
|
8
|
+
import type { LedgerFact, LedgerFile } from './usage-ledger.types.js';
|
|
9
|
+
/** Directory under CREWLY_HOME that holds the ledger. */
|
|
10
|
+
export declare const LEDGER_DIR_NAME = "usage-ledger";
|
|
11
|
+
/** File of facts rebuilt from history. */
|
|
12
|
+
export declare const BACKFILL_FILE = "backfill.jsonl";
|
|
13
|
+
/** Month file name of an ISO time (UTC). */
|
|
14
|
+
export declare function monthFileFor(ts: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* The ledger's files. Writes are queued and applied in order.
|
|
17
|
+
*/
|
|
18
|
+
export declare class UsageLedgerStore {
|
|
19
|
+
readonly dir: string;
|
|
20
|
+
private chain;
|
|
21
|
+
private dirReady;
|
|
22
|
+
/**
|
|
23
|
+
* @param dir - Ledger directory (default `~/.crewly/usage-ledger`)
|
|
24
|
+
*/
|
|
25
|
+
constructor(dir?: string);
|
|
26
|
+
/**
|
|
27
|
+
* Queue a fact. Never throws; a failed write is dropped (accounting must not
|
|
28
|
+
* break the harness).
|
|
29
|
+
*
|
|
30
|
+
* @param fact - The fact
|
|
31
|
+
* @param file - `live` (month file of the fact) or `backfill`
|
|
32
|
+
*/
|
|
33
|
+
append(fact: LedgerFact, file?: LedgerFile): void;
|
|
34
|
+
/**
|
|
35
|
+
* Queue several facts as one write.
|
|
36
|
+
*
|
|
37
|
+
* @param facts - The facts
|
|
38
|
+
* @param file - Target
|
|
39
|
+
*/
|
|
40
|
+
appendMany(facts: LedgerFact[], file?: LedgerFile): void;
|
|
41
|
+
/**
|
|
42
|
+
* Wait for every queued write.
|
|
43
|
+
*/
|
|
44
|
+
flush(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* The ledger's fact files.
|
|
47
|
+
*
|
|
48
|
+
* @returns File names (month files oldest first, then the backfill file)
|
|
49
|
+
*/
|
|
50
|
+
listFiles(): Promise<string[]>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=usage-ledger.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-ledger.store.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/usage-ledger/usage-ledger.store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEtE,yDAAyD;AACzD,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAC9C,0CAA0C;AAC1C,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAE9C,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAOhB,QAAQ,CAAC,GAAG,EAAE,MAAM;IANhC,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,QAAQ,CAAS;IAEzB;;OAEG;gBACkB,GAAG,GAAE,MAAwD;IAElF;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,UAAmB,GAAG,IAAI;IAIzD;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,UAAmB,GAAG,IAAI;IAwBhE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CASpC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Append-only storage of ledger facts: one JSON object per line, one file per
|
|
3
|
+
* UTC month (`2026-10.jsonl`), plus `backfill.jsonl` for facts rebuilt from
|
|
4
|
+
* history. There is no update and no delete: a fact is written once.
|
|
5
|
+
*
|
|
6
|
+
* @module services/usage-ledger/usage-ledger.store
|
|
7
|
+
*/
|
|
8
|
+
import { promises as fs } from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
11
|
+
/** Directory under CREWLY_HOME that holds the ledger. */
|
|
12
|
+
export const LEDGER_DIR_NAME = 'usage-ledger';
|
|
13
|
+
/** File of facts rebuilt from history. */
|
|
14
|
+
export const BACKFILL_FILE = 'backfill.jsonl';
|
|
15
|
+
/** Month file name of an ISO time (UTC). */
|
|
16
|
+
export function monthFileFor(ts) {
|
|
17
|
+
return `${/^\d{4}-\d{2}/.test(ts) ? ts.slice(0, 7) : new Date().toISOString().slice(0, 7)}.jsonl`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The ledger's files. Writes are queued and applied in order.
|
|
21
|
+
*/
|
|
22
|
+
export class UsageLedgerStore {
|
|
23
|
+
dir;
|
|
24
|
+
chain = Promise.resolve();
|
|
25
|
+
dirReady = false;
|
|
26
|
+
/**
|
|
27
|
+
* @param dir - Ledger directory (default `~/.crewly/usage-ledger`)
|
|
28
|
+
*/
|
|
29
|
+
constructor(dir = path.join(getCrewlyHomePath(), LEDGER_DIR_NAME)) {
|
|
30
|
+
this.dir = dir;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Queue a fact. Never throws; a failed write is dropped (accounting must not
|
|
34
|
+
* break the harness).
|
|
35
|
+
*
|
|
36
|
+
* @param fact - The fact
|
|
37
|
+
* @param file - `live` (month file of the fact) or `backfill`
|
|
38
|
+
*/
|
|
39
|
+
append(fact, file = 'live') {
|
|
40
|
+
this.appendMany([fact], file);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Queue several facts as one write.
|
|
44
|
+
*
|
|
45
|
+
* @param facts - The facts
|
|
46
|
+
* @param file - Target
|
|
47
|
+
*/
|
|
48
|
+
appendMany(facts, file = 'live') {
|
|
49
|
+
if (facts.length === 0)
|
|
50
|
+
return;
|
|
51
|
+
const byFile = new Map();
|
|
52
|
+
for (const fact of facts) {
|
|
53
|
+
const name = file === 'backfill' ? BACKFILL_FILE : monthFileFor(fact.ts);
|
|
54
|
+
const lines = byFile.get(name) ?? [];
|
|
55
|
+
lines.push(JSON.stringify(fact));
|
|
56
|
+
byFile.set(name, lines);
|
|
57
|
+
}
|
|
58
|
+
this.chain = this.chain.then(async () => {
|
|
59
|
+
try {
|
|
60
|
+
if (!this.dirReady) {
|
|
61
|
+
await fs.mkdir(this.dir, { recursive: true });
|
|
62
|
+
this.dirReady = true;
|
|
63
|
+
}
|
|
64
|
+
for (const [name, lines] of byFile) {
|
|
65
|
+
await fs.appendFile(path.join(this.dir, name), `${lines.join('\n')}\n`, 'utf-8');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// dropped
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Wait for every queued write.
|
|
75
|
+
*/
|
|
76
|
+
async flush() {
|
|
77
|
+
await this.chain;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The ledger's fact files.
|
|
81
|
+
*
|
|
82
|
+
* @returns File names (month files oldest first, then the backfill file)
|
|
83
|
+
*/
|
|
84
|
+
async listFiles() {
|
|
85
|
+
try {
|
|
86
|
+
const names = await fs.readdir(this.dir);
|
|
87
|
+
const months = names.filter((n) => /^\d{4}-\d{2}\.jsonl$/.test(n)).sort();
|
|
88
|
+
return names.includes(BACKFILL_FILE) ? [...months, BACKFILL_FILE] : months;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=usage-ledger.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-ledger.store.js","sourceRoot":"","sources":["../../../../../../backend/src/services/usage-ledger/usage-ledger.store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage ledger types: the immutable facts behind per-ticket time and token
|
|
3
|
+
* accounting (specs/2026-10-11-usage-ledger.md).
|
|
4
|
+
*
|
|
5
|
+
* A "unit" is one trace (a ticket, a request, a work item thread, an owner
|
|
6
|
+
* conversation). Facts only ever get appended; every statistic (category,
|
|
7
|
+
* team, owner minutes) is computed from them at report time.
|
|
8
|
+
*
|
|
9
|
+
* @module services/usage-ledger/usage-ledger.types
|
|
10
|
+
*/
|
|
11
|
+
/** Schema version written on every fact. */
|
|
12
|
+
export declare const LEDGER_VERSION = 1;
|
|
13
|
+
/**
|
|
14
|
+
* How a fact was tied to its unit.
|
|
15
|
+
* - `recorded`: the harness knew the unit when it happened.
|
|
16
|
+
* - `inferred`: rebuilt afterwards from timestamps (history backfill).
|
|
17
|
+
*/
|
|
18
|
+
export type Attribution = 'recorded' | 'inferred';
|
|
19
|
+
/** Id of the pseudo-unit that holds an agent's usage while it worked on no ticket. */
|
|
20
|
+
export declare const UNTICKETED_PREFIX = "~none:";
|
|
21
|
+
/** Fields every fact carries. */
|
|
22
|
+
interface FactBase {
|
|
23
|
+
v: typeof LEDGER_VERSION;
|
|
24
|
+
/** ISO time of the thing that happened (the covered hour's start, for usage / busy) */
|
|
25
|
+
ts: string;
|
|
26
|
+
}
|
|
27
|
+
/** What is known about a unit. Several of these merge field by field, first value wins. */
|
|
28
|
+
export interface UnitMetaFact extends FactBase {
|
|
29
|
+
kind: 'unit.meta';
|
|
30
|
+
unitId: string;
|
|
31
|
+
/** `TKT-12` or a project ticket id (`CE-7`) */
|
|
32
|
+
ticketId?: string;
|
|
33
|
+
requestId?: string;
|
|
34
|
+
/** What started the trace (`request`, `owner_message`, `ticket`, …) */
|
|
35
|
+
rootKind?: string;
|
|
36
|
+
title?: string;
|
|
37
|
+
/** The owner's words / the ticket description, cut */
|
|
38
|
+
excerpt?: string;
|
|
39
|
+
team?: string;
|
|
40
|
+
project?: string;
|
|
41
|
+
/** Where the request came from (`slack-dm`, `chat`, …) */
|
|
42
|
+
channel?: string;
|
|
43
|
+
/** Conversation thread the request lives in (Slack thread ref) */
|
|
44
|
+
threadRef?: string;
|
|
45
|
+
/** When the unit began */
|
|
46
|
+
openedAt?: string;
|
|
47
|
+
attribution: Attribution;
|
|
48
|
+
}
|
|
49
|
+
/** An agent worked on a unit (written once per agent and unit). */
|
|
50
|
+
export interface UnitAgentFact extends FactBase {
|
|
51
|
+
kind: 'unit.agent';
|
|
52
|
+
unitId: string;
|
|
53
|
+
agent: string;
|
|
54
|
+
team?: string;
|
|
55
|
+
project?: string;
|
|
56
|
+
attribution: Attribution;
|
|
57
|
+
}
|
|
58
|
+
/** The unit reached a terminal status. */
|
|
59
|
+
export interface UnitClosedFact extends FactBase {
|
|
60
|
+
kind: 'unit.closed';
|
|
61
|
+
unitId: string;
|
|
62
|
+
status: string;
|
|
63
|
+
attribution: Attribution;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Token usage of one agent on one unit within one hour (a delta: the sum of
|
|
67
|
+
* the facts is the total). `share` is the fraction of the underlying events
|
|
68
|
+
* this unit carries (1, or 1/n when the turn was about n tickets); token
|
|
69
|
+
* fields are the raw event sums, before the share.
|
|
70
|
+
*/
|
|
71
|
+
export interface UsageFact extends FactBase {
|
|
72
|
+
kind: 'usage';
|
|
73
|
+
unitId: string;
|
|
74
|
+
agent: string;
|
|
75
|
+
team?: string;
|
|
76
|
+
model: string;
|
|
77
|
+
runtime?: string;
|
|
78
|
+
events: number;
|
|
79
|
+
share: number;
|
|
80
|
+
/** Every input token, cached ones included (see eventTokens) */
|
|
81
|
+
input: number;
|
|
82
|
+
cachedInput: number;
|
|
83
|
+
output: number;
|
|
84
|
+
cacheWrite: number;
|
|
85
|
+
/** Cost-weighted tokens (see eventTokens) */
|
|
86
|
+
budget: number;
|
|
87
|
+
/** Estimated USD at the model's rate (cache-aware) */
|
|
88
|
+
costUsd: number;
|
|
89
|
+
attribution: Attribution;
|
|
90
|
+
}
|
|
91
|
+
/** Agent busy time on one unit within one hour (a delta, like {@link UsageFact}). */
|
|
92
|
+
export interface BusyFact extends FactBase {
|
|
93
|
+
kind: 'busy';
|
|
94
|
+
unitId: string;
|
|
95
|
+
agent: string;
|
|
96
|
+
team?: string;
|
|
97
|
+
turns: number;
|
|
98
|
+
busyMs: number;
|
|
99
|
+
share: number;
|
|
100
|
+
attribution: Attribution;
|
|
101
|
+
}
|
|
102
|
+
/** The owner wrote to a unit (a message delivered to an agent on it). */
|
|
103
|
+
export interface OwnerMessageFact extends FactBase {
|
|
104
|
+
kind: 'owner.message';
|
|
105
|
+
unitId: string;
|
|
106
|
+
attribution: Attribution;
|
|
107
|
+
}
|
|
108
|
+
/** Any ledger fact. */
|
|
109
|
+
export type LedgerFact = UnitMetaFact | UnitAgentFact | UnitClosedFact | UsageFact | BusyFact | OwnerMessageFact;
|
|
110
|
+
/** Where a fact is written. */
|
|
111
|
+
export type LedgerFile = 'live' | 'backfill';
|
|
112
|
+
/** One tokens + cost tally. */
|
|
113
|
+
export interface Tally {
|
|
114
|
+
input: number;
|
|
115
|
+
cachedInput: number;
|
|
116
|
+
output: number;
|
|
117
|
+
cacheWrite: number;
|
|
118
|
+
/** Raw total: input (cached included) + output */
|
|
119
|
+
total: number;
|
|
120
|
+
/** Cost-weighted total */
|
|
121
|
+
budget: number;
|
|
122
|
+
costUsd: number;
|
|
123
|
+
}
|
|
124
|
+
/** A zeroed {@link Tally}. */
|
|
125
|
+
export declare function emptyTally(): Tally;
|
|
126
|
+
export {};
|
|
127
|
+
//# sourceMappingURL=usage-ledger.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-ledger.types.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/usage-ledger/usage-ledger.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage ledger types: the immutable facts behind per-ticket time and token
|
|
3
|
+
* accounting (specs/2026-10-11-usage-ledger.md).
|
|
4
|
+
*
|
|
5
|
+
* A "unit" is one trace (a ticket, a request, a work item thread, an owner
|
|
6
|
+
* conversation). Facts only ever get appended; every statistic (category,
|
|
7
|
+
* team, owner minutes) is computed from them at report time.
|
|
8
|
+
*
|
|
9
|
+
* @module services/usage-ledger/usage-ledger.types
|
|
10
|
+
*/
|
|
11
|
+
/** Schema version written on every fact. */
|
|
12
|
+
export const LEDGER_VERSION = 1;
|
|
13
|
+
/** Id of the pseudo-unit that holds an agent's usage while it worked on no ticket. */
|
|
14
|
+
export const UNTICKETED_PREFIX = '~none:';
|
|
15
|
+
/** A zeroed {@link Tally}. */
|
|
16
|
+
export function emptyTally() {
|
|
17
|
+
return { input: 0, cachedInput: 0, output: 0, cacheWrite: 0, total: 0, budget: 0, costUsd: 0 };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=usage-ledger.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-ledger.types.js","sourceRoot":"","sources":["../../../../../../backend/src/services/usage-ledger/usage-ledger.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,4CAA4C;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAShC,sFAAsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAmH1C,8BAA8B;AAC9B,MAAM,UAAU,UAAU;IACzB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAChG,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage report: where the owner's time and the agents' tokens went, per
|
|
3
|
+
* category / team / project / agent / ticket.
|
|
4
|
+
*
|
|
5
|
+
* Everything is computed from the ledger facts at call time. Categories are
|
|
6
|
+
* applied here (see {@link UnitClassifier}) and never stored in the facts.
|
|
7
|
+
* Owner minutes follow the span heuristic of owner-spans.ts. Figures are
|
|
8
|
+
* summed per UTC hour, so a window edge is accurate to the hour.
|
|
9
|
+
*
|
|
10
|
+
* @module services/usage-ledger/usage-report.service
|
|
11
|
+
*/
|
|
12
|
+
import type { LedgerRollup } from './ledger-rollup.js';
|
|
13
|
+
import type { TeamLookup } from './team-directory.js';
|
|
14
|
+
import { type CategoryDef } from './usage-categories.store.js';
|
|
15
|
+
import { UnitClassifier } from './unit-classifier.js';
|
|
16
|
+
import { type Tally } from './usage-ledger.types.js';
|
|
17
|
+
/** Ways to group a report. */
|
|
18
|
+
export declare const REPORT_DIMENSIONS: readonly ["category", "team", "project", "agent", "ticket"];
|
|
19
|
+
/** A grouping. */
|
|
20
|
+
export type ReportDimension = (typeof REPORT_DIMENSIONS)[number];
|
|
21
|
+
/** Request for a report. */
|
|
22
|
+
export interface ReportQuery {
|
|
23
|
+
/** Window start (ms) */
|
|
24
|
+
sinceMs: number;
|
|
25
|
+
/** Window end (ms) */
|
|
26
|
+
untilMs: number;
|
|
27
|
+
by: ReportDimension;
|
|
28
|
+
/** Categories to use instead of the stored ones (ad hoc) */
|
|
29
|
+
categories?: CategoryDef[];
|
|
30
|
+
/** Keep only these groups (by name), e.g. two categories to compare */
|
|
31
|
+
only?: string[];
|
|
32
|
+
/** Groups returned (default 50) */
|
|
33
|
+
limit?: number;
|
|
34
|
+
}
|
|
35
|
+
/** One ticket in a group. */
|
|
36
|
+
export interface TicketLine {
|
|
37
|
+
unitId: string;
|
|
38
|
+
ticketId?: string;
|
|
39
|
+
title: string;
|
|
40
|
+
team?: string;
|
|
41
|
+
ownerMinutes: number;
|
|
42
|
+
agentBusyMinutes: number;
|
|
43
|
+
tokens: number;
|
|
44
|
+
costUsd: number;
|
|
45
|
+
inferred: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** One group of a report. */
|
|
48
|
+
export interface ReportGroup {
|
|
49
|
+
key: string;
|
|
50
|
+
ownerMinutes: number;
|
|
51
|
+
agentBusyMinutes: number;
|
|
52
|
+
/** Token figures: `budget` is the cost-weighted headline, `total` the raw sum */
|
|
53
|
+
tokens: Tally;
|
|
54
|
+
costUsd: number;
|
|
55
|
+
ticketCount: number;
|
|
56
|
+
topTickets: TicketLine[];
|
|
57
|
+
}
|
|
58
|
+
/** A report. */
|
|
59
|
+
export interface UsageReport {
|
|
60
|
+
window: {
|
|
61
|
+
since: string;
|
|
62
|
+
until: string;
|
|
63
|
+
};
|
|
64
|
+
by: ReportDimension;
|
|
65
|
+
categories: {
|
|
66
|
+
setId: string;
|
|
67
|
+
source: 'stored' | 'ad-hoc' | 'default';
|
|
68
|
+
names: string[];
|
|
69
|
+
llmClassified: number;
|
|
70
|
+
unclassified: number;
|
|
71
|
+
} | null;
|
|
72
|
+
totals: Omit<ReportGroup, 'key' | 'topTickets'>;
|
|
73
|
+
groups: ReportGroup[];
|
|
74
|
+
/** Voice / Slack friendly text */
|
|
75
|
+
summary: string;
|
|
76
|
+
notes: string[];
|
|
77
|
+
}
|
|
78
|
+
/** Where the report gets its inputs. */
|
|
79
|
+
export interface ReportDeps {
|
|
80
|
+
rollup: LedgerRollup;
|
|
81
|
+
directory: TeamLookup;
|
|
82
|
+
classifier: UnitClassifier;
|
|
83
|
+
/** Stored category definitions */
|
|
84
|
+
categories: () => Promise<CategoryDef[]>;
|
|
85
|
+
/** Called before reading so buffered facts are on disk and in the rollup */
|
|
86
|
+
sync: () => Promise<void>;
|
|
87
|
+
now?: () => number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Parse a window start.
|
|
91
|
+
*
|
|
92
|
+
* @param value - `7d`, `24h`, `2w`, `90m`, or an ISO date / time
|
|
93
|
+
* @param nowMs - Now (ms)
|
|
94
|
+
* @returns Epoch ms, or null when unreadable
|
|
95
|
+
*/
|
|
96
|
+
export declare function parseSince(value: string, nowMs: number): number | null;
|
|
97
|
+
/**
|
|
98
|
+
* Format minutes for speech: `45m`, `2h10m`, `1d3h`.
|
|
99
|
+
*
|
|
100
|
+
* @param minutes - Minutes
|
|
101
|
+
* @returns Short text
|
|
102
|
+
*/
|
|
103
|
+
export declare function formatMinutes(minutes: number): string;
|
|
104
|
+
/**
|
|
105
|
+
* Builds reports from the ledger.
|
|
106
|
+
*/
|
|
107
|
+
export declare class UsageReportService {
|
|
108
|
+
private readonly deps;
|
|
109
|
+
constructor(deps: ReportDeps);
|
|
110
|
+
/**
|
|
111
|
+
* Compute a report.
|
|
112
|
+
*
|
|
113
|
+
* @param query - Window, grouping, optional ad-hoc categories
|
|
114
|
+
* @returns The report
|
|
115
|
+
*/
|
|
116
|
+
report(query: ReportQuery): Promise<UsageReport>;
|
|
117
|
+
private teamOf;
|
|
118
|
+
/** The team a ticket is credited to: the recorded one, else the team with the most spend. */
|
|
119
|
+
private primaryTeam;
|
|
120
|
+
private projectOf;
|
|
121
|
+
private labelOf;
|
|
122
|
+
private summarize;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=usage-report.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-report.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/usage-ledger/usage-report.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,oBAAoB,CAAC;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAsC,cAAc,EAAyB,MAAM,sBAAsB,CAAC;AACjH,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEjE,8BAA8B;AAC9B,eAAO,MAAM,iBAAiB,6DAA8D,CAAC;AAC7F,kBAAkB;AAClB,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC3B,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,eAAe,CAAC;IACpB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3B,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,6BAA6B;AAC7B,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,6BAA6B;AAC7B,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,MAAM,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,EAAE,EAAE,eAAe,CAAC;IACpB,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5I,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,YAAY,CAAC,CAAC;IAChD,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,EAAE,cAAc,CAAC;IAC3B,kCAAkC;IAClC,UAAU,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAWD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQtE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrD;AAsCD;;GAEG;AACH,qBAAa,kBAAkB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAE7C;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IA+NtD,OAAO,CAAC,MAAM;IAId,6FAA6F;IAC7F,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,SAAS;CAsBjB"}
|