@cat-factory/worker 0.183.0 → 0.183.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.
- package/dist/infrastructure/repositories/D1TrackerSettingsRepository.d.ts +2 -2
- package/dist/infrastructure/repositories/D1TrackerSettingsRepository.d.ts.map +1 -1
- package/dist/infrastructure/repositories/D1TrackerSettingsRepository.js +58 -27
- package/dist/infrastructure/repositories/D1TrackerSettingsRepository.js.map +1 -1
- package/package.json +18 -18
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TrackerSettings, TrackerSettingsRepository } from '@cat-factory/kernel';
|
|
1
|
+
import type { TrackerSettings, TrackerSettingsPatch, TrackerSettingsRepository } from '@cat-factory/kernel';
|
|
2
2
|
import type { D1Database } from '@cloudflare/workers-types';
|
|
3
3
|
/** A workspace's issue-tracker selection, one row per workspace (migration 0029). */
|
|
4
4
|
export declare class D1TrackerSettingsRepository implements TrackerSettingsRepository {
|
|
@@ -7,6 +7,6 @@ export declare class D1TrackerSettingsRepository implements TrackerSettingsRepos
|
|
|
7
7
|
db: D1Database;
|
|
8
8
|
});
|
|
9
9
|
get(workspaceId: string): Promise<TrackerSettings | null>;
|
|
10
|
-
|
|
10
|
+
merge(workspaceId: string, patch: TrackerSettingsPatch, defaults: Omit<TrackerSettings, 'updatedAt'>, updatedAt: number): Promise<TrackerSettings>;
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=D1TrackerSettingsRepository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1TrackerSettingsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1TrackerSettingsRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"D1TrackerSettingsRepository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1TrackerSettingsRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA8B3D,qFAAqF;AACrF,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,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAM9D;IAEK,KAAK,CACT,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,EAC5C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CA0B1B;CACF"}
|
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every settable field and the column it lands in.
|
|
3
|
+
*
|
|
4
|
+
* A `Record` over the patch's own key union, so a field added to `TrackerSettings` fails to COMPILE
|
|
5
|
+
* here rather than being silently dropped by a merge that never names its column. The sibling
|
|
6
|
+
* Drizzle repository carries the same table for the same reason.
|
|
7
|
+
*/
|
|
8
|
+
const COLUMNS = {
|
|
9
|
+
tracker: 'tracker',
|
|
10
|
+
jiraProjectKey: 'jira_project_key',
|
|
11
|
+
linearTeamId: 'linear_team_id',
|
|
12
|
+
writebackCommentOnPrOpen: 'writeback_comment_on_pr_open',
|
|
13
|
+
writebackResolveOnMerge: 'writeback_resolve_on_merge',
|
|
14
|
+
writebackQuestionsOnPark: 'writeback_questions_on_park',
|
|
15
|
+
};
|
|
16
|
+
const FIELDS = Object.keys(COLUMNS);
|
|
1
17
|
/** A workspace's issue-tracker selection, one row per workspace (migration 0029). */
|
|
2
18
|
export class D1TrackerSettingsRepository {
|
|
3
19
|
db;
|
|
@@ -9,35 +25,50 @@ export class D1TrackerSettingsRepository {
|
|
|
9
25
|
.prepare(`SELECT * FROM tracker_settings WHERE workspace_id = ?`)
|
|
10
26
|
.bind(workspaceId)
|
|
11
27
|
.first();
|
|
12
|
-
|
|
13
|
-
return null;
|
|
14
|
-
return {
|
|
15
|
-
tracker: row.tracker ?? null,
|
|
16
|
-
jiraProjectKey: row.jira_project_key,
|
|
17
|
-
linearTeamId: row.linear_team_id,
|
|
18
|
-
writebackCommentOnPrOpen: row.writeback_comment_on_pr_open === 1,
|
|
19
|
-
writebackResolveOnMerge: row.writeback_resolve_on_merge === 1,
|
|
20
|
-
writebackQuestionsOnPark: row.writeback_questions_on_park === 1,
|
|
21
|
-
updatedAt: row.updated_at,
|
|
22
|
-
};
|
|
28
|
+
return row ? toSettings(row) : null;
|
|
23
29
|
}
|
|
24
|
-
async
|
|
25
|
-
|
|
30
|
+
async merge(workspaceId, patch, defaults, updatedAt) {
|
|
31
|
+
// The INSERT carries a complete row (the defaults, overlaid with whatever the patch names) and
|
|
32
|
+
// the conflict branch touches ONLY the named columns. That is what makes the merge atomic: an
|
|
33
|
+
// unnamed column is never read up into this process and written back, so a concurrent writer
|
|
34
|
+
// naming a different one cannot be clobbered by a value that was stale before it was written.
|
|
35
|
+
const inserted = { ...defaults, ...patch };
|
|
36
|
+
const assignments = FIELDS.filter((field) => patch[field] !== undefined)
|
|
37
|
+
.map((field) => `${COLUMNS[field]} = excluded.${COLUMNS[field]}`)
|
|
38
|
+
.concat('updated_at = excluded.updated_at');
|
|
39
|
+
const row = await this.db
|
|
26
40
|
.prepare(`INSERT INTO tracker_settings
|
|
27
|
-
(workspace_id,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
updated_at = excluded.updated_at`)
|
|
39
|
-
.bind(workspaceId, settings.tracker, settings.jiraProjectKey, settings.linearTeamId, settings.writebackCommentOnPrOpen ? 1 : 0, settings.writebackResolveOnMerge ? 1 : 0, settings.writebackQuestionsOnPark ? 1 : 0, settings.updatedAt)
|
|
40
|
-
.run();
|
|
41
|
+
(workspace_id, ${FIELDS.map((field) => COLUMNS[field]).join(', ')}, updated_at)
|
|
42
|
+
VALUES (?, ${FIELDS.map(() => '?').join(', ')}, ?)
|
|
43
|
+
ON CONFLICT (workspace_id) DO UPDATE SET ${assignments.join(', ')}
|
|
44
|
+
RETURNING *`)
|
|
45
|
+
.bind(workspaceId, ...FIELDS.map((field) => encode(inserted[field])), updatedAt)
|
|
46
|
+
.first();
|
|
47
|
+
if (!row) {
|
|
48
|
+
throw new Error(`Writing tracker settings for workspace ${workspaceId} returned no row, so what the ` +
|
|
49
|
+
`store now holds cannot be reported.`);
|
|
50
|
+
}
|
|
51
|
+
return toSettings(row);
|
|
41
52
|
}
|
|
42
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* One field's value as SQLite stores it.
|
|
56
|
+
*
|
|
57
|
+
* Total over what a settable field can hold today, which is how a field of a new SHAPE (a number, a
|
|
58
|
+
* JSON column) is caught: it fails to compile here rather than binding something SQLite coerces.
|
|
59
|
+
*/
|
|
60
|
+
function encode(value) {
|
|
61
|
+
return typeof value === 'boolean' ? (value ? 1 : 0) : value;
|
|
62
|
+
}
|
|
63
|
+
function toSettings(row) {
|
|
64
|
+
return {
|
|
65
|
+
tracker: row.tracker ?? null,
|
|
66
|
+
jiraProjectKey: row.jira_project_key,
|
|
67
|
+
linearTeamId: row.linear_team_id,
|
|
68
|
+
writebackCommentOnPrOpen: row.writeback_comment_on_pr_open === 1,
|
|
69
|
+
writebackResolveOnMerge: row.writeback_resolve_on_merge === 1,
|
|
70
|
+
writebackQuestionsOnPark: row.writeback_questions_on_park === 1,
|
|
71
|
+
updatedAt: row.updated_at,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
43
74
|
//# sourceMappingURL=D1TrackerSettingsRepository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1TrackerSettingsRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1TrackerSettingsRepository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"D1TrackerSettingsRepository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/D1TrackerSettingsRepository.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/worker",
|
|
3
|
-
"version": "0.183.
|
|
3
|
+
"version": "0.183.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",
|
|
@@ -43,22 +43,22 @@
|
|
|
43
43
|
"pino": "^10.3.1",
|
|
44
44
|
"valibot": "^1.4.2",
|
|
45
45
|
"workers-ai-provider": "^4.0.0",
|
|
46
|
-
"@cat-factory/agents": "0.126.
|
|
47
|
-
"@cat-factory/caching": "0.20.
|
|
48
|
-
"@cat-factory/consensus": "0.16.
|
|
49
|
-
"@cat-factory/contracts": "0.
|
|
50
|
-
"@cat-factory/eks": "0.1.
|
|
51
|
-
"@cat-factory/gates": "0.10.
|
|
52
|
-
"@cat-factory/gitlab": "0.20.
|
|
53
|
-
"@cat-factory/
|
|
54
|
-
"@cat-factory/
|
|
55
|
-
"@cat-factory/observability-langfuse": "0.10.
|
|
56
|
-
"@cat-factory/
|
|
57
|
-
"@cat-factory/orchestration": "0.
|
|
58
|
-
"@cat-factory/prompt-fragments": "1.0.
|
|
59
|
-
"@cat-factory/provider-cloudflare": "0.7.
|
|
60
|
-
"@cat-factory/server": "0.
|
|
61
|
-
"@cat-factory/spend": "0.15.
|
|
46
|
+
"@cat-factory/agents": "0.126.2",
|
|
47
|
+
"@cat-factory/caching": "0.20.2",
|
|
48
|
+
"@cat-factory/consensus": "0.16.2",
|
|
49
|
+
"@cat-factory/contracts": "0.299.0",
|
|
50
|
+
"@cat-factory/eks": "0.1.306",
|
|
51
|
+
"@cat-factory/gates": "0.10.33",
|
|
52
|
+
"@cat-factory/gitlab": "0.20.3",
|
|
53
|
+
"@cat-factory/integrations": "0.160.0",
|
|
54
|
+
"@cat-factory/kernel": "0.289.1",
|
|
55
|
+
"@cat-factory/observability-langfuse": "0.10.77",
|
|
56
|
+
"@cat-factory/observability-otel": "0.18.40",
|
|
57
|
+
"@cat-factory/orchestration": "0.261.0",
|
|
58
|
+
"@cat-factory/prompt-fragments": "1.0.57",
|
|
59
|
+
"@cat-factory/provider-cloudflare": "0.7.455",
|
|
60
|
+
"@cat-factory/server": "0.276.0",
|
|
61
|
+
"@cat-factory/spend": "0.15.75"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@cloudflare/vitest-pool-workers": "^0.20.3",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"typescript": "7.0.2",
|
|
67
67
|
"vitest": "^4.1.10",
|
|
68
68
|
"wrangler": "^4.120.0",
|
|
69
|
-
"@cat-factory/conformance": "0.38.
|
|
69
|
+
"@cat-factory/conformance": "0.38.12"
|
|
70
70
|
},
|
|
71
71
|
"scripts": {
|
|
72
72
|
"build": "tsc -b tsconfig.build.json",
|