@cat-factory/worker 0.141.1 → 0.143.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 (45) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +13 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/infrastructure/config/auth.d.ts.map +1 -1
  5. package/dist/infrastructure/config/auth.js +6 -0
  6. package/dist/infrastructure/config/auth.js.map +1 -1
  7. package/dist/infrastructure/config/retention.d.ts.map +1 -1
  8. package/dist/infrastructure/config/retention.js +6 -0
  9. package/dist/infrastructure/config/retention.js.map +1 -1
  10. package/dist/infrastructure/container-assembly.d.ts.map +1 -1
  11. package/dist/infrastructure/container-assembly.js +70 -7
  12. package/dist/infrastructure/container-assembly.js.map +1 -1
  13. package/dist/infrastructure/container-model-resolver.d.ts.map +1 -1
  14. package/dist/infrastructure/container-model-resolver.js +4 -3
  15. package/dist/infrastructure/container-model-resolver.js.map +1 -1
  16. package/dist/infrastructure/env.d.ts +12 -0
  17. package/dist/infrastructure/env.d.ts.map +1 -1
  18. package/dist/infrastructure/env.js.map +1 -1
  19. package/dist/infrastructure/repositories/D1AuthAttemptRepository.d.ts +16 -0
  20. package/dist/infrastructure/repositories/D1AuthAttemptRepository.d.ts.map +1 -0
  21. package/dist/infrastructure/repositories/D1AuthAttemptRepository.js +37 -0
  22. package/dist/infrastructure/repositories/D1AuthAttemptRepository.js.map +1 -0
  23. package/dist/infrastructure/repositories/D1GateOutcomeRepository.d.ts +12 -0
  24. package/dist/infrastructure/repositories/D1GateOutcomeRepository.d.ts.map +1 -0
  25. package/dist/infrastructure/repositories/D1GateOutcomeRepository.js +64 -0
  26. package/dist/infrastructure/repositories/D1GateOutcomeRepository.js.map +1 -0
  27. package/dist/infrastructure/repositories/D1MachineNodeRepository.d.ts +16 -0
  28. package/dist/infrastructure/repositories/D1MachineNodeRepository.d.ts.map +1 -0
  29. package/dist/infrastructure/repositories/D1MachineNodeRepository.js +83 -0
  30. package/dist/infrastructure/repositories/D1MachineNodeRepository.js.map +1 -0
  31. package/dist/infrastructure/repositories/D1PlatformMetricsRepository.d.ts +6 -1
  32. package/dist/infrastructure/repositories/D1PlatformMetricsRepository.d.ts.map +1 -1
  33. package/dist/infrastructure/repositories/D1PlatformMetricsRepository.js +124 -0
  34. package/dist/infrastructure/repositories/D1PlatformMetricsRepository.js.map +1 -1
  35. package/dist/infrastructure/wireCredentialServices.d.ts.map +1 -1
  36. package/dist/infrastructure/wireCredentialServices.js +4 -0
  37. package/dist/infrastructure/wireCredentialServices.js.map +1 -1
  38. package/dist/infrastructure/workflows/retention.d.ts +29 -2
  39. package/dist/infrastructure/workflows/retention.d.ts.map +1 -1
  40. package/dist/infrastructure/workflows/retention.js +19 -2
  41. package/dist/infrastructure/workflows/retention.js.map +1 -1
  42. package/migrations/0077_machine_nodes.sql +20 -0
  43. package/migrations/0078_auth_attempts.sql +16 -0
  44. package/migrations/0079_gate_outcomes_and_run_days.sql +82 -0
  45. package/package.json +18 -18
@@ -0,0 +1,37 @@
1
+ /** D1 auth-attempt ledger for the password-endpoint throttle (SEC-4). Mirror of the Drizzle repo. */
2
+ export class D1AuthAttemptRepository {
3
+ db;
4
+ idGenerator;
5
+ constructor({ db, idGenerator }) {
6
+ this.db = db;
7
+ this.idGenerator = idGenerator;
8
+ }
9
+ async record(attempt) {
10
+ await this.db
11
+ .prepare('INSERT INTO auth_attempts (id, key, ip, at) VALUES (?, ?, ?, ?)')
12
+ .bind(this.idGenerator.next('atmpt'), attempt.key, attempt.ip, attempt.at)
13
+ .run();
14
+ }
15
+ async countByKeySince(key, sinceMs) {
16
+ const row = await this.db
17
+ .prepare('SELECT COUNT(*) AS n FROM auth_attempts WHERE key = ? AND at >= ?')
18
+ .bind(key, sinceMs)
19
+ .first();
20
+ return row?.n ?? 0;
21
+ }
22
+ async countByIpSince(ip, sinceMs) {
23
+ const row = await this.db
24
+ .prepare('SELECT COUNT(*) AS n FROM auth_attempts WHERE ip = ? AND at >= ?')
25
+ .bind(ip, sinceMs)
26
+ .first();
27
+ return row?.n ?? 0;
28
+ }
29
+ async deleteOlderThan(epochMs) {
30
+ const result = await this.db
31
+ .prepare('DELETE FROM auth_attempts WHERE at < ?')
32
+ .bind(epochMs)
33
+ .run();
34
+ return result.meta.changes ?? 0;
35
+ }
36
+ }
37
+ //# sourceMappingURL=D1AuthAttemptRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1AuthAttemptRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1AuthAttemptRepository.ts"],"names":[],"mappings":"AAGA,qGAAqG;AACrG,MAAM,OAAO,uBAAuB;IACjB,EAAE,CAAY;IACd,WAAW,CAAa;IAEzC,YAAY,EAAE,EAAE,EAAE,WAAW,EAAgD;QAC3E,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA0B;QACrC,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,iEAAiE,CAAC;aAC1E,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;aACzE,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAW,EAAE,OAAe;QAChD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,mEAAmE,CAAC;aAC5E,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;aAClB,KAAK,EAAiB,CAAA;QACzB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,OAAe;QAC9C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,kEAAkE,CAAC;aAC3E,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;aACjB,KAAK,EAAiB,CAAA;QACzB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aACzB,OAAO,CAAC,wCAAwC,CAAC;aACjD,IAAI,CAAC,OAAO,CAAC;aACb,GAAG,EAAE,CAAA;QACR,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;IACjC,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { GateOutcomeRecord, GateOutcomeRepository, PlatformGateOutcomeCount } from '@cat-factory/kernel';
2
+ import type { D1Database } from '@cloudflare/workers-types';
3
+ export declare class D1GateOutcomeRepository implements GateOutcomeRepository {
4
+ private readonly db;
5
+ constructor({ db }: {
6
+ db: D1Database;
7
+ });
8
+ record(row: GateOutcomeRecord): Promise<void>;
9
+ statsSince(accountId: string, sinceEpochMs: number): Promise<PlatformGateOutcomeCount[]>;
10
+ deleteOlderThan(cutoff: number): Promise<number>;
11
+ }
12
+ //# sourceMappingURL=D1GateOutcomeRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1GateOutcomeRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1GateOutcomeRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAc3D,qBAAa,uBAAwB,YAAW,qBAAqB;IACnE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,MAAM,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BlD;IAEK,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAmC7F;IAEK,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMrD;CACF"}
@@ -0,0 +1,64 @@
1
+ // The settled-gate projection on D1: the write the engine's gate machine makes, and the ONE
2
+ // aggregate the operator dashboard's gate statistics read. Mirrors
3
+ // {@link DrizzleGateOutcomeRepository}; the cross-runtime conformance suite asserts they agree.
4
+ /** The account's workspace ids, as the scalar sub-select the account-scoped read uses. */
5
+ const ACCOUNT_WORKSPACES = 'SELECT id FROM workspaces WHERE account_id = ?';
6
+ /** Guard a stored `outcome` into the port's union; anything else is treated as exhausted. */
7
+ function decodeOutcome(raw) {
8
+ return raw === 'passed' ? 'passed' : 'exhausted';
9
+ }
10
+ export class D1GateOutcomeRepository {
11
+ db;
12
+ constructor({ db }) {
13
+ this.db = db;
14
+ }
15
+ async record(row) {
16
+ // FIRST WRITE WINS on the derived id: the durable drivers replay, so the same settle can
17
+ // arrive twice, and re-inserting it would inflate every count this table exists to report.
18
+ // `ON CONFLICT(id) DO NOTHING` rather than `INSERT OR IGNORE`, which would also swallow a
19
+ // genuine constraint violation (the `llm_call_metrics` precedent).
20
+ await this.db
21
+ .prepare(`INSERT INTO gate_outcomes
22
+ (id, workspace_id, execution_id, block_id, gate_kind, helper_kind, outcome,
23
+ attempts, max_attempts, helper_failures, duration_ms, created_at)
24
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
25
+ ON CONFLICT(id) DO NOTHING`)
26
+ .bind(row.id, row.workspaceId, row.executionId, row.blockId, row.gateKind, row.helperKind, row.outcome, row.attempts, row.maxAttempts, row.helperFailures, row.durationMs, row.createdAt)
27
+ .run();
28
+ }
29
+ async statsSince(accountId, sinceEpochMs) {
30
+ const { results } = await this.db
31
+ .prepare(
32
+ // One GROUP BY: the counts, the attempt sums and the precheck-clean tally all come off
33
+ // the same scan. `helper_kind` joins the grouping key rather than being aggregated:
34
+ // it is a property of the gate definition, so it does not vary within a gate kind.
35
+ `SELECT gate_kind, helper_kind, outcome,
36
+ COUNT(*) AS gates,
37
+ SUM(attempts) AS attempts,
38
+ SUM(helper_failures) AS helper_failures,
39
+ SUM(CASE WHEN attempts = 0 THEN 1 ELSE 0 END) AS clean_gates
40
+ FROM gate_outcomes
41
+ WHERE workspace_id IN (${ACCOUNT_WORKSPACES}) AND created_at >= ?
42
+ GROUP BY gate_kind, helper_kind, outcome
43
+ ORDER BY gates DESC`)
44
+ .bind(accountId, sinceEpochMs)
45
+ .all();
46
+ return (results ?? []).map((r) => ({
47
+ gateKind: r.gate_kind,
48
+ helperKind: r.helper_kind ?? null,
49
+ outcome: decodeOutcome(r.outcome),
50
+ gates: Number(r.gates),
51
+ attempts: Number(r.attempts ?? 0),
52
+ helperFailures: Number(r.helper_failures ?? 0),
53
+ cleanGates: Number(r.clean_gates ?? 0),
54
+ }));
55
+ }
56
+ async deleteOlderThan(cutoff) {
57
+ const res = await this.db
58
+ .prepare('DELETE FROM gate_outcomes WHERE created_at < ?')
59
+ .bind(cutoff)
60
+ .run();
61
+ return res.meta.changes ?? 0;
62
+ }
63
+ }
64
+ //# sourceMappingURL=D1GateOutcomeRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1GateOutcomeRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1GateOutcomeRepository.ts"],"names":[],"mappings":"AAQA,4FAA4F;AAC5F,mEAAmE;AACnE,gGAAgG;AAEhG,0FAA0F;AAC1F,MAAM,kBAAkB,GAAG,gDAAgD,CAAA;AAE3E,6FAA6F;AAC7F,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAA;AAClD,CAAC;AAED,MAAM,OAAO,uBAAuB;IACjB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAsB;QACjC,yFAAyF;QACzF,2FAA2F;QAC3F,0FAA0F;QAC1F,mEAAmE;QACnE,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;;oCAI4B,CAC7B;aACA,IAAI,CACH,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,cAAc,EAClB,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,SAAS,CACd;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,YAAoB;QACtD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO;QACN,uFAAuF;QACvF,oFAAoF;QACpF,mFAAmF;QACnF;;;;;;kCAM0B,kBAAkB;;6BAEvB,CACtB;aACA,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;aAC7B,GAAG,EAQA,CAAA;QACN,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,QAAQ,EAAE,CAAC,CAAC,SAAS;YACrB,UAAU,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI;YACjC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;YACjC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YACtB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;YACjC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;YAC9C,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;SACvC,CAAC,CAAC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,gDAAgD,CAAC;aACzD,IAAI,CAAC,MAAM,CAAC;aACZ,GAAG,EAAE,CAAA;QACR,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;IAC9B,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import type { MachineNodeMint, MachineNodeMintOutcome, MachineNodeRecord, MachineNodeRepository } from '@cat-factory/kernel';
2
+ import type { D1Database } from '@cloudflare/workers-types';
3
+ /** D1 machine-node roster + revocation tombstones (SEC-5). Mirror of the Drizzle repo. */
4
+ export declare class D1MachineNodeRepository implements MachineNodeRepository {
5
+ private readonly db;
6
+ constructor({ db }: {
7
+ db: D1Database;
8
+ });
9
+ recordMint(mint: MachineNodeMint): Promise<MachineNodeMintOutcome>;
10
+ get(nodeId: string): Promise<MachineNodeRecord | null>;
11
+ listByUser(userId: string): Promise<MachineNodeRecord[]>;
12
+ revoke(nodeId: string, revokedAt: number, revokedByUserId: string): Promise<boolean>;
13
+ isRevoked(nodeId: string): Promise<boolean>;
14
+ deleteExpired(before: number): Promise<number>;
15
+ }
16
+ //# sourceMappingURL=D1MachineNodeRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1MachineNodeRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1MachineNodeRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA0B3D,0FAA0F;AAC1F,qBAAa,uBAAwB,YAAW,qBAAqB;IACnE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgCvE;IAEK,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAM3D;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAM7D;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWzF;IAEK,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMhD;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnD;CACF"}
@@ -0,0 +1,83 @@
1
+ function toRecord(row) {
2
+ return {
3
+ nodeId: row.node_id,
4
+ userId: row.user_id,
5
+ accountIds: JSON.parse(row.account_ids),
6
+ createdAt: row.created_at,
7
+ lastMintedAt: row.last_minted_at,
8
+ expiresAt: row.expires_at,
9
+ revokedAt: row.revoked_at,
10
+ revokedByUserId: row.revoked_by,
11
+ };
12
+ }
13
+ /** D1 machine-node roster + revocation tombstones (SEC-5). Mirror of the Drizzle repo. */
14
+ export class D1MachineNodeRepository {
15
+ db;
16
+ constructor({ db }) {
17
+ this.db = db;
18
+ }
19
+ async recordMint(mint) {
20
+ // The upsert refreshes only the mint-shaped columns: `user_id`, `created_at` and the
21
+ // revocation tombstone never change here. `MAX` keeps `expires_at` the latest exp ever
22
+ // signed, so a shorter re-mint cannot make the roster forget a longer token.
23
+ //
24
+ // The `WHERE` on the conflict branch is what makes ownership atomic rather than
25
+ // check-then-write: a concurrent first mint of the same node id by another user updates
26
+ // nothing instead of stamping its scope onto the winner's row.
27
+ const result = await this.db
28
+ .prepare(`INSERT INTO machine_nodes
29
+ (node_id, user_id, account_ids, created_at, last_minted_at, expires_at)
30
+ VALUES (?, ?, ?, ?, ?, ?)
31
+ ON CONFLICT(node_id) DO UPDATE SET
32
+ account_ids = excluded.account_ids,
33
+ last_minted_at = excluded.last_minted_at,
34
+ expires_at = MAX(machine_nodes.expires_at, excluded.expires_at)
35
+ WHERE machine_nodes.user_id = excluded.user_id
36
+ AND machine_nodes.revoked_at IS NULL`)
37
+ .bind(mint.nodeId, mint.userId, JSON.stringify(mint.accountIds), mint.mintedAt, mint.mintedAt, mint.expiresAt)
38
+ .run();
39
+ // A guarded no-op and a successful refresh are both "no error", so the write count is
40
+ // the only thing that distinguishes them.
41
+ return (result.meta.changes ?? 0) > 0 ? 'recorded' : 'refused';
42
+ }
43
+ async get(nodeId) {
44
+ const row = await this.db
45
+ .prepare('SELECT * FROM machine_nodes WHERE node_id = ?')
46
+ .bind(nodeId)
47
+ .first();
48
+ return row ? toRecord(row) : null;
49
+ }
50
+ async listByUser(userId) {
51
+ const result = await this.db
52
+ .prepare('SELECT * FROM machine_nodes WHERE user_id = ? ORDER BY last_minted_at DESC')
53
+ .bind(userId)
54
+ .all();
55
+ return (result.results ?? []).map(toRecord);
56
+ }
57
+ async revoke(nodeId, revokedAt, revokedByUserId) {
58
+ // Idempotent kill switch: only the FIRST revocation writes (the tombstone keeps its
59
+ // original timestamp/actor), but re-revoking an already-revoked node still reports true.
60
+ const result = await this.db
61
+ .prepare('UPDATE machine_nodes SET revoked_at = ?, revoked_by = ? WHERE node_id = ? AND revoked_at IS NULL')
62
+ .bind(revokedAt, revokedByUserId, nodeId)
63
+ .run();
64
+ if ((result.meta.changes ?? 0) > 0)
65
+ return true;
66
+ return (await this.get(nodeId)) !== null;
67
+ }
68
+ async isRevoked(nodeId) {
69
+ const row = await this.db
70
+ .prepare('SELECT revoked_at FROM machine_nodes WHERE node_id = ?')
71
+ .bind(nodeId)
72
+ .first();
73
+ return row?.revoked_at != null;
74
+ }
75
+ async deleteExpired(before) {
76
+ const result = await this.db
77
+ .prepare('DELETE FROM machine_nodes WHERE expires_at < ?')
78
+ .bind(before)
79
+ .run();
80
+ return result.meta.changes ?? 0;
81
+ }
82
+ }
83
+ //# sourceMappingURL=D1MachineNodeRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1MachineNodeRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1MachineNodeRepository.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { PlatformDurationStats, PlatformFailureCount, PlatformLiveCounts, PlatformMetricsRepository, PlatformRunOutcome, PlatformRunTrendPoint } from '@cat-factory/kernel';
1
+ import type { PlatformDailyRunCount, PlatformDurationStats, PlatformFailedRunRef, PlatformFailureCount, PlatformLiveCounts, PlatformMetricsRepository, PlatformRunOutcome, PlatformRunTrendPoint } from '@cat-factory/kernel';
2
2
  import type { D1Database } from '@cloudflare/workers-types';
3
3
  export declare class D1PlatformMetricsRepository implements PlatformMetricsRepository {
4
4
  private readonly db;
@@ -10,5 +10,10 @@ export declare class D1PlatformMetricsRepository implements PlatformMetricsRepos
10
10
  failureKindBreakdown(accountId: string, sinceEpochMs: number): Promise<PlatformFailureCount[]>;
11
11
  activeAndParkedCounts(accountId: string): Promise<PlatformLiveCounts>;
12
12
  durationStatsSince(accountId: string, sinceEpochMs: number): Promise<PlatformDurationStats>;
13
+ rollupRunDays(fromEpochMs: number, toEpochMs: number): Promise<number>;
14
+ dailyRunTotalsSince(accountId: string, sinceEpochMs: number): Promise<PlatformDailyRunCount[]>;
15
+ dailyRollupWatermark(): Promise<number | null>;
16
+ deleteRunDaysOlderThan(cutoff: number): Promise<number>;
17
+ recentFailedRuns(accountId: string, sinceEpochMs: number, perWorkspaceLimit: number): Promise<PlatformFailedRunRef[]>;
13
18
  }
14
19
  //# sourceMappingURL=D1PlatformMetricsRepository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"D1PlatformMetricsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1PlatformMetricsRepository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAW3D,qBAAa,2BAA4B,YAAW,yBAAyB;IAC3E,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAe7F;IAEK,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAkBlC;IAEK,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAejC;IAEK,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgB1E;IAEK,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC,CA6ChC;CACF"}
1
+ {"version":3,"file":"D1PlatformMetricsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1PlatformMetricsRepository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,qBAAqB,CAAA;AAI5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAW3D,qBAAa,2BAA4B,YAAW,yBAAyB;IAC3E,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAe7F;IAEK,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAkBlC;IAEK,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAejC;IAEK,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgB1E;IAEK,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC,CA6ChC;IAEK,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD3E;IAEK,mBAAmB,CACvB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAoBlC;IAEK,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMnD;IAEK,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5D;IAEK,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAuCjC;CACF"}
@@ -1,4 +1,6 @@
1
1
  import { agentRunKindSchema } from '@cat-factory/contracts';
2
+ import { RUN_DAYS_ROLLUP } from '@cat-factory/kernel';
3
+ import { DAY_MS } from '@cat-factory/orchestration';
2
4
  import { decodeEnum } from '@cat-factory/server';
3
5
  // Deployment-level rollups over `agent_runs`, scoped to an account by a sub-select on
4
6
  // `workspaces` (both live in the main DB). Every method is a single aggregate query —
@@ -110,5 +112,127 @@ export class D1PlatformMetricsRepository {
110
112
  p99Ms: at(row?.p99_ms),
111
113
  };
112
114
  }
115
+ async rollupRunDays(fromEpochMs, toEpochMs) {
116
+ // The aggregation happens in SQLite and no run row is ever loaded. Snapping the bounds to
117
+ // day edges keeps a partially-covered day from being written with only the covered part's
118
+ // counts, which would then look complete.
119
+ const from = Math.floor(fromEpochMs / DAY_MS) * DAY_MS;
120
+ const to = Math.ceil(toEpochMs / DAY_MS) * DAY_MS;
121
+ if (to <= from)
122
+ return 0;
123
+ // DELETE the window, then INSERT it: an upsert alone is NOT a rewrite. A run's `status`
124
+ // MUTATES in place (`running` → `done`) while its `created_at` stays put, so a pass that ran
125
+ // while the day was in flight wrote a `(day, 'running')` bucket that a later pass's SELECT no
126
+ // longer produces — `DO UPDATE` never touches a row the new result set omits, and the orphan
127
+ // then sits in the table until retention, inflating every long-window total and trend by
128
+ // every run that happened to be mid-flight at a sweep.
129
+ //
130
+ // `batch()` runs both in ONE implicit transaction, so a concurrent dashboard read never
131
+ // observes the window mid-rewrite (it would see an empty stretch and render it as an idle
132
+ // period). The `ON CONFLICT` is kept as a belt on top of the braces: the `GROUP BY` makes the
133
+ // incoming keys unique, so it can only fire against a pass racing this one.
134
+ const [, inserted] = await this.db.batch([
135
+ this.db
136
+ .prepare('DELETE FROM platform_run_days WHERE day_start >= ? AND day_start < ?')
137
+ .bind(from, to),
138
+ this.db
139
+ .prepare(
140
+ // `failure_kind` is '' for a non-failed status because it is part of the primary key
141
+ // and SQLite does not treat two NULLs there as equal (see migration 0079).
142
+ `INSERT INTO platform_run_days (workspace_id, day_start, status, failure_kind, run_count)
143
+ SELECT workspace_id,
144
+ CAST(created_at / ? AS INTEGER) * ? AS day_start,
145
+ status,
146
+ CASE WHEN status = 'failed'
147
+ THEN COALESCE(json_extract(failure, '$.kind'), 'unknown')
148
+ ELSE '' END AS failure_kind,
149
+ COUNT(*) AS run_count
150
+ FROM agent_runs
151
+ WHERE created_at >= ? AND created_at < ?
152
+ GROUP BY workspace_id, day_start, status, failure_kind
153
+ ON CONFLICT(workspace_id, day_start, status, failure_kind)
154
+ DO UPDATE SET run_count = excluded.run_count`)
155
+ .bind(DAY_MS, DAY_MS, from, to),
156
+ // The sweep's coverage, in the SAME batch (hence the same transaction) as the rewrite it
157
+ // describes, so the watermark can never claim a day the rows do not have. `through_day` is
158
+ // the last day the pass actually covered (`to` is the exclusive end) and only ever moves
159
+ // FORWARD: a pass recomputing an OLD window (a backfill, a replay) must not walk it
160
+ // backwards and make a current rollup read as behind. `updated_at` is the pass's own upper
161
+ // bound, which is the caller's `now` before it was snapped to a day edge.
162
+ this.db
163
+ .prepare(`INSERT INTO platform_rollup_state (rollup, through_day, updated_at) VALUES (?, ?, ?)
164
+ ON CONFLICT(rollup) DO UPDATE SET
165
+ through_day = MAX(platform_rollup_state.through_day, excluded.through_day),
166
+ updated_at = MAX(platform_rollup_state.updated_at, excluded.updated_at)`)
167
+ .bind(RUN_DAYS_ROLLUP, to - DAY_MS, toEpochMs),
168
+ ]);
169
+ return inserted?.meta.changes ?? 0;
170
+ }
171
+ async dailyRunTotalsSince(accountId, sinceEpochMs) {
172
+ const { results } = await this.db
173
+ .prepare(`SELECT day_start, status, failure_kind, SUM(run_count) AS run_count
174
+ FROM platform_run_days
175
+ WHERE workspace_id IN (${ACCOUNT_WORKSPACES}) AND day_start >= ?
176
+ GROUP BY day_start, status, failure_kind
177
+ ORDER BY day_start`)
178
+ // Snap to the day the window starts IN, so a window beginning mid-day still includes
179
+ // that day's bucket instead of silently dropping it (the bucket is the smallest unit
180
+ // this table can answer, and omitting it would under-report the oldest day).
181
+ .bind(accountId, Math.floor(sinceEpochMs / DAY_MS) * DAY_MS)
182
+ .all();
183
+ return (results ?? []).map((r) => ({
184
+ dayStart: Number(r.day_start),
185
+ status: r.status,
186
+ failureKind: r.failure_kind === '' ? null : r.failure_kind,
187
+ count: Number(r.run_count),
188
+ }));
189
+ }
190
+ async dailyRollupWatermark() {
191
+ const row = await this.db
192
+ .prepare('SELECT through_day FROM platform_rollup_state WHERE rollup = ?')
193
+ .bind(RUN_DAYS_ROLLUP)
194
+ .first();
195
+ return row?.through_day != null ? Number(row.through_day) : null;
196
+ }
197
+ async deleteRunDaysOlderThan(cutoff) {
198
+ const res = await this.db
199
+ .prepare('DELETE FROM platform_run_days WHERE day_start < ?')
200
+ .bind(cutoff)
201
+ .run();
202
+ return res.meta.changes ?? 0;
203
+ }
204
+ async recentFailedRuns(accountId, sinceEpochMs, perWorkspaceLimit) {
205
+ if (perWorkspaceLimit <= 0)
206
+ return [];
207
+ const { results } = await this.db
208
+ .prepare(
209
+ // Capped PER WORKSPACE by a window function, not by one global LIMIT: a card belongs to
210
+ // one workspace, and a single noisy workspace must not starve every other one's card of
211
+ // its own evidence. The partition COUNT rides along so the cap can report what it left
212
+ // out without a second query that could disagree with the sample it accompanies.
213
+ `SELECT workspace_id, id, block_id, failure_kind, created_at, workspace_failed_total
214
+ FROM (
215
+ SELECT workspace_id, id, block_id, created_at,
216
+ COALESCE(json_extract(failure, '$.kind'), 'unknown') AS failure_kind,
217
+ ROW_NUMBER() OVER (PARTITION BY workspace_id ORDER BY created_at DESC, id DESC)
218
+ AS rn,
219
+ COUNT(*) OVER (PARTITION BY workspace_id) AS workspace_failed_total
220
+ FROM agent_runs
221
+ WHERE workspace_id IN (${ACCOUNT_WORKSPACES}) AND created_at >= ?
222
+ AND status = 'failed' AND kind = 'execution'
223
+ )
224
+ WHERE rn <= ?
225
+ ORDER BY workspace_id, created_at DESC`)
226
+ .bind(accountId, sinceEpochMs, perWorkspaceLimit)
227
+ .all();
228
+ return (results ?? []).map((r) => ({
229
+ workspaceId: r.workspace_id,
230
+ executionId: r.id,
231
+ blockId: r.block_id ?? null,
232
+ failureKind: r.failure_kind ?? 'unknown',
233
+ createdAt: Number(r.created_at),
234
+ workspaceFailedTotal: Number(r.workspace_failed_total),
235
+ }));
236
+ }
113
237
  }
114
238
  //# sourceMappingURL=D1PlatformMetricsRepository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"D1PlatformMetricsRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1PlatformMetricsRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"D1PlatformMetricsRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1PlatformMetricsRepository.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wireCredentialServices.d.ts","sourceRoot":"","sources":["../../src/infrastructure/wireCredentialServices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EAEnB,kBAAkB,EAElB,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,sBAAsB,EAE5B,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AA0BhC;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,2BAA2B,GAAG,SAAS,CAazC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,aAAa,GAAG,SAAS,CAa3B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,mBAAmB,GAAG,SAAS,CASjC;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,2BAA2B,GAAG,SAAS,CAczC;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,yBAAyB,GAAG,SAAS,CAWvC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,EAIZ,sBAAsB,CAAC,EAAE,sBAAsB,EAI/C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,UAAU,EAAE,CAAC,GAChD,iBAAiB,GAAG,SAAS,CAe/B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,sBAAsB,GAAG,SAAS,CAGpC;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,aAAa,EAAE,MAAM,GACpB,wBAAwB,GAAG,SAAS,CAWtC;AACD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,kBAAkB,GAAG,SAAS,CAYhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,4BAA4B,GAAG,SAAS,CAW1C;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,uBAAuB,CAMzB"}
1
+ {"version":3,"file":"wireCredentialServices.d.ts","sourceRoot":"","sources":["../../src/infrastructure/wireCredentialServices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EAEnB,kBAAkB,EAElB,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,sBAAsB,EAE5B,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AA0BhC;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,2BAA2B,GAAG,SAAS,CAazC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,aAAa,GAAG,SAAS,CAa3B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,mBAAmB,GAAG,SAAS,CASjC;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,2BAA2B,GAAG,SAAS,CAczC;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,yBAAyB,GAAG,SAAS,CAevC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,EAIZ,sBAAsB,CAAC,EAAE,sBAAsB,EAI/C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,UAAU,EAAE,CAAC,GAChD,iBAAiB,GAAG,SAAS,CAe/B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,sBAAsB,GAAG,SAAS,CAGpC;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,aAAa,EAAE,MAAM,GACpB,wBAAwB,GAAG,SAAS,CAWtC;AACD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,kBAAkB,GAAG,SAAS,CAYhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,4BAA4B,GAAG,SAAS,CAW1C;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,GACX,uBAAuB,CAMzB"}
@@ -118,6 +118,10 @@ export function buildLocalModelEndpointService(env, db, clock) {
118
118
  info: 'cat-factory:local-model-endpoints',
119
119
  }),
120
120
  clock,
121
+ // Loopback-only unless the operator opts into LAN reach (SEC-3). RFC1918 is
122
+ // unroutable from workerd anyway, so on this facade the flag mostly governs what
123
+ // the write boundary accepts; kept symmetric with the Node facade regardless.
124
+ allowPrivateLanHosts: env.LOCAL_MODELS_ALLOW_LAN?.trim() === 'true',
121
125
  });
122
126
  }
123
127
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"wireCredentialServices.js","sourceRoot":"","sources":["../../src/infrastructure/wireCredentialServices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wireCredentialServices.js","sourceRoot":"","sources":["../../src/infrastructure/wireCredentialServices.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { AgentContextSnapshotRepository, AgentSearchQueryRepository, Clock, CommitProjectionRepository, LlmCallMetricRepository, NotificationRepository, PasswordResetTokenRepository, PipelineScheduleRepository, ProvisioningLogRepository, RateLimitRepository, SubscriptionQuotaCycleRepository, TokenUsageRepository, Logger } from '@cat-factory/kernel';
1
+ import type { AgentContextSnapshotRepository, AgentSearchQueryRepository, Clock, CommitProjectionRepository, LlmCallMetricRepository, GateOutcomeRepository, NotificationRepository, AuthAttemptRepository, MachineNodeRepository, PasswordResetTokenRepository, PlatformMetricsRepository, PipelineScheduleRepository, ProvisioningLogRepository, RateLimitRepository, SubscriptionQuotaCycleRepository, TokenUsageRepository, Logger } from '@cat-factory/kernel';
2
2
  /** Per-table retention ages in milliseconds; 0 (or less) disables that table's pass. */
3
3
  interface RetentionPolicy {
4
4
  tokenUsageMs: number;
@@ -14,6 +14,10 @@ interface RetentionPolicy {
14
14
  provisioningLogMs: number;
15
15
  /** Resolved (acted/dismissed) notifications; open cards are never pruned. */
16
16
  notificationsMs: number;
17
+ /** Settled-gate projection (`gate_outcomes`) behind the dashboard's attempt statistics. */
18
+ gateOutcomesMs: number;
19
+ /** Daily run rollup (`platform_run_days`) behind the `30d` / `90d` dashboard windows. */
20
+ runDaysMs: number;
17
21
  }
18
22
  export interface RetentionDeps {
19
23
  tokenUsageRepository: TokenUsageRepository;
@@ -32,8 +36,25 @@ export interface RetentionDeps {
32
36
  provisioningLogRepository?: ProvisioningLogRepository;
33
37
  /** Optional: password-reset tokens past their own TTL (single-use + 1h expiry). */
34
38
  passwordResetTokenRepository?: PasswordResetTokenRepository;
39
+ /**
40
+ * Machine-node roster rows past their latest signed exp (no token for the node can outlive
41
+ * it, so a revocation tombstone past it protects nothing). REQUIRED, matching the Node
42
+ * facade: both are wired unconditionally, and an optional field would let a call-site
43
+ * regression drop the prune on one runtime while compiling fine.
44
+ */
45
+ machineNodeRepository: MachineNodeRepository;
46
+ /** Password-throttle attempts (SEC-4), prunable an hour after the window closes. Required
47
+ * for the same reason as the roster above. */
48
+ authAttemptRepository: AuthAttemptRepository;
35
49
  /** Resolved notifications past the retention window (open cards are never pruned). */
36
50
  notificationRepository: NotificationRepository;
51
+ /** Settled-gate projection: pruned to `gateOutcomesMs`. */
52
+ gateOutcomeRepository: GateOutcomeRepository;
53
+ /**
54
+ * The daily run rollup: this pass both MATERIALISES it (a short trailing window, so a missed
55
+ * pass self-heals) and prunes it to `runDaysMs`.
56
+ */
57
+ platformMetricsRepository: PlatformMetricsRepository;
37
58
  clock: Clock;
38
59
  policy: RetentionPolicy;
39
60
  /** Names the table behind each isolated prune failure. Absent ⇒ the failures are silent. */
@@ -51,7 +72,13 @@ export interface RetentionResult {
51
72
  scheduleRuns: number;
52
73
  provisioningLog: number;
53
74
  passwordResetTokens: number;
75
+ machineNodes: number;
76
+ authAttempts: number;
54
77
  notifications: number;
78
+ gateOutcomes: number;
79
+ runDays: number;
80
+ /** Daily buckets (re)written by this pass's rollup: a WRITE, not rows reclaimed. */
81
+ runDaysRolledUp: number;
55
82
  /**
56
83
  * The tables whose prune threw this pass. EMPTY on a clean pass. Reported separately from
57
84
  * the counts because a failed prune and an empty table both reclaim 0 rows, and only one of
@@ -70,6 +97,6 @@ export interface RetentionResult {
70
97
  * since the same table failed on every subsequent pass too. Shared with the Node twin via
71
98
  * `createRetentionPass`, so the two facades cannot drift on it.
72
99
  */
73
- export declare function sweepRetention({ tokenUsageRepository, rateLimitRepository, commitRepository, llmCallMetricRepository, agentContextSnapshotRepository, agentSearchQueryRepository, subscriptionQuotaCycleRepository, pipelineScheduleRepository, provisioningLogRepository, passwordResetTokenRepository, notificationRepository, clock, policy, logger, }: RetentionDeps): Promise<RetentionResult>;
100
+ export declare function sweepRetention({ tokenUsageRepository, rateLimitRepository, commitRepository, llmCallMetricRepository, agentContextSnapshotRepository, agentSearchQueryRepository, subscriptionQuotaCycleRepository, pipelineScheduleRepository, provisioningLogRepository, passwordResetTokenRepository, machineNodeRepository, authAttemptRepository, notificationRepository, gateOutcomeRepository, platformMetricsRepository, clock, policy, logger, }: RetentionDeps): Promise<RetentionResult>;
74
101
  export {};
75
102
  //# sourceMappingURL=retention.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/retention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,8BAA8B,EAC9B,0BAA0B,EAC1B,KAAK,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,EACnB,gCAAgC,EAChC,oBAAoB,EACpB,MAAM,EACP,MAAM,qBAAqB,CAAA;AAqB5B,wFAAwF;AACxF,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,CAAA;IACzB,6EAA6E;IAC7E,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,oBAAoB,EAAE,oBAAoB,CAAA;IAC1C,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,gBAAgB,EAAE,0BAA0B,CAAA;IAC5C,uBAAuB,EAAE,uBAAuB,CAAA;IAChD,oFAAoF;IACpF,8BAA8B,EAAE,8BAA8B,CAAA;IAC9D,iFAAiF;IACjF,0BAA0B,EAAE,0BAA0B,CAAA;IACtD,uFAAuF;IACvF,gCAAgC,EAAE,gCAAgC,CAAA;IAClE,4FAA4F;IAC5F,0BAA0B,CAAC,EAAE,0BAA0B,CAAA;IACvD,+FAA+F;IAC/F,yBAAyB,CAAC,EAAE,yBAAyB,CAAA;IACrD,mFAAmF;IACnF,4BAA4B,CAAC,EAAE,4BAA4B,CAAA;IAC3D,sFAAsF;IACtF,sBAAsB,EAAE,sBAAsB,CAAA;IAC9C,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,eAAe,CAAA;IACvB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,uBAAuB,EAAE,MAAM,CAAA;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,EACnC,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,8BAA8B,EAC9B,0BAA0B,EAC1B,gCAAgC,EAChC,0BAA0B,EAC1B,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,KAAK,EACL,MAAM,EACN,MAAM,GACP,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CA2D1C"}
1
+ {"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/retention.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
- import { createRetentionPass } from '@cat-factory/orchestration';
1
+ import { RUN_DAY_ROLLUP_LOOKBACK_MS, createRetentionPass } from '@cat-factory/orchestration';
2
2
  /** Recurring-pipeline run history is kept ~1 week (the inspector's window). */
3
3
  const SCHEDULE_RUN_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
4
+ // Auth attempts are junk once the 15-minute throttle window closes; a 1-hour retention leaves
5
+ // ample slack for clock skew. It is the AGE at which a row becomes prunable, not how often the
6
+ // prune runs: this facade sweeps on the daily retention cron, so a row survives up to a day past
7
+ // it. Bounding the age still matters (the rows carry `ip:email`), but nothing about the throttle
8
+ // depends on the prune, which reads its own 15-minute window.
9
+ const AUTH_ATTEMPT_RETENTION_MS = 60 * 60 * 1000;
4
10
  /**
5
11
  * Idle subscription quota-cycle rows are pruned after 30 days. A fixed window (not the
6
12
  * configurable retention policy), deliberately far beyond the longest quota window (the
@@ -19,7 +25,7 @@ const SUBSCRIPTION_QUOTA_CYCLE_RETENTION_MS = 30 * 24 * 60 * 60 * 1000;
19
25
  * since the same table failed on every subsequent pass too. Shared with the Node twin via
20
26
  * `createRetentionPass`, so the two facades cannot drift on it.
21
27
  */
22
- export async function sweepRetention({ tokenUsageRepository, rateLimitRepository, commitRepository, llmCallMetricRepository, agentContextSnapshotRepository, agentSearchQueryRepository, subscriptionQuotaCycleRepository, pipelineScheduleRepository, provisioningLogRepository, passwordResetTokenRepository, notificationRepository, clock, policy, logger, }) {
28
+ export async function sweepRetention({ tokenUsageRepository, rateLimitRepository, commitRepository, llmCallMetricRepository, agentContextSnapshotRepository, agentSearchQueryRepository, subscriptionQuotaCycleRepository, pipelineScheduleRepository, provisioningLogRepository, passwordResetTokenRepository, machineNodeRepository, authAttemptRepository, notificationRepository, gateOutcomeRepository, platformMetricsRepository, clock, policy, logger, }) {
23
29
  const now = clock.now();
24
30
  const pass = createRetentionPass(logger);
25
31
  return {
@@ -43,8 +49,19 @@ export async function sweepRetention({ tokenUsageRepository, rateLimitRepository
43
49
  passwordResetTokens: passwordResetTokenRepository
44
50
  ? await pass.expire('password_reset_tokens', () => passwordResetTokenRepository.deleteExpired(now))
45
51
  : 0,
52
+ // Machine-node roster rows past their latest signed exp: `now`, not a window.
53
+ machineNodes: await pass.expire('machine_nodes', () => machineNodeRepository.deleteExpired(now)),
54
+ // Password-throttle attempts on a fixed aggressive window (SEC-4).
55
+ authAttempts: await pass.prune('auth_attempts', AUTH_ATTEMPT_RETENTION_MS, now, (c) => authAttemptRepository.deleteOlderThan(c)),
46
56
  // Resolved (acted/dismissed) notifications past the window; open cards untouched.
47
57
  notifications: await pass.prune('notifications', policy.notificationsMs, now, (c) => notificationRepository.deleteResolvedOlderThan(c)),
58
+ // Settled gates behind the dashboard's attempt statistics.
59
+ gateOutcomes: await pass.prune('gate_outcomes', policy.gateOutcomesMs, now, (c) => gateOutcomeRepository.deleteOlderThan(c)),
60
+ // Materialise the daily rollup BEFORE pruning it, so a pass never prunes a window it is
61
+ // about to rewrite, and recompute a short trailing lookback so a missed pass self-heals
62
+ // rather than leaving a day permanently half-counted.
63
+ runDaysRolledUp: await pass.materialize('platform_run_days', () => platformMetricsRepository.rollupRunDays(now - RUN_DAY_ROLLUP_LOOKBACK_MS, now)),
64
+ runDays: await pass.prune('platform_run_days', policy.runDaysMs, now, (c) => platformMetricsRepository.deleteRunDaysOlderThan(c)),
48
65
  failedTables: pass.failed,
49
66
  };
50
67
  }