@cat-factory/worker 0.166.3 → 0.168.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 (64) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +13 -17
  3. package/dist/index.js.map +1 -1
  4. package/dist/infrastructure/config/retention.d.ts.map +1 -1
  5. package/dist/infrastructure/config/retention.js +6 -0
  6. package/dist/infrastructure/config/retention.js.map +1 -1
  7. package/dist/infrastructure/container-assembly.d.ts.map +1 -1
  8. package/dist/infrastructure/container-assembly.js +17 -8
  9. package/dist/infrastructure/container-assembly.js.map +1 -1
  10. package/dist/infrastructure/env.d.ts +7 -0
  11. package/dist/infrastructure/env.d.ts.map +1 -1
  12. package/dist/infrastructure/env.js.map +1 -1
  13. package/dist/infrastructure/observability/logExport.d.ts.map +1 -1
  14. package/dist/infrastructure/observability/logExport.js +10 -4
  15. package/dist/infrastructure/observability/logExport.js.map +1 -1
  16. package/dist/infrastructure/observability/logSettings.d.ts +22 -0
  17. package/dist/infrastructure/observability/logSettings.d.ts.map +1 -0
  18. package/dist/infrastructure/observability/logSettings.js +42 -0
  19. package/dist/infrastructure/observability/logSettings.js.map +1 -0
  20. package/dist/infrastructure/repositories/D1AuditEventRepository.d.ts +1 -0
  21. package/dist/infrastructure/repositories/D1AuditEventRepository.d.ts.map +1 -1
  22. package/dist/infrastructure/repositories/D1AuditEventRepository.js +6 -0
  23. package/dist/infrastructure/repositories/D1AuditEventRepository.js.map +1 -1
  24. package/dist/infrastructure/repositories/D1ReportsRepository.d.ts.map +1 -1
  25. package/dist/infrastructure/repositories/D1ReportsRepository.js +9 -0
  26. package/dist/infrastructure/repositories/D1ReportsRepository.js.map +1 -1
  27. package/dist/infrastructure/repositories/D1SpendRollupRepository.d.ts +20 -0
  28. package/dist/infrastructure/repositories/D1SpendRollupRepository.d.ts.map +1 -0
  29. package/dist/infrastructure/repositories/D1SpendRollupRepository.js +243 -0
  30. package/dist/infrastructure/repositories/D1SpendRollupRepository.js.map +1 -0
  31. package/dist/infrastructure/repositories/D1UserRepository.d.ts +2 -0
  32. package/dist/infrastructure/repositories/D1UserRepository.d.ts.map +1 -1
  33. package/dist/infrastructure/repositories/D1UserRepository.js +26 -0
  34. package/dist/infrastructure/repositories/D1UserRepository.js.map +1 -1
  35. package/dist/infrastructure/workflows/BootstrapWorkflow.d.ts +1 -0
  36. package/dist/infrastructure/workflows/BootstrapWorkflow.d.ts.map +1 -1
  37. package/dist/infrastructure/workflows/BootstrapWorkflow.js +9 -2
  38. package/dist/infrastructure/workflows/BootstrapWorkflow.js.map +1 -1
  39. package/dist/infrastructure/workflows/EnvConfigRepairWorkflow.d.ts +1 -0
  40. package/dist/infrastructure/workflows/EnvConfigRepairWorkflow.d.ts.map +1 -1
  41. package/dist/infrastructure/workflows/EnvConfigRepairWorkflow.js +7 -2
  42. package/dist/infrastructure/workflows/EnvConfigRepairWorkflow.js.map +1 -1
  43. package/dist/infrastructure/workflows/EnvironmentTestWorkflow.d.ts +1 -0
  44. package/dist/infrastructure/workflows/EnvironmentTestWorkflow.d.ts.map +1 -1
  45. package/dist/infrastructure/workflows/EnvironmentTestWorkflow.js +7 -2
  46. package/dist/infrastructure/workflows/EnvironmentTestWorkflow.js.map +1 -1
  47. package/dist/infrastructure/workflows/ExecutionWorkflow.d.ts +1 -0
  48. package/dist/infrastructure/workflows/ExecutionWorkflow.d.ts.map +1 -1
  49. package/dist/infrastructure/workflows/ExecutionWorkflow.js +10 -2
  50. package/dist/infrastructure/workflows/ExecutionWorkflow.js.map +1 -1
  51. package/dist/infrastructure/workflows/GitHubBackfillWorkflow.d.ts.map +1 -1
  52. package/dist/infrastructure/workflows/GitHubBackfillWorkflow.js +11 -5
  53. package/dist/infrastructure/workflows/GitHubBackfillWorkflow.js.map +1 -1
  54. package/dist/infrastructure/workflows/logExport.d.ts +11 -0
  55. package/dist/infrastructure/workflows/logExport.d.ts.map +1 -0
  56. package/dist/infrastructure/workflows/logExport.js +110 -0
  57. package/dist/infrastructure/workflows/logExport.js.map +1 -0
  58. package/dist/infrastructure/workflows/retention.d.ts +20 -2
  59. package/dist/infrastructure/workflows/retention.d.ts.map +1 -1
  60. package/dist/infrastructure/workflows/retention.js +13 -2
  61. package/dist/infrastructure/workflows/retention.js.map +1 -1
  62. package/migrations/0084_spend_days.sql +72 -0
  63. package/migrations/0084_user_session_generation.sql +22 -0
  64. package/package.json +18 -18
@@ -1 +1 @@
1
- {"version":3,"file":"D1AuditEventRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1AuditEventRepository.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,qBAAqB,CAAA;AAG5B,oEAAoE;AACpE,MAAM,OAAO,sBAAsB;IAChB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAuB;QAClC,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,6FAA6F;QAC7F,2FAA2F;QAC3F,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;kDAG0C,CAC3C;aACA,IAAI,CACH,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,aAAa,EACjB,GAAG,CAAC,gBAAgB,EACpB,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,EAAE,CACP;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,SAAiB,EACjB,OAAoD;QAEpD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC5C,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAChD,6FAA6F;QAC7F,yFAAyF;QACzF,wEAAwE;QACxE,MAAM,SAAS,GAAG,KAAK;YACrB,CAAC,CAAC,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;gDAEoC,CACrC;iBACA,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC;YAC7D,CAAC,CAAC,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;gDAEoC,CACrC;iBACA,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;QAEjC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAiB,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACxB,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SACzE,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"D1AuditEventRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1AuditEventRepository.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,qBAAqB,CAAA;AAG5B,oEAAoE;AACpE,MAAM,OAAO,sBAAsB;IAChB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAuB;QAClC,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,6FAA6F;QAC7F,2FAA2F;QAC3F,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;kDAG0C,CAC3C;aACA,IAAI,CACH,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,aAAa,EACjB,GAAG,CAAC,gBAAgB,EACpB,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,EAAE,CACP;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,2FAA2F;QAC3F,4EAA4E;QAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAA;QAChG,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,SAAiB,EACjB,OAAoD;QAEpD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC5C,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAChD,6FAA6F;QAC7F,yFAAyF;QACzF,wEAAwE;QACxE,MAAM,SAAS,GAAG,KAAK;YACrB,CAAC,CAAC,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;gDAEoC,CACrC;iBACA,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC;YAC7D,CAAC,CAAC,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;gDAEoC,CACrC;iBACA,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;QAEjC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAiB,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACxB,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SACzE,CAAA;IACH,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"D1ReportsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1ReportsRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC3F,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA0J3D,qBAAa,mBAAoB,YAAW,iBAAiB;IAC3D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAED;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAgBb,gBAAgB,CACpB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,oBAAoB,EAC/B,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6B7B;IAEK,mBAAmB,CACvB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,uBAAuB,EAClC,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA2ChC;IAEK,UAAU,CACd,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAkCnC;CACF"}
1
+ {"version":3,"file":"D1ReportsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1ReportsRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC3F,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAmK3D,qBAAa,mBAAoB,YAAW,iBAAiB;IAC3D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAED;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAgBb,gBAAgB,CACpB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,oBAAoB,EAC/B,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6B7B;IAEK,mBAAmB,CACvB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,uBAAuB,EAClC,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA2ChC;IAEK,UAAU,CACd,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAkCnC;CACF"}
@@ -99,6 +99,15 @@ const SPEND_DIMENSIONS = {
99
99
  key: "COALESCE(tk.ticket_key, '')",
100
100
  label: 'NULL',
101
101
  },
102
+ run: {
103
+ // The KEY needs no join (the ledger row records its run); the joins are the LABEL's, and
104
+ // both are 1:1 primary-key joins. A run with no block (a repo bootstrap) keeps its money
105
+ // and loses its name, like an unsynced repo above.
106
+ joins: `LEFT JOIN agent_runs ar ON ar.workspace_id = tu.workspace_id AND ar.id = tu.execution_id
107
+ LEFT JOIN blocks b ON b.workspace_id = ar.workspace_id AND b.id = ar.block_id`,
108
+ key: "COALESCE(tu.execution_id, '')",
109
+ label: 'MAX(b.title)',
110
+ },
102
111
  };
103
112
  /** The same, for the run-based activity breakdowns (a run already carries its service/block). */
104
113
  const ACTIVITY_DIMENSIONS = {
@@ -1 +1 @@
1
- {"version":3,"file":"D1ReportsRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1ReportsRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"D1ReportsRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1ReportsRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ReportSpendDimension } from '@cat-factory/contracts';
2
+ import { type ReportRange, type ReportScope, type ReportSpendGroup, type ReportSpendTrendBucket, type SpendRollupRepository } from '@cat-factory/kernel';
3
+ import type { D1Database } from '@cloudflare/workers-types';
4
+ export declare class D1SpendRollupRepository implements SpendRollupRepository {
5
+ private readonly db;
6
+ constructor({ db }: {
7
+ db: D1Database;
8
+ });
9
+ rollupSpendDays(fromEpochMs: number, toEpochMs: number): Promise<number>;
10
+ spendRollupWatermark(): Promise<number | null>;
11
+ /**
12
+ * The account (+ optional single-board) scope and the day window. Scoped on the row's OWN
13
+ * `account_id` rather than a `workspaces` sub-select: the whole point of the table is that
14
+ * a read of it does not depend on rows that may since have been re-pointed or deleted.
15
+ */
16
+ private scopeClause;
17
+ spendByDimension(scope: ReportScope, dimension: ReportSpendDimension, range: ReportRange): Promise<ReportSpendGroup[]>;
18
+ spendTrend(scope: ReportScope, range: ReportRange, bucketMs: number): Promise<ReportSpendTrendBucket[]>;
19
+ }
20
+ //# sourceMappingURL=D1SpendRollupRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1SpendRollupRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1SpendRollupRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,oBAAoB,EAAyB,MAAM,wBAAwB,CAAA;AACzF,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAqF3D,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,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgG7E;IAEK,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMnD;IAED;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAYb,gBAAgB,CACpB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,oBAAoB,EAC/B,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA4B7B;IAEK,UAAU,CACd,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAkCnC;CACF"}
@@ -0,0 +1,243 @@
1
+ import { lastCompleteRollupDay } from '@cat-factory/contracts';
2
+ import { SPEND_DAYS_ROLLUP, } from '@cat-factory/kernel';
3
+ // The durable cost-attribution rollup (`spend_days`) against D1: the write is one
4
+ // `INSERT … SELECT … GROUP BY` folding the ledger with the run's board shape frozen onto it,
5
+ // and every read is one aggregate over that table ALONE, with no join, so nothing a reader sees
6
+ // can be re-pointed or pruned out from under it. Mirrors `DrizzleSpendRollupRepository`; the
7
+ // cross-runtime conformance suite asserts the two agree with each other AND with the
8
+ // ledger-side `ReportsRepository` they stand in for on the long windows.
9
+ const DAY_MS = 24 * 60 * 60 * 1000;
10
+ /**
11
+ * A service's display name, PRE-AGGREGATED to one row per service id, the same guard the
12
+ * ledger-side repository documents at length: `blocks` is keyed `(workspace_id, id)`, a block
13
+ * id is only unique within a board, so joining `blocks ON blocks.id = services.frame_block_id`
14
+ * from an aggregate would FAN OUT and multiply that service's calls, tokens and cost.
15
+ */
16
+ const SERVICE_LABELS = `SELECT s.id AS service_id, MIN(b.title) AS title
17
+ FROM services s
18
+ LEFT JOIN blocks b ON b.id = s.frame_block_id
19
+ GROUP BY s.id`;
20
+ /**
21
+ * The tracker ticket a block is linked to, PRE-AGGREGATED to one row per
22
+ * `(workspace_id, linked_block_id)`: `idx_tasks_block` is a plain index, so a block linked
23
+ * from two imported issues would otherwise fan the aggregate out and double that block's
24
+ * money. `MIN(source || ':' || external_id)` makes the pick deterministic, matching the
25
+ * ledger-side dimension exactly. The rollup must not attribute a block to a different ticket
26
+ * than the live read would, or the two sources would disagree at the window boundary.
27
+ */
28
+ const TICKET_BY_BLOCK = `SELECT workspace_id, linked_block_id,
29
+ MIN(source || ':' || external_id) AS ticket_key
30
+ FROM tasks
31
+ WHERE linked_block_id IS NOT NULL AND deleted_at IS NULL
32
+ GROUP BY workspace_id, linked_block_id`;
33
+ /**
34
+ * Every join the fold needs, each provably 1:1 with a ledger row: `workspaces` and `services`
35
+ * on their primary keys, `blocks` and `github_repos` on theirs, and the two pre-aggregated
36
+ * sub-selects above. That is what lets `COUNT(*)` and the token/cost sums stay exact while
37
+ * seven tables are in the query.
38
+ */
39
+ const ROLLUP_JOINS = `LEFT JOIN workspaces w ON w.id = tu.workspace_id
40
+ LEFT JOIN agent_runs ar ON ar.workspace_id = tu.workspace_id AND ar.id = tu.execution_id
41
+ LEFT JOIN blocks b ON b.workspace_id = ar.workspace_id AND b.id = ar.block_id
42
+ LEFT JOIN services s ON s.id = ar.service_id
43
+ LEFT JOIN (${SERVICE_LABELS}) sl ON sl.service_id = ar.service_id
44
+ LEFT JOIN github_repos gr ON gr.workspace_id = tu.workspace_id
45
+ AND gr.github_id = s.repo_github_id
46
+ LEFT JOIN (${TICKET_BY_BLOCK}) tk ON tk.workspace_id = ar.workspace_id
47
+ AND tk.linked_block_id = ar.block_id`;
48
+ /**
49
+ * The two cost sums, spelled out rather than referenced by output alias.
50
+ *
51
+ * The alias would be `metered_cost`, which is also the name of the COLUMN being summed, and
52
+ * inside an aggregate query SQLite resolves a bare name in an ORDER BY expression to the input
53
+ * column: the ranking then read one arbitrary row's cost per group instead of the group's
54
+ * total, which silently mis-ordered "heaviest first", the one thing every breakdown promises.
55
+ */
56
+ const METERED_COST = 'COALESCE(SUM(sd.metered_cost), 0)';
57
+ const SUBSCRIPTION_COST = 'COALESCE(SUM(sd.subscription_cost), 0)';
58
+ /** Which stored column a spend dimension groups by, and which one labels it. */
59
+ const DIMENSIONS = {
60
+ model: { key: "sd.provider || ':' || sd.model", label: 'NULL' },
61
+ agentKind: { key: 'sd.agent_kind', label: 'NULL' },
62
+ workspace: { key: 'sd.workspace_id', label: 'MAX(sd.workspace_name)' },
63
+ service: { key: 'sd.service_id', label: 'MAX(sd.service_name)' },
64
+ taskType: { key: 'sd.task_type', label: 'NULL' },
65
+ repo: { key: 'sd.repo_id', label: 'MAX(sd.repo_name)' },
66
+ ticket: { key: 'sd.ticket_ref', label: 'NULL' },
67
+ run: { key: 'sd.execution_id', label: 'MAX(sd.block_title)' },
68
+ };
69
+ export class D1SpendRollupRepository {
70
+ db;
71
+ constructor({ db }) {
72
+ this.db = db;
73
+ }
74
+ async rollupSpendDays(fromEpochMs, toEpochMs) {
75
+ // Snap to day edges so a partially-covered day is never written with only the covered
76
+ // part's spend, which would then read as a complete (and cheap) day.
77
+ const from = Math.floor(fromEpochMs / DAY_MS) * DAY_MS;
78
+ const to = Math.ceil(toEpochMs / DAY_MS) * DAY_MS;
79
+ if (to <= from)
80
+ return 0;
81
+ // DELETE the window, then INSERT it: an upsert alone is NOT a rewrite. A ledger row can
82
+ // arrive for a day that has already been rolled up (a run still in flight, a late meter),
83
+ // and a bucket the new result set no longer produces (a run whose block was since
84
+ // deleted, so its `taskType` moves to the unattributed slice) is never touched by
85
+ // `DO UPDATE` and would sit there double-counting for the LIFE of the table, which here
86
+ // means forever. `batch()` runs both in one implicit transaction, so a concurrent report
87
+ // read never observes the window mid-rewrite and renders the gap as a quiet fortnight.
88
+ //
89
+ // The rewrite reaches only boards that STILL EXIST, because a rewrite may only delete
90
+ // what it can reproduce. `token_usage` IS in the workspace-delete cascade and this table
91
+ // deliberately is not (`WORKSPACE_CASCADE_SPECIAL_TABLES`), so for a deleted board the
92
+ // re-fold below reads nothing and a bare window DELETE would quietly reclaim the very
93
+ // rows the exclusion exists to keep: every day of it still inside the trailing rewrite
94
+ // window at the moment the board went. Once the board is gone the ledger can never speak
95
+ // for those buckets again, which is exactly what makes them final.
96
+ const [, inserted] = await this.db.batch([
97
+ this.db
98
+ .prepare(`DELETE FROM spend_days
99
+ WHERE day_start >= ? AND day_start < ?
100
+ AND workspace_id IN (SELECT id FROM workspaces)`)
101
+ .bind(from, to),
102
+ this.db
103
+ .prepare(`INSERT INTO spend_days (
104
+ workspace_id, day_start, execution_id, agent_kind, provider, model, billing, vendor,
105
+ account_id, workspace_name, block_id, block_title, service_id, service_name,
106
+ repo_id, repo_name, task_type, ticket_ref,
107
+ calls, input_tokens, output_tokens, metered_cost, subscription_cost)
108
+ SELECT tu.workspace_id,
109
+ CAST(tu.created_at / ? AS INTEGER) * ? AS day_start,
110
+ COALESCE(tu.execution_id, '') AS execution_id,
111
+ tu.agent_kind,
112
+ tu.provider,
113
+ tu.model,
114
+ tu.billing,
115
+ COALESCE(tu.vendor, '') AS vendor,
116
+ -- The ledger's own denormalized account wins; the board's is the fallback
117
+ -- for a row recorded before it was resolved.
118
+ MAX(COALESCE(tu.account_id, w.account_id, '')) AS account_id,
119
+ MAX(w.name) AS workspace_name,
120
+ MAX(COALESCE(ar.block_id, '')) AS block_id,
121
+ MAX(b.title) AS block_title,
122
+ MAX(COALESCE(ar.service_id, '')) AS service_id,
123
+ MAX(sl.title) AS service_name,
124
+ MAX(COALESCE(CAST(s.repo_github_id AS TEXT), '')) AS repo_id,
125
+ MAX(gr.owner || '/' || gr.name) AS repo_name,
126
+ MAX(COALESCE(b.task_type, '')) AS task_type,
127
+ MAX(COALESCE(tk.ticket_key, '')) AS ticket_ref,
128
+ COUNT(*) AS calls,
129
+ COALESCE(SUM(tu.input_tokens), 0) AS input_tokens,
130
+ COALESCE(SUM(tu.output_tokens), 0) AS output_tokens,
131
+ COALESCE(SUM(CASE WHEN tu.billing = 'subscription'
132
+ THEN 0 ELSE tu.cost_estimate END), 0) AS metered_cost,
133
+ COALESCE(SUM(CASE WHEN tu.billing = 'subscription'
134
+ THEN tu.cost_estimate ELSE 0 END), 0) AS subscription_cost
135
+ FROM token_usage tu
136
+ ${ROLLUP_JOINS}
137
+ WHERE tu.created_at >= ? AND tu.created_at < ?
138
+ GROUP BY 1, 2, 3, 4, 5, 6, 7, 8
139
+ ON CONFLICT(workspace_id, day_start, execution_id, agent_kind, provider, model,
140
+ billing, vendor)
141
+ DO UPDATE SET calls = excluded.calls,
142
+ input_tokens = excluded.input_tokens,
143
+ output_tokens = excluded.output_tokens,
144
+ metered_cost = excluded.metered_cost,
145
+ subscription_cost = excluded.subscription_cost`)
146
+ .bind(DAY_MS, DAY_MS, from, to),
147
+ // The sweep's coverage, in the SAME batch (hence the same transaction) as the rewrite it
148
+ // describes, and forward-only so a catch-up pass over an older window cannot present a
149
+ // current rollup as a stalled one.
150
+ //
151
+ // `through_day` is the last day this pass covered COMPLETELY, which is not the last day
152
+ // it wrote: `to` is rounded UP to a day edge so today's partial spend is folded rather
153
+ // than deferred, and today keeps accruing after the sweep returns. Stamping the day
154
+ // `to` lands in would advertise a bucket still filling as finished, and the panel's
155
+ // "complete through <date>" would then name the one day guaranteed to be short. See
156
+ // `lastCompleteRollupDay`.
157
+ this.db
158
+ .prepare(`INSERT INTO platform_rollup_state (rollup, through_day, updated_at) VALUES (?, ?, ?)
159
+ ON CONFLICT(rollup) DO UPDATE SET
160
+ through_day = MAX(platform_rollup_state.through_day, excluded.through_day),
161
+ updated_at = MAX(platform_rollup_state.updated_at, excluded.updated_at)`)
162
+ .bind(SPEND_DAYS_ROLLUP, lastCompleteRollupDay(toEpochMs), toEpochMs),
163
+ ]);
164
+ return inserted?.meta.changes ?? 0;
165
+ }
166
+ async spendRollupWatermark() {
167
+ const row = await this.db
168
+ .prepare('SELECT through_day FROM platform_rollup_state WHERE rollup = ?')
169
+ .bind(SPEND_DAYS_ROLLUP)
170
+ .first();
171
+ return row ? Number(row.through_day) : null;
172
+ }
173
+ /**
174
+ * The account (+ optional single-board) scope and the day window. Scoped on the row's OWN
175
+ * `account_id` rather than a `workspaces` sub-select: the whole point of the table is that
176
+ * a read of it does not depend on rows that may since have been re-pointed or deleted.
177
+ */
178
+ scopeClause(scope, range) {
179
+ const binds = [scope.accountId];
180
+ let sql = 'sd.account_id = ?';
181
+ if (scope.workspaceId) {
182
+ sql += ' AND sd.workspace_id = ?';
183
+ binds.push(scope.workspaceId);
184
+ }
185
+ sql += ' AND sd.day_start >= ? AND sd.day_start < ?';
186
+ binds.push(range.since, range.until);
187
+ return { sql, binds };
188
+ }
189
+ async spendByDimension(scope, dimension, range) {
190
+ const dim = DIMENSIONS[dimension];
191
+ const where = this.scopeClause(scope, range);
192
+ const { results } = await this.db
193
+ .prepare(`SELECT ${dim.key} AS k,
194
+ ${dim.label} AS label,
195
+ COALESCE(SUM(sd.input_tokens), 0) AS input_tokens,
196
+ COALESCE(SUM(sd.output_tokens), 0) AS output_tokens,
197
+ COALESCE(SUM(sd.calls), 0) AS calls,
198
+ ${METERED_COST} AS metered_cost,
199
+ ${SUBSCRIPTION_COST} AS subscription_cost
200
+ FROM spend_days sd
201
+ WHERE ${where.sql}
202
+ GROUP BY k
203
+ ORDER BY (${METERED_COST} + ${SUBSCRIPTION_COST}) DESC, k`)
204
+ .bind(...where.binds)
205
+ .all();
206
+ return (results ?? []).map((r) => ({
207
+ key: r.k ?? '',
208
+ label: r.label,
209
+ inputTokens: Number(r.input_tokens),
210
+ outputTokens: Number(r.output_tokens),
211
+ calls: Number(r.calls),
212
+ meteredCost: Number(r.metered_cost),
213
+ subscriptionCost: Number(r.subscription_cost),
214
+ }));
215
+ }
216
+ async spendTrend(scope, range, bucketMs) {
217
+ const where = this.scopeClause(scope, range);
218
+ // CAST(... AS INTEGER) forces integer (floor) division: D1 binds JS numbers as REAL, so a
219
+ // bare `day_start / ?` would be floating-point and never land on a bucket edge.
220
+ const { results } = await this.db
221
+ .prepare(`SELECT CAST(sd.day_start / ? AS INTEGER) * ? AS bucket_start,
222
+ COALESCE(SUM(sd.input_tokens), 0) AS input_tokens,
223
+ COALESCE(SUM(sd.output_tokens), 0) AS output_tokens,
224
+ COALESCE(SUM(sd.calls), 0) AS calls,
225
+ ${METERED_COST} AS metered_cost,
226
+ ${SUBSCRIPTION_COST} AS subscription_cost
227
+ FROM spend_days sd
228
+ WHERE ${where.sql}
229
+ GROUP BY bucket_start
230
+ ORDER BY bucket_start`)
231
+ .bind(bucketMs, bucketMs, ...where.binds)
232
+ .all();
233
+ return (results ?? []).map((r) => ({
234
+ bucketStart: Number(r.bucket_start),
235
+ meteredCost: Number(r.metered_cost),
236
+ subscriptionCost: Number(r.subscription_cost),
237
+ calls: Number(r.calls),
238
+ inputTokens: Number(r.input_tokens),
239
+ outputTokens: Number(r.output_tokens),
240
+ }));
241
+ }
242
+ }
243
+ //# sourceMappingURL=D1SpendRollupRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1SpendRollupRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1SpendRollupRepository.ts"],"names":[],"mappings":"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"}
@@ -15,5 +15,7 @@ export declare class D1UserRepository implements UserRepository {
15
15
  getIdentity(provider: IdentityProvider, subject: string): Promise<UserIdentityRecord | null>;
16
16
  linkIdentity(identity: UserIdentityRecord): Promise<void>;
17
17
  listIdentities(userId: string): Promise<UserIdentityRecord[]>;
18
+ sessionGeneration(userId: string): Promise<number | null>;
19
+ bumpSessionGeneration(userId: string): Promise<number>;
18
20
  }
19
21
  //# sourceMappingURL=D1UserRepository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"D1UserRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1UserRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAwC3D,0EAA0E;AAC1E,qBAAa,gBAAiB,YAAW,cAAc;IACrD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAGhD;IAEK,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5C;IAEK,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC,GAC/D,OAAO,CAAC,IAAI,CAAC,CAoBf;IAEK,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAU5F;IAEK,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAM3D;IAEK,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQpD;IAEK,WAAW,CACf,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAMpC;IAEK,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9D;IAEK,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAMlE;CACF"}
1
+ {"version":3,"file":"D1UserRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1UserRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAwC3D,0EAA0E;AAC1E,qBAAa,gBAAiB,YAAW,cAAc;IACrD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAGhD;IAEK,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5C;IAEK,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC,GAC/D,OAAO,CAAC,IAAI,CAAC,CAoBf;IAEK,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAU5F;IAEK,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAM3D;IAEK,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQpD;IAEK,WAAW,CACf,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAMpC;IAEK,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9D;IAEK,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAMlE;IAEK,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS9D;IAEK,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB3D;CACF"}
@@ -104,5 +104,31 @@ export class D1UserRepository {
104
104
  .all();
105
105
  return results.map(rowToIdentity);
106
106
  }
107
+ async sessionGeneration(userId) {
108
+ // Selecting the ONE column rather than reusing `get`: this runs on every authenticated
109
+ // request on the facade whose cache profile passes through, so it stays the narrowest read
110
+ // the store can serve.
111
+ const row = await this.db
112
+ .prepare('SELECT session_generation FROM users WHERE id = ?')
113
+ .bind(userId)
114
+ .first();
115
+ return row ? row.session_generation : null;
116
+ }
117
+ async bumpSessionGeneration(userId) {
118
+ // Incremented in SQL and RETURNING the new value, so two concurrent revocations cannot both
119
+ // read the same generation and write the same successor — and so the caller invalidating the
120
+ // cached read can only ever cache a number the row actually holds.
121
+ const row = await this.db
122
+ .prepare(`UPDATE users SET session_generation = session_generation + 1
123
+ WHERE id = ? RETURNING session_generation`)
124
+ .bind(userId)
125
+ .first();
126
+ if (!row) {
127
+ // A revocation that matched no row must not report success: the caller's whole purpose is
128
+ // to withdraw access, and "nothing to withdraw" is a state it has to hear about.
129
+ throw new Error(`Cannot revoke sessions for unknown user '${userId}'`);
130
+ }
131
+ return row.session_generation;
132
+ }
107
133
  }
108
134
  //# sourceMappingURL=D1UserRepository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"D1UserRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1UserRepository.ts"],"names":[],"mappings":"AAyBA,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAgB;IACrC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,QAAQ,EAAE,GAAG,CAAC,QAA4B;QAC1C,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,OAAO,gBAAgB;IACV,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAW,CAAA;QAC/F,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAgB;QAC3B,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,oFAAoF,CAAC;aAC7F,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;aACpE,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,MAAM,CACV,EAAU,EACV,KAAgE;QAEhE,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,MAAM,KAAK,GAAsB,EAAE,CAAA;QACnC,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC7B,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;aAC3D,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;aAClB,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAA0B,EAAE,OAAe;QAC9D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;;iDAEyC,CAC1C;aACA,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;aACvB,KAAK,EAAW,CAAA;QACnB,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,qCAAqC,CAAC;aAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;aAChC,KAAK,EAAW,CAAA;QACnB,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAa;QAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QAC/B,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CAAC,oCAAoC,YAAY,GAAG,CAAC;aAC5D,IAAI,CAAC,GAAG,GAAG,CAAC;aACZ,GAAG,EAAW,CAAA;QACjB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW,CACf,QAA0B,EAC1B,OAAe;QAEf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,kEAAkE,CAAC;aAC3E,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;aACvB,KAAK,EAAe,CAAA;QACvB,OAAO,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAA4B;QAC7C,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;8FAGsF,CACvF;aACA,IAAI,CACH,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,SAAS,CACnB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CAAC,iDAAiD,CAAC;aAC1D,IAAI,CAAC,MAAM,CAAC;aACZ,GAAG,EAAe,CAAA;QACrB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"D1UserRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1UserRepository.ts"],"names":[],"mappings":"AAyBA,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAgB;IACrC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,QAAQ,EAAE,GAAG,CAAC,QAA4B;QAC1C,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,OAAO,gBAAgB;IACV,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAW,CAAA;QAC/F,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAgB;QAC3B,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,oFAAoF,CAAC;aAC7F,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;aACpE,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,MAAM,CACV,EAAU,EACV,KAAgE;QAEhE,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,MAAM,KAAK,GAAsB,EAAE,CAAA;QACnC,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC7B,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;aAC3D,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;aAClB,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAA0B,EAAE,OAAe;QAC9D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;;iDAEyC,CAC1C;aACA,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;aACvB,KAAK,EAAW,CAAA;QACnB,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,qCAAqC,CAAC;aAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;aAChC,KAAK,EAAW,CAAA;QACnB,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAa;QAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QAC/B,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CAAC,oCAAoC,YAAY,GAAG,CAAC;aAC5D,IAAI,CAAC,GAAG,GAAG,CAAC;aACZ,GAAG,EAAW,CAAA;QACjB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW,CACf,QAA0B,EAC1B,OAAe;QAEf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,kEAAkE,CAAC;aAC3E,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;aACvB,KAAK,EAAe,CAAA;QACvB,OAAO,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAA4B;QAC7C,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;8FAGsF,CACvF;aACA,IAAI,CACH,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,SAAS,CACnB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CAAC,iDAAiD,CAAC;aAC1D,IAAI,CAAC,MAAM,CAAC;aACZ,GAAG,EAAe,CAAA;QACrB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc;QACpC,uFAAuF;QACvF,2FAA2F;QAC3F,uBAAuB;QACvB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,mDAAmD,CAAC;aAC5D,IAAI,CAAC,MAAM,CAAC;aACZ,KAAK,EAAkC,CAAA;QAC1C,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5C,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,MAAc;QACxC,4FAA4F;QAC5F,6FAA6F;QAC7F,mEAAmE;QACnE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;qDAC6C,CAC9C;aACA,IAAI,CAAC,MAAM,CAAC;aACZ,KAAK,EAAkC,CAAA;QAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,0FAA0F;YAC1F,iFAAiF;YACjF,MAAM,IAAI,KAAK,CAAC,4CAA4C,MAAM,GAAG,CAAC,CAAA;QACxE,CAAC;QACD,OAAO,GAAG,CAAC,kBAAkB,CAAA;IAC/B,CAAC;CACF"}
@@ -17,5 +17,6 @@ export interface BootstrapWorkflowParams {
17
17
  */
18
18
  export declare class BootstrapWorkflow extends WorkflowEntrypoint<Env, BootstrapWorkflowParams> {
19
19
  run(event: WorkflowEvent<BootstrapWorkflowParams>, step: WorkflowStep): Promise<void>;
20
+ private drive;
20
21
  }
21
22
  //# sourceMappingURL=BootstrapWorkflow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BootstrapWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/BootstrapWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAMjC,sFAAsF;AACtF,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAQD;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,SAAQ,kBAAkB,CAAC,GAAG,EAAE,uBAAuB,CAAC;IACtE,GAAG,CAChB,KAAK,EAAE,aAAa,CAAC,uBAAuB,CAAC,EAC7C,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAuEf;CACF"}
1
+ {"version":3,"file":"BootstrapWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/BootstrapWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAOjC,sFAAsF;AACtF,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAQD;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,SAAQ,kBAAkB,CAAC,GAAG,EAAE,uBAAuB,CAAC;IAC5E,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7F;YAEa,KAAK;CAwEpB"}
@@ -2,6 +2,7 @@ import { WorkflowEntrypoint, } from 'cloudflare:workers';
2
2
  import { buildContainer } from '../container';
3
3
  import { loadConfig } from '../config';
4
4
  import { logger } from '../observability/logger';
5
+ import { withWorkflowLogExport } from './logExport';
5
6
  import { buildWorkflowRuntime } from './runtime';
6
7
  /** Per-step retry policy: a transient poll failure retries before the run fails. */
7
8
  const STEP_CONFIG = {
@@ -19,8 +20,14 @@ const STEP_CONFIG = {
19
20
  * `jobMaxPolls` is a backstop in case it never reports terminal.
20
21
  */
21
22
  export class BootstrapWorkflow extends WorkflowEntrypoint {
22
- async run(event, step) {
23
- const { workspaceId, jobId } = event.payload;
23
+ run(event, step) {
24
+ // The wake's logging bracket: settings applied for an isolate no other entry point has
25
+ // touched, and a drain before every durable suspension the body below reaches. The body is
26
+ // a method rather than a closure so `run` stays the bracket and nothing else.
27
+ return withWorkflowLogExport(this.env, step, (step) => this.drive(event.payload, step));
28
+ }
29
+ async drive(params, step) {
30
+ const { workspaceId, jobId } = params;
24
31
  // One DI-graph assembly per wake (pure wiring over env bindings, no I/O) shared by
25
32
  // every poll in this invocation; a hibernation wake replays `run()` and rebuilds. Built
26
33
  // via `buildWorkflowRuntime` so a transient throw here can't kill the instance terminally
@@ -1 +1 @@
1
- {"version":3,"file":"BootstrapWorkflow.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/BootstrapWorkflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BootstrapWorkflow.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/BootstrapWorkflow.ts"],"names":[],"mappings":"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"}
@@ -16,5 +16,6 @@ export interface EnvConfigRepairWorkflowParams {
16
16
  */
17
17
  export declare class EnvConfigRepairWorkflow extends WorkflowEntrypoint<Env, EnvConfigRepairWorkflowParams> {
18
18
  run(event: WorkflowEvent<EnvConfigRepairWorkflowParams>, step: WorkflowStep): Promise<void>;
19
+ private drive;
19
20
  }
20
21
  //# sourceMappingURL=EnvConfigRepairWorkflow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EnvConfigRepairWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/EnvConfigRepairWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAMjC,0FAA0F;AAC1F,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAQD;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,SAAQ,kBAAkB,CAC7D,GAAG,EACH,6BAA6B,CAC9B;IACgB,GAAG,CAChB,KAAK,EAAE,aAAa,CAAC,6BAA6B,CAAC,EACnD,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CA6Df;CACF"}
1
+ {"version":3,"file":"EnvConfigRepairWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/EnvConfigRepairWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAOjC,0FAA0F;AAC1F,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAQD;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,SAAQ,kBAAkB,CAC7D,GAAG,EACH,6BAA6B,CAC9B;IACU,GAAG,CACV,KAAK,EAAE,aAAa,CAAC,6BAA6B,CAAC,EACnD,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;YAEa,KAAK;CA8DpB"}
@@ -2,6 +2,7 @@ import { WorkflowEntrypoint, } from 'cloudflare:workers';
2
2
  import { buildContainer } from '../container';
3
3
  import { loadConfig } from '../config';
4
4
  import { logger } from '../observability/logger';
5
+ import { withWorkflowLogExport } from './logExport';
5
6
  import { buildWorkflowRuntime } from './runtime';
6
7
  /** Per-step retry policy: a transient poll failure retries before the run fails. */
7
8
  const STEP_CONFIG = {
@@ -18,8 +19,12 @@ const STEP_CONFIG = {
18
19
  * on a terminal outcome; this loop only decides when to stop.
19
20
  */
20
21
  export class EnvConfigRepairWorkflow extends WorkflowEntrypoint {
21
- async run(event, step) {
22
- const { workspaceId, jobId } = event.payload;
22
+ run(event, step) {
23
+ // See BootstrapWorkflow: `run` is the wake's logging bracket, `drive` is the body.
24
+ return withWorkflowLogExport(this.env, step, (step) => this.drive(event.payload, step));
25
+ }
26
+ async drive(params, step) {
27
+ const { workspaceId, jobId } = params;
23
28
  // One DI-graph assembly per wake (pure wiring over env bindings, no I/O) shared by
24
29
  // every poll in this invocation; a hibernation wake replays `run()` and rebuilds. Built
25
30
  // via `buildWorkflowRuntime` so a transient throw here can't kill the instance terminally
@@ -1 +1 @@
1
- {"version":3,"file":"EnvConfigRepairWorkflow.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/EnvConfigRepairWorkflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EnvConfigRepairWorkflow.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/EnvConfigRepairWorkflow.ts"],"names":[],"mappings":"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"}
@@ -15,5 +15,6 @@ export interface EnvironmentTestWorkflowParams {
15
15
  */
16
16
  export declare class EnvironmentTestWorkflow extends WorkflowEntrypoint<Env, EnvironmentTestWorkflowParams> {
17
17
  run(event: WorkflowEvent<EnvironmentTestWorkflowParams>, step: WorkflowStep): Promise<void>;
18
+ private drive;
18
19
  }
19
20
  //# sourceMappingURL=EnvironmentTestWorkflow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EnvironmentTestWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/EnvironmentTestWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAMjC,6FAA6F;AAC7F,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAQD;;;;;;;GAOG;AACH,qBAAa,uBAAwB,SAAQ,kBAAkB,CAC7D,GAAG,EACH,6BAA6B,CAC9B;IACgB,GAAG,CAChB,KAAK,EAAE,aAAa,CAAC,6BAA6B,CAAC,EACnD,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CA6Df;CACF"}
1
+ {"version":3,"file":"EnvironmentTestWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/EnvironmentTestWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAOjC,6FAA6F;AAC7F,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAQD;;;;;;;GAOG;AACH,qBAAa,uBAAwB,SAAQ,kBAAkB,CAC7D,GAAG,EACH,6BAA6B,CAC9B;IACU,GAAG,CACV,KAAK,EAAE,aAAa,CAAC,6BAA6B,CAAC,EACnD,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;YAEa,KAAK;CA8DpB"}
@@ -2,6 +2,7 @@ import { WorkflowEntrypoint, } from 'cloudflare:workers';
2
2
  import { buildContainer } from '../container';
3
3
  import { loadConfig } from '../config';
4
4
  import { logger } from '../observability/logger';
5
+ import { withWorkflowLogExport } from './logExport';
5
6
  import { buildWorkflowRuntime } from './runtime';
6
7
  /** Per-step retry policy: a transient poll failure retries before the run fails. */
7
8
  const STEP_CONFIG = {
@@ -17,8 +18,12 @@ const STEP_CONFIG = {
17
18
  * provisioning survives eviction while the driver stays cheap.
18
19
  */
19
20
  export class EnvironmentTestWorkflow extends WorkflowEntrypoint {
20
- async run(event, step) {
21
- const { workspaceId, jobId } = event.payload;
21
+ run(event, step) {
22
+ // See BootstrapWorkflow: `run` is the wake's logging bracket, `drive` is the body.
23
+ return withWorkflowLogExport(this.env, step, (step) => this.drive(event.payload, step));
24
+ }
25
+ async drive(params, step) {
26
+ const { workspaceId, jobId } = params;
22
27
  const { container, execConfig } = await buildWorkflowRuntime(() => ({ container: buildContainer(this.env), execConfig: loadConfig(this.env).execution }), step, 'env-test');
23
28
  const pollInterval = execConfig.jobPollInterval;
24
29
  const log = logger.child({ workspaceId, jobId, workflow: 'env-test' });
@@ -1 +1 @@
1
- {"version":3,"file":"EnvironmentTestWorkflow.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/EnvironmentTestWorkflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EnvironmentTestWorkflow.js","sourceRoot":"","sources":["../../../src/infrastructure/workflows/EnvironmentTestWorkflow.ts"],"names":[],"mappings":"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"}
@@ -11,5 +11,6 @@ import type { ExecutionWorkflowParams } from './WorkflowsWorkRunner';
11
11
  */
12
12
  export declare class ExecutionWorkflow extends WorkflowEntrypoint<Env, ExecutionWorkflowParams> {
13
13
  run(event: WorkflowEvent<ExecutionWorkflowParams>, step: WorkflowStep): Promise<void>;
14
+ private drive;
14
15
  }
15
16
  //# sourceMappingURL=ExecutionWorkflow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExecutionWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/ExecutionWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAQ3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAKjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAoJpE;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,kBAAkB,CAAC,GAAG,EAAE,uBAAuB,CAAC;IACtE,GAAG,CAChB,KAAK,EAAE,aAAa,CAAC,uBAAuB,CAAC,EAC7C,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAwMf;CACF"}
1
+ {"version":3,"file":"ExecutionWorkflow.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/workflows/ExecutionWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAElB,KAAK,YAAY,EAElB,MAAM,oBAAoB,CAAA;AAQ3B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAMjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAoJpE;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,kBAAkB,CAAC,GAAG,EAAE,uBAAuB,CAAC;IAC5E,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7F;YAEa,KAAK;CAyMpB"}