@cat-factory/node-server 0.6.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/LICENSE +21 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +297 -0
- package/dist/config.js.map +1 -0
- package/dist/container.d.ts +88 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +937 -0
- package/dist/container.js.map +1 -0
- package/dist/db/client.d.ts +13 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +21 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/migrate.d.ts +12 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +40 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema.d.ts +7858 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +928 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/environments.d.ts +11 -0
- package/dist/environments.d.ts.map +1 -0
- package/dist/environments.js +31 -0
- package/dist/environments.js.map +1 -0
- package/dist/execution/bootstrapRunner.d.ts +27 -0
- package/dist/execution/bootstrapRunner.d.ts.map +1 -0
- package/dist/execution/bootstrapRunner.js +79 -0
- package/dist/execution/bootstrapRunner.js.map +1 -0
- package/dist/execution/config.d.ts +37 -0
- package/dist/execution/config.d.ts.map +1 -0
- package/dist/execution/config.js +86 -0
- package/dist/execution/config.js.map +1 -0
- package/dist/execution/drive.d.ts +6 -0
- package/dist/execution/drive.d.ts.map +1 -0
- package/dist/execution/drive.js +13 -0
- package/dist/execution/drive.js.map +1 -0
- package/dist/execution/pgBossRunner.d.ts +82 -0
- package/dist/execution/pgBossRunner.d.ts.map +1 -0
- package/dist/execution/pgBossRunner.js +163 -0
- package/dist/execution/pgBossRunner.js.map +1 -0
- package/dist/gateways.d.ts +4 -0
- package/dist/gateways.d.ts.map +1 -0
- package/dist/gateways.js +91 -0
- package/dist/gateways.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +9 -0
- package/dist/main.js.map +1 -0
- package/dist/modelProvider.d.ts +6 -0
- package/dist/modelProvider.d.ts.map +1 -0
- package/dist/modelProvider.js +72 -0
- package/dist/modelProvider.js.map +1 -0
- package/dist/realtime.d.ts +62 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +171 -0
- package/dist/realtime.js.map +1 -0
- package/dist/recurring.d.ts +11 -0
- package/dist/recurring.d.ts.map +1 -0
- package/dist/recurring.js +33 -0
- package/dist/recurring.js.map +1 -0
- package/dist/repositories/bootstrap.d.ts +25 -0
- package/dist/repositories/bootstrap.d.ts.map +1 -0
- package/dist/repositories/bootstrap.js +280 -0
- package/dist/repositories/bootstrap.js.map +1 -0
- package/dist/repositories/containerExecution.d.ts +33 -0
- package/dist/repositories/containerExecution.d.ts.map +1 -0
- package/dist/repositories/containerExecution.js +199 -0
- package/dist/repositories/containerExecution.js.map +1 -0
- package/dist/repositories/documents.d.ts +31 -0
- package/dist/repositories/documents.d.ts.map +1 -0
- package/dist/repositories/documents.js +176 -0
- package/dist/repositories/documents.js.map +1 -0
- package/dist/repositories/drizzle.d.ts +105 -0
- package/dist/repositories/drizzle.d.ts.map +1 -0
- package/dist/repositories/drizzle.js +1872 -0
- package/dist/repositories/drizzle.js.map +1 -0
- package/dist/repositories/environments.d.ts +23 -0
- package/dist/repositories/environments.d.ts.map +1 -0
- package/dist/repositories/environments.js +162 -0
- package/dist/repositories/environments.js.map +1 -0
- package/dist/repositories/fragments.d.ts +23 -0
- package/dist/repositories/fragments.d.ts.map +1 -0
- package/dist/repositories/fragments.js +190 -0
- package/dist/repositories/fragments.js.map +1 -0
- package/dist/repositories/github.d.ts +53 -0
- package/dist/repositories/github.d.ts.map +1 -0
- package/dist/repositories/github.js +441 -0
- package/dist/repositories/github.js.map +1 -0
- package/dist/repositories/localModelEndpoint.d.ts +12 -0
- package/dist/repositories/localModelEndpoint.d.ts.map +1 -0
- package/dist/repositories/localModelEndpoint.js +75 -0
- package/dist/repositories/localModelEndpoint.js.map +1 -0
- package/dist/repositories/notifications.d.ts +11 -0
- package/dist/repositories/notifications.d.ts.map +1 -0
- package/dist/repositories/notifications.js +88 -0
- package/dist/repositories/notifications.js.map +1 -0
- package/dist/repositories/personalSubscription.d.ts +22 -0
- package/dist/repositories/personalSubscription.d.ts.map +1 -0
- package/dist/repositories/personalSubscription.js +159 -0
- package/dist/repositories/personalSubscription.js.map +1 -0
- package/dist/repositories/providerApiKey.d.ts +18 -0
- package/dist/repositories/providerApiKey.d.ts.map +1 -0
- package/dist/repositories/providerApiKey.js +111 -0
- package/dist/repositories/providerApiKey.js.map +1 -0
- package/dist/repositories/providerSubscription.d.ts +16 -0
- package/dist/repositories/providerSubscription.d.ts.map +1 -0
- package/dist/repositories/providerSubscription.js +88 -0
- package/dist/repositories/providerSubscription.js.map +1 -0
- package/dist/repositories/slack.d.ts +23 -0
- package/dist/repositories/slack.d.ts.map +1 -0
- package/dist/repositories/slack.js +150 -0
- package/dist/repositories/slack.js.map +1 -0
- package/dist/repositories/tasks.d.ts +24 -0
- package/dist/repositories/tasks.d.ts.map +1 -0
- package/dist/repositories/tasks.js +194 -0
- package/dist/repositories/tasks.js.map +1 -0
- package/dist/retention.d.ts +38 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/retention.js +53 -0
- package/dist/retention.js.map +1 -0
- package/dist/runtime.d.ts +10 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +13 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +138 -0
- package/dist/server.js.map +1 -0
- package/dist/tasks/JiraProvider.d.ts +27 -0
- package/dist/tasks/JiraProvider.d.ts.map +1 -0
- package/dist/tasks/JiraProvider.js +79 -0
- package/dist/tasks/JiraProvider.js.map +1 -0
- package/drizzle/20260622175812_flashy_maginty/migration.sql +689 -0
- package/drizzle/20260622175812_flashy_maginty/snapshot.json +8318 -0
- package/drizzle/20260623172634_loud_wallop/migration.sql +11 -0
- package/drizzle/20260623172634_loud_wallop/snapshot.json +8439 -0
- package/drizzle/20260623174706_acoustic_zemo/migration.sql +16 -0
- package/drizzle/20260623174706_acoustic_zemo/snapshot.json +8506 -0
- package/drizzle/20260623184400_silent_cardiac/migration.sql +24 -0
- package/drizzle/20260623184400_silent_cardiac/snapshot.json +8639 -0
- package/drizzle/20260623205323_quick_arclight/migration.sql +1 -0
- package/drizzle/20260623205323_quick_arclight/snapshot.json +8963 -0
- package/drizzle/20260623221910_black_zombie/migration.sql +22 -0
- package/drizzle/20260623221910_black_zombie/snapshot.json +9189 -0
- package/drizzle/20260624131343_far_lily_hollister/migration.sql +3 -0
- package/drizzle/20260624131343_far_lily_hollister/snapshot.json +9228 -0
- package/drizzle/20260624135452_tiny_norman_osborn/migration.sql +11 -0
- package/drizzle/20260624135452_tiny_norman_osborn/snapshot.json +9126 -0
- package/drizzle/20260624140138_wandering_avengers/migration.sql +1 -0
- package/drizzle/20260624140138_wandering_avengers/snapshot.json +9045 -0
- package/package.json +62 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { and, eq, isNull } from 'drizzle-orm';
|
|
2
|
+
import { slackConnections, slackMemberMappings, slackSettings } from '../db/schema.js';
|
|
3
|
+
function rowToConnection(row) {
|
|
4
|
+
return {
|
|
5
|
+
accountId: row.account_id,
|
|
6
|
+
teamId: row.team_id,
|
|
7
|
+
teamName: row.team_name,
|
|
8
|
+
teamIconUrl: row.team_icon_url,
|
|
9
|
+
botUserId: row.bot_user_id,
|
|
10
|
+
scopesJson: row.scopes,
|
|
11
|
+
tokenCipher: row.token_cipher,
|
|
12
|
+
createdAt: row.created_at,
|
|
13
|
+
deletedAt: row.deleted_at,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export class DrizzleSlackConnectionRepository {
|
|
17
|
+
db;
|
|
18
|
+
constructor(db) {
|
|
19
|
+
this.db = db;
|
|
20
|
+
}
|
|
21
|
+
async getByAccount(accountId) {
|
|
22
|
+
const rows = await this.db
|
|
23
|
+
.select()
|
|
24
|
+
.from(slackConnections)
|
|
25
|
+
.where(eq(slackConnections.account_id, accountId))
|
|
26
|
+
.limit(1);
|
|
27
|
+
return rows[0] ? rowToConnection(rows[0]) : null;
|
|
28
|
+
}
|
|
29
|
+
async getByTeam(teamId) {
|
|
30
|
+
const rows = await this.db
|
|
31
|
+
.select()
|
|
32
|
+
.from(slackConnections)
|
|
33
|
+
.where(and(eq(slackConnections.team_id, teamId), isNull(slackConnections.deleted_at)))
|
|
34
|
+
.limit(1);
|
|
35
|
+
return rows[0] ? rowToConnection(rows[0]) : null;
|
|
36
|
+
}
|
|
37
|
+
async upsert(record) {
|
|
38
|
+
const values = {
|
|
39
|
+
account_id: record.accountId,
|
|
40
|
+
team_id: record.teamId,
|
|
41
|
+
team_name: record.teamName,
|
|
42
|
+
team_icon_url: record.teamIconUrl,
|
|
43
|
+
bot_user_id: record.botUserId,
|
|
44
|
+
scopes: record.scopesJson,
|
|
45
|
+
token_cipher: record.tokenCipher,
|
|
46
|
+
created_at: record.createdAt,
|
|
47
|
+
deleted_at: null,
|
|
48
|
+
};
|
|
49
|
+
await this.db
|
|
50
|
+
.insert(slackConnections)
|
|
51
|
+
.values(values)
|
|
52
|
+
.onConflictDoUpdate({
|
|
53
|
+
target: [slackConnections.account_id],
|
|
54
|
+
set: {
|
|
55
|
+
team_id: values.team_id,
|
|
56
|
+
team_name: values.team_name,
|
|
57
|
+
team_icon_url: values.team_icon_url,
|
|
58
|
+
bot_user_id: values.bot_user_id,
|
|
59
|
+
scopes: values.scopes,
|
|
60
|
+
token_cipher: values.token_cipher,
|
|
61
|
+
created_at: values.created_at,
|
|
62
|
+
deleted_at: null,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async softDelete(accountId, at) {
|
|
67
|
+
await this.db
|
|
68
|
+
.update(slackConnections)
|
|
69
|
+
.set({ deleted_at: at })
|
|
70
|
+
.where(and(eq(slackConnections.account_id, accountId), isNull(slackConnections.deleted_at)));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class DrizzleSlackSettingsRepository {
|
|
74
|
+
db;
|
|
75
|
+
constructor(db) {
|
|
76
|
+
this.db = db;
|
|
77
|
+
}
|
|
78
|
+
async getByWorkspace(workspaceId) {
|
|
79
|
+
const rows = await this.db
|
|
80
|
+
.select()
|
|
81
|
+
.from(slackSettings)
|
|
82
|
+
.where(eq(slackSettings.workspace_id, workspaceId))
|
|
83
|
+
.limit(1);
|
|
84
|
+
const row = rows[0];
|
|
85
|
+
if (!row)
|
|
86
|
+
return null;
|
|
87
|
+
return {
|
|
88
|
+
workspaceId: row.workspace_id,
|
|
89
|
+
routesJson: row.routes,
|
|
90
|
+
mentionsEnabled: row.mentions_enabled === 1,
|
|
91
|
+
updatedAt: row.updated_at,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async upsert(record) {
|
|
95
|
+
const values = {
|
|
96
|
+
workspace_id: record.workspaceId,
|
|
97
|
+
routes: record.routesJson,
|
|
98
|
+
mentions_enabled: record.mentionsEnabled ? 1 : 0,
|
|
99
|
+
updated_at: record.updatedAt,
|
|
100
|
+
};
|
|
101
|
+
await this.db
|
|
102
|
+
.insert(slackSettings)
|
|
103
|
+
.values(values)
|
|
104
|
+
.onConflictDoUpdate({
|
|
105
|
+
target: [slackSettings.workspace_id],
|
|
106
|
+
set: {
|
|
107
|
+
routes: values.routes,
|
|
108
|
+
mentions_enabled: values.mentions_enabled,
|
|
109
|
+
updated_at: values.updated_at,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export class DrizzleSlackMemberMappingRepository {
|
|
115
|
+
db;
|
|
116
|
+
constructor(db) {
|
|
117
|
+
this.db = db;
|
|
118
|
+
}
|
|
119
|
+
async getByAccount(accountId) {
|
|
120
|
+
const rows = await this.db
|
|
121
|
+
.select()
|
|
122
|
+
.from(slackMemberMappings)
|
|
123
|
+
.where(eq(slackMemberMappings.account_id, accountId))
|
|
124
|
+
.limit(1);
|
|
125
|
+
if (!rows[0])
|
|
126
|
+
return [];
|
|
127
|
+
try {
|
|
128
|
+
const parsed = JSON.parse(rows[0].entries);
|
|
129
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async upsert(accountId, entries, at) {
|
|
136
|
+
const values = {
|
|
137
|
+
account_id: accountId,
|
|
138
|
+
entries: JSON.stringify(entries),
|
|
139
|
+
updated_at: at,
|
|
140
|
+
};
|
|
141
|
+
await this.db
|
|
142
|
+
.insert(slackMemberMappings)
|
|
143
|
+
.values(values)
|
|
144
|
+
.onConflictDoUpdate({
|
|
145
|
+
target: [slackMemberMappings.account_id],
|
|
146
|
+
set: { entries: values.entries, updated_at: values.updated_at },
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/repositories/slack.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAStF,SAAS,eAAe,CAAC,GAAuB;IAC9C,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,WAAW,EAAE,GAAG,CAAC,aAAa;QAC9B,SAAS,EAAE,GAAG,CAAC,WAAW;QAC1B,UAAU,EAAE,GAAG,CAAC,MAAM;QACtB,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED,MAAM,OAAO,gCAAgC;IACd,EAAE;IAA/B,YAA6B,EAAa;kBAAb,EAAE;IAAc,CAAC;IAE9C,KAAK,CAAC,YAAY,CAAC,SAAiB;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,gBAAgB,CAAC;aACtB,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;aACjD,KAAK,CAAC,CAAC,CAAC,CAAA;QACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,gBAAgB,CAAC;aACtB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;aACrF,KAAK,CAAC,CAAC,CAAC,CAAA;QACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA6B;QACxC,MAAM,MAAM,GAAG;YACb,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,aAAa,EAAE,MAAM,CAAC,WAAW;YACjC,WAAW,EAAE,MAAM,CAAC,SAAS;YAC7B,MAAM,EAAE,MAAM,CAAC,UAAU;YACzB,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,UAAU,EAAE,IAAI;SACjB,CAAA;QACD,MAAM,IAAI,CAAC,EAAE;aACV,MAAM,CAAC,gBAAgB,CAAC;aACxB,MAAM,CAAC,MAAM,CAAC;aACd,kBAAkB,CAAC;YAClB,MAAM,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC;YACrC,GAAG,EAAE;gBACH,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,IAAI;aACjB;SACF,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,EAAU;QAC5C,MAAM,IAAI,CAAC,EAAE;aACV,MAAM,CAAC,gBAAgB,CAAC;aACxB,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;aACvB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAChG,CAAC;CACF;AAID,MAAM,OAAO,8BAA8B;IACZ,EAAE;IAA/B,YAA6B,EAAa;kBAAb,EAAE;IAAc,CAAC;IAE9C,KAAK,CAAC,cAAc,CAAC,WAAmB;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;aAClD,KAAK,CAAC,CAAC,CAAC,CAAA;QACX,MAAM,GAAG,GAAiC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,UAAU,EAAE,GAAG,CAAC,MAAM;YACtB,eAAe,EAAE,GAAG,CAAC,gBAAgB,KAAK,CAAC;YAC3C,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAA2B;QACtC,MAAM,MAAM,GAAG;YACb,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,MAAM,EAAE,MAAM,CAAC,UAAU;YACzB,gBAAgB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,UAAU,EAAE,MAAM,CAAC,SAAS;SAC7B,CAAA;QACD,MAAM,IAAI,CAAC,EAAE;aACV,MAAM,CAAC,aAAa,CAAC;aACrB,MAAM,CAAC,MAAM,CAAC;aACd,kBAAkB,CAAC;YAClB,MAAM,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC;YACpC,GAAG,EAAE;gBACH,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B;SACF,CAAC,CAAA;IACN,CAAC;CACF;AAED,MAAM,OAAO,mCAAmC;IACjB,EAAE;IAA/B,YAA6B,EAAa;kBAAb,EAAE;IAAc,CAAC;IAE9C,KAAK,CAAC,YAAY,CAAC,SAAiB;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,mBAAmB,CAAC;aACzB,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;aACpD,KAAK,CAAC,CAAC,CAAC,CAAA;QACX,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAA;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;YAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAoC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,OAAkC,EAAE,EAAU;QAC5E,MAAM,MAAM,GAAG;YACb,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAChC,UAAU,EAAE,EAAE;SACf,CAAA;QACD,MAAM,IAAI,CAAC,EAAE;aACV,MAAM,CAAC,mBAAmB,CAAC;aAC3B,MAAM,CAAC,MAAM,CAAC;aACd,kBAAkB,CAAC;YAClB,MAAM,EAAE,CAAC,mBAAmB,CAAC,UAAU,CAAC;YACxC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;SAChE,CAAC,CAAA;IACN,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SecretCipher, TaskConnectionRecord, TaskConnectionRepository, TaskRecord, TaskRepository, TaskSourceKind } from '@cat-factory/kernel';
|
|
2
|
+
import type { DrizzleDb } from '../db/client.js';
|
|
3
|
+
export declare class DrizzleTaskConnectionRepository implements TaskConnectionRepository {
|
|
4
|
+
private readonly db;
|
|
5
|
+
private readonly cipher;
|
|
6
|
+
constructor(db: DrizzleDb, cipher: SecretCipher);
|
|
7
|
+
/** Decode the stored credential blob, decrypting the envelope when present. */
|
|
8
|
+
private decodeCredentials;
|
|
9
|
+
private rowToRecord;
|
|
10
|
+
getByWorkspace(workspaceId: string, source: TaskSourceKind): Promise<TaskConnectionRecord | null>;
|
|
11
|
+
listByWorkspace(workspaceId: string): Promise<TaskConnectionRecord[]>;
|
|
12
|
+
upsert(record: TaskConnectionRecord): Promise<void>;
|
|
13
|
+
softDelete(workspaceId: string, source: TaskSourceKind, at: number): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export declare class DrizzleTaskRepository implements TaskRepository {
|
|
16
|
+
private readonly db;
|
|
17
|
+
constructor(db: DrizzleDb);
|
|
18
|
+
upsert(record: TaskRecord): Promise<void>;
|
|
19
|
+
get(workspaceId: string, source: TaskSourceKind, externalId: string): Promise<TaskRecord | null>;
|
|
20
|
+
listByWorkspace(workspaceId: string): Promise<TaskRecord[]>;
|
|
21
|
+
listByBlock(workspaceId: string, blockId: string): Promise<TaskRecord[]>;
|
|
22
|
+
linkBlock(workspaceId: string, source: TaskSourceKind, externalId: string, blockId: string | null): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/repositories/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEZ,oBAAoB,EACpB,wBAAwB,EACxB,UAAU,EACV,cAAc,EACd,cAAc,EACf,MAAM,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AA6BhD,qBAAa,+BAAgC,YAAW,wBAAwB;IAE5E,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFzB,YACmB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,YAAY,EACnC;IAEJ,+EAA+E;YACjE,iBAAiB;YASjB,WAAW;IAanB,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAYtC;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAO1E;IAEK,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBxD;IAEK,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvF;CACF;AAuBD,qBAAa,qBAAsB,YAAW,cAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA/B,YAA6B,EAAE,EAAE,SAAS,EAAI;IAExC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC9C;IAEK,GAAG,CACP,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAa5B;IAEK,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAOhE;IAEK,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAa7E;IAEK,SAAS,CACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC,CAWf;CACF"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { and, desc, eq, isNull } from 'drizzle-orm';
|
|
2
|
+
import { taskConnections, tasks } from '../db/schema.js';
|
|
3
|
+
// Drizzle/Postgres implementations of the task-source ports, mirroring the
|
|
4
|
+
// Cloudflare facade's `D1TaskConnectionRepository` / `D1TaskRepository` (D1
|
|
5
|
+
// migration 0014) so the Jira integration behaves identically across runtimes.
|
|
6
|
+
// Source credentials are third-party secrets, encrypted at rest with the same
|
|
7
|
+
// AES-256-GCM envelope the Cloudflare store uses (never written in plaintext).
|
|
8
|
+
function parseCredentials(json) {
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(json);
|
|
11
|
+
if (parsed && typeof parsed === 'object')
|
|
12
|
+
return parsed;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// A malformed bag is treated as empty; the import path then fails closed.
|
|
16
|
+
}
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
function parseJsonArray(json) {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(json);
|
|
22
|
+
if (Array.isArray(parsed))
|
|
23
|
+
return parsed;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// A malformed blob is treated as empty.
|
|
27
|
+
}
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
export class DrizzleTaskConnectionRepository {
|
|
31
|
+
db;
|
|
32
|
+
cipher;
|
|
33
|
+
constructor(db, cipher) {
|
|
34
|
+
this.db = db;
|
|
35
|
+
this.cipher = cipher;
|
|
36
|
+
}
|
|
37
|
+
/** Decode the stored credential blob, decrypting the envelope when present. */
|
|
38
|
+
async decodeCredentials(stored) {
|
|
39
|
+
if (!stored.startsWith('v1.'))
|
|
40
|
+
return parseCredentials(stored);
|
|
41
|
+
try {
|
|
42
|
+
return parseCredentials(await this.cipher.decrypt(stored));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async rowToRecord(row) {
|
|
49
|
+
return {
|
|
50
|
+
workspaceId: row.workspace_id,
|
|
51
|
+
source: row.source,
|
|
52
|
+
credentials: await this.decodeCredentials(row.credentials),
|
|
53
|
+
label: row.label,
|
|
54
|
+
createdAt: row.created_at,
|
|
55
|
+
deletedAt: row.deleted_at,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async getByWorkspace(workspaceId, source) {
|
|
59
|
+
const [row] = await this.db
|
|
60
|
+
.select()
|
|
61
|
+
.from(taskConnections)
|
|
62
|
+
.where(and(eq(taskConnections.workspace_id, workspaceId), eq(taskConnections.source, source), isNull(taskConnections.deleted_at)));
|
|
63
|
+
return row ? this.rowToRecord(row) : null;
|
|
64
|
+
}
|
|
65
|
+
async listByWorkspace(workspaceId) {
|
|
66
|
+
const rows = await this.db
|
|
67
|
+
.select()
|
|
68
|
+
.from(taskConnections)
|
|
69
|
+
.where(and(eq(taskConnections.workspace_id, workspaceId), isNull(taskConnections.deleted_at)))
|
|
70
|
+
.orderBy(desc(taskConnections.created_at));
|
|
71
|
+
return Promise.all(rows.map((row) => this.rowToRecord(row)));
|
|
72
|
+
}
|
|
73
|
+
async upsert(record) {
|
|
74
|
+
const credentials = await this.cipher.encrypt(JSON.stringify(record.credentials));
|
|
75
|
+
// A workspace has a single live connection per source: clear any prior binding
|
|
76
|
+
// (live or tombstoned) before inserting, so reconnecting can't collide on the PK.
|
|
77
|
+
await this.db.transaction(async (tx) => {
|
|
78
|
+
await tx
|
|
79
|
+
.delete(taskConnections)
|
|
80
|
+
.where(and(eq(taskConnections.workspace_id, record.workspaceId), eq(taskConnections.source, record.source)));
|
|
81
|
+
await tx.insert(taskConnections).values({
|
|
82
|
+
workspace_id: record.workspaceId,
|
|
83
|
+
source: record.source,
|
|
84
|
+
credentials,
|
|
85
|
+
label: record.label,
|
|
86
|
+
created_at: record.createdAt,
|
|
87
|
+
deleted_at: null,
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async softDelete(workspaceId, source, at) {
|
|
92
|
+
await this.db
|
|
93
|
+
.update(taskConnections)
|
|
94
|
+
.set({ deleted_at: at })
|
|
95
|
+
.where(and(eq(taskConnections.workspace_id, workspaceId), eq(taskConnections.source, source), isNull(taskConnections.deleted_at)));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function rowToTask(row) {
|
|
99
|
+
return {
|
|
100
|
+
workspaceId: row.workspace_id,
|
|
101
|
+
source: row.source,
|
|
102
|
+
externalId: row.external_id,
|
|
103
|
+
title: row.title,
|
|
104
|
+
url: row.url,
|
|
105
|
+
status: row.status,
|
|
106
|
+
type: row.type,
|
|
107
|
+
assignee: row.assignee,
|
|
108
|
+
priority: row.priority,
|
|
109
|
+
labels: parseJsonArray(row.labels),
|
|
110
|
+
description: row.description,
|
|
111
|
+
comments: parseJsonArray(row.comments),
|
|
112
|
+
excerpt: row.excerpt,
|
|
113
|
+
linkedBlockId: row.linked_block_id,
|
|
114
|
+
syncedAt: row.synced_at,
|
|
115
|
+
deletedAt: row.deleted_at,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
export class DrizzleTaskRepository {
|
|
119
|
+
db;
|
|
120
|
+
constructor(db) {
|
|
121
|
+
this.db = db;
|
|
122
|
+
}
|
|
123
|
+
async upsert(record) {
|
|
124
|
+
const values = {
|
|
125
|
+
workspace_id: record.workspaceId,
|
|
126
|
+
source: record.source,
|
|
127
|
+
external_id: record.externalId,
|
|
128
|
+
title: record.title,
|
|
129
|
+
url: record.url,
|
|
130
|
+
status: record.status,
|
|
131
|
+
type: record.type,
|
|
132
|
+
assignee: record.assignee,
|
|
133
|
+
priority: record.priority,
|
|
134
|
+
labels: JSON.stringify(record.labels),
|
|
135
|
+
description: record.description,
|
|
136
|
+
comments: JSON.stringify(record.comments),
|
|
137
|
+
excerpt: record.excerpt,
|
|
138
|
+
linked_block_id: record.linkedBlockId,
|
|
139
|
+
synced_at: record.syncedAt,
|
|
140
|
+
deleted_at: null,
|
|
141
|
+
};
|
|
142
|
+
await this.db
|
|
143
|
+
.insert(tasks)
|
|
144
|
+
.values(values)
|
|
145
|
+
.onConflictDoUpdate({
|
|
146
|
+
target: [tasks.workspace_id, tasks.source, tasks.external_id],
|
|
147
|
+
set: {
|
|
148
|
+
title: values.title,
|
|
149
|
+
url: values.url,
|
|
150
|
+
status: values.status,
|
|
151
|
+
type: values.type,
|
|
152
|
+
assignee: values.assignee,
|
|
153
|
+
priority: values.priority,
|
|
154
|
+
labels: values.labels,
|
|
155
|
+
description: values.description,
|
|
156
|
+
comments: values.comments,
|
|
157
|
+
excerpt: values.excerpt,
|
|
158
|
+
linked_block_id: values.linked_block_id,
|
|
159
|
+
synced_at: values.synced_at,
|
|
160
|
+
deleted_at: null,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async get(workspaceId, source, externalId) {
|
|
165
|
+
const [row] = await this.db
|
|
166
|
+
.select()
|
|
167
|
+
.from(tasks)
|
|
168
|
+
.where(and(eq(tasks.workspace_id, workspaceId), eq(tasks.source, source), eq(tasks.external_id, externalId), isNull(tasks.deleted_at)));
|
|
169
|
+
return row ? rowToTask(row) : null;
|
|
170
|
+
}
|
|
171
|
+
async listByWorkspace(workspaceId) {
|
|
172
|
+
const rows = await this.db
|
|
173
|
+
.select()
|
|
174
|
+
.from(tasks)
|
|
175
|
+
.where(and(eq(tasks.workspace_id, workspaceId), isNull(tasks.deleted_at)))
|
|
176
|
+
.orderBy(desc(tasks.synced_at));
|
|
177
|
+
return rows.map(rowToTask);
|
|
178
|
+
}
|
|
179
|
+
async listByBlock(workspaceId, blockId) {
|
|
180
|
+
const rows = await this.db
|
|
181
|
+
.select()
|
|
182
|
+
.from(tasks)
|
|
183
|
+
.where(and(eq(tasks.workspace_id, workspaceId), eq(tasks.linked_block_id, blockId), isNull(tasks.deleted_at)))
|
|
184
|
+
.orderBy(desc(tasks.synced_at));
|
|
185
|
+
return rows.map(rowToTask);
|
|
186
|
+
}
|
|
187
|
+
async linkBlock(workspaceId, source, externalId, blockId) {
|
|
188
|
+
await this.db
|
|
189
|
+
.update(tasks)
|
|
190
|
+
.set({ linked_block_id: blockId })
|
|
191
|
+
.where(and(eq(tasks.workspace_id, workspaceId), eq(tasks.source, source), eq(tasks.external_id, externalId)));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/repositories/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Clock, LlmCallMetricRepository, PipelineScheduleRepository, SubscriptionActivationRepository, TokenUsageRepository } from '@cat-factory/kernel';
|
|
2
|
+
import type { Logger, RetentionConfig } from '@cat-factory/server';
|
|
3
|
+
/** Recurring-pipeline run history is kept ~1 week (the inspector's window). */
|
|
4
|
+
export declare const SCHEDULE_RUN_RETENTION_MS: number;
|
|
5
|
+
/** The Node-persisted repositories with an age-based prune. */
|
|
6
|
+
export interface RetentionRepos {
|
|
7
|
+
tokenUsageRepository: Pick<TokenUsageRepository, 'deleteOlderThan'>;
|
|
8
|
+
llmCallMetricRepository: Pick<LlmCallMetricRepository, 'deleteOlderThan'>;
|
|
9
|
+
pipelineScheduleRepository: Pick<PipelineScheduleRepository, 'pruneRunsBefore'>;
|
|
10
|
+
subscriptionActivationRepository: Pick<SubscriptionActivationRepository, 'deleteExpired'>;
|
|
11
|
+
}
|
|
12
|
+
/** Rows reclaimed from each table, for logging. */
|
|
13
|
+
export interface RetentionResult {
|
|
14
|
+
tokenUsage: number;
|
|
15
|
+
llmCallMetrics: number;
|
|
16
|
+
scheduleRuns: number;
|
|
17
|
+
activations: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* How often the retention sweep runs. The windows are measured in days, so an hourly
|
|
21
|
+
* pass keeps the tables bounded at negligible cost — each prune is an indexed range
|
|
22
|
+
* delete that usually reclaims nothing.
|
|
23
|
+
*/
|
|
24
|
+
export declare const RETENTION_SWEEP_INTERVAL_MS: number;
|
|
25
|
+
/**
|
|
26
|
+
* Prune each Node-persisted unbounded table to its retention window. Pure over its
|
|
27
|
+
* repos so it is unit-testable without a database (mirrors the Worker's pure
|
|
28
|
+
* `sweepRetention`). Returns the counts removed per table.
|
|
29
|
+
*/
|
|
30
|
+
export declare function sweepRetention(repos: RetentionRepos, retention: RetentionConfig, now: number): Promise<RetentionResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Start the periodic retention sweep, the Node analogue of the Worker's cron prune.
|
|
33
|
+
* Runs once immediately (so a restart reclaims promptly) then on an hourly timer.
|
|
34
|
+
* Best-effort: a failed sweep is logged and retried next tick, never thrown. Returns
|
|
35
|
+
* a stop function that clears the timer.
|
|
36
|
+
*/
|
|
37
|
+
export declare function startRetentionSweeper(repos: RetentionRepos, retention: RetentionConfig, clock: Clock, log: Logger): () => void;
|
|
38
|
+
//# sourceMappingURL=retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../src/retention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,gCAAgC,EAChC,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElE,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,QAA0B,CAAA;AAUhE,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAA;IACnE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,EAAE,iBAAiB,CAAC,CAAA;IACzE,0BAA0B,EAAE,IAAI,CAAC,0BAA0B,EAAE,iBAAiB,CAAC,CAAA;IAG/E,gCAAgC,EAAE,IAAI,CAAC,gCAAgC,EAAE,eAAe,CAAC,CAAA;CAC1F;AAED,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,QAAiB,CAAA;AAYzD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,eAAe,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,CAAC,CAe1B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,GACV,MAAM,IAAI,CAyBZ"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Recurring-pipeline run history is kept ~1 week (the inspector's window). */
|
|
2
|
+
export const SCHEDULE_RUN_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
|
|
3
|
+
/**
|
|
4
|
+
* How often the retention sweep runs. The windows are measured in days, so an hourly
|
|
5
|
+
* pass keeps the tables bounded at negligible cost — each prune is an indexed range
|
|
6
|
+
* delete that usually reclaims nothing.
|
|
7
|
+
*/
|
|
8
|
+
export const RETENTION_SWEEP_INTERVAL_MS = 60 * 60 * 1000;
|
|
9
|
+
/** Delete rows older than `now - windowMs`, treating a non-positive window as "disabled". */
|
|
10
|
+
async function prune(windowMs, now, del) {
|
|
11
|
+
if (windowMs <= 0)
|
|
12
|
+
return 0;
|
|
13
|
+
return del(now - windowMs);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Prune each Node-persisted unbounded table to its retention window. Pure over its
|
|
17
|
+
* repos so it is unit-testable without a database (mirrors the Worker's pure
|
|
18
|
+
* `sweepRetention`). Returns the counts removed per table.
|
|
19
|
+
*/
|
|
20
|
+
export async function sweepRetention(repos, retention, now) {
|
|
21
|
+
return {
|
|
22
|
+
tokenUsage: await prune(retention.tokenUsageMs, now, (c) => repos.tokenUsageRepository.deleteOlderThan(c)),
|
|
23
|
+
llmCallMetrics: await prune(retention.llmCallMetricsMs, now, (c) => repos.llmCallMetricRepository.deleteOlderThan(c)),
|
|
24
|
+
// Fixed ~1-week window (not part of the configurable retention policy).
|
|
25
|
+
scheduleRuns: await prune(SCHEDULE_RUN_RETENTION_MS, now, (c) => repos.pipelineScheduleRepository.pruneRunsBefore(c)),
|
|
26
|
+
// Delete activations whose own TTL (expires_at) has passed — `now`, not a window.
|
|
27
|
+
activations: await repos.subscriptionActivationRepository.deleteExpired(now),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Start the periodic retention sweep, the Node analogue of the Worker's cron prune.
|
|
32
|
+
* Runs once immediately (so a restart reclaims promptly) then on an hourly timer.
|
|
33
|
+
* Best-effort: a failed sweep is logged and retried next tick, never thrown. Returns
|
|
34
|
+
* a stop function that clears the timer.
|
|
35
|
+
*/
|
|
36
|
+
export function startRetentionSweeper(repos, retention, clock, log) {
|
|
37
|
+
const tick = async () => {
|
|
38
|
+
try {
|
|
39
|
+
const { tokenUsage, llmCallMetrics, scheduleRuns, activations } = await sweepRetention(repos, retention, clock.now());
|
|
40
|
+
if (tokenUsage > 0 || llmCallMetrics > 0 || scheduleRuns > 0 || activations > 0) {
|
|
41
|
+
log.info({ tokenUsage, llmCallMetrics, scheduleRuns, activations }, 'retention sweep reclaimed rows');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
log.error({ err: error instanceof Error ? error.message : String(error) }, 'retention sweep failed');
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
void tick();
|
|
49
|
+
const timer = setInterval(() => void tick(), RETENTION_SWEEP_INTERVAL_MS);
|
|
50
|
+
timer.unref?.(); // never keep the process alive on the sweep timer alone
|
|
51
|
+
return () => clearInterval(timer);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../src/retention.ts"],"names":[],"mappings":"AASA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AA4BhE;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAEzD,6FAA6F;AAC7F,KAAK,UAAU,KAAK,CAClB,QAAgB,EAChB,GAAW,EACX,GAAwC;IAExC,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,CAAC,CAAA;IAC3B,OAAO,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAA;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAqB,EACrB,SAA0B,EAC1B,GAAW;IAEX,OAAO;QACL,UAAU,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACzD,KAAK,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC,CAC9C;QACD,cAAc,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACjE,KAAK,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC,CAAC,CACjD;QACD,wEAAwE;QACxE,YAAY,EAAE,MAAM,KAAK,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAC9D,KAAK,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC,CAAC,CACpD;QACD,kFAAkF;QAClF,WAAW,EAAE,MAAM,KAAK,CAAC,gCAAgC,CAAC,aAAa,CAAC,GAAG,CAAC;KAC7E,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAqB,EACrB,SAA0B,EAC1B,KAAY,EACZ,GAAW;IAEX,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CACpF,KAAK,EACL,SAAS,EACT,KAAK,CAAC,GAAG,EAAE,CACZ,CAAA;YACD,IAAI,UAAU,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBAChF,GAAG,CAAC,IAAI,CACN,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,EACzD,gCAAgC,CACjC,CAAA;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CACP,EAAE,GAAG,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC/D,wBAAwB,CACzB,CAAA;QACH,CAAC;IACH,CAAC,CAAA;IACD,KAAK,IAAI,EAAE,CAAA;IACX,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,2BAA2B,CAAC,CAAA;IACzE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAA,CAAC,wDAAwD;IACxE,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Clock, IdGenerator } from '@cat-factory/kernel';
|
|
2
|
+
/** Wall-clock time source. */
|
|
3
|
+
export declare class SystemClock implements Clock {
|
|
4
|
+
now(): number;
|
|
5
|
+
}
|
|
6
|
+
/** Prefixed, collision-resistant ids (`blk_<uuid-ish>`), built on Web Crypto. */
|
|
7
|
+
export declare class CryptoIdGenerator implements IdGenerator {
|
|
8
|
+
next(prefix: string): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE7D,8BAA8B;AAC9B,qBAAa,WAAY,YAAW,KAAK;IACvC,GAAG,IAAI,MAAM,CAEZ;CACF;AAED,iFAAiF;AACjF,qBAAa,iBAAkB,YAAW,WAAW;IACnD,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3B;CACF"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Wall-clock time source. */
|
|
2
|
+
export class SystemClock {
|
|
3
|
+
now() {
|
|
4
|
+
return Date.now();
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
/** Prefixed, collision-resistant ids (`blk_<uuid-ish>`), built on Web Crypto. */
|
|
8
|
+
export class CryptoIdGenerator {
|
|
9
|
+
next(prefix) {
|
|
10
|
+
return `${prefix}_${crypto.randomUUID().replace(/-/g, '').slice(0, 24)}`;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAEA,8BAA8B;AAC9B,MAAM,OAAO,WAAW;IACtB,GAAG;QACD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;IACnB,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,OAAO,iBAAiB;IAC5B,IAAI,CAAC,MAAc;QACjB,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;IAC1E,CAAC;CACF"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { serve } from '@hono/node-server';
|
|
2
|
+
import { type AppEnv, type ServerContainer } from '@cat-factory/server';
|
|
3
|
+
import { Hono } from 'hono';
|
|
4
|
+
import { type NodeContainerOptions } from './container.js';
|
|
5
|
+
export interface CreateServerOptions extends NodeContainerOptions {
|
|
6
|
+
}
|
|
7
|
+
/** Build the Hono app around a ready container (shared by `createServer` + `start`). */
|
|
8
|
+
export declare function createApp(container: ServerContainer, env?: NodeJS.ProcessEnv): Hono<AppEnv>;
|
|
9
|
+
/**
|
|
10
|
+
* Build the app from container options (convenience, e.g. embedding / tests).
|
|
11
|
+
*
|
|
12
|
+
* WARNING: unless a started `boss` is passed in `options`, the container wires the
|
|
13
|
+
* engine's NoopWorkRunner — a started execution then returns `running` but is never
|
|
14
|
+
* driven to completion. Use {@link start} for a fully-wired service (durable pg-boss
|
|
15
|
+
* worker + stale-run sweeper); pass `boss` here only if you drive runs yourself.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createServer(options: CreateServerOptions): Hono<AppEnv>;
|
|
18
|
+
/**
|
|
19
|
+
* Boot the Node HTTP server: connect to Postgres (`DATABASE_URL`), ensure the schema,
|
|
20
|
+
* start pg-boss + the durable execution worker + the stale-run sweeper, build the app,
|
|
21
|
+
* and listen. Registers SIGTERM/SIGINT handlers for a clean, ordered shutdown.
|
|
22
|
+
*/
|
|
23
|
+
export declare function start(options?: {
|
|
24
|
+
env?: NodeJS.ProcessEnv;
|
|
25
|
+
/**
|
|
26
|
+
* The composition root to build. Defaults to {@link buildNodeContainer}; a sibling
|
|
27
|
+
* facade (local mode) passes its own builder (same signature) so it reuses this
|
|
28
|
+
* whole boot sequence — Postgres + pg-boss + sweepers — while supplying only its
|
|
29
|
+
* differentiators (e.g. the local Docker transport + PAT token source).
|
|
30
|
+
*/
|
|
31
|
+
buildContainer?: (options: NodeContainerOptions) => ServerContainer;
|
|
32
|
+
/**
|
|
33
|
+
* The address to bind the HTTP listener to. Defaults to `HOST` from the env, else
|
|
34
|
+
* all interfaces. A facade or operator can pass `127.0.0.1` to keep the service off
|
|
35
|
+
* the LAN — but note repo-operating agent containers reach this service's LLM proxy
|
|
36
|
+
* via `PUBLIC_URL`, so on native Linux Docker (where that resolves to the bridge
|
|
37
|
+
* gateway, not loopback) a loopback-only bind makes the proxy unreachable to them.
|
|
38
|
+
*/
|
|
39
|
+
host?: string;
|
|
40
|
+
}): Promise<ReturnType<typeof serve>>;
|
|
41
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EACL,KAAK,MAAM,EACX,KAAK,eAAe,EAMrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,KAAK,oBAAoB,EAAsB,MAAM,gBAAgB,CAAA;AAsB9E,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;CAAG;AAEpE,wFAAwF;AACxF,wBAAgB,SAAS,CACvB,SAAS,EAAE,eAAe,EAC1B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,IAAI,CAAC,MAAM,CAAC,CAkBd;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,CAEvE;AAED;;;;GAIG;AACH,wBAAsB,KAAK,CACzB,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,eAAe,CAAA;IACnE;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACT,GACL,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CA+FnC"}
|