@cat-factory/worker 0.18.6 → 0.20.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 (44) hide show
  1. package/dist/infrastructure/config/index.d.ts +2 -2
  2. package/dist/infrastructure/config/index.d.ts.map +1 -1
  3. package/dist/infrastructure/config/index.js +1 -2
  4. package/dist/infrastructure/config/index.js.map +1 -1
  5. package/dist/infrastructure/config/releaseHealth.d.ts +2 -3
  6. package/dist/infrastructure/config/releaseHealth.d.ts.map +1 -1
  7. package/dist/infrastructure/config/releaseHealth.js +2 -12
  8. package/dist/infrastructure/config/releaseHealth.js.map +1 -1
  9. package/dist/infrastructure/config/slack.d.ts.map +1 -1
  10. package/dist/infrastructure/config/slack.js +3 -8
  11. package/dist/infrastructure/config/slack.js.map +1 -1
  12. package/dist/infrastructure/config/spending.d.ts +8 -1
  13. package/dist/infrastructure/config/spending.d.ts.map +1 -1
  14. package/dist/infrastructure/config/spending.js +10 -34
  15. package/dist/infrastructure/config/spending.js.map +1 -1
  16. package/dist/infrastructure/container.d.ts.map +1 -1
  17. package/dist/infrastructure/container.js +99 -20
  18. package/dist/infrastructure/container.js.map +1 -1
  19. package/dist/infrastructure/env.d.ts +8 -16
  20. package/dist/infrastructure/env.d.ts.map +1 -1
  21. package/dist/infrastructure/repositories/D1AccountSettingsRepository.d.ts +18 -0
  22. package/dist/infrastructure/repositories/D1AccountSettingsRepository.d.ts.map +1 -0
  23. package/dist/infrastructure/repositories/D1AccountSettingsRepository.js +48 -0
  24. package/dist/infrastructure/repositories/D1AccountSettingsRepository.js.map +1 -0
  25. package/dist/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.d.ts +18 -0
  26. package/dist/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.d.ts.map +1 -0
  27. package/dist/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.js +46 -0
  28. package/dist/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.js.map +1 -0
  29. package/dist/infrastructure/repositories/D1SandboxRepositories.d.ts +47 -0
  30. package/dist/infrastructure/repositories/D1SandboxRepositories.d.ts.map +1 -0
  31. package/dist/infrastructure/repositories/D1SandboxRepositories.js +287 -0
  32. package/dist/infrastructure/repositories/D1SandboxRepositories.js.map +1 -0
  33. package/dist/infrastructure/repositories/D1TokenUsageRepository.d.ts +1 -0
  34. package/dist/infrastructure/repositories/D1TokenUsageRepository.d.ts.map +1 -1
  35. package/dist/infrastructure/repositories/D1TokenUsageRepository.js +16 -0
  36. package/dist/infrastructure/repositories/D1TokenUsageRepository.js.map +1 -1
  37. package/dist/infrastructure/repositories/D1WorkspaceSettingsRepository.d.ts.map +1 -1
  38. package/dist/infrastructure/repositories/D1WorkspaceSettingsRepository.js +21 -14
  39. package/dist/infrastructure/repositories/D1WorkspaceSettingsRepository.js.map +1 -1
  40. package/migrations/0012_workspace_budget.sql +14 -0
  41. package/migrations/0013_incident_enrichment_connections.sql +12 -0
  42. package/migrations/0014_account_settings.sql +14 -0
  43. package/package.json +16 -15
  44. package/sandbox-migrations/0001_init.sql +99 -0
@@ -24,6 +24,14 @@ export type GitHubSyncMessage = {
24
24
  /** Bindings and vars available to the Worker (declared in wrangler.toml). */
25
25
  export interface Env {
26
26
  DB: D1Database;
27
+ /**
28
+ * Dedicated D1 database for the Sandbox (parallel prompt/model testing surface), with
29
+ * its own migrations lineage (sandbox-migrations/). Optional + opt-in: absent ⇒ the
30
+ * Sandbox module isn't assembled and its API answers 503. Kept separate from the main
31
+ * `DB` for blast-radius isolation (Cloudflare's granular-DB guidance) and so the whole
32
+ * feature can be lifted out later.
33
+ */
34
+ SANDBOX_DB?: D1Database;
27
35
  /** Cloudflare Workers AI binding (optional; used when provider = workers-ai). */
28
36
  AI?: Ai;
29
37
  /** Workflows binding that durably drives each run (the only execution path). */
@@ -96,16 +104,6 @@ export interface Env {
96
104
  AGENT_MAX_OUTPUT_TOKENS?: string;
97
105
  /** JSON: per-kind overrides, e.g. {"architect":{"provider":"openai","model":"gpt-4o"}}. */
98
106
  AGENT_MODELS?: string;
99
- /** Monthly token budget, in SPEND_CURRENCY. Default ~100. */
100
- SPEND_MONTHLY_LIMIT?: string;
101
- /** ISO 4217 currency for the budget and prices. Default 'EUR'. */
102
- SPEND_CURRENCY?: string;
103
- /**
104
- * JSON map of `provider:model` (or bare `provider`) → per-1M-token price,
105
- * e.g. {"openai:gpt-4o":{"inputPerMillion":2.3,"outputPerMillion":9.2}}.
106
- * Merged over the built-in defaults.
107
- */
108
- SPEND_MODEL_PRICES?: string;
109
107
  OPENAI_API_KEY?: string;
110
108
  ANTHROPIC_API_KEY?: string;
111
109
  /** Alibaba DashScope key (provider `qwen`; OpenAI-compatible endpoint). */
@@ -133,12 +131,6 @@ export interface Env {
133
131
  INLINE_WEB_SEARCH_KINDS?: string;
134
132
  /** Cap on provider web searches per inline run (Anthropic `maxUses`; default 5). */
135
133
  INLINE_WEB_SEARCH_MAX_USES?: string;
136
- /** Brave Search key — enables the container web-search proxy (the recommended path). */
137
- WEB_SEARCH_BRAVE_API_KEY?: string;
138
- /** A self-hosted SearXNG base URL the backend reverse-proxies to (alternative to Brave). */
139
- WEB_SEARCH_SEARXNG_URL?: string;
140
- /** Optional bearer for a SearXNG instance behind an auth proxy. */
141
- WEB_SEARCH_SEARXNG_API_KEY?: string;
142
134
  /** GitHub App id (numeric). Presence enables the integration. */
143
135
  GITHUB_APP_ID?: string;
144
136
  /** GitHub App slug, used to build the install URL. */
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/infrastructure/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/infrastructure/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AccountSettingsRecord, AccountSettingsRepository } from '@cat-factory/kernel';
2
+ import type { D1Database } from '@cloudflare/workers-types';
3
+ /**
4
+ * Per-account (deployment-wide) settings (migration 0014). One row per account; a
5
+ * missing row means all defaults. `config` + `summary` are non-secret JSON; the ONE
6
+ * sealed `secrets_cipher` blob is encrypted/decrypted by the caller. Mirrors the
7
+ * email-connection per-account shape.
8
+ */
9
+ export declare class D1AccountSettingsRepository implements AccountSettingsRepository {
10
+ private readonly db;
11
+ constructor({ db }: {
12
+ db: D1Database;
13
+ });
14
+ getByAccount(accountId: string): Promise<AccountSettingsRecord | null>;
15
+ upsert(record: AccountSettingsRecord): Promise<void>;
16
+ listAll(): Promise<AccountSettingsRecord[]>;
17
+ }
18
+ //# sourceMappingURL=D1AccountSettingsRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1AccountSettingsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1AccountSettingsRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAC3F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAsB3D;;;;;GAKG;AACH,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,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAM3E;IAEK,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzD;IAEK,OAAO,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAKhD;CACF"}
@@ -0,0 +1,48 @@
1
+ function rowToRecord(row) {
2
+ return {
3
+ accountId: row.account_id,
4
+ config: row.config,
5
+ secretsCipher: row.secrets_cipher,
6
+ summary: row.summary,
7
+ createdAt: row.created_at,
8
+ updatedAt: row.updated_at,
9
+ };
10
+ }
11
+ /**
12
+ * Per-account (deployment-wide) settings (migration 0014). One row per account; a
13
+ * missing row means all defaults. `config` + `summary` are non-secret JSON; the ONE
14
+ * sealed `secrets_cipher` blob is encrypted/decrypted by the caller. Mirrors the
15
+ * email-connection per-account shape.
16
+ */
17
+ export class D1AccountSettingsRepository {
18
+ db;
19
+ constructor({ db }) {
20
+ this.db = db;
21
+ }
22
+ async getByAccount(accountId) {
23
+ const row = await this.db
24
+ .prepare('SELECT * FROM account_settings WHERE account_id = ?')
25
+ .bind(accountId)
26
+ .first();
27
+ return row ? rowToRecord(row) : null;
28
+ }
29
+ async upsert(record) {
30
+ await this.db
31
+ .prepare(`INSERT INTO account_settings (account_id, config, secrets_cipher, summary, created_at, updated_at)
32
+ VALUES (?, ?, ?, ?, ?, ?)
33
+ ON CONFLICT (account_id) DO UPDATE SET
34
+ config = excluded.config,
35
+ secrets_cipher = excluded.secrets_cipher,
36
+ summary = excluded.summary,
37
+ updated_at = excluded.updated_at`)
38
+ .bind(record.accountId, record.config, record.secretsCipher, record.summary, record.createdAt, record.updatedAt)
39
+ .run();
40
+ }
41
+ async listAll() {
42
+ const { results } = await this.db
43
+ .prepare('SELECT * FROM account_settings')
44
+ .all();
45
+ return (results ?? []).map(rowToRecord);
46
+ }
47
+ }
48
+ //# sourceMappingURL=D1AccountSettingsRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1AccountSettingsRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1AccountSettingsRepository.ts"],"names":[],"mappings":"AAYA,SAAS,WAAW,CAAC,GAAuB;IAC1C,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,2BAA2B;IACrB,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,qDAAqD,CAAC;aAC9D,IAAI,CAAC,SAAS,CAAC;aACf,KAAK,EAAsB,CAAA;QAC9B,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA6B;QACxC,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;;;;4CAMoC,CACrC;aACA,IAAI,CACH,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,CACjB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CAAC,gCAAgC,CAAC;aACzC,GAAG,EAAsB,CAAA;QAC5B,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACzC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { IncidentEnrichmentConnectionRecord, IncidentEnrichmentConnectionRepository } from '@cat-factory/kernel';
2
+ import type { D1Database } from '@cloudflare/workers-types';
3
+ /**
4
+ * A workspace's incident-enrichment connection (migration 0013). Exactly one row per
5
+ * workspace. `credentials` is ONE sealed envelope of `{ pagerDuty?, incidentIo? }` —
6
+ * the caller encrypts before upsert and decrypts at enrichment time; `summary` is a
7
+ * non-secret presence blob. Mirrors D1ObservabilityConnectionRepository.
8
+ */
9
+ export declare class D1IncidentEnrichmentConnectionRepository implements IncidentEnrichmentConnectionRepository {
10
+ private readonly db;
11
+ constructor({ db }: {
12
+ db: D1Database;
13
+ });
14
+ get(workspaceId: string): Promise<IncidentEnrichmentConnectionRecord | null>;
15
+ upsert(record: IncidentEnrichmentConnectionRecord): Promise<void>;
16
+ delete(workspaceId: string): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=D1IncidentEnrichmentConnectionRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1IncidentEnrichmentConnectionRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kCAAkC,EAClC,sCAAsC,EACvC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAoB3D;;;;;GAKG;AACH,qBAAa,wCAAyC,YAAW,sCAAsC;IACrG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kCAAkC,GAAG,IAAI,CAAC,CAMjF;IAEK,MAAM,CAAC,MAAM,EAAE,kCAAkC,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtE;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/C;CACF"}
@@ -0,0 +1,46 @@
1
+ function rowToRecord(row) {
2
+ return {
3
+ workspaceId: row.workspace_id,
4
+ credentials: row.credentials,
5
+ summary: row.summary,
6
+ createdAt: row.created_at,
7
+ updatedAt: row.updated_at,
8
+ };
9
+ }
10
+ /**
11
+ * A workspace's incident-enrichment connection (migration 0013). Exactly one row per
12
+ * workspace. `credentials` is ONE sealed envelope of `{ pagerDuty?, incidentIo? }` —
13
+ * the caller encrypts before upsert and decrypts at enrichment time; `summary` is a
14
+ * non-secret presence blob. Mirrors D1ObservabilityConnectionRepository.
15
+ */
16
+ export class D1IncidentEnrichmentConnectionRepository {
17
+ db;
18
+ constructor({ db }) {
19
+ this.db = db;
20
+ }
21
+ async get(workspaceId) {
22
+ const row = await this.db
23
+ .prepare(`SELECT * FROM incident_enrichment_connections WHERE workspace_id = ?`)
24
+ .bind(workspaceId)
25
+ .first();
26
+ return row ? rowToRecord(row) : null;
27
+ }
28
+ async upsert(record) {
29
+ await this.db
30
+ .prepare(`INSERT INTO incident_enrichment_connections (workspace_id, credentials, summary, created_at, updated_at)
31
+ VALUES (?, ?, ?, ?, ?)
32
+ ON CONFLICT (workspace_id) DO UPDATE SET
33
+ credentials = excluded.credentials,
34
+ summary = excluded.summary,
35
+ updated_at = excluded.updated_at`)
36
+ .bind(record.workspaceId, record.credentials, record.summary, record.createdAt, record.updatedAt)
37
+ .run();
38
+ }
39
+ async delete(workspaceId) {
40
+ await this.db
41
+ .prepare(`DELETE FROM incident_enrichment_connections WHERE workspace_id = ?`)
42
+ .bind(workspaceId)
43
+ .run();
44
+ }
45
+ }
46
+ //# sourceMappingURL=D1IncidentEnrichmentConnectionRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1IncidentEnrichmentConnectionRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.ts"],"names":[],"mappings":"AAcA,SAAS,WAAW,CAAC,GAAoC;IACvD,OAAO;QACL,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,wCAAwC;IAClC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,WAAmB;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CAAC,sEAAsE,CAAC;aAC/E,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,EAAmC,CAAA;QAC3C,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA0C;QACrD,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;;;4CAKoC,CACrC;aACA,IAAI,CACH,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,CACjB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,oEAAoE,CAAC;aAC7E,IAAI,CAAC,WAAW,CAAC;aACjB,GAAG,EAAE,CAAA;IACV,CAAC;CACF"}
@@ -0,0 +1,47 @@
1
+ import type { SandboxExperiment, SandboxExperimentRepository, SandboxExperimentStatus, SandboxFixture, SandboxFixtureRepository, SandboxGrade, SandboxGradeRepository, SandboxPromptVersion, SandboxPromptVersionRepository, SandboxRun, SandboxRunRepository, SandboxRunStatus } from '@cat-factory/kernel';
2
+ import type { D1Database } from '@cloudflare/workers-types';
3
+ export declare class D1SandboxPromptVersionRepository implements SandboxPromptVersionRepository {
4
+ private readonly db;
5
+ constructor(db: D1Database);
6
+ get(workspaceId: string, id: string): Promise<SandboxPromptVersion | null>;
7
+ list(workspaceId: string): Promise<SandboxPromptVersion[]>;
8
+ listByKind(workspaceId: string, agentKind: string): Promise<SandboxPromptVersion[]>;
9
+ upsert(workspaceId: string, version: SandboxPromptVersion): Promise<void>;
10
+ archive(workspaceId: string, id: string, at: number): Promise<void>;
11
+ }
12
+ export declare class D1SandboxFixtureRepository implements SandboxFixtureRepository {
13
+ private readonly db;
14
+ constructor(db: D1Database);
15
+ get(workspaceId: string, id: string): Promise<SandboxFixture | null>;
16
+ list(workspaceId: string): Promise<SandboxFixture[]>;
17
+ upsert(workspaceId: string, fixture: SandboxFixture): Promise<void>;
18
+ remove(workspaceId: string, id: string): Promise<void>;
19
+ }
20
+ export declare class D1SandboxExperimentRepository implements SandboxExperimentRepository {
21
+ private readonly db;
22
+ constructor(db: D1Database);
23
+ get(workspaceId: string, id: string): Promise<SandboxExperiment | null>;
24
+ list(workspaceId: string): Promise<SandboxExperiment[]>;
25
+ upsert(workspaceId: string, experiment: SandboxExperiment): Promise<void>;
26
+ setStatus(workspaceId: string, id: string, status: SandboxExperimentStatus): Promise<void>;
27
+ claimForRun(workspaceId: string, id: string): Promise<boolean>;
28
+ }
29
+ export declare class D1SandboxRunRepository implements SandboxRunRepository {
30
+ private readonly db;
31
+ constructor(db: D1Database);
32
+ get(workspaceId: string, id: string): Promise<SandboxRun | null>;
33
+ listByExperiment(workspaceId: string, experimentId: string): Promise<SandboxRun[]>;
34
+ listQueued(workspaceId: string, experimentId: string): Promise<SandboxRun[]>;
35
+ upsert(workspaceId: string, run: SandboxRun): Promise<void>;
36
+ setStatus(workspaceId: string, id: string, status: SandboxRunStatus): Promise<void>;
37
+ removeByExperiment(workspaceId: string, experimentId: string): Promise<void>;
38
+ }
39
+ export declare class D1SandboxGradeRepository implements SandboxGradeRepository {
40
+ private readonly db;
41
+ constructor(db: D1Database);
42
+ getByRun(workspaceId: string, runId: string): Promise<SandboxGrade | null>;
43
+ listByExperiment(workspaceId: string, experimentId: string): Promise<SandboxGrade[]>;
44
+ upsert(workspaceId: string, grade: SandboxGrade): Promise<void>;
45
+ removeByExperiment(workspaceId: string, experimentId: string): Promise<void>;
46
+ }
47
+ //# sourceMappingURL=D1SandboxRepositories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1SandboxRepositories.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1SandboxRepositories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
1
+ import { rowToSandboxExperiment, rowToSandboxFixture, rowToSandboxGrade, rowToSandboxPromptVersion, rowToSandboxRun, } from './mappers';
2
+ // D1 persistence for the Sandbox. These target a DEDICATED D1 database (the SANDBOX_DB
3
+ // binding, sandbox-migrations/), so the tables are unprefixed (`prompt_versions`,
4
+ // `fixtures`, `experiments`, `runs`, `grades`) — the database IS the namespace. The Node
5
+ // facade mirrors these over a Postgres `sandbox` schema (Drizzle); the cross-runtime
6
+ // conformance suite asserts they behave identically. JSON-shaped fields are TEXT JSON.
7
+ // The row -> domain mappers are shared with the Drizzle repos (`@cat-factory/server`);
8
+ // only the dialect-specific SQL write path lives here.
9
+ // ---- prompt versions --------------------------------------------------------
10
+ export class D1SandboxPromptVersionRepository {
11
+ db;
12
+ constructor(db) {
13
+ this.db = db;
14
+ }
15
+ async get(workspaceId, id) {
16
+ const row = await this.db
17
+ .prepare(`SELECT * FROM prompt_versions WHERE workspace_id = ? AND id = ?`)
18
+ .bind(workspaceId, id)
19
+ .first();
20
+ return row ? rowToSandboxPromptVersion(row) : null;
21
+ }
22
+ async list(workspaceId) {
23
+ const { results } = await this.db
24
+ .prepare(`SELECT * FROM prompt_versions
25
+ WHERE workspace_id = ? AND archived_at IS NULL
26
+ ORDER BY created_at DESC`)
27
+ .bind(workspaceId)
28
+ .all();
29
+ return results.map(rowToSandboxPromptVersion);
30
+ }
31
+ async listByKind(workspaceId, agentKind) {
32
+ const { results } = await this.db
33
+ .prepare(`SELECT * FROM prompt_versions
34
+ WHERE workspace_id = ? AND agent_kind = ? AND archived_at IS NULL
35
+ ORDER BY created_at DESC`)
36
+ .bind(workspaceId, agentKind)
37
+ .all();
38
+ return results.map(rowToSandboxPromptVersion);
39
+ }
40
+ async upsert(workspaceId, version) {
41
+ await this.db
42
+ .prepare(`INSERT INTO prompt_versions
43
+ (workspace_id, id, lineage_id, agent_kind, name, origin, system_text, base_prompt_id,
44
+ version, parent_id, labels, created_at, created_by, archived_at)
45
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
46
+ ON CONFLICT (workspace_id, id) DO UPDATE SET
47
+ lineage_id = excluded.lineage_id,
48
+ agent_kind = excluded.agent_kind,
49
+ name = excluded.name,
50
+ origin = excluded.origin,
51
+ system_text = excluded.system_text,
52
+ base_prompt_id = excluded.base_prompt_id,
53
+ version = excluded.version,
54
+ parent_id = excluded.parent_id,
55
+ labels = excluded.labels,
56
+ created_by = excluded.created_by,
57
+ archived_at = excluded.archived_at`)
58
+ .bind(workspaceId, version.id, version.lineageId, version.agentKind, version.name, version.origin, version.systemText, version.basePromptId, version.version, version.parentId, JSON.stringify(version.labels), version.createdAt, version.createdBy, version.archivedAt)
59
+ .run();
60
+ }
61
+ async archive(workspaceId, id, at) {
62
+ await this.db
63
+ .prepare(`UPDATE prompt_versions SET archived_at = ? WHERE workspace_id = ? AND id = ?`)
64
+ .bind(at, workspaceId, id)
65
+ .run();
66
+ }
67
+ }
68
+ // ---- fixtures ---------------------------------------------------------------
69
+ export class D1SandboxFixtureRepository {
70
+ db;
71
+ constructor(db) {
72
+ this.db = db;
73
+ }
74
+ async get(workspaceId, id) {
75
+ const row = await this.db
76
+ .prepare(`SELECT * FROM fixtures WHERE workspace_id = ? AND id = ?`)
77
+ .bind(workspaceId, id)
78
+ .first();
79
+ return row ? rowToSandboxFixture(row) : null;
80
+ }
81
+ async list(workspaceId) {
82
+ const { results } = await this.db
83
+ .prepare(`SELECT * FROM fixtures WHERE workspace_id = ? ORDER BY created_at ASC`)
84
+ .bind(workspaceId)
85
+ .all();
86
+ return results.map(rowToSandboxFixture);
87
+ }
88
+ async upsert(workspaceId, fixture) {
89
+ await this.db
90
+ .prepare(`INSERT INTO fixtures
91
+ (workspace_id, id, kind, name, payload, repo_ref, objective, origin, created_at)
92
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
93
+ ON CONFLICT (workspace_id, id) DO UPDATE SET
94
+ kind = excluded.kind,
95
+ name = excluded.name,
96
+ payload = excluded.payload,
97
+ repo_ref = excluded.repo_ref,
98
+ objective = excluded.objective,
99
+ origin = excluded.origin`)
100
+ .bind(workspaceId, fixture.id, fixture.kind, fixture.name, fixture.payload ? JSON.stringify(fixture.payload) : null, fixture.repoRef ? JSON.stringify(fixture.repoRef) : null, fixture.objective ? JSON.stringify(fixture.objective) : null, fixture.origin, fixture.createdAt)
101
+ .run();
102
+ }
103
+ async remove(workspaceId, id) {
104
+ await this.db
105
+ .prepare(`DELETE FROM fixtures WHERE workspace_id = ? AND id = ?`)
106
+ .bind(workspaceId, id)
107
+ .run();
108
+ }
109
+ }
110
+ // ---- experiments ------------------------------------------------------------
111
+ export class D1SandboxExperimentRepository {
112
+ db;
113
+ constructor(db) {
114
+ this.db = db;
115
+ }
116
+ async get(workspaceId, id) {
117
+ const row = await this.db
118
+ .prepare(`SELECT * FROM experiments WHERE workspace_id = ? AND id = ?`)
119
+ .bind(workspaceId, id)
120
+ .first();
121
+ return row ? rowToSandboxExperiment(row) : null;
122
+ }
123
+ async list(workspaceId) {
124
+ const { results } = await this.db
125
+ .prepare(`SELECT * FROM experiments WHERE workspace_id = ? ORDER BY created_at DESC`)
126
+ .bind(workspaceId)
127
+ .all();
128
+ return results.map(rowToSandboxExperiment);
129
+ }
130
+ async upsert(workspaceId, experiment) {
131
+ await this.db
132
+ .prepare(`INSERT INTO experiments
133
+ (workspace_id, id, name, agent_kind, judge_model, repeats, status, matrix,
134
+ budget_tokens, created_at, created_by)
135
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
136
+ ON CONFLICT (workspace_id, id) DO UPDATE SET
137
+ name = excluded.name,
138
+ agent_kind = excluded.agent_kind,
139
+ judge_model = excluded.judge_model,
140
+ repeats = excluded.repeats,
141
+ status = excluded.status,
142
+ matrix = excluded.matrix,
143
+ budget_tokens = excluded.budget_tokens,
144
+ created_by = excluded.created_by`)
145
+ .bind(workspaceId, experiment.id, experiment.name, experiment.agentKind, experiment.judgeModel, experiment.repeats, experiment.status, JSON.stringify(experiment.matrix), experiment.budgetTokens, experiment.createdAt, experiment.createdBy)
146
+ .run();
147
+ }
148
+ async setStatus(workspaceId, id, status) {
149
+ await this.db
150
+ .prepare(`UPDATE experiments SET status = ? WHERE workspace_id = ? AND id = ?`)
151
+ .bind(status, workspaceId, id)
152
+ .run();
153
+ }
154
+ async claimForRun(workspaceId, id) {
155
+ // Conditional update: only flips a non-running experiment to `running`. The affected-row
156
+ // count tells the caller whether it won the claim (false ⇒ already running). Atomic, so
157
+ // concurrent launches can't both clear + re-expand the grid (see the port doc).
158
+ const result = await this.db
159
+ .prepare(`UPDATE experiments SET status = 'running'
160
+ WHERE workspace_id = ? AND id = ? AND status != 'running'`)
161
+ .bind(workspaceId, id)
162
+ .run();
163
+ return (result.meta?.changes ?? 0) > 0;
164
+ }
165
+ }
166
+ // ---- runs -------------------------------------------------------------------
167
+ export class D1SandboxRunRepository {
168
+ db;
169
+ constructor(db) {
170
+ this.db = db;
171
+ }
172
+ async get(workspaceId, id) {
173
+ const row = await this.db
174
+ .prepare(`SELECT * FROM runs WHERE workspace_id = ? AND id = ?`)
175
+ .bind(workspaceId, id)
176
+ .first();
177
+ return row ? rowToSandboxRun(row) : null;
178
+ }
179
+ async listByExperiment(workspaceId, experimentId) {
180
+ const { results } = await this.db
181
+ .prepare(`SELECT * FROM runs
182
+ WHERE workspace_id = ? AND experiment_id = ?
183
+ ORDER BY prompt_version_id, model, fixture_id, repeat_index`)
184
+ .bind(workspaceId, experimentId)
185
+ .all();
186
+ return results.map(rowToSandboxRun);
187
+ }
188
+ async listQueued(workspaceId, experimentId) {
189
+ const { results } = await this.db
190
+ .prepare(`SELECT * FROM runs
191
+ WHERE workspace_id = ? AND experiment_id = ? AND status = 'queued'
192
+ ORDER BY started_at ASC, id ASC`)
193
+ .bind(workspaceId, experimentId)
194
+ .all();
195
+ return results.map(rowToSandboxRun);
196
+ }
197
+ async upsert(workspaceId, run) {
198
+ await this.db
199
+ .prepare(`INSERT INTO runs
200
+ (workspace_id, id, experiment_id, prompt_version_id, model, fixture_id, repeat_index,
201
+ status, output_text, usage, latency_ms, branch, pr_url, diff, error, seed_sha,
202
+ prompt_label, started_at, finished_at)
203
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
204
+ ON CONFLICT (workspace_id, id) DO UPDATE SET
205
+ experiment_id = excluded.experiment_id,
206
+ prompt_version_id = excluded.prompt_version_id,
207
+ model = excluded.model,
208
+ fixture_id = excluded.fixture_id,
209
+ repeat_index = excluded.repeat_index,
210
+ status = excluded.status,
211
+ output_text = excluded.output_text,
212
+ usage = excluded.usage,
213
+ latency_ms = excluded.latency_ms,
214
+ branch = excluded.branch,
215
+ pr_url = excluded.pr_url,
216
+ diff = excluded.diff,
217
+ error = excluded.error,
218
+ seed_sha = excluded.seed_sha,
219
+ prompt_label = excluded.prompt_label,
220
+ started_at = excluded.started_at,
221
+ finished_at = excluded.finished_at`)
222
+ .bind(workspaceId, run.id, run.experimentId, run.promptVersionId, run.model, run.fixtureId, run.repeatIndex, run.status, run.outputText, run.usage ? JSON.stringify(run.usage) : null, run.latencyMs, run.branch, run.prUrl, run.diff, run.error, run.seedSha, run.promptLabel, run.startedAt, run.finishedAt)
223
+ .run();
224
+ }
225
+ async setStatus(workspaceId, id, status) {
226
+ await this.db
227
+ .prepare(`UPDATE runs SET status = ? WHERE workspace_id = ? AND id = ?`)
228
+ .bind(status, workspaceId, id)
229
+ .run();
230
+ }
231
+ async removeByExperiment(workspaceId, experimentId) {
232
+ await this.db
233
+ .prepare(`DELETE FROM runs WHERE workspace_id = ? AND experiment_id = ?`)
234
+ .bind(workspaceId, experimentId)
235
+ .run();
236
+ }
237
+ }
238
+ // ---- grades -----------------------------------------------------------------
239
+ export class D1SandboxGradeRepository {
240
+ db;
241
+ constructor(db) {
242
+ this.db = db;
243
+ }
244
+ async getByRun(workspaceId, runId) {
245
+ const row = await this.db
246
+ .prepare(`SELECT * FROM grades WHERE workspace_id = ? AND run_id = ?
247
+ ORDER BY created_at DESC LIMIT 1`)
248
+ .bind(workspaceId, runId)
249
+ .first();
250
+ return row ? rowToSandboxGrade(row) : null;
251
+ }
252
+ async listByExperiment(workspaceId, experimentId) {
253
+ const { results } = await this.db
254
+ .prepare(`SELECT g.* FROM grades g
255
+ JOIN runs r ON r.workspace_id = g.workspace_id AND r.id = g.run_id
256
+ WHERE g.workspace_id = ? AND r.experiment_id = ?
257
+ ORDER BY g.created_at ASC`)
258
+ .bind(workspaceId, experimentId)
259
+ .all();
260
+ return results.map(rowToSandboxGrade);
261
+ }
262
+ async upsert(workspaceId, grade) {
263
+ await this.db
264
+ .prepare(`INSERT INTO grades
265
+ (workspace_id, id, run_id, judge_model, scores, weighted_total, objective, created_at)
266
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
267
+ ON CONFLICT (workspace_id, id) DO UPDATE SET
268
+ run_id = excluded.run_id,
269
+ judge_model = excluded.judge_model,
270
+ scores = excluded.scores,
271
+ weighted_total = excluded.weighted_total,
272
+ objective = excluded.objective`)
273
+ .bind(workspaceId, grade.id, grade.runId, grade.judgeModel, JSON.stringify(grade.scores), grade.weightedTotal, grade.objective ? JSON.stringify(grade.objective) : null, grade.createdAt)
274
+ .run();
275
+ }
276
+ async removeByExperiment(workspaceId, experimentId) {
277
+ // Grades carry no experiment_id; scope them through their run. Callers clear grades
278
+ // BEFORE runs so this subquery still resolves the experiment's cells.
279
+ await this.db
280
+ .prepare(`DELETE FROM grades
281
+ WHERE workspace_id = ?
282
+ AND run_id IN (SELECT id FROM runs WHERE workspace_id = ? AND experiment_id = ?)`)
283
+ .bind(workspaceId, workspaceId, experimentId)
284
+ .run();
285
+ }
286
+ }
287
+ //# sourceMappingURL=D1SandboxRepositories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"D1SandboxRepositories.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1SandboxRepositories.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ export declare class D1TokenUsageRepository implements TokenUsageRepository {
8
8
  });
9
9
  record(usage: TokenUsageRecord): Promise<void>;
10
10
  totalsSince(epochMs: number): Promise<TokenUsageTotals>;
11
+ totalsSinceForWorkspace(workspaceId: string, epochMs: number): Promise<TokenUsageTotals>;
11
12
  deleteOlderThan(epochMs: number): Promise<number>;
12
13
  }
13
14
  //# sourceMappingURL=D1TokenUsageRepository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"D1TokenUsageRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1TokenUsageRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACnG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAE3D,qEAAqE;AACrE,qBAAa,sBAAuB,YAAW,oBAAoB;IACjE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBnD;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiB5D;IAEK,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOtD;CACF"}
1
+ {"version":3,"file":"D1TokenUsageRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1TokenUsageRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACnG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAE3D,qEAAqE;AACrE,qBAAa,sBAAuB,YAAW,oBAAoB;IACjE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBnD;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiB5D;IAEK,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiB7F;IAEK,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOtD;CACF"}
@@ -29,6 +29,22 @@ export class D1TokenUsageRepository {
29
29
  costEstimate: row?.cost_estimate ?? 0,
30
30
  };
31
31
  }
32
+ async totalsSinceForWorkspace(workspaceId, epochMs) {
33
+ const row = await this.db
34
+ .prepare(`SELECT
35
+ COALESCE(SUM(input_tokens), 0) AS input_tokens,
36
+ COALESCE(SUM(output_tokens), 0) AS output_tokens,
37
+ COALESCE(SUM(cost_estimate), 0) AS cost_estimate
38
+ FROM token_usage
39
+ WHERE workspace_id = ? AND created_at >= ?`)
40
+ .bind(workspaceId, epochMs)
41
+ .first();
42
+ return {
43
+ inputTokens: row?.input_tokens ?? 0,
44
+ outputTokens: row?.output_tokens ?? 0,
45
+ costEstimate: row?.cost_estimate ?? 0,
46
+ };
47
+ }
32
48
  async deleteOlderThan(epochMs) {
33
49
  // Range delete on idx_token_usage_created; bounded by the rows being pruned.
34
50
  const { meta } = await this.db
@@ -1 +1 @@
1
- {"version":3,"file":"D1TokenUsageRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1TokenUsageRepository.ts"],"names":[],"mappings":"AAGA,qEAAqE;AACrE,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,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;+CAGuC,CACxC;aACA,IAAI,CACH,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CAChB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;;;;;+BAKuB,CACxB;aACA,IAAI,CAAC,OAAO,CAAC;aACb,KAAK,EAA0E,CAAA;QAClF,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,YAAY,IAAI,CAAC;YACnC,YAAY,EAAE,GAAG,EAAE,aAAa,IAAI,CAAC;YACrC,YAAY,EAAE,GAAG,EAAE,aAAa,IAAI,CAAC;SACtC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,6EAA6E;QAC7E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC3B,OAAO,CAAC,8CAA8C,CAAC;aACvD,IAAI,CAAC,OAAO,CAAC;aACb,GAAG,EAAE,CAAA;QACR,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"D1TokenUsageRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1TokenUsageRepository.ts"],"names":[],"mappings":"AAGA,qEAAqE;AACrE,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,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;+CAGuC,CACxC;aACA,IAAI,CACH,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CAChB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;;;;;+BAKuB,CACxB;aACA,IAAI,CAAC,OAAO,CAAC;aACb,KAAK,EAA0E,CAAA;QAClF,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,YAAY,IAAI,CAAC;YACnC,YAAY,EAAE,GAAG,EAAE,aAAa,IAAI,CAAC;YACrC,YAAY,EAAE,GAAG,EAAE,aAAa,IAAI,CAAC;SACtC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,WAAmB,EAAE,OAAe;QAChE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;;;;;oDAK4C,CAC7C;aACA,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;aAC1B,KAAK,EAA0E,CAAA;QAClF,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,YAAY,IAAI,CAAC;YACnC,YAAY,EAAE,GAAG,EAAE,aAAa,IAAI,CAAC;YACrC,YAAY,EAAE,GAAG,EAAE,aAAa,IAAI,CAAC;SACtC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,6EAA6E;QAC7E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC3B,OAAO,CAAC,8CAA8C,CAAC;aACvD,IAAI,CAAC,OAAO,CAAC;aACb,GAAG,EAAE,CAAA;QACR,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;IAC1B,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"D1WorkspaceSettingsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceSettingsRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,KAAK,EAAmC,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA0B3D;;;;GAIG;AACH,qBAAa,6BAA8B,YAAW,2BAA2B;IAC/E,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAMhE;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB5E;CACF"}
1
+ {"version":3,"file":"D1WorkspaceSettingsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1WorkspaceSettingsRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,KAAK,EAIV,iBAAiB,EAClB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAiC3D;;;;GAIG;AACH,qBAAa,6BAA8B,YAAW,2BAA2B;IAC/E,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAMhE;IAEK,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B5E;CACF"}