@cat-factory/worker 0.43.0 → 0.44.1

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.
@@ -1,13 +1,14 @@
1
1
  import type { EnvironmentConnectionRecord, EnvironmentConnectionRepository } from '@cat-factory/kernel';
2
2
  import type { D1Database } from '@cloudflare/workers-types';
3
- /** D1-backed store of workspace → environment provider bindings (migration 0008). */
3
+ /** D1-backed store of workspace → per-type environment handler bindings (migration 0025). */
4
4
  export declare class D1EnvironmentConnectionRepository implements EnvironmentConnectionRepository {
5
5
  private readonly db;
6
6
  constructor({ db }: {
7
7
  db: D1Database;
8
8
  });
9
- getByWorkspace(workspaceId: string): Promise<EnvironmentConnectionRecord | null>;
9
+ listByWorkspace(workspaceId: string): Promise<EnvironmentConnectionRecord[]>;
10
+ getByWorkspaceAndType(workspaceId: string, provisionType: string, manifestId: string | null): Promise<EnvironmentConnectionRecord | null>;
10
11
  upsert(record: EnvironmentConnectionRecord): Promise<void>;
11
- softDelete(workspaceId: string, at: number): Promise<void>;
12
+ softDelete(workspaceId: string, provisionType: string, manifestId: string | null, at: number): Promise<void>;
12
13
  }
13
14
  //# sourceMappingURL=D1EnvironmentConnectionRepository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"D1EnvironmentConnectionRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1EnvironmentConnectionRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,+BAA+B,EAChC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA4B3D,qFAAqF;AACrF,qBAAa,iCAAkC,YAAW,+BAA+B;IACvF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAE,EAAE;QAAE,EAAE,EAAE,UAAU,CAAA;KAAE,EAErC;IAEK,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAQrF;IAEK,MAAM,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB/D;IAEK,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D;CACF"}
1
+ {"version":3,"file":"D1EnvironmentConnectionRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1EnvironmentConnectionRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,+BAA+B,EAChC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAyC3D,6FAA6F;AAC7F,qBAAa,iCAAkC,YAAW,+BAA+B;IACvF,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,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAUjF;IAEK,qBAAqB,CACzB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAS7C;IAEK,MAAM,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC/D;IAEK,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC,CAQf;CACF"}
@@ -1,48 +1,64 @@
1
1
  function rowToRecord(row) {
2
2
  return {
3
3
  workspaceId: row.workspace_id,
4
- kind: row.kind ?? 'manifest',
4
+ provisionType: row.provision_type,
5
+ manifestId: row.manifest_id === '' ? null : row.manifest_id,
6
+ engine: row.engine,
7
+ backendKind: row.backend_kind,
5
8
  providerId: row.provider_id,
6
9
  label: row.label,
7
10
  baseUrl: row.base_url,
8
- manifestJson: row.manifest_json,
11
+ handlerJson: row.handler_json,
12
+ acceptsManifestId: row.accepts_manifest_id,
9
13
  secretsCipher: row.secrets_cipher,
10
14
  createdAt: row.created_at,
11
15
  deletedAt: row.deleted_at,
12
16
  };
13
17
  }
14
- /** D1-backed store of workspace → environment provider bindings (migration 0008). */
18
+ /** D1-backed store of workspace → per-type environment handler bindings (migration 0025). */
15
19
  export class D1EnvironmentConnectionRepository {
16
20
  db;
17
21
  constructor({ db }) {
18
22
  this.db = db;
19
23
  }
20
- async getByWorkspace(workspaceId) {
21
- const row = await this.db
22
- .prepare('SELECT * FROM environment_connections WHERE workspace_id = ? AND deleted_at IS NULL')
24
+ async listByWorkspace(workspaceId) {
25
+ const { results } = await this.db
26
+ .prepare(`SELECT * FROM environment_connections
27
+ WHERE workspace_id = ? AND deleted_at IS NULL
28
+ ORDER BY created_at ASC`)
23
29
  .bind(workspaceId)
30
+ .all();
31
+ return (results ?? []).map(rowToRecord);
32
+ }
33
+ async getByWorkspaceAndType(workspaceId, provisionType, manifestId) {
34
+ const row = await this.db
35
+ .prepare(`SELECT * FROM environment_connections
36
+ WHERE workspace_id = ? AND provision_type = ? AND manifest_id = ? AND deleted_at IS NULL`)
37
+ .bind(workspaceId, provisionType, manifestId ?? '')
24
38
  .first();
25
39
  return row ? rowToRecord(row) : null;
26
40
  }
27
41
  async upsert(record) {
28
- // A workspace has a single live provider: clear any prior binding (live or
29
- // tombstoned) before inserting, so re-registering a different provider can't
30
- // collide on the (workspace_id, provider_id) primary key.
42
+ // Clear any prior row (live or tombstoned) on the same composite key first, so a
43
+ // re-register that changes the engine/provider can't collide on the primary key.
31
44
  await this.db
32
- .prepare('DELETE FROM environment_connections WHERE workspace_id = ?')
33
- .bind(record.workspaceId)
45
+ .prepare(`DELETE FROM environment_connections
46
+ WHERE workspace_id = ? AND provision_type = ? AND manifest_id = ?`)
47
+ .bind(record.workspaceId, record.provisionType, record.manifestId ?? '')
34
48
  .run();
35
49
  await this.db
36
50
  .prepare(`INSERT INTO environment_connections
37
- (workspace_id, kind, provider_id, label, base_url, manifest_json, secrets_cipher, created_at, deleted_at)
38
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL)`)
39
- .bind(record.workspaceId, record.kind, record.providerId, record.label, record.baseUrl, record.manifestJson, record.secretsCipher, record.createdAt)
51
+ (workspace_id, provision_type, manifest_id, engine, backend_kind, provider_id, label, base_url,
52
+ handler_json, accepts_manifest_id, secrets_cipher, created_at, deleted_at)
53
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)`)
54
+ .bind(record.workspaceId, record.provisionType, record.manifestId ?? '', record.engine, record.backendKind, record.providerId, record.label, record.baseUrl, record.handlerJson, record.acceptsManifestId, record.secretsCipher, record.createdAt)
40
55
  .run();
41
56
  }
42
- async softDelete(workspaceId, at) {
57
+ async softDelete(workspaceId, provisionType, manifestId, at) {
43
58
  await this.db
44
- .prepare('UPDATE environment_connections SET deleted_at = ? WHERE workspace_id = ? AND deleted_at IS NULL')
45
- .bind(at, workspaceId)
59
+ .prepare(`UPDATE environment_connections SET deleted_at = ?
60
+ WHERE workspace_id = ? AND provision_type = ? AND manifest_id = ? AND deleted_at IS NULL`)
61
+ .bind(at, workspaceId, provisionType, manifestId ?? '')
46
62
  .run();
47
63
  }
48
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"D1EnvironmentConnectionRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1EnvironmentConnectionRepository.ts"],"names":[],"mappings":"AAkBA,SAAS,WAAW,CAAC,GAA6B;IAChD,OAAO;QACL,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,UAAU;QAC5B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,OAAO,iCAAiC;IAC3B,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN,qFAAqF,CACtF;aACA,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,EAA4B,CAAA;QACpC,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAmC;QAC9C,2EAA2E;QAC3E,6EAA6E;QAC7E,0DAA0D;QAC1D,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CAAC,4DAA4D,CAAC;aACrE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;aACxB,GAAG,EAAE,CAAA;QACR,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;+CAEuC,CACxC;aACA,IAAI,CACH,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,SAAS,CACjB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,EAAU;QAC9C,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN,iGAAiG,CAClG;aACA,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC;aACrB,GAAG,EAAE,CAAA;IACV,CAAC;CACF"}
1
+ {"version":3,"file":"D1EnvironmentConnectionRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1EnvironmentConnectionRepository.ts"],"names":[],"mappings":"AA2BA,SAAS,WAAW,CAAC,GAA6B;IAChD,OAAO;QACL,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,UAAU,EAAE,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW;QAC3D,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,iBAAiB,EAAE,GAAG,CAAC,mBAAmB;QAC1C,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,6FAA6F;AAC7F,MAAM,OAAO,iCAAiC;IAC3B,EAAE,CAAY;IAE/B,YAAY,EAAE,EAAE,EAAsB;QACpC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAAmB;QACvC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAC9B,OAAO,CACN;;iCAEyB,CAC1B;aACA,IAAI,CAAC,WAAW,CAAC;aACjB,GAAG,EAA4B,CAAA;QAClC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,WAAmB,EACnB,aAAqB,EACrB,UAAyB;QAEzB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE;aACtB,OAAO,CACN;kGAC0F,CAC3F;aACA,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,UAAU,IAAI,EAAE,CAAC;aAClD,KAAK,EAA4B,CAAA;QACpC,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAmC;QAC9C,iFAAiF;QACjF,iFAAiF;QACjF,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;2EACmE,CACpE;aACA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;aACvE,GAAG,EAAE,CAAA;QACR,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;;;2DAGmD,CACpD;aACA,IAAI,CACH,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,UAAU,IAAI,EAAE,EACvB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,SAAS,CACjB;aACA,GAAG,EAAE,CAAA;IACV,CAAC;IAED,KAAK,CAAC,UAAU,CACd,WAAmB,EACnB,aAAqB,EACrB,UAAyB,EACzB,EAAU;QAEV,MAAM,IAAI,CAAC,EAAE;aACV,OAAO,CACN;kGAC0F,CAC3F;aACA,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,IAAI,EAAE,CAAC;aACtD,GAAG,EAAE,CAAA;IACV,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ -- Per-service provision type + per-type infra handlers (slice 2b, breaking).
2
+ -- See docs/initiatives/per-service-provision-types.md.
3
+ --
4
+ -- Reshape `environment_connections` from a single per-workspace provider binding (keyed by
5
+ -- (workspace_id, provider_id), discriminated by `kind`) into a multi-row per-provision-type
6
+ -- HANDLER table keyed by (workspace_id, provision_type, manifest_id): a workspace declares
7
+ -- one handler per provision type, plus one per pinned custom `manifest_id`. `manifest_id` is
8
+ -- '' for the non-custom types so it sits in the composite primary key cleanly (the repos map
9
+ -- '' ⇄ null). `manifest_json` is renamed `handler_json` (it now carries the engine
10
+ -- connection, sans secrets; the manifests to apply come from the service at provision time).
11
+ --
12
+ -- Backwards compatibility is NOT a goal (CLAUDE.md): this is a clean DROP/CREATE, so any
13
+ -- pre-reshape connection rows are dropped and must be re-registered.
14
+ DROP TABLE IF EXISTS environment_connections;
15
+ CREATE TABLE environment_connections (
16
+ workspace_id TEXT NOT NULL,
17
+ provision_type TEXT NOT NULL, -- kubernetes | docker-compose | custom
18
+ manifest_id TEXT NOT NULL DEFAULT '', -- custom manifest id ('' for non-custom)
19
+ engine TEXT NOT NULL, -- local-docker | local-k3s | remote-kubernetes | remote-custom
20
+ backend_kind TEXT NOT NULL, -- env-backend registry kind that builds the provider
21
+ provider_id TEXT NOT NULL,
22
+ label TEXT NOT NULL,
23
+ base_url TEXT NOT NULL,
24
+ handler_json TEXT NOT NULL, -- serialized InfraHandlerConfig (sans secrets)
25
+ accepts_manifest_id TEXT, -- for remote-custom: the manifest id it accepts
26
+ secrets_cipher TEXT NOT NULL,
27
+ created_at INTEGER NOT NULL,
28
+ deleted_at INTEGER,
29
+ PRIMARY KEY (workspace_id, provision_type, manifest_id)
30
+ );
31
+ CREATE INDEX idx_environment_conn_workspace
32
+ ON environment_connections (workspace_id)
33
+ WHERE deleted_at IS NULL;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/worker",
3
- "version": "0.43.0",
3
+ "version": "0.44.1",
4
4
  "description": "Reusable Cloudflare Worker library (Hono + D1) exposing the Agent Architecture Board core: the `createApp()` Hono factory, the default fetch/scheduled/queue handler, and the Durable Object + Workflow classes. Deployments (see deploy/backend) supply the wrangler.toml + config and re-export these.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -32,29 +32,29 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@ai-sdk/anthropic": "^3.0.85",
36
- "@ai-sdk/openai": "^3.0.74",
37
- "@ai-sdk/openai-compatible": "^2.0.51",
35
+ "@ai-sdk/anthropic": "^3.0.89",
36
+ "@ai-sdk/openai": "^3.0.77",
37
+ "@ai-sdk/openai-compatible": "^2.0.54",
38
38
  "@cloudflare/containers": "^0.3.7",
39
39
  "@hono/valibot-validator": "^0.6.1",
40
- "ai": "^6.0.209",
40
+ "ai": "^6.0.214",
41
41
  "hono": "^4.12.27",
42
42
  "pino": "^10.3.1",
43
43
  "valibot": "^1.4.2",
44
44
  "workers-ai-provider": "^3.2.1",
45
- "@cat-factory/agents": "0.23.1",
46
- "@cat-factory/consensus": "0.7.84",
47
- "@cat-factory/contracts": "0.59.0",
48
- "@cat-factory/gates": "0.2.37",
49
- "@cat-factory/gitlab": "0.4.7",
50
- "@cat-factory/integrations": "0.40.0",
51
- "@cat-factory/kernel": "0.57.0",
52
- "@cat-factory/observability-langfuse": "0.7.80",
53
- "@cat-factory/orchestration": "0.45.2",
54
- "@cat-factory/prompt-fragments": "0.9.12",
55
- "@cat-factory/provider-cloudflare": "0.7.84",
56
- "@cat-factory/server": "0.51.0",
57
- "@cat-factory/spend": "0.10.41"
45
+ "@cat-factory/agents": "0.23.4",
46
+ "@cat-factory/consensus": "0.7.87",
47
+ "@cat-factory/contracts": "0.61.0",
48
+ "@cat-factory/gates": "0.2.40",
49
+ "@cat-factory/gitlab": "0.4.10",
50
+ "@cat-factory/integrations": "0.41.1",
51
+ "@cat-factory/kernel": "0.59.0",
52
+ "@cat-factory/observability-langfuse": "0.7.83",
53
+ "@cat-factory/orchestration": "0.46.1",
54
+ "@cat-factory/prompt-fragments": "0.9.14",
55
+ "@cat-factory/provider-cloudflare": "0.7.87",
56
+ "@cat-factory/server": "0.51.3",
57
+ "@cat-factory/spend": "0.10.44"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@cloudflare/vitest-pool-workers": "^0.16.20",
@@ -62,7 +62,7 @@
62
62
  "typescript": "7.0.1-rc",
63
63
  "vitest": "^4.1.9",
64
64
  "wrangler": "^4.105.0",
65
- "@cat-factory/conformance": "0.9.47"
65
+ "@cat-factory/conformance": "0.9.50"
66
66
  },
67
67
  "scripts": {
68
68
  "build": "tsc -b tsconfig.build.json",