@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.
- package/dist/infrastructure/config/index.d.ts +2 -2
- package/dist/infrastructure/config/index.d.ts.map +1 -1
- package/dist/infrastructure/config/index.js +1 -2
- package/dist/infrastructure/config/index.js.map +1 -1
- package/dist/infrastructure/config/releaseHealth.d.ts +2 -3
- package/dist/infrastructure/config/releaseHealth.d.ts.map +1 -1
- package/dist/infrastructure/config/releaseHealth.js +2 -12
- package/dist/infrastructure/config/releaseHealth.js.map +1 -1
- package/dist/infrastructure/config/slack.d.ts.map +1 -1
- package/dist/infrastructure/config/slack.js +3 -8
- package/dist/infrastructure/config/slack.js.map +1 -1
- package/dist/infrastructure/config/spending.d.ts +8 -1
- package/dist/infrastructure/config/spending.d.ts.map +1 -1
- package/dist/infrastructure/config/spending.js +10 -34
- package/dist/infrastructure/config/spending.js.map +1 -1
- package/dist/infrastructure/container.d.ts.map +1 -1
- package/dist/infrastructure/container.js +99 -20
- package/dist/infrastructure/container.js.map +1 -1
- package/dist/infrastructure/env.d.ts +8 -16
- package/dist/infrastructure/env.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1AccountSettingsRepository.d.ts +18 -0
- package/dist/infrastructure/repositories/D1AccountSettingsRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/D1AccountSettingsRepository.js +48 -0
- package/dist/infrastructure/repositories/D1AccountSettingsRepository.js.map +1 -0
- package/dist/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.d.ts +18 -0
- package/dist/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.js +46 -0
- package/dist/infrastructure/repositories/D1IncidentEnrichmentConnectionRepository.js.map +1 -0
- package/dist/infrastructure/repositories/D1SandboxRepositories.d.ts +47 -0
- package/dist/infrastructure/repositories/D1SandboxRepositories.d.ts.map +1 -0
- package/dist/infrastructure/repositories/D1SandboxRepositories.js +287 -0
- package/dist/infrastructure/repositories/D1SandboxRepositories.js.map +1 -0
- package/dist/infrastructure/repositories/D1TokenUsageRepository.d.ts +1 -0
- package/dist/infrastructure/repositories/D1TokenUsageRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1TokenUsageRepository.js +16 -0
- package/dist/infrastructure/repositories/D1TokenUsageRepository.js.map +1 -1
- package/dist/infrastructure/repositories/D1WorkspaceSettingsRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1WorkspaceSettingsRepository.js +21 -14
- package/dist/infrastructure/repositories/D1WorkspaceSettingsRepository.js.map +1 -1
- package/migrations/0012_workspace_budget.sql +14 -0
- package/migrations/0013_incident_enrichment_connections.sql +12 -0
- package/migrations/0014_account_settings.sql +14 -0
- package/package.json +16 -15
- 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":"AAAA,OAAO,KAAK,EACV,EAAE,EACF,UAAU,EACV,sBAAsB,EACtB,KAAK,EACL,QAAQ,EACT,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAE9E,4EAA4E;AAC5E,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtE,6EAA6E;AAC7E,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,UAAU,CAAA;IAEd,iFAAiF;IACjF,EAAE,CAAC,EAAE,EAAE,CAAA;IAGP,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,QAAQ,CAAA;IAC7B,4EAA4E;IAC5E,eAAe,CAAC,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAA;IAC9C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,QAAQ,CAAA;IAC7B,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,sBAAsB,CAAC,kBAAkB,CAAC,CAAA;IAG7D;;;OAGG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC,kBAAkB,CAAC,CAAA;IAC3D;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;OAKG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAGlC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAA;
|
|
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,
|
|
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"}
|