@rasensio/aidlc 1.2.0 → 1.3.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cli.js +4 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/claim.d.ts +15 -0
  5. package/dist/commands/claim.d.ts.map +1 -0
  6. package/dist/commands/claim.js +122 -0
  7. package/dist/commands/claim.js.map +1 -0
  8. package/dist/commands/cost.d.ts +12 -0
  9. package/dist/commands/cost.d.ts.map +1 -0
  10. package/dist/commands/cost.js +409 -0
  11. package/dist/commands/cost.js.map +1 -0
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +38 -2
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/status.d.ts.map +1 -1
  16. package/dist/commands/status.js +30 -1
  17. package/dist/commands/status.js.map +1 -1
  18. package/dist/commands/transition.js +9 -0
  19. package/dist/commands/transition.js.map +1 -1
  20. package/dist/core/types.d.ts +8 -0
  21. package/dist/core/types.d.ts.map +1 -1
  22. package/dist/cost/config.d.ts +8 -0
  23. package/dist/cost/config.d.ts.map +1 -0
  24. package/dist/cost/config.js +37 -0
  25. package/dist/cost/config.js.map +1 -0
  26. package/dist/cost/hooks/claude-code.d.ts +29 -0
  27. package/dist/cost/hooks/claude-code.d.ts.map +1 -0
  28. package/dist/cost/hooks/claude-code.js +101 -0
  29. package/dist/cost/hooks/claude-code.js.map +1 -0
  30. package/dist/cost/hooks/kiro.d.ts +17 -0
  31. package/dist/cost/hooks/kiro.d.ts.map +1 -0
  32. package/dist/cost/hooks/kiro.js +66 -0
  33. package/dist/cost/hooks/kiro.js.map +1 -0
  34. package/dist/cost/ledger.d.ts +70 -0
  35. package/dist/cost/ledger.d.ts.map +1 -0
  36. package/dist/cost/ledger.js +314 -0
  37. package/dist/cost/ledger.js.map +1 -0
  38. package/dist/cost/providers/claude-code.d.ts +20 -0
  39. package/dist/cost/providers/claude-code.d.ts.map +1 -0
  40. package/dist/cost/providers/claude-code.js +116 -0
  41. package/dist/cost/providers/claude-code.js.map +1 -0
  42. package/dist/cost/providers/kiro.d.ts +19 -0
  43. package/dist/cost/providers/kiro.d.ts.map +1 -0
  44. package/dist/cost/providers/kiro.js +147 -0
  45. package/dist/cost/providers/kiro.js.map +1 -0
  46. package/dist/cost/providers/provider.d.ts +36 -0
  47. package/dist/cost/providers/provider.d.ts.map +1 -0
  48. package/dist/cost/providers/provider.js +21 -0
  49. package/dist/cost/providers/provider.js.map +1 -0
  50. package/dist/cost/rates-bundled.d.ts +11 -0
  51. package/dist/cost/rates-bundled.d.ts.map +1 -0
  52. package/dist/cost/rates-bundled.js +23 -0
  53. package/dist/cost/rates-bundled.js.map +1 -0
  54. package/dist/cost/rates.d.ts +42 -0
  55. package/dist/cost/rates.d.ts.map +1 -0
  56. package/dist/cost/rates.js +190 -0
  57. package/dist/cost/rates.js.map +1 -0
  58. package/dist/cost/recorder.d.ts +57 -0
  59. package/dist/cost/recorder.d.ts.map +1 -0
  60. package/dist/cost/recorder.js +339 -0
  61. package/dist/cost/recorder.js.map +1 -0
  62. package/dist/cost/report.d.ts +44 -0
  63. package/dist/cost/report.d.ts.map +1 -0
  64. package/dist/cost/report.js +164 -0
  65. package/dist/cost/report.js.map +1 -0
  66. package/dist/cost/sessions.d.ts +40 -0
  67. package/dist/cost/sessions.d.ts.map +1 -0
  68. package/dist/cost/sessions.js +200 -0
  69. package/dist/cost/sessions.js.map +1 -0
  70. package/dist/cost/sync.d.ts +24 -0
  71. package/dist/cost/sync.d.ts.map +1 -0
  72. package/dist/cost/sync.js +191 -0
  73. package/dist/cost/sync.js.map +1 -0
  74. package/dist/cost/types.d.ts +116 -0
  75. package/dist/cost/types.d.ts.map +1 -0
  76. package/dist/cost/types.js +13 -0
  77. package/dist/cost/types.js.map +1 -0
  78. package/dist/setup/setup-compute.d.ts +6 -0
  79. package/dist/setup/setup-compute.d.ts.map +1 -1
  80. package/dist/setup/setup-compute.js +3 -0
  81. package/dist/setup/setup-compute.js.map +1 -1
  82. package/package.json +11 -14
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Session ledger: durable session↔instance mapping (FR1).
3
+ *
4
+ * sessions.ndjson is append-only; the instance.yaml claim field remains
5
+ * concurrency control only. Attribution intervals are derived here.
6
+ *
7
+ * The active-session stash (design §2.3) joins platform session ids to
8
+ * claims: SessionStart hooks write stash entries; `aidlc claim` resolves
9
+ * the current session with a strict single-candidate rule.
10
+ *
11
+ * Design: design.md §2.2, §2.3, §4.3
12
+ */
13
+ import { readFileSync, writeFileSync, readdirSync, unlinkSync, openSync, writeSync, closeSync, constants, mkdirSync, existsSync, } from 'node:fs';
14
+ import { dirname, join } from 'node:path';
15
+ import { execFileSync } from 'node:child_process';
16
+ import { SESSION_ID_RE } from './types.js';
17
+ const EVENTS = new Set(['claim', 'renew', 'release']);
18
+ const STASH_TTL_MS = 48 * 60 * 60 * 1000;
19
+ export function sessionsPath(projectRoot, instance) {
20
+ return join(projectRoot, '.aidlc', 'state', instance, 'sessions.ndjson');
21
+ }
22
+ export function stashDir(projectRoot) {
23
+ return join(projectRoot, '.aidlc', 'cost', 'active-sessions');
24
+ }
25
+ function isValidEvent(e) {
26
+ if (typeof e !== 'object' || e === null)
27
+ return false;
28
+ const r = e;
29
+ return (EVENTS.has(r.event) &&
30
+ typeof r.session_id === 'string' &&
31
+ SESSION_ID_RE.test(r.session_id) &&
32
+ (r.id_source === 'platform' || r.id_source === 'agent') &&
33
+ typeof r.agent === 'string' &&
34
+ typeof r.timestamp === 'string' &&
35
+ !Number.isNaN(Date.parse(r.timestamp)));
36
+ }
37
+ /** Append a session event (O_APPEND whole-line write). */
38
+ export function appendSessionEvent(path, event) {
39
+ if (!isValidEvent(event))
40
+ throw new Error('invalid session event');
41
+ mkdirSync(dirname(path), { recursive: true });
42
+ const fd = openSync(path, constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT);
43
+ try {
44
+ writeSync(fd, JSON.stringify(event) + '\n');
45
+ }
46
+ finally {
47
+ closeSync(fd);
48
+ }
49
+ }
50
+ /** Read valid session events; missing file → empty; bad lines skipped. */
51
+ export function readSessionEvents(path) {
52
+ let raw;
53
+ try {
54
+ raw = readFileSync(path, 'utf8');
55
+ }
56
+ catch (err) {
57
+ if (err.code === 'ENOENT')
58
+ return [];
59
+ throw err;
60
+ }
61
+ const events = [];
62
+ let skipped = 0;
63
+ for (const line of raw.split('\n')) {
64
+ const t = line.trim();
65
+ if (t === '')
66
+ continue;
67
+ try {
68
+ const parsed = JSON.parse(t);
69
+ if (isValidEvent(parsed))
70
+ events.push(parsed);
71
+ else
72
+ skipped++;
73
+ }
74
+ catch {
75
+ skipped++;
76
+ }
77
+ }
78
+ if (skipped > 0)
79
+ process.stderr.write(`${path}: skipped ${skipped} invalid line(s)\n`);
80
+ return events;
81
+ }
82
+ /**
83
+ * Resolve attribution intervals from session events (FR1.3).
84
+ *
85
+ * claim → release pairs per session; an unreleased claim is bounded by
86
+ * min(now, lastEventForSession + claimTimeoutMinutes) and marked open.
87
+ * Renew events extend the liveness bound of an open claim.
88
+ */
89
+ export function resolveIntervals(events, claimTimeoutMinutes, now = new Date()) {
90
+ const intervals = [];
91
+ const open = new Map();
92
+ for (const e of events) {
93
+ const cur = open.get(e.session_id);
94
+ if (e.event === 'claim') {
95
+ // A re-claim without release closes the previous interval at the new claim.
96
+ if (cur) {
97
+ intervals.push(closedInterval(cur.claim, e.timestamp, false));
98
+ }
99
+ open.set(e.session_id, { claim: e, lastSeen: e.timestamp });
100
+ }
101
+ else if (e.event === 'renew' && cur) {
102
+ cur.lastSeen = e.timestamp;
103
+ }
104
+ else if (e.event === 'release' && cur) {
105
+ intervals.push(closedInterval(cur.claim, e.timestamp, false));
106
+ open.delete(e.session_id);
107
+ }
108
+ }
109
+ for (const { claim, lastSeen } of open.values()) {
110
+ const bound = Math.min(now.getTime(), Date.parse(lastSeen) + claimTimeoutMinutes * 60_000);
111
+ intervals.push(closedInterval(claim, new Date(bound).toISOString(), true));
112
+ }
113
+ return intervals;
114
+ }
115
+ function closedInterval(claim, to, open) {
116
+ return {
117
+ session_id: claim.session_id,
118
+ id_source: claim.id_source,
119
+ agent: claim.agent,
120
+ from: claim.timestamp,
121
+ to,
122
+ open,
123
+ };
124
+ }
125
+ // ---------------------------------------------------------------------------
126
+ // Active-session stash (design §2.3)
127
+ // ---------------------------------------------------------------------------
128
+ /** Write a stash entry for a just-started platform session. */
129
+ export function stashSession(projectRoot, session) {
130
+ if (!SESSION_ID_RE.test(session.session_id))
131
+ throw new Error('invalid session id');
132
+ const dir = stashDir(projectRoot);
133
+ mkdirSync(dir, { recursive: true });
134
+ writeFileSync(join(dir, `${session.session_id}.json`), JSON.stringify(session) + '\n');
135
+ }
136
+ /** Remove stash entries older than the TTL. Called opportunistically. */
137
+ export function pruneStash(projectRoot, now = new Date()) {
138
+ const dir = stashDir(projectRoot);
139
+ if (!existsSync(dir))
140
+ return;
141
+ for (const f of readdirSync(dir)) {
142
+ if (!f.endsWith('.json'))
143
+ continue;
144
+ try {
145
+ const entry = JSON.parse(readFileSync(join(dir, f), 'utf8'));
146
+ if (now.getTime() - Date.parse(entry.started_at) > STASH_TTL_MS) {
147
+ unlinkSync(join(dir, f));
148
+ }
149
+ }
150
+ catch {
151
+ unlinkSync(join(dir, f));
152
+ }
153
+ }
154
+ }
155
+ /** Resolve a directory to its repo identity (git common dir), or null. */
156
+ export function repoIdentity(cwd) {
157
+ try {
158
+ const out = execFileSync('git', ['rev-parse', '--git-common-dir'], {
159
+ cwd,
160
+ encoding: 'utf8',
161
+ stdio: ['ignore', 'pipe', 'ignore'],
162
+ }).trim();
163
+ return join(cwd, out);
164
+ }
165
+ catch {
166
+ return null;
167
+ }
168
+ }
169
+ /**
170
+ * Find the current platform session with the strict single-candidate rule:
171
+ * exactly one live stash entry whose repo identity matches → that session;
172
+ * zero or multiple → null (caller degrades to id_source: agent).
173
+ */
174
+ export function resolveCurrentSession(projectRoot, now = new Date()) {
175
+ pruneStash(projectRoot, now);
176
+ const dir = stashDir(projectRoot);
177
+ if (!existsSync(dir))
178
+ return null;
179
+ const here = repoIdentity(projectRoot);
180
+ const candidates = [];
181
+ for (const f of readdirSync(dir)) {
182
+ if (!f.endsWith('.json'))
183
+ continue;
184
+ try {
185
+ const entry = JSON.parse(readFileSync(join(dir, f), 'utf8'));
186
+ const theirs = repoIdentity(entry.cwd);
187
+ if (here !== null && theirs !== null && here === theirs) {
188
+ candidates.push(entry);
189
+ }
190
+ else if (here === null && entry.cwd === projectRoot) {
191
+ candidates.push(entry);
192
+ }
193
+ }
194
+ catch {
195
+ // Unreadable stash entries are ignored here; pruneStash removes them.
196
+ }
197
+ }
198
+ return candidates.length === 1 ? candidates[0] : null;
199
+ }
200
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/cost/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Post-hoc reconciliation: `aidlc cost sync` (FR4).
3
+ *
4
+ * Correlates platform usage records with instances via sessions.ndjson.
5
+ * Platform-id sessions match records by id equality; agent-id sessions
6
+ * match by interval overlap with a strict single-candidate rule. Appends
7
+ * `reconciled` entries only where coverage is not already held at equal or
8
+ * higher fidelity. Idempotent by construction; never guesses — ambiguity
9
+ * goes to the report, unattributable usage to unattributed.ndjson.
10
+ *
11
+ * Design: design.md §4.4
12
+ */
13
+ import { type ProviderEnv } from './providers/provider.js';
14
+ export interface SyncReport {
15
+ attributed: number;
16
+ skipped: string[];
17
+ unattributed: number;
18
+ }
19
+ /**
20
+ * Reconcile one or all instances. Streams platform records session by
21
+ * session; reports everything it skipped and why (FR4.3).
22
+ */
23
+ export declare function syncCosts(projectRoot: string, instanceFilter: string | null, claimTimeoutMinutes: number, env?: ProviderEnv): Promise<SyncReport>;
24
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/cost/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKxE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAkBD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,mBAAmB,EAAE,MAAM,EAC3B,GAAG,GAAE,WAA6B,GACjC,OAAO,CAAC,UAAU,CAAC,CA0GrB"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Post-hoc reconciliation: `aidlc cost sync` (FR4).
3
+ *
4
+ * Correlates platform usage records with instances via sessions.ndjson.
5
+ * Platform-id sessions match records by id equality; agent-id sessions
6
+ * match by interval overlap with a strict single-candidate rule. Appends
7
+ * `reconciled` entries only where coverage is not already held at equal or
8
+ * higher fidelity. Idempotent by construction; never guesses — ambiguity
9
+ * goes to the report, unattributable usage to unattributed.ndjson.
10
+ *
11
+ * Design: design.md §4.4
12
+ */
13
+ import { existsSync, readdirSync, statSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { readEntries, appendEntry, ledgerPath, unattributedPath } from './ledger.js';
16
+ import { sessionsPath, readSessionEvents, resolveIntervals } from './sessions.js';
17
+ import { getProvider } from './providers/provider.js';
18
+ import { transcriptRoot } from './providers/claude-code.js';
19
+ import { phaseWindows } from './recorder.js';
20
+ import { logCapture } from './recorder.js';
21
+ function coveredWindows(entries, sessionId, minRank) {
22
+ const rank = { metered: 3, reconciled: 2, estimated: 1, unknown: 0 };
23
+ return entries
24
+ .filter((e) => e.session_id === sessionId && rank[e.fidelity] >= minRank && e.units !== null)
25
+ .map((e) => ({ from: Date.parse(e.coverage.from), to: Date.parse(e.coverage.to) }));
26
+ }
27
+ function overlapsAny(at, windows) {
28
+ return windows.some((w) => at >= w.from && at <= w.to);
29
+ }
30
+ /**
31
+ * Reconcile one or all instances. Streams platform records session by
32
+ * session; reports everything it skipped and why (FR4.3).
33
+ */
34
+ export async function syncCosts(projectRoot, instanceFilter, claimTimeoutMinutes, env = { projectRoot }) {
35
+ const report = { attributed: 0, skipped: [], unattributed: 0 };
36
+ const stateDir = join(projectRoot, '.aidlc', 'state');
37
+ if (!existsSync(stateDir))
38
+ return report;
39
+ const instances = readdirSync(stateDir, { withFileTypes: true })
40
+ .filter((d) => d.isDirectory())
41
+ .map((d) => d.name)
42
+ .filter((n) => instanceFilter === null || n === instanceFilter);
43
+ const perInstance = instances.map((instance) => ({
44
+ instance,
45
+ intervals: resolveIntervals(readSessionEvents(sessionsPath(projectRoot, instance)), claimTimeoutMinutes),
46
+ }));
47
+ // Gather every session id seen anywhere.
48
+ const sessions = new Map();
49
+ for (const { intervals } of perInstance) {
50
+ for (const iv of intervals) {
51
+ sessions.set(iv.session_id, { id_source: iv.id_source, agent: iv.agent });
52
+ }
53
+ }
54
+ for (const [sessionId, meta] of sessions) {
55
+ const provider = getProvider(meta.agent);
56
+ if (!provider) {
57
+ report.skipped.push(`${sessionId}: no provider for agent "${meta.agent}"`);
58
+ continue;
59
+ }
60
+ // Locate the record file.
61
+ let recordPath = null;
62
+ if (meta.id_source === 'platform') {
63
+ recordPath = locateById(provider.name, sessionId, env);
64
+ if (!recordPath) {
65
+ report.skipped.push(`${sessionId}: no local ${provider.name} records found`);
66
+ continue;
67
+ }
68
+ }
69
+ else {
70
+ const candidates = locateByInterval(provider.name, sessionId, perInstance, env);
71
+ if (candidates.length === 0) {
72
+ report.skipped.push(`${sessionId}: agent-id session, no overlapping ${provider.name} records`);
73
+ continue;
74
+ }
75
+ if (candidates.length > 1) {
76
+ report.skipped.push(`${sessionId}: agent-id session, ${candidates.length} candidate records — ambiguous, not guessing`);
77
+ continue;
78
+ }
79
+ recordPath = candidates[0];
80
+ }
81
+ let segments;
82
+ try {
83
+ segments = await provider.extract({ provider: provider.name, path: recordPath }, null, env);
84
+ }
85
+ catch {
86
+ logCapture(projectRoot, 'sync-extract', 'extract-failed');
87
+ report.skipped.push(`${sessionId}: extraction failed`);
88
+ continue;
89
+ }
90
+ for (const seg of segments) {
91
+ const at = Date.parse(seg.at);
92
+ let target = { instance: null, phase: null };
93
+ for (const { instance, intervals } of perInstance) {
94
+ const mine = intervals.filter((iv) => iv.session_id === sessionId);
95
+ if (mine.some((iv) => at >= Date.parse(iv.from) && at <= Date.parse(iv.to))) {
96
+ const windows = phaseWindows(projectRoot, instance, 'implementation');
97
+ const phase = windows.find((w) => at >= w.from && at < w.to)?.phase ?? null;
98
+ target = { instance, phase };
99
+ break;
100
+ }
101
+ }
102
+ const targetPath = target.instance !== null
103
+ ? ledgerPath(projectRoot, target.instance)
104
+ : unattributedPath(projectRoot);
105
+ const existing = readEntries(targetPath);
106
+ // Skip segments already covered at reconciled-or-better fidelity.
107
+ if (overlapsAny(at, coveredWindows(existing, sessionId, 2)))
108
+ continue;
109
+ const entry = {
110
+ timestamp: new Date().toISOString(),
111
+ session_id: sessionId,
112
+ phase: target.phase,
113
+ provider: provider.name,
114
+ fidelity: 'reconciled',
115
+ coverage: { from: seg.at, to: seg.at },
116
+ cursor: seg.cursor,
117
+ units: seg.units,
118
+ };
119
+ try {
120
+ appendEntry(targetPath, entry);
121
+ if (target.instance !== null)
122
+ report.attributed++;
123
+ else
124
+ report.unattributed++;
125
+ }
126
+ catch {
127
+ logCapture(projectRoot, 'sync-append', 'validation-rejected');
128
+ }
129
+ }
130
+ }
131
+ return report;
132
+ }
133
+ /** Locate a platform record file by session id equality. */
134
+ function locateById(providerName, sessionId, env) {
135
+ if (providerName === 'claude-code') {
136
+ const root = transcriptRoot(env);
137
+ if (!existsSync(root))
138
+ return null;
139
+ for (const dir of readdirSync(root, { withFileTypes: true })) {
140
+ if (!dir.isDirectory())
141
+ continue;
142
+ const candidate = join(root, dir.name, `${sessionId}.jsonl`);
143
+ if (existsSync(candidate))
144
+ return candidate;
145
+ }
146
+ return null;
147
+ }
148
+ if (providerName === 'kiro') {
149
+ const provider = getProvider('kiro');
150
+ const source = provider?.resolveSource({ session_id: sessionId }, env);
151
+ return source?.path ?? null;
152
+ }
153
+ return null;
154
+ }
155
+ /**
156
+ * For agent-id sessions: find record files whose usage overlaps the
157
+ * session's claim intervals. Strict — several candidates means ambiguity.
158
+ */
159
+ function locateByInterval(providerName, sessionId, perInstance, env) {
160
+ if (providerName !== 'claude-code')
161
+ return [];
162
+ const intervals = perInstance
163
+ .flatMap(({ intervals }) => intervals)
164
+ .filter((iv) => iv.session_id === sessionId);
165
+ if (intervals.length === 0)
166
+ return [];
167
+ const root = transcriptRoot(env);
168
+ if (!existsSync(root))
169
+ return [];
170
+ const matches = [];
171
+ for (const dir of readdirSync(root, { withFileTypes: true })) {
172
+ if (!dir.isDirectory())
173
+ continue;
174
+ for (const f of readdirSync(join(root, dir.name))) {
175
+ if (!f.endsWith('.jsonl'))
176
+ continue;
177
+ const path = join(root, dir.name, f);
178
+ try {
179
+ const mtime = statSync(path).mtimeMs;
180
+ if (intervals.some((iv) => mtime >= Date.parse(iv.from) && mtime <= Date.parse(iv.to) + 60 * 60 * 1000)) {
181
+ matches.push(path);
182
+ }
183
+ }
184
+ catch {
185
+ continue;
186
+ }
187
+ }
188
+ }
189
+ return matches;
190
+ }
191
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cost/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Cost-tracking domain types.
3
+ *
4
+ * The ledger records raw usage units (tokens, credits) — never dollars.
5
+ * Dollars are computed at report time from a rate table (see rates.ts).
6
+ *
7
+ * Design: .aidlc/state/cost-tracking/design.md §2
8
+ */
9
+ /** Token usage for a single model within a coverage window. */
10
+ export interface TokenUnits {
11
+ kind: 'tokens';
12
+ model: string;
13
+ input_tokens: number;
14
+ output_tokens: number;
15
+ cache_read_tokens: number;
16
+ cache_write_tokens: number;
17
+ }
18
+ /** Credit usage (Kiro-style metering) within a coverage window. */
19
+ export interface CreditUnits {
20
+ kind: 'credits';
21
+ credits: number;
22
+ model: string | null;
23
+ }
24
+ export type CostUnits = TokenUnits | CreditUnits;
25
+ /** Provenance of a ledger entry's numbers. */
26
+ export type CostFidelity = 'metered' | 'reconciled' | 'estimated' | 'unknown';
27
+ /** One line in costs.ndjson / unattributed.ndjson. */
28
+ export interface CostEntry {
29
+ /** ISO 8601 UTC append time. */
30
+ timestamp: string;
31
+ session_id: string | null;
32
+ /** Phase the usage occurred in; null only in unattributed.ndjson. */
33
+ phase: string | null;
34
+ provider: string;
35
+ fidelity: CostFidelity;
36
+ /** Usage window this entry covers. */
37
+ coverage: {
38
+ from: string;
39
+ to: string;
40
+ };
41
+ /** Provider resume point after this entry (e.g. transcript message uuid). */
42
+ cursor: string | null;
43
+ /** null ⇔ fidelity 'unknown' (attribution interval marker). */
44
+ units: CostUnits | null;
45
+ }
46
+ /** One line in sessions.ndjson. */
47
+ export interface SessionEvent {
48
+ event: 'claim' | 'renew' | 'release';
49
+ session_id: string;
50
+ id_source: 'platform' | 'agent';
51
+ agent: string;
52
+ timestamp: string;
53
+ }
54
+ /** A resolved session↔instance attribution interval. */
55
+ export interface ClaimInterval {
56
+ session_id: string;
57
+ id_source: 'platform' | 'agent';
58
+ agent: string;
59
+ from: string;
60
+ /** Release time, or claim-timeout bound for unreleased claims. */
61
+ to: string;
62
+ /** True when bounded by timeout rather than an explicit release. */
63
+ open: boolean;
64
+ }
65
+ /** Active-session stash entry (.aidlc/cost/active-sessions/<id>.json). */
66
+ export interface ActiveSession {
67
+ session_id: string;
68
+ agent: string;
69
+ cwd: string;
70
+ transcript_path?: string;
71
+ started_at: string;
72
+ }
73
+ /** A usage segment extracted by a provider, pre-attribution. */
74
+ export interface UsageSegment {
75
+ /** ISO 8601 timestamp of the usage event. */
76
+ at: string;
77
+ units: CostUnits;
78
+ /** Provider resume point after this segment. */
79
+ cursor: string;
80
+ }
81
+ /** Validated pointer to a provider's usage records. */
82
+ export interface SourceRef {
83
+ provider: string;
84
+ path: string;
85
+ }
86
+ /** Input to `aidlc cost record` in hook mode (parsed from stdin). */
87
+ export interface RecordInput {
88
+ session_id: string;
89
+ transcript_path?: string;
90
+ cwd?: string;
91
+ }
92
+ /** Per-model (or per-unit) pricing entry. */
93
+ export interface RateEntry {
94
+ input_per_mtok?: number;
95
+ output_per_mtok?: number;
96
+ cache_read_per_mtok?: number;
97
+ cache_write_per_mtok?: number;
98
+ /** For unit-priced providers (e.g. kiro-credit). */
99
+ per_unit?: number;
100
+ }
101
+ /** A rate table snapshot with provenance. */
102
+ export interface RateSnapshot {
103
+ snapshot_version: string;
104
+ effective_date: string;
105
+ rates: Record<string, RateEntry>;
106
+ }
107
+ /** Cost section of .aidlc/config.yaml. */
108
+ export interface CostConfig {
109
+ rates_url?: string;
110
+ rates?: Record<string, RateEntry>;
111
+ }
112
+ /** Session-id format shared by validation and path construction (FR3.9). */
113
+ export declare const SESSION_ID_RE: RegExp;
114
+ /** Model-id format allowed in ledger entries. */
115
+ export declare const MODEL_ID_RE: RegExp;
116
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cost/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Cost-tracking domain types.
3
+ *
4
+ * The ledger records raw usage units (tokens, credits) — never dollars.
5
+ * Dollars are computed at report time from a rate table (see rates.ts).
6
+ *
7
+ * Design: .aidlc/state/cost-tracking/design.md §2
8
+ */
9
+ /** Session-id format shared by validation and path construction (FR3.9). */
10
+ export const SESSION_ID_RE = /^[A-Za-z0-9_-]{8,64}$/;
11
+ /** Model-id format allowed in ledger entries. */
12
+ export const MODEL_ID_RE = /^[A-Za-z0-9_.:/@-]{1,128}$/;
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cost/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoHH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,aAAa,GAAG,uBAAuB,CAAC;AAErD,iDAAiD;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,4BAA4B,CAAC"}
@@ -34,6 +34,12 @@ export interface SetupConfig {
34
34
  actions: string[];
35
35
  stalled_threshold_days: number;
36
36
  claim_timeout_minutes: number;
37
+ /**
38
+ * Sections computeSetup does not own (cost, orchestrator, secret_patterns,
39
+ * anything future) carry through rebuilds untouched — re-running init must
40
+ * never drop a hand-added config section.
41
+ */
42
+ [key: string]: unknown;
37
43
  }
38
44
  /**
39
45
  * Compute the setup result by merging existing config with new answers.
@@ -1 +1 @@
1
- {"version":3,"file":"setup-compute.d.ts","sourceRoot":"","sources":["../../src/setup/setup-compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,KAAK,EAAE,UAAU,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAkCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,OAAO,EAAE,YAAY,GACpB,WAAW,CAcb"}
1
+ {"version":3,"file":"setup-compute.d.ts","sourceRoot":"","sources":["../../src/setup/setup-compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,KAAK,EAAE,UAAU,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAkCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,OAAO,EAAE,YAAY,GACpB,WAAW,CAiBb"}
@@ -52,6 +52,9 @@ function sortedUnion(a, b) {
52
52
  export function computeSetup(existing, answers) {
53
53
  const base = existing ?? DEFAULT_CONFIG;
54
54
  return {
55
+ // Unknown keys first so owned fields below always win (DD8: preserve
56
+ // the whole class of hand-added sections, not just known ones).
57
+ ...base,
55
58
  version: base.version,
56
59
  defaults: {
57
60
  scope: answers.scope ?? base.defaults.scope,
@@ -1 +1 @@
1
- {"version":3,"file":"setup-compute.js","sourceRoot":"","sources":["../../src/setup/setup-compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqCH,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,cAAc,GAAgB;IAClC,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE;QACR,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,YAAY;KACvB;IACD,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;IACX,sBAAsB,EAAE,CAAC;IACzB,qBAAqB,EAAE,EAAE;CAC1B,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;GAEG;AACH,SAAS,WAAW,CAAC,CAAW,EAAE,CAAW;IAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAC1B,QAA4B,EAC5B,OAAqB;IAErB,MAAM,IAAI,GAAG,QAAQ,IAAI,cAAc,CAAC;IAExC,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE;YACR,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK;YAC3C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ;SACrD;QACD,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QAC/D,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACzD,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;QACnD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;KAClD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"setup-compute.js","sourceRoot":"","sources":["../../src/setup/setup-compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2CH,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,cAAc,GAAgB;IAClC,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE;QACR,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,YAAY;KACvB;IACD,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;IACX,sBAAsB,EAAE,CAAC;IACzB,qBAAqB,EAAE,EAAE;CAC1B,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;GAEG;AACH,SAAS,WAAW,CAAC,CAAW,EAAE,CAAW;IAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAC1B,QAA4B,EAC5B,OAAqB;IAErB,MAAM,IAAI,GAAG,QAAQ,IAAI,cAAc,CAAC;IAExC,OAAO;QACL,qEAAqE;QACrE,gEAAgE;QAChE,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE;YACR,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK;YAC3C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ;SACrD;QACD,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QAC/D,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACzD,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;QACnD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;KAClD,CAAC;AACJ,CAAC"}